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