proj home

Files   Classes   Functions   Hierarchy  

d4tessdraw.cpp

Go to the documentation of this file.
00001 
00002 #include <GL/glut.h>
00003 
00004 #include <gobj.h>
00005 #include <displaypoints.h>
00006 
00007 #include <d4tessdraw.h>
00008 #include <tetrahedrondraw.h>
00009 
00010 
00011 
00012 typedef point3<double> pt3;
00013 typedef point3<double> const pt3c;
00014 typedef point4<double> pt4;
00015 typedef point4<double> const pt4c;
00016 
00017 typedef unsigned int uint;
00018 
00019 void d4tessdraw::meshupdate()
00020 {
00021   gdynamic.nuke();
00022 
00023   gobjContainer & g(*gobjContainer::global);
00024 
00025   uint i = g.v.size();
00026 
00027   // Writes all the graphics to gobjContainer::global
00028   graphicsDeffered.draw();
00029 
00030   uint k = g.v.size();
00031 
00032   for (uint j=i; j<k; ++j)
00033     gdynamic.push_back( g.v[j] );
00034 
00035   g.v.erase(g.v.begin()+i,g.v.end());
00036 
00037   assert(g.v.size()==i);
00038 }
00039 
00040 
00041 d4tessdraw::d4tessdraw
00042 (
00043   d4tess & _tess
00044 )
00045   : tess(_tess), gdynamic(true)
00046 {
00047   gobjContainer::global->push_back(&gdynamic);
00048 
00049   graphicsDeffered.push_back(new writepointsobj(tess));
00050   graphicsDeffered.push_back(new writesimplicesobj(tess));
00051   graphicsDeffered.push_back(new writewindingobj(tess));
00052   graphicsDeffered.push_back(new writegridobj(tess));
00053   graphicsDeffered.push_back(new writebaseobj(tess));
00054   graphicsDeffered.push_back(new writesurfaceobj(tess));
00055 
00056 
00057   graphicsImmediate.push_back(new writecpobj(tess));
00058 
00059   meshupdate();
00060 }
00061 
00062 void d4tessdraw::draw()
00063 {
00064   
00065   glPushAttrib(GL_CURRENT_BIT);
00066   glPushAttrib(GL_LIGHTING_BIT);
00067 
00068   graphicsImmediate.draw();
00069 
00070   glPopAttrib();
00071   glPopAttrib();
00072 }
00073 
00074 void writepointsobj::draw() const
00075 {
00076   gobjContainer & x = * gobjContainer::global;
00077 
00078   x.push_back( new gobjglPushAttrib(GL_CURRENT_BIT) );
00079   x.push_back( new gobjglPushAttrib(GL_LIGHTING_BIT) );
00080 
00081   x.push_back( new gobjglDisable(GL_LIGHTING) );
00082 
00083   x.push_back( new gobjglColor3ub(col) );
00084     
00085   displaypoints<pt4> dp(x,tess.pt);
00086 
00087   x.push_back( new gobjglPopAttrib() );
00088   x.push_back( new gobjglPopAttrib() );
00089 }
00090 
00091 
00092 void writecpobj::draw() const
00093 {
00094 
00095   pt4 P0,P1,P2,P3;
00096   tess.getpoints(P0,P1,P2,P3);
00097 
00098   glPushAttrib(GL_CURRENT_BIT);
00099   glPushAttrib(GL_LIGHTING_BIT);
00100 
00101     glBegin(GL_TRIANGLES);
00102 
00103     // Inner Triangle
00104 
00105     glColor3ub(128,0,128);
00106     glVertex3f(P1.x,P1.y,P1.z);
00107     glVertex3f(P0.x,P0.y,P0.z);
00108     glColor3ub(0,255,0);
00109     glVertex3f(P2.x,P2.y,P2.z);
00110 
00111 
00112     // Outer Triangle
00113 
00114     glColor3ub(0,255,0);
00115     glVertex3f(P2.x,P2.y,P2.z);
00116     glColor3ub(255,0,0);
00117     glVertex3f(P0.x,P0.y,P0.z);
00118     glVertex3f(P1.x,P1.y,P1.z);
00119 
00120     glEnd();
00121 
00122     glColor3ub(255,215,0);
00123 
00124     double const radius=0.02;
00125 
00126     glPushMatrix();
00127     glTranslatef(P0.x,P0.y,P0.z);
00128     glutSolidSphere(radius,10,10);
00129     glPopMatrix();
00130 
00131     glPushMatrix();
00132     glTranslatef(P1.x,P1.y,P1.z);
00133     glutSolidSphere(radius,10,10);
00134     glPopMatrix();
00135 
00136     glPushMatrix();
00137     glTranslatef(P2.x,P2.y,P2.z);
00138     glutSolidSphere(radius,10,10);
00139     glPopMatrix();
00140 
00141     glPushMatrix();
00142     glTranslatef(P3.x,P3.y,P3.z);
00143     glutSolidSphere(radius,10,10);
00144     glPopMatrix();
00145 
00146 // TODO - transparent sides for better visualization of cp
00147 
00148 // I am unable to get this working. 
00149 //
00150 //  What I wanted was transpent sides of the cp other than the base. 
00151 //  The color of the inner triangle should come through.
00152 
00153 //    glDisable(GL_DEPTH_TEST);
00154 //    glEnable(GL_BLEND);
00155 //    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00156 
00157 //    float const blendratio = 0.05;
00158     
00159 
00160 
00161 
00162     
00163 //    glBegin(GL_TRIANGLES);
00164 
00165 //    glVertex4f(P0.x,P0.y,P0.z,blendratio);
00166 //    glVertex4f(P2.x,P2.y,P2.z,blendratio);
00167 //    glVertex4f(P3.x,P3.y,P3.z,blendratio);
00168 
00169 /*
00170     glVertex3f(P0.x,P0.y,P0.z);
00171     glVertex3f(P2.x,P2.y,P2.z);
00172     glVertex3f(P3.x,P3.y,P3.z);
00173 
00174     glVertex3f(P2.x,P2.y,P2.z);
00175     glVertex3f(P1.x,P1.y,P1.z);
00176     glVertex3f(P3.x,P3.y,P3.z);
00177 
00178     glVertex3f(P0.x,P0.y,P0.z);
00179     glVertex3f(P3.x,P3.y,P3.z);
00180     glVertex3f(P1.x,P1.y,P1.z);
00181 */
00182 
00183 
00184 /*
00185     glVertex4f(P0.x,P0.y,P0.z,blendratio);
00186     glVertex4f(P1.x,P1.y,P1.z,blendratio);
00187     glVertex4f(P2.x,P2.y,P2.z,blendratio);
00188 
00189     glVertex4f(P0.x,P2.y,P2.z,blendratio);
00190     glVertex4f(P3.x,P3.y,P3.z,blendratio);
00191     glVertex4f(P0.x,P0.y,P0.z,blendratio);
00192 
00193     glVertex4f(P1.x,P1.y,P1.z,blendratio);
00194     glVertex4f(P0.x,P0.y,P0.z,blendratio);
00195     glVertex4f(P3.x,P3.y,P3.z,blendratio);
00196 
00197     glVertex4f(P2.x,P2.y,P2.z,blendratio);
00198     glVertex4f(P1.x,P1.y,P1.z,blendratio);
00199     glVertex4f(P3.x,P3.y,P3.z,blendratio);
00200 */
00201 
00202 //    glEnd();
00203 
00204 
00205     glDisable(GL_BLEND);
00206     glEnable(GL_DEPTH_TEST);
00207 
00208 
00209 
00210   glPopAttrib();
00211   glPopAttrib();
00212 
00213 }
00214 
00215 void writesurfaceobj::draw() const
00216 {
00217   gobjContainer & x = * gobjContainer::global;
00218 
00219   x.push_back( new gobjglPushAttrib(GL_CURRENT_BIT) );
00220   x.push_back( new gobjglPushAttrib(GL_LIGHTING_BIT) );
00221 
00222   x.push_back( new gobjglEnable(GL_LIGHTING) );
00223 
00224   x.push_back( new gobjglColor3ub(surfacecolor) );
00225 
00226   uintc imax = tess.vi.size();
00227   for (uint i=1; i<imax; ++i)
00228   {
00229     d4tri t(tess.vi[i]);
00230 
00231     if (t.isnull())
00232       continue;
00233 
00234     pt4c & P0(tess.pt[t.pi[0]]); 
00235     pt4c & P1(tess.pt[t.pi[1]]); 
00236     pt4c & P2(tess.pt[t.pi[2]]); 
00237     pt4c & P3(tess.pt[t.pi[2]]); 
00238 
00239     surface.eval(P0,P1,P2,P3);
00240   }
00241 
00242   x.push_back( new gobjglPopAttrib() );
00243   x.push_back( new gobjglPopAttrib() );
00244 }
00245 
00246 void writegridobj::draw() const
00247 {
00248   gobjContainer & x = * gobjContainer::global;
00249 
00250   x.push_back( new gobjglPushAttrib(GL_CURRENT_BIT) );
00251   x.push_back( new gobjglPushAttrib(GL_LIGHTING_BIT) );
00252 
00253 
00254   x.push_back( new gobjglDisable(GL_LIGHTING) );
00255 
00256 
00257   x.push_back( new gobjglColor3ub(gridcolor) );
00258 
00259   vector<pt4> const & pt(tess.pt);
00260   vector<d4tri> const & vi(tess.vi);
00261 
00262   x.push_back( new gobjglBegin(GL_LINES) );
00263 
00264   uintc imax = tess.vi.size();
00265   for (uint i=1; i<imax; ++i)
00266   {
00267     d4tri const & t(vi[i]);
00268 
00269     if (t.isnull())
00270       continue;
00271 
00272     pt4c & P0(pt[t.pi[0]]); 
00273     pt4c & P1(pt[t.pi[1]]); 
00274     pt4c & P2(pt[t.pi[2]]); 
00275     pt4c & P3(pt[t.pi[3]]); 
00276 
00277     x.push_back( new gobjglVertex3f(P0.x,P0.y,P0.z) );
00278     x.push_back( new gobjglVertex3f(P1.x,P1.y,P1.z) );
00279     x.push_back( new gobjglVertex3f(P0.x,P0.y,P0.z) );
00280     x.push_back( new gobjglVertex3f(P2.x,P2.y,P2.z) );
00281     x.push_back( new gobjglVertex3f(P0.x,P0.y,P0.z) );
00282     x.push_back( new gobjglVertex3f(P3.x,P3.y,P3.z) );
00283     x.push_back( new gobjglVertex3f(P1.x,P1.y,P1.z) );
00284     x.push_back( new gobjglVertex3f(P2.x,P2.y,P2.z) );
00285     x.push_back( new gobjglVertex3f(P1.x,P1.y,P1.z) );
00286     x.push_back( new gobjglVertex3f(P3.x,P3.y,P3.z) );
00287     x.push_back( new gobjglVertex3f(P2.x,P2.y,P2.z) );
00288     x.push_back( new gobjglVertex3f(P3.x,P3.y,P3.z) );
00289 
00290   }
00291 
00292   x.push_back( new gobjglEnd() );
00293 
00294   x.push_back( new gobjglPopAttrib() );
00295   x.push_back( new gobjglPopAttrib() );
00296 }
00297 
00298 
00299 
00300 
00301 void writesimplicesobj::draw() const
00302 {
00303   gobjContainer & x = * gobjContainer::global;
00304 
00305   x.push_back( new gobjglPushAttrib(GL_CURRENT_BIT) );
00306   x.push_back( new gobjglPushAttrib(GL_LIGHTING_BIT) );
00307 
00308   x.push_back( new gobjglDisable(GL_LIGHTING) );
00309 
00310   x.push_back( new gobjglColor3f(1.0,0.0,0.0) );
00311     
00312   uintc n = tess.vi.size();
00313   vector< pt4 > v;
00314   uint k;
00315   pt4 w;
00316 
00317   // The first tet is void.
00318   v.push_back(w);  
00319 
00320   for (uint i=1; i<n; ++i)
00321   {
00322     d4tri const & t(tess.vi[i]);
00323     w = pt4();
00324 
00325     for (k=0; k<4; ++k)
00326       w += tess.pt[ t.pi[k] ];
00327 
00328     w *= 0.25;
00329     v.push_back(w);
00330   }
00331 
00332   displaypoints<pt4> dp(x,v,false);
00333 
00334   x.push_back( new gobjglPopAttrib() );
00335   x.push_back( new gobjglPopAttrib() );
00336 }
00337 
00338 
00339 void writewindingobj::draw() const
00340 {
00341   uintc imax = tess.vi.size();
00342   for (uint i=1; i<imax; ++i)
00343   {
00344     d4tri const & t(tess.vi[i]);
00345 
00346     if (t.isnull())
00347       continue;
00348 
00349     pt4c & P0(tess.pt[t.pi[0]]); 
00350     pt4c & P1(tess.pt[t.pi[1]]); 
00351     pt4c & P2(tess.pt[t.pi[2]]); 
00352     pt4c & P3(tess.pt[t.pi[3]]); 
00353 
00354     tetrahedrondraw<double> td(P0,P1,P2,P3);
00355     td.displaywinding();
00356   }
00357 }
00358 
00359 void writebaseobj::draw() const
00360 {
00361   //glPushAttrib(GL_CURRENT_BIT);
00362   //glPushAttrib(GL_LIGHTING_BIT);
00363 
00364   //glBegin(GL_LINES);
00365 
00366   uintc imax = tess.vi.size();
00367   for (uint i=1; i<imax; ++i)
00368   {
00369     d4tri const & t(tess.vi[i]);
00370 
00371     if (t.isnull())
00372       continue;
00373 
00374     pt4c & P0(tess.pt[t.pi[0]]); 
00375     pt4c & P1(tess.pt[t.pi[1]]); 
00376     pt4c & P2(tess.pt[t.pi[2]]); 
00377     pt4c & P3(tess.pt[t.pi[3]]); 
00378 
00379     tetrahedrondraw<double> td(P0,P1,P2,P3);
00380     td.displaybase();
00381   }
00382 
00383   //glEnd();
00384 
00385   //glPopAttrib();
00386   //glPopAttrib();
00387 }
00388 
00389 

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