proj home

Files   Classes   Functions   Hierarchy  

d4marchdisp.cpp

Go to the documentation of this file.
00001 
00002 #include <cassert>
00003 using namespace std;
00004 
00005 #include <GL/glut.h>
00006 
00007 
00008 
00009 #include <d4marchdisp.h>
00010 #include <d3halfspace.h>
00011 
00012 #include <gobj.h>
00013 
00014 
00015 void d4marchdisp::eval( pt4c & P0, pt4c & P1, pt4c & P2, pt4c & P3 ) const
00016 {
00017   unsigned int res(0);
00018   if (P0.a<cvalue)
00019     res += 1;
00020   if (P1.a<cvalue)
00021     res += 2;
00022   if (P2.a<cvalue)
00023     res += 4;
00024   if (P3.a<cvalue)
00025     res += 8;
00026 
00027   if (res==0)
00028     return;
00029 
00030   if (res==15)
00031     return;
00032 
00033   switch(res)
00034   {
00035     case 14:
00036     case 1:
00037       writeone(P0,P1,P2,P3);
00038       //writeone(x0,y0,z0,f0,x1,y1,z1,f1,x2,y2,z2,f2,x3,y3,z3,f3);
00039       break;
00040     case 2:
00041     case 13:
00042       writeone(P1,P0,P2,P3);
00043       //writeone(x1,y1,z1,f1,x0,y0,z0,f0,x2,y2,z2,f2,x3,y3,z3,f3);
00044       break;
00045     case 4:
00046     case 11:
00047       writeone(P2,P1,P0,P3);
00048       //writeone(x2,y2,z2,f2,x1,y1,z1,f1,x0,y0,z0,f0,x3,y3,z3,f3);
00049       break;
00050     case 8:
00051     case 7:
00052       writeone(P3,P1,P2,P0);
00053       //writeone(x3,y3,z3,f3,x1,y1,z1,f1,x2,y2,z2,f2,x0,y0,z0,f0);
00054       break;
00055 
00056     case 3:
00057     case 12:
00058       writetwo(P0,P1,P2,P3);
00059       //writetwo(x0,y0,z0,f0,x1,y1,z1,f1,x2,y2,z2,f2,x3,y3,z3,f3);
00060       break;
00061 
00062     case 5:
00063     case 10:
00064       writetwo(P0,P2,P1,P3);
00065       //writetwo(x0,y0,z0,f0,x2,y2,z2,f2,x1,y1,z1,f1,x3,y3,z3,f3);
00066       break;
00067 
00068     case 9:
00069     case 6:
00070       writetwo(P0,P3,P2,P1);
00071       //writetwo(x0,y0,z0,f0,x3,y3,z3,f3,x2,y2,z2,f2,x1,y1,z1,f1);
00072       break;
00073   }
00074 
00075 }
00076 
00077 
00078 void d4marchdisp::writeone( pt4c & P0, pt4c & P1, pt4c & P2, pt4c & P3 ) const
00079 {
00080   float t;
00081 
00082   t = (cvalue-P0.a)/(P1.a-P0.a);
00083   float ax=P0.x+(P1.x-P0.x)*t;
00084   float ay=P0.y+(P1.y-P0.y)*t;
00085   float az=P0.z+(P1.z-P0.z)*t;
00086 
00087   t = (cvalue-P0.a)/(P2.a-P0.a);
00088   float bx=P0.x+(P2.x-P0.x)*t;
00089   float by=P0.y+(P2.y-P0.y)*t;
00090   float bz=P0.z+(P2.z-P0.z)*t;
00091 
00092   t = (cvalue-P0.a)/(P3.a-P0.a);
00093   float cx=P0.x+(P3.x-P0.x)*t;
00094   float cy=P0.y+(P3.y-P0.y)*t;
00095   float cz=P0.z+(P3.z-P0.z)*t;
00096 
00097   // Double sided triangles.
00098   // The main emphasis is not on visulization but
00099   // algorithm development. I have commented 
00100   // because graphics people will be so critical.
00101   // 
00102   // I understand and will rewrite later.
00103 
00104   drawtriangle(ax,ay,az,bx,by,bz,cx,cy,cz);
00105 
00106 }
00107 
00108 
00109 void d4marchdisp::drawtriangle
00110 (
00111   float const ax,
00112   float const ay,
00113   float const az,
00114   float const bx,
00115   float const by,
00116   float const bz,
00117   float const cx,
00118   float const cy,
00119   float const cz
00120 ) const 
00121 {
00122   d3halfspace<float> p( 
00123     point3<float>(ax,ay,az),
00124     point3<float>(bx,by,bz),
00125     point3<float>(cx,cy,cz) );
00126 //  p.pn.normalize();
00127   float const nx(p.pn.x);
00128   float const ny(p.pn.y);
00129   float const nz(p.pn.z);
00130 
00131   gobjContainer & x = * gobjContainer::global;
00132 
00133   x.push_back( new gobjglBegin(GL_TRIANGLES) );
00134 
00135   if (winding)
00136   {
00137     x.push_back( new gobjglColor3f(1.0,0.0,0.0) );
00138     x.push_back( new gobjglNormal3f(nx,ny,nz) );
00139     x.push_back( new gobjglVertex3f(ax,ay,az) );
00140     x.push_back( new gobjglColor3f(0.0,1.0,0.0) );
00141     x.push_back( new gobjglNormal3f(nx,ny,nz) );
00142     x.push_back( new gobjglVertex3f(bx,by,bz) );
00143     x.push_back( new gobjglColor3f(0.0,0.0,1.0) );
00144     x.push_back( new gobjglNormal3f(nx,ny,nz) );
00145     x.push_back( new gobjglVertex3f(cx,cy,cz) );
00146   }
00147   else
00148   {
00149     x.push_back( new gobjglNormal3f(nx,ny,nz) );
00150     x.push_back( new gobjglVertex3f(ax,ay,az) );
00151     x.push_back( new gobjglNormal3f(nx,ny,nz) );
00152     x.push_back( new gobjglVertex3f(bx,by,bz) );
00153     x.push_back( new gobjglNormal3f(nx,ny,nz) );
00154     x.push_back( new gobjglVertex3f(cx,cy,cz) );
00155   }
00156 
00157   x.push_back( new gobjglEnd() );
00158 
00159   if (seenormal)
00160   {
00161     x.push_back( new gobjglPushAttrib(GL_CURRENT_BIT) );
00162     x.push_back( new gobjglPushAttrib(GL_LIGHTING) );
00163 
00164     x.push_back( new gobjglDisable(GL_LIGHTING) );
00165 
00166     x.push_back( new gobjglColor3f(0.0,0.0,1.0) );
00167 
00168     float const r = 0.2;
00169     float const x2 = (ax+bx+cx)*0.3333333333;
00170     float const y2 = (ay+by+cy)*0.3333333333;
00171     float const z2 = (az+bz+cz)*0.3333333333;
00172     x.push_back( new gobjglBegin(GL_LINES) );
00173 
00174     x.push_back( new gobjglVertex3f(x2,y2,z2) );
00175     x.push_back( new gobjglVertex3f
00176     (
00177       x2+nx*r,
00178       y2+ny*r,
00179       z2+nz*r
00180     ) );
00181 
00182     x.push_back( new gobjglEnd() );
00183   
00184     x.push_back( new gobjglPopAttrib() );
00185     x.push_back( new gobjglPopAttrib() );
00186   }
00187 
00188 }
00189 
00190 void d4marchdisp::writetwo( pt4c & P0, pt4c & P1, pt4c & P2, pt4c & P3 ) const
00191 {
00192   float t;
00193 
00194   t = (cvalue-P0.a)/(P2.a-P0.a);
00195   float ax=P0.x+(P2.x-P0.x)*t;
00196   float ay=P0.y+(P2.y-P0.y)*t;
00197   float az=P0.z+(P2.z-P0.z)*t;
00198 
00199   t = (cvalue-P0.a)/(P3.a-P0.a);
00200   float bx=P0.x+(P3.x-P0.x)*t;
00201   float by=P0.y+(P3.y-P0.y)*t;
00202   float bz=P0.z+(P3.z-P0.z)*t;
00203 
00204   t = (cvalue-P1.a)/(P2.a-P1.a);
00205   float cx=P1.x+(P2.x-P1.x)*t;
00206   float cy=P1.y+(P2.y-P1.y)*t;
00207   float cz=P1.z+(P2.z-P1.z)*t;
00208 
00209   t = (cvalue-P1.a)/(P3.a-P1.a);
00210   float ex=P1.x+(P3.x-P1.x)*t;
00211   float ey=P1.y+(P3.x-P1.y)*t;
00212   float ez=P1.z+(P3.x-P1.z)*t;
00213 
00214   drawtriangle(ax,ay,az,cx,cy,cz,ex,ey,ez);
00215   drawtriangle(bx,by,bz,ax,ay,az,ex,ey,ez);
00216 }
00217 
00218 
00219 
00220 
00221 

Generated on Fri Mar 4 00:49:31 2011 for Chelton Evans Source by  doxygen 1.5.8