Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

FileRenderer.h

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr                                                                       
00003  *cr            (C) Copyright 1995-2019 The Board of Trustees of the           
00004  *cr                        University of Illinois                       
00005  *cr                         All Rights Reserved                        
00006  *cr                                                                   
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  * RCS INFORMATION:
00011  *
00012  *      $RCSfile: FileRenderer.h,v $
00013  *      $Author: johns $        $Locker:  $             $State: Exp $
00014  *      $Revision: 1.130 $      $Date: 2021/05/14 22:51:35 $
00015  *
00016  ***************************************************************************
00017  * DESCRIPTION:
00018  *
00019  * The FileRenderer class implements the data and functions needed to 
00020  * render a scene to a file in some format (postscript, raster3d, etc.)
00021  *
00022  ***************************************************************************/
00023 #ifndef FILERENDERER_H
00024 #define FILERENDERER_H
00025 
00026 #include <stdio.h>
00027 
00028 #include "DisplayDevice.h"
00029 #include "Scene.h"
00030 #include "NameList.h"
00031 #include "Inform.h"
00032 
00033 #define FILERENDERER_NOWARNINGS    0
00034 #define FILERENDERER_NOMISCFEATURE 1
00035 #define FILERENDERER_NOCLIP        2
00036 #define FILERENDERER_NOCUEING      4
00037 #define FILERENDERER_NOTEXTURE     8
00038 #define FILERENDERER_NOGEOM       16
00039 #define FILERENDERER_NOTEXT       32
00040 
00044 class FileRenderer : public DisplayDevice {
00045 protected:
00046   char *publicName;         
00047   char *publicPrettyName;   
00048   char *defaultFilename;    
00049   char *defaultCommandLine; 
00050 
00051   char *execCmd;     
00052   FILE *outfile;     
00053   int isOpened;      
00054   char *my_filename; 
00055   int has_aa;        
00056   int aasamples;     
00057   int aosamples;     
00058   int has_imgsize;   
00059 
00060   int warningflags;  
00061 
00062 
00063   int imgwidth, imgheight;  
00064   float aspectratio;        
00065   NameList<int> formats;    
00066   int curformat;     
00067 
00070   virtual void update_exec_cmd() {}
00071 
00073   struct LightState {
00074     float color[3];             
00075     float pos[3];               
00076     int on;                     
00077   };
00078   LightState lightState[DISP_LIGHTS]; 
00079 
00081   struct AdvancedLightState {
00082     float color[3];             
00083     float pos[3];               
00084     float constfactor;          
00085     float linearfactor;         
00086     float quadfactor;           
00087     float spotdir[3];           
00088     float fallstart;            
00089     float fallend;              
00090     int spoton;                 
00091     int on;                     
00092   };
00093   AdvancedLightState advLightState[DISP_LIGHTS]; 
00094 
00096   float matData[MAXCOLORS][3];
00097   virtual void do_use_colors();
00098 
00100   float backColor[3];
00101 
00102   float backgradientenabled;      
00103   float backgradienttopcolor[3];  
00104   float backgradientbotcolor[3];  
00105  
00106 public:
00108   FileRenderer(const char *public_name, 
00109                const char *public_pretty_name,
00110                const char *default_file_name,
00111                const char *default_command_line);
00112   virtual ~FileRenderer(void);
00113 
00114   const char *visible_name(void) const { return publicName;}
00115   const char *pretty_name(void) const { return publicPrettyName;}
00116   const char *default_filename(void) const {return defaultFilename;}
00117   const char *default_exec_string(void) const {return defaultCommandLine;}
00118   const char *saved_exec_string(void) const { return execCmd; }
00119 
00120   void set_exec_string(const char *);
00121 
00123   int has_antialiasing() const { return has_aa; }
00124 
00126   int set_aasamples(int newval) {
00127     if (has_aa && (newval >= 0)) {
00128       aasamples = newval;
00129       update_exec_cmd();
00130     }
00131     return aasamples;
00132   }
00133 
00135   int set_aosamples(int newval) {
00136     if (newval >= 0) {
00137       aosamples = newval;
00138       update_exec_cmd();
00139     }
00140     return aosamples;
00141   }
00142 
00144   int has_imagesize() const { return has_imgsize; }
00145 
00150   int set_imagesize(int *w, int *h);
00151 
00154   float set_aspectratio(float aspect);
00155   
00157   int numformats() const { return formats.num(); }
00158   
00160   const char *format(int i) const { return formats.name(i); }
00161   const char *format() const { return formats.name(curformat); }
00162   int set_format(const char *format) {
00163     int ind = formats.typecode(format);
00164     if (ind < 0) return FALSE;
00165     if (curformat != ind) {
00166       curformat = ind;
00167       update_exec_cmd();
00168     }
00169     return TRUE;
00170   }
00171 
00173   virtual void set_background(const float *);
00174 
00176   virtual void set_backgradient(const float *top, const float *bot);
00177 
00182   virtual int open_file(const char *filename);
00183 
00184   virtual int do_define_light(int n, float *color, float *position);
00185   virtual int do_activate_light(int n, int turnon);
00186 
00187   virtual int do_define_adv_light(int n, float *color, float *position,
00188                                   float constant, float linear, float quad,
00189                                   float *spotdir, float fallstart, 
00190                                   float fallend, int spoton); 
00191   virtual int do_activate_adv_light(int n, int turnon);
00192 
00193 private:
00194   int sph_nverts;   
00195   float *sph_verts; 
00196 
00197 protected:
00199   virtual void write_header(void) {};
00200   void reset_state(void);
00201 
00202 public:
00203   virtual int prepare3D(int); 
00204   virtual void render(const VMDDisplayList *); // render the display list
00205 
00206 protected:
00208   virtual void write_trailer(void) {};
00209 
00213   virtual void close_file(void);
00214 
00215 public:
00217   virtual void update(int) {
00218     if (isOpened) {
00219       write_trailer();
00220       close_file();
00221       isOpened = FALSE;
00222   
00223       // Emit any pending warning messages for missing or unsupported
00224       // geometric primitives.
00225       if (warningflags & FILERENDERER_NOCLIP)
00226         msgWarn << "User-defined clipping planes not exported for this renderer" << sendmsg;
00227 
00228       if (warningflags & FILERENDERER_NOTEXT)
00229         msgWarn << "Text not exported for this renderer" << sendmsg;
00230 
00231       if (warningflags & FILERENDERER_NOTEXTURE)
00232         msgWarn << "Texture mapping not exported for this renderer" << sendmsg;
00233 
00234       if (warningflags & FILERENDERER_NOCUEING)
00235         msgWarn << "Depth cueing not exported for this renderer" << sendmsg;
00236 
00237       if (warningflags & FILERENDERER_NOGEOM)
00238         msgWarn << "One or more geometry types not exported for this renderer" << sendmsg;
00239 
00240       if (warningflags != FILERENDERER_NOWARNINGS)
00241         msgWarn << "Unimplemented features may negatively affect the appearance of the scene" << sendmsg;
00242     }
00243   }
00244 
00245 protected:
00247   // (for those that do not want to take care of it themselves)
00248   // the 'super_' version is called by render to set the matrix.  It
00249   // then calls the non-super version
00250   Stack<Matrix4> transMat;
00251   void super_load(float *cmdptr);
00252   virtual void load(const Matrix4& /*mat*/) {}
00253   void super_multmatrix(const float *cmdptr);
00254   virtual void multmatrix(const Matrix4& /*mat*/) {}
00255   void super_translate(float *cmdptr);
00256   virtual void translate(float /*x*/, float /*y*/, float /*z*/) {}
00257   void super_rot(float *cmdptr);
00258   virtual void rot(float /*ang*/, char /*axis*/) {}
00259   void super_scale(float *cmdptr);
00260   void super_scale(float);
00261   virtual void scale(float /*scalex*/, float /*scaley*/, 
00262                      float /*scalez*/) {}
00263 
00264   float scale_factor(void);         
00265 
00266   float scale_radius(float);        
00267 
00268   // change the color definitions
00269   int colorIndex;                   
00270   void super_set_color(int index);  
00271   virtual void set_color(int) {}    
00272   
00277   int nearest_index(float r, float g, float b) const;
00278 
00279   // change the material definition
00280   int materialIndex;                    
00281   float mat_ambient;                    
00282   float mat_diffuse;                    
00283   float mat_specular;                   
00284   float mat_shininess;                  
00285   float mat_mirror;                     
00286   float mat_opacity;                    
00287   float mat_outline;                    
00288   float mat_outlinewidth;               
00289   float mat_transmode;                  
00290   void super_set_material(int index);   
00291   virtual void set_material(int) {}     
00292 
00293   float clip_center[VMD_MAX_CLIP_PLANE][3]; 
00294   float clip_normal[VMD_MAX_CLIP_PLANE][3]; 
00295   float clip_color[VMD_MAX_CLIP_PLANE][3];  
00296   int clip_mode[VMD_MAX_CLIP_PLANE];        
00297 
00298   virtual void start_clipgroup();       
00299   virtual void end_clipgroup() {}       
00300 
00301   // change the line definitions
00302   int lineWidth, lineStyle, pointSize;
00303   virtual void set_line_width(int new_width) {
00304     lineWidth = new_width;
00305   }
00306   virtual void set_line_style(int /*new_style*/) {}  
00307 
00308   // change the sphere definitions
00309   int sphereResolution, sphereStyle;
00310   virtual void set_sphere_res(int /*res*/) {}        
00311   virtual void set_sphere_style(int /*style*/) {}    
00312 
00313   int materials_on;
00314   void super_materials(int on_or_off);
00315   virtual void activate_materials(void) {}           
00316   virtual void deactivate_materials(void) {}         
00317   
00318 
00320 
00322   virtual void cone(float * xyz1, float * xyz2, float radius, int resolution) { 
00323     // if not overridden by the subclass, we just call the truncated cone
00324     // method with a 0.0 radius for the tip
00325     cone_trunc(xyz1, xyz2, radius, 0.0f, resolution);
00326   }
00327 
00329   virtual void cone_trunc(float * /*xyz1*/, float * /*xyz2*/, 
00330                           float /* radius*/, float /* radius2 */, 
00331                           int /*resolution*/);
00332 
00333 
00335   virtual void cylinder(float * base, float * apex, float radius, int filled);
00336 
00337 #if defined(VMDOPTIXRTRT)
00338 
00339   virtual void cylinder_array(int num, int res, int caps,
00340                               float *points, float *radii, float *colors);
00341 #endif
00342 
00344   virtual void line(float * a, float * b);
00345 
00347   virtual void line_array(int num, float thickness, float *points);
00348 
00350   virtual void polyline_array(int num, float thickness, float *points);
00351 
00352 
00354   virtual void point(float * xyz) {
00355     float xyzr[4];
00356     vec_copy(xyzr, xyz);
00357     xyzr[3] = lineWidth * 0.002f; // hack for renderers that don't have points
00358   }
00359 
00361   virtual void point_array(int num, float size, float *xyz, float *colors);
00362 
00364   virtual void point_array_lit(int num, float size, 
00365                                float *xyz, float *norm, float *colors);
00366 
00368   virtual void cube_array(int num, float *centers, float *radii, float *colors);
00369 
00371   virtual void sphere(float * xyzr);
00372 
00374   virtual void sphere_array(int num, int res, float *centers, float *radii, float *colors);
00375 
00377   virtual void square(float * norm, float * a, float * b, 
00378                       float * c, float * d) {
00379     // draw as two triangles, with correct winding order etc
00380     triangle(a, b, c, norm, norm, norm);
00381     triangle(a, c, d, norm, norm, norm);
00382   }
00383 
00385   virtual void cube(float * xyzr) {
00386     // coordinates of unit cube
00387     float v0[] = {-1.0, -1.0, -1.0}; 
00388     float v1[] = { 1.0, -1.0, -1.0}; 
00389     float v2[] = {-1.0,  1.0, -1.0}; 
00390     float v3[] = { 1.0,  1.0, -1.0}; 
00391     float v4[] = {-1.0, -1.0,  1.0}; 
00392     float v5[] = { 1.0, -1.0,  1.0}; 
00393     float v6[] = {-1.0,  1.0,  1.0}; 
00394     float v7[] = { 1.0,  1.0,  1.0}; 
00395 
00396     float n0[] = {0, 0,  1};
00397     float n1[] = {0, 0,  1};
00398     float n2[] = {0, -1, 0};
00399     float n3[] = {0, -1, 0};
00400     float n4[] = {1, 0, 0};
00401     float n5[] = {1, 0, 0};
00402 
00403     vec_triad(v0, xyzr, xyzr[3], v0);
00404     vec_triad(v1, xyzr, xyzr[3], v1);
00405     vec_triad(v2, xyzr, xyzr[3], v2);
00406     vec_triad(v3, xyzr, xyzr[3], v3);
00407     vec_triad(v4, xyzr, xyzr[3], v4);
00408     vec_triad(v5, xyzr, xyzr[3], v5);
00409     vec_triad(v6, xyzr, xyzr[3], v6);
00410     vec_triad(v7, xyzr, xyzr[3], v7);
00411 
00412     square(n0, v0, v1, v3, v2);
00413     square(n1, v4, v5, v7, v6);
00414     square(n2, v0, v1, v5, v4);
00415     square(n3, v2, v3, v7, v6);
00416     square(n4, v0, v2, v6, v4);
00417     square(n5, v1, v3, v7, v5);
00418   }
00419 
00420 
00422   virtual void triangle(const float * /*xyz1*/, const float * /*xyz2*/, const float * /*xyz3*/, 
00423                         const float * /*n1*/, const float * /*n2*/, const float * /*n3*/) {
00424     warningflags |= FILERENDERER_NOGEOM; // no triangles written
00425   }
00426 
00427 
00429   virtual void tricolor(const float * xyz1, const float * xyz2, const float * xyz3, 
00430                         const float * n1, const float * n2, const float * n3,
00431                         const float *c1, const float *c2, const float *c3) {
00432     int index = 1;
00433     float r, g, b;
00434     r = (c1[0] + c2[0] + c3[0]) / 3.0f; // average three vertex colors 
00435     g = (c1[1] + c2[1] + c3[1]) / 3.0f;
00436     b = (c1[2] + c2[2] + c3[2]) / 3.0f;
00437 
00438     index = nearest_index(r,g,b); // lookup nearest color here.
00439     super_set_color(index); // use the closest color
00440 
00441     triangle(xyz1, xyz2, xyz3, n1, n2, n3); // draw a regular triangle   
00442   }
00443 
00444 
00446   virtual void trimesh_n3f_v3f(float *n, float *v, int numfacets) { 
00447     int i;
00448     for (i=0; i<numfacets*9; i+=9) {
00449       triangle(v + i    , 
00450                v + i + 3, 
00451                v + i + 6,
00452                n + i    , 
00453                n + i + 3, 
00454                n + i + 6); 
00455     }           
00456   }
00457 
00458 
00465   virtual void trimesh_n3fopt_v3f(float *n, float *v, int numfacets) { 
00466     trimesh_n3f_v3f(n, v, numfacets); 
00467   }
00468 
00469 
00470   virtual void trimesh_n3b_v3f(signed char *n, float *v, int numfacets) { 
00471     int i;
00472     const float cn2f = 1.0f / 127.5f;
00473     const float ci2f = 1.0f / 255.0f; 
00474 
00475     for (i=0; i<numfacets*9; i+=9) {
00476       float norm[9];
00477 
00478       // conversion from GLbyte format, Table 2.6, p. 44 of OpenGL spec 1.2.1
00479       // float = (2c+1)/(2^8-1)
00480       norm[0] = n[i    ] * cn2f + ci2f;
00481       norm[1] = n[i + 1] * cn2f + ci2f;
00482       norm[2] = n[i + 2] * cn2f + ci2f;
00483       norm[3] = n[i + 3] * cn2f + ci2f;
00484       norm[4] = n[i + 4] * cn2f + ci2f;
00485       norm[5] = n[i + 5] * cn2f + ci2f;
00486       norm[6] = n[i + 6] * cn2f + ci2f;
00487       norm[7] = n[i + 7] * cn2f + ci2f;
00488       norm[8] = n[i + 8] * cn2f + ci2f;
00489 
00490       triangle(v + i    ,
00491                v + i + 3, 
00492                v + i + 6, 
00493                &norm[0],
00494                &norm[3], 
00495                &norm[6]);
00496     }           
00497   }
00498 
00500   virtual void trimesh_c3f_n3f_v3f(float *c, float *n, float *v, int numfacets) { 
00501     int i;
00502     for (i=0; i<numfacets*9; i+=9) {
00503       tricolor(v + i    ,
00504                v + i + 3, 
00505                v + i + 6, 
00506                n + i    , 
00507                n + i + 3, 
00508                n + i + 6, 
00509                c + i    , 
00510                c + i + 3, 
00511                c + i + 6);
00512     }           
00513   }
00514 
00516   virtual void trimesh_c4n3v3(int /* numverts */, float * cnv, 
00517                               int numfacets, int * facets) { 
00518     int i;
00519     for (i=0; i<numfacets*3; i+=3) {
00520       int v0 = facets[i    ] * 10;
00521       int v1 = facets[i + 1] * 10;
00522       int v2 = facets[i + 2] * 10;
00523       tricolor(cnv + v0 + 7, // vertices 0, 1, 2
00524                cnv + v1 + 7, 
00525                cnv + v2 + 7,
00526                cnv + v0 + 4, // normals 0, 1, 2
00527                cnv + v1 + 4, 
00528                cnv + v2 + 4,
00529                cnv + v0,     // colors 0, 1, 2
00530                cnv + v1, 
00531                cnv + v2);
00532     }           
00533   }
00534 
00536   virtual void trimesh_c4u_n3f_v3f(unsigned char *c, float *n, float *v, 
00537                                    int numfacets) { 
00538     int i, j;
00539     const float ci2f = 1.0f / 255.0f;
00540     for (i=0,j=0; i<numfacets*9; i+=9,j+=12) {
00541       float col[9];
00542 
00543       // conversion from GLubyte format, Table 2.6, p. 44 of OpenGL spec 1.2.1
00544       // float = c/(2^8-1)
00545       col[0] = c[j     ] * ci2f;
00546       col[1] = c[j +  1] * ci2f;
00547       col[2] = c[j +  2] * ci2f;
00548       col[3] = c[j +  4] * ci2f;
00549       col[4] = c[j +  5] * ci2f;
00550       col[5] = c[j +  6] * ci2f;
00551       col[6] = c[j +  8] * ci2f;
00552       col[7] = c[j +  9] * ci2f;
00553       col[8] = c[j + 10] * ci2f;
00554 
00555       tricolor(v + i    ,
00556                v + i + 3, 
00557                v + i + 6, 
00558                n + i    , 
00559                n + i + 3, 
00560                n + i + 6, 
00561                &col[0],
00562                &col[3], 
00563                &col[6]);
00564     }           
00565   }
00566 
00568   virtual void trimesh_c4u_n3b_v3f(unsigned char *c, signed char *n, float *v, 
00569                                    int numfacets) { 
00570     int i, j;
00571     const float ci2f = 1.0f / 255.0f; // used for uchar2float and normal conv
00572     const float cn2f = 1.0f / 127.5f;
00573     for (i=0,j=0; i<numfacets*9; i+=9,j+=12) {
00574       float col[9], norm[9];
00575 
00576       // conversion from GLubyte format, Table 2.6, p. 44 of OpenGL spec 1.2.1
00577       // float = c/(2^8-1)
00578       col[0] = c[j     ] * ci2f;
00579       col[1] = c[j +  1] * ci2f;
00580       col[2] = c[j +  2] * ci2f;
00581       col[3] = c[j +  4] * ci2f;
00582       col[4] = c[j +  5] * ci2f;
00583       col[5] = c[j +  6] * ci2f;
00584       col[6] = c[j +  8] * ci2f;
00585       col[7] = c[j +  9] * ci2f;
00586       col[8] = c[j + 10] * ci2f;
00587 
00588       // conversion from GLbyte format, Table 2.6, p. 44 of OpenGL spec 1.2.1
00589       // float = (2c+1)/(2^8-1)
00590       norm[0] = n[i    ] * cn2f + ci2f;
00591       norm[1] = n[i + 1] * cn2f + ci2f;
00592       norm[2] = n[i + 2] * cn2f + ci2f;
00593       norm[3] = n[i + 3] * cn2f + ci2f;
00594       norm[4] = n[i + 4] * cn2f + ci2f;
00595       norm[5] = n[i + 5] * cn2f + ci2f;
00596       norm[6] = n[i + 6] * cn2f + ci2f;
00597       norm[7] = n[i + 7] * cn2f + ci2f;
00598       norm[8] = n[i + 8] * cn2f + ci2f;
00599 
00600       tricolor(v + i    ,
00601                v + i + 3, 
00602                v + i + 6, 
00603                &norm[0],
00604                &norm[3], 
00605                &norm[6],
00606                &col[0],
00607                &col[3], 
00608                &col[6]);
00609     }           
00610   }
00611 
00612 
00614   virtual void trimesh_singlecolor(int cindex, int /* numverts */, float * nv, 
00615                                    int numfacets, int * facets) { 
00616     super_set_color(cindex); // set current color
00617 
00618     int i;
00619     for (i=0; i<numfacets*3; i+=3) {
00620       int v0 = facets[i    ] * 6;
00621       int v1 = facets[i + 1] * 6; 
00622       int v2 = facets[i + 2] * 6;
00623       triangle(nv + v0 + 3, // vertices 0, 1, 2
00624                nv + v1 + 3, 
00625                nv + v2 + 3,
00626                nv + v0,     // normals 0, 1, 2
00627                nv + v1, 
00628                nv + v2);
00629     }           
00630   }
00631 
00632 
00634   virtual void tristrip(int /* numverts */, const float * cnv, 
00635                         int numstrips, const int *vertsperstrip, 
00636                         const int *facets) { 
00637     // render triangle strips one triangle at a time
00638     // triangle winding order is:
00639     //   v0, v1, v2, then v2, v1, v3, then v2, v3, v4, etc.
00640     int strip, t, v = 0;
00641     int stripaddr[2][3] = { {0, 1, 2}, {1, 0, 2} };
00642  
00643     // loop over all of the triangle strips
00644     for (strip=0; strip < numstrips; strip++) {       
00645       // loop over all triangles in this triangle strip
00646       for (t = 0; t < (vertsperstrip[strip] - 2); t++) {
00647         // render one triangle, using lookup table to fix winding order
00648         int v0 = facets[v + (stripaddr[t & 0x01][0])] * 10;
00649         int v1 = facets[v + (stripaddr[t & 0x01][1])] * 10;
00650         int v2 = facets[v + (stripaddr[t & 0x01][2])] * 10;
00651  
00652         tricolor(cnv + v0 + 7, // vertices 0, 1, 2
00653                  cnv + v1 + 7, 
00654                  cnv + v2 + 7,
00655                  cnv + v0 + 4, // normals 0, 1, 2
00656                  cnv + v1 + 4, 
00657                  cnv + v2 + 4,
00658                  cnv + v0,     // colors 0, 1, 2
00659                  cnv + v1, 
00660                  cnv + v2);
00661         v++; // move on to next vertex
00662       }
00663       v+=2; // last two vertices are already used by last triangle
00664     }
00665   }
00666 
00667 
00670   virtual void tristrip_singlecolor(int /* numverts */, const float * nv, 
00671                                     int numstrips, const int *stripcolindex,
00672                                     const int *vertsperstrip, const int *facets) { 
00673     // render triangle strips one triangle at a time
00674     // triangle winding order is:
00675     //   v0, v1, v2, then v2, v1, v3, then v2, v3, v4, etc.
00676     int strip, t, v = 0;
00677     int stripaddr[2][3] = { {0, 1, 2}, {1, 0, 2} };
00678  
00679     // loop over all of the triangle strips
00680     for (strip=0; strip < numstrips; strip++) {       
00681       super_set_color(stripcolindex[strip]); // set current color
00682       
00683       // loop over all triangles in this triangle strip
00684       for (t = 0; t < (vertsperstrip[strip] - 2); t++) {
00685         // render one triangle, using lookup table to fix winding order
00686         int v0 = facets[v + (stripaddr[t & 0x01][0])] * 6;
00687         int v1 = facets[v + (stripaddr[t & 0x01][1])] * 6;
00688         int v2 = facets[v + (stripaddr[t & 0x01][2])] * 6;
00689  
00690         triangle(nv + v0 + 3, // vertices 0, 1, 2
00691                  nv + v1 + 3, 
00692                  nv + v2 + 3,
00693                  nv + v0, // normals 0, 1, 2
00694                  nv + v1, 
00695                  nv + v2);
00696         v++; // move on to next vertex
00697       }
00698       v+=2; // last two vertices are already used by last triangle
00699     }
00700   }
00701 
00702 
00705   virtual void trifan_singlecolor(int /* numverts */, const float * nv,
00706                                   int numfans, const int *fancolindex,
00707                                   const int *vertsperfan, const int *facets) {
00708     // render triangle fans one triangle at a time
00709     // triangle winding order is:
00710     //   v0, v1, v2, then v0, v2, v3, then v0, v3, v4, etc.
00711     int fan, t, v = 0;
00712 
00713     // loop over all of the triangle fans
00714     for (fan=0; fan < numfans; fan++) {
00715       super_set_color(fancolindex[fan]); // set current color
00716 
00717       // loop over all triangles in this triangle fan
00718       int v0 = facets[v] * 6;
00719       v++;
00720       for (t = 1; t < (vertsperfan[fan] - 1); t++) {
00721         // render one triangle with correct winding order
00722         int v1 = facets[v    ] * 6;
00723         int v2 = facets[v + 1] * 6;
00724 
00725         triangle(nv + v0 + 3, // vertices 0, 1, 2
00726                  nv + v1 + 3,
00727                  nv + v2 + 3,
00728                  nv + v0, // normals 0, 1, 2
00729                  nv + v1,
00730                  nv + v2);
00731         v++; // move on to next vertex
00732       }
00733       v++; // last vertex is already used by last triangle
00734     }
00735   }
00736 
00737 
00739   virtual void define_volume_texture(int ID, int xs, int ys, int zs,
00740                                      const float *xplaneeq, 
00741                                      const float *yplaneeq,
00742                                      const float *zplaneeq,
00743                                      unsigned char *texmap) {
00744     warningflags |= FILERENDERER_NOTEXTURE;
00745   }
00746 
00747 
00749   virtual void volume_texture_on(int texmode) {
00750     warningflags |= FILERENDERER_NOTEXTURE;
00751   }
00752 
00753 
00755   virtual void volume_texture_off(void) {
00756     warningflags |= FILERENDERER_NOTEXTURE;
00757   }
00758 
00759 
00761   virtual void wiremesh(int /* numverts */, float * cnv, 
00762                        int numlines, int * lines) { 
00763     int i;
00764     int index = 1;
00765 
00766     for (i=0; i<numlines; i++) {
00767       float r, g, b;
00768       int ind = i * 2;
00769       int v0 = lines[ind    ] * 10;
00770       int v1 = lines[ind + 1] * 10;
00771 
00772       r = cnv[v0 + 0] + cnv[v1 + 0] / 2.0f;
00773       g = cnv[v0 + 1] + cnv[v1 + 1] / 2.0f;
00774       b = cnv[v0 + 2] + cnv[v1 + 2] / 2.0f;
00775 
00776       index = nearest_index(r,g,b); // lookup nearest color here.
00777       super_set_color(index); // use the closest color
00778 
00779       line(cnv + v0 + 7, cnv + v1 + 7); 
00780     }           
00781   }
00782 
00786   virtual void beginrepgeomgroup(const char *) {}
00787 
00789   virtual void comment(const char *) {}
00790 
00792   virtual void text(float *pos, float size, float thickness, const char *str);
00793 
00795   virtual void pick_point(float * /*xyz*/, int /*id*/) {}
00796 
00797 };
00798 
00799 #endif
00800 

Generated on Fri Nov 8 02:44:35 2024 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002