00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00022 #ifndef VMDLINKEDLIST_H__
00023 #define VMDLINKEDLIST_H__
00024
00025 #include <string.h>
00026 #include "ResizeArray.h"
00027 #include "Matrix4.h"
00028
00030 struct VMDClipPlane {
00031 float center[3];
00032 float normal[3];
00033 float color[3];
00034 int mode;
00035
00037 VMDClipPlane() {
00038 center[0] = center[1] = center[2] = 0;
00039 normal[0] = normal[1] = 0; normal[2] = 1;
00040 color[0] = color[1] = color[2] = 0.5;
00041 mode = 0;
00042 }
00043 };
00044
00045 #define VMD_MAX_CLIP_PLANE 6
00046
00049 #define PBC_NONE 0x00 // don't draw any PBC images
00050 #define PBC_X 0x01 // +X images
00051 #define PBC_Y 0x02 // +Y images
00052 #define PBC_Z 0x04 // +Z images
00053 #define PBC_OPX 0x08 // -X images
00054 #define PBC_OPY 0x10 // -Y images
00055 #define PBC_OPZ 0x20 // -Z images
00056 #define PBC_NOSELF 0x40 // set this flag to NOT draw the original image
00057
00060 #define INSTANCE_NONE 0x0 // don't draw any instance images
00061 #define INSTANCE_ALL 0x00ffff // draw all of the instance images
00062 #define INSTANCE_NOSELF 0x01ffff // don't draw the original instance
00063
00066 class VMDDisplayList {
00067 private:
00068 struct CommandHeader {
00069 int code;
00070 long size;
00071 };
00072
00073 public:
00074 VMDDisplayList();
00075 ~VMDDisplayList();
00076
00077 void *operator new(size_t);
00078 void operator delete(void *, size_t);
00079
00080 Matrix4 mat;
00081 unsigned long serial;
00082 int cacheskip;
00083 int pbc;
00084 int npbc;
00085 Matrix4 transX, transY, transZ;
00086 Matrix4 transXinv, transYinv, transZinv;
00087 int instanceset;
00088 ResizeArray<Matrix4> instances;
00089
00091
00092 float ambient, specular, diffuse, shininess, mirror, opacity;
00093 float outline, outlinewidth, transmode;
00094 int materialtag;
00095
00096
00097 VMDClipPlane clipplanes[VMD_MAX_CLIP_PLANE];
00098
00100 void *append(int code, long size);
00101
00102
00103
00104 void reset_and_free(unsigned long newserial);
00105
00107 const VMDClipPlane *clipplane(int i) {
00108 if (i < 0 || i >= VMD_MAX_CLIP_PLANE) return NULL;
00109 return clipplanes+i;
00110 }
00111
00113
00114
00115 int set_clip_center(int i, const float *);
00116 int set_clip_normal(int i, const float *);
00117 int set_clip_color(int i, const float *);
00118 int set_clip_status(int i, int);
00119 int get_clip_status(int i, int &);
00121
00122 struct VMDLinkIter {
00123 char *ptr;
00124 int ncmds;
00125 };
00126
00128 void first(VMDLinkIter *it) const {
00129 it->ptr = pool;
00130 it->ncmds = listsize;
00131 }
00132
00134 int next(VMDLinkIter *it, char *&d) const {
00135 if (!(it->ncmds--)) return -1;
00136 CommandHeader *header = (CommandHeader *)(it->ptr);
00137 int code = header->code;
00138 long size = header->size;
00139 d = it->ptr + sizeof(CommandHeader);
00140 it->ptr += size;
00141 return code;
00142 }
00143
00144 private:
00145
00146 int listsize;
00147
00148
00149 unsigned long poolsize;
00150
00151
00152 unsigned long poolused;
00153
00154
00155 char *pool;
00156 };
00157
00158 #endif