Files Classes Functions Hierarchy
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
1.5.8