00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef DRAWMOLITEM_H
00026 #define DRAWMOLITEM_H
00027
00028 #include "config.h"
00029 #include "Displayable.h"
00030 #include "DispCmds.h"
00031 #include "AtomColor.h"
00032 #include "AtomRep.h"
00033 #include "AtomSel.h"
00034 #include "PickMode.h"
00035 #include "BaseMolecule.h"
00036 #include "VolumeTexture.h"
00037
00038 class DrawMolecule;
00039
00040 #ifdef VMDMSMS
00041 #include "MSMSInterface.h"
00042 #endif
00043
00044 #ifdef VMDNANOSHAPER
00045 #include "NanoShaperInterface.h"
00046 #endif
00047
00048 #ifdef VMDSURF
00049 #include "Surf.h"
00050 #endif
00051
00052 #include "QuickSurf.h"
00053
00055 class DrawMolItem : public Displayable {
00056 public:
00057 AtomColor *atomColor;
00058 AtomRep *atomRep;
00059 AtomSel *atomSel;
00060 int repNumber;
00061 char commentBuffer[1024];
00062
00063 char *name;
00064
00065 private:
00066 DrawMolecule *mol;
00067 float *avg;
00068 int avgsize;
00069
00070
00071 char *framesel;
00072
00073
00074 int structwarningcount;
00075
00076 int emitstructwarning(void);
00077
00079
00080 DispCmdBeginRepGeomGroup cmdBeginRepGeomGroup;
00081 DispCmdColorIndex cmdColorIndex;
00082 DispCmdComment cmdCommentX;
00083 DispCmdCylinder cmdCylinder;
00084 DispCmdLatticeCubeArray cmdCubeArray;
00085 DispCmdLine cmdLine;
00086 DispCmdLineType cmdLineType;
00087 DispCmdLineWidth cmdLineWidth;
00088 DispCmdPointArray cmdPointArray;
00089 DispCmdSphere cmdSphere;
00090 DispCmdSphereRes cmdSphres;
00091 DispCmdSphereType cmdSphtype;
00092 DispCmdSphereArray cmdSphereArray;
00093 DispCmdSquare cmdSquare;
00094 DispCmdTriangle cmdTriangle;
00095 DispCmdTriMesh cmdTriMesh;
00096 DispCmdVolSlice cmdVolSlice;
00097 DispCmdWireMesh cmdWireMesh;
00099
00101 struct ColorLookup {
00102 int num;
00103 int max;
00104 int *idlist;
00105 ColorLookup() {
00106 num = 0;
00107 max = 0;
00108 idlist = 0;
00109 }
00110 ~ColorLookup() {
00111 free(idlist);
00112 }
00113 void append(int id) {
00114 if (max == 0) {
00115 idlist = (int *)malloc(8L*sizeof(int));
00116 max = 8;
00117 }
00118 if (num == max) {
00119 idlist = (int *)realloc(idlist, 2L*num*sizeof(int));
00120 max = 2L*num;
00121 }
00122 idlist[num++] = id;
00123 }
00124 };
00125
00127 ColorLookup *colorlookups;
00128 static void update_lookups(AtomColor *, AtomSel *, ColorLookup *);
00129
00131 void update_pbc_transformations();
00132
00134 void update_instance_transformations();
00135
00136 #ifdef VMDMSMS
00137 MSMSInterface msms;
00138 #endif
00139
00140 #ifdef VMDNANOSHAPER
00141 NanoShaperInterface nanoshaper;
00142 #endif
00143
00144 #ifdef VMDSURF
00145 Surf surf;
00146 #endif
00147
00148 int waveftype;
00149 int wavefspin;
00150 int wavefexcitation;
00151 int gridorbid;
00152 float orbgridspacing;
00153 int orbgridisdensity;
00154 VolumetricData *orbvol;
00155
00156
00157 int voltexVolid;
00158 int voltexColorMethod;
00159 float voltexDataMin, voltexDataMax;
00160
00161
00162 VolumeTexture volumeTexture;
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 typedef ResizeArray<int> TubeIndexList;
00173
00177 ResizeArray<TubeIndexList *> *tubearray;
00178
00180 void generate_tubearray();
00181
00182
00183 void draw_solid_cubes(float *, float radscale);
00184 void draw_solid_spheres(float *, int res, float radscale, float fixrad);
00185 void draw_residue_beads(float *, int res, float radscale);
00186 void draw_dotted_spheres(float *, float srad, int sres);
00187 void draw_lines(float *, int thickness, float cutoff);
00188 void draw_cpk_licorice(float *, int, float, int, float, int, int, float cutoff);
00189
00190 #ifdef VMDPOLYHEDRA
00191 void draw_polyhedra(float *, float);
00192 #endif
00193 void draw_points(float *, float);
00194 void draw_bonds(float *, float brad, int bres, float cutoff);
00195
00197 void make_connection(float *prev, float *start, float *end, float *next,
00198 float radius, int resolution, int is_cyl);
00199
00201 void draw_spline_curve(int num, float *coords, int *idx,
00202 int use_cyl, float b_rad, int b_res);
00203
00205 void draw_spline_ribbon(int num, float *coords, float *perps,
00206 int *idx, int use_cyl, float b_rad,
00207 int b_res);
00208
00210 void draw_spline_new(int num, const float *coords,
00211 const float *perps, const int *idx,
00212 const float *cpwidths, const float *cpheights,
00213 int numscalefactors, int b_res, int cyclic);
00214
00216 void draw_ribbon_from_points(int numpoints, const float *points,
00217 const float *perps, const int *cols, int numpanels,
00218 const float *heights, const float *widths,
00219 int numscalefactors);
00220
00221 void draw_tube(float *, float radius, int res);
00222 void draw_ribbons(float *, float brad, int bres, float thickness);
00223 void draw_ribbons_new(float *, float, int, int, float);
00224
00225
00226 int draw_protein_ribbons_old(float *, int, float, float, int);
00227 int draw_protein_ribbons_new(float *, int, float, float, int);
00228 int draw_nucleic_ribbons(float *, int, float, float, int, int, int);
00229 int draw_nucleotide_cylinders(float *, int, float, float, int);
00230 int draw_base_sugar_rings(float *, int, float, float, int);
00231 int draw_cartoon_ribbons(float *, int, float, float, int, int);
00233
00234 void draw_structure(float *, float brad, int bres, int linethickness);
00235
00236 void draw_alpha_helix_cylinders(ResizeArray<float> &x,
00237 ResizeArray<float> &y,
00238 ResizeArray<float> &z,
00239 ResizeArray<int> &atom_on, int *color,
00240 float bond_rad, int bond_res,
00241 float *res_start, float *res_end);
00242
00244 void draw_beta_sheet(ResizeArray<float> &x, ResizeArray<float> &y,
00245 ResizeArray<float> &z, ResizeArray<int> &atom_on,
00246 int *color, float ribbon_width,
00247 float *res_start, float *res_end);
00248
00249 void draw_trace(float *pos, float brad, int bres, int linethickness);
00250 void draw_dot_surface(float *pos, float srad, int sres, int method);
00251 void draw_msms(float *pos, int draw_wireframe, int allatoms, float radius, float density);
00252 void draw_nanoshaper(float *pos, int surftype, int draw_wireframe, float gspacing, float probe_rad, float skin_parm, float blob_parm);
00253 void draw_quicksurf(float *pos, int quality, float radius, float isovalue, float spacing);
00254 void draw_surface(float *pos, int draw_wireframe, float radius);
00255 void draw_hbonds(float *, float maxangle, int thickness, float cutoff);
00256 void draw_dynamic_bonds(float *, float brad, int bres, float cutoff);
00257
00258
00259 void draw_volslice(int volid, float slice, int axis, int texmode);
00260
00262 void updateVolumeTexture();
00263
00264 void draw_isosurface(int, float, int, int, int, int);
00265 void draw_volume_field_lines(int volid, int seedusegrid, int maxseeds, float seedval, float deltacell, float minlen, float maxlen, int drawtubes, int tuberes, float thickness);
00266
00267 void draw_orbital(int, int, int, int, int, float, int, int, float, int, int);
00268
00270
00271 void draw_volume_box_solid(VolumetricData *);
00272 void draw_volume_box_lines(VolumetricData *);
00273 void draw_volume_slice(const VolumetricData *, int, float, int);
00274 void draw_volume_texture(const VolumetricData *, int);
00275 void draw_volume_isosurface_points(const VolumetricData *, float, int, int);
00276 void draw_volume_isosurface_lit_points(VolumetricData *, float, int, int);
00277 void draw_volume_isosurface_trimesh(VolumetricData *, float, int, const float *voltex=NULL);
00278 void draw_volume_isosurface_lines(VolumetricData *, float, int, int);
00279 int draw_volume_get_colorid(void);
00280 void prepare_volume_texture(const VolumetricData *v, int method);
00281 int calcseeds_grid(VolumetricData *v, ResizeArray<float> *seeds, int maxseedcount);
00282 int calcseeds_gradient_magnitude(VolumetricData *v, ResizeArray<float> *seeds, float seedmin, float seedmax, int maxseedcount);
00283
00285
00286 #ifdef VMDWITHCARBS
00287
00288
00289 void draw_rings_paperchain(float *framepos, float bipyramid_height, int maxringsize);
00290 void paperchain_get_ring_color(SmallRing &ring, float *framepos, float *rgb);
00291 void paperchain_draw_ring(SmallRing &ring, float *framepos, float bipyramid_height);
00293
00295
00296 void draw_rings_twister(float *framepos, int start_end_centroid, int hide_shared_links, int rib_steps, float rib_width, float rib_height, int maxringsize, int maxpathlength);
00297 void twister_draw_path(LinkagePath &path, float *framepos, int start_end_centroid, int rib_steps, float rib_width, float rib_height);
00298 void twister_draw_ribbon_extensions(ResizeArray<float> &vertices, ResizeArray<float> &colors,
00299 ResizeArray<float> &normals, ResizeArray<int> &facets,
00300 float centroid[3], float normal[3], float right[3], float rib_point[3],
00301 float rib_height, float rib_width,
00302 float top_color[3], float bottom_color[3]);
00303 void twister_draw_hexagon(ResizeArray<float> &vertices, ResizeArray<float> &colors, ResizeArray<float> &normals,
00304 ResizeArray<int> &facets, float centroid[3], float normal[3],
00305 float first_atom[3], float rib_height, float rib_width,
00306 float top_color[3], float bottom_color[3]);
00308
00310
00311 void get_ring_centroid_and_normal(float *centroid, float *normal, SmallRing &ring, float *framepos);
00312 bool smallring_selected(SmallRing &ring);
00313 bool linkagepath_selected(LinkagePath &path);
00315 #endif
00316
00317 void create_cmdlist(void);
00318 void do_create_cmdlist();
00319
00320 public:
00328 enum RegenChoices {NO_REGEN = 0, MOL_REGEN = 1, SEL_REGEN = 2,
00329 REP_REGEN = 4, COL_REGEN = 8};
00330
00331 private:
00332 int needRegenerate;
00333 int update_pbc;
00334 int update_instances;
00335 int update_ss;
00336 int update_ts;
00337 int update_traj;
00338 void place_picks(float *pos);
00339
00340 protected:
00341 virtual void do_color_changed(int);
00342 virtual void do_color_rgb_changed(int);
00343 virtual void do_color_scale_changed();
00344
00345 public:
00346
00347 DrawMolItem(const char *, DrawMolecule *, AtomColor *, AtomRep *, AtomSel *);
00348 virtual ~DrawMolItem(void);
00349
00350 int change_color(AtomColor *);
00351 int change_rep(AtomRep *);
00352 int change_sel(const char *);
00353 void force_recalc(int);
00354 int atom_displayed(int);
00355 int representation_index(void);
00356
00357 int set_smoothing(int n) {
00358 if (n >= 0) {
00359 avgsize = n;
00360 return TRUE;
00361 }
00362 return FALSE;
00363 }
00364 int get_smoothing() const {
00365 return avgsize;
00366 }
00367
00371 void set_drawframes(const char *frames);
00372 const char *get_drawframes() const { return framesel; }
00373
00376 void set_pbc(int);
00377 int get_pbc() const;
00378
00380 void set_pbc_images(int);
00381 int get_pbc_images() const;
00382
00385 void change_pbc() { update_pbc = 1; }
00386
00387
00390 void set_instances(int);
00391 int get_instances() const;
00392
00395 void change_instances() { update_instances = 1; }
00396
00397
00399 void change_ss() { update_ss = 1; }
00400
00402 void change_ts() { update_ts = 1; }
00403
00405 void change_traj() { update_traj = 1; }
00406
00407
00408
00409
00410 virtual void prepare();
00411
00414 virtual int pickable_on();
00415
00417
00418 virtual void pick_start(PickMode *p, DisplayDevice *d,
00419 int btn, int tag, const int *cell, int dim,
00420 const float *pos) {
00421 p->pick_molecule_start(mol, d, btn, tag, cell, dim, pos);
00422 }
00423
00424 virtual void pick_move(PickMode *p, DisplayDevice *d,
00425 int tag, int dim, const float *pos) {
00426 p->pick_molecule_move (mol, d, tag, dim, pos);
00427 }
00428
00429 virtual void pick_end(PickMode *p, DisplayDevice *d) {
00430 p->pick_molecule_end (mol, d);
00431 }
00433
00434 protected:
00435 float spline_basis[4][4];
00436 };
00437
00438 #endif
00439