|
Blender
V2.59
|
00001 00029 #ifndef BSP_TMesh_h 00030 #define BSP_TMesh_h 00031 00032 #include "MT_Point3.h" 00033 #include "MT_Vector3.h" 00034 #include "MT_Transform.h" 00035 00036 #include "MEM_SmartPtr.h" 00037 00038 #include <vector> 00039 00040 #include "CSG_BooleanOps.h" 00041 00046 struct BSP_TVertex { 00047 MT_Point3 m_pos; 00048 }; 00049 00050 struct BSP_TFace { 00051 int m_verts[3]; 00052 MT_Vector3 m_normal; 00053 }; 00054 00055 00056 class BSP_TMesh { 00057 public : 00058 00059 std::vector<BSP_TVertex> m_verts; 00060 std::vector<BSP_TFace> m_faces; 00061 00062 MT_Vector3 m_min,m_max; 00063 00064 std::vector<BSP_TVertex> & 00065 VertexSet( 00066 ){ 00067 return m_verts; 00068 } 00069 00070 std::vector<BSP_TFace> & 00071 FaceSet( 00072 ) { 00073 return m_faces; 00074 } 00075 00076 void 00077 AddFace( 00078 int *verts, 00079 int num_verts 00080 ){ 00081 int i; 00082 for (i= 2; i <num_verts; i++) { 00083 BSP_TFace f; 00084 f.m_verts[0] = verts[0]; 00085 f.m_verts[1] = verts[i-1]; 00086 f.m_verts[2] = verts[i]; 00087 00088 m_faces.push_back(f); 00089 00090 BuildNormal(m_faces.back()); 00091 } 00092 } 00093 00094 void 00095 BuildNormal( 00096 BSP_TFace & f 00097 ) const { 00098 MT_Vector3 l1 = 00099 m_verts[f.m_verts[1]].m_pos - 00100 m_verts[f.m_verts[0]].m_pos; 00101 MT_Vector3 l2 = 00102 m_verts[f.m_verts[2]].m_pos - 00103 m_verts[f.m_verts[1]].m_pos; 00104 00105 MT_Vector3 normal = l1.cross(l2); 00106 00107 f.m_normal = normal.safe_normalized(); 00108 } 00109 00110 }; 00111 00112 00113 00124 struct VertexIt { 00125 BSP_TMesh * mesh; 00126 BSP_TVertex * pos; 00127 MT_Transform trans; 00128 }; 00129 00130 00131 static 00132 void 00133 VertexIt_Destruct( 00134 CSG_VertexIteratorDescriptor * iterator 00135 ) { 00136 delete ((VertexIt *)(iterator->it)); 00137 iterator->it = NULL; 00138 delete(iterator); 00139 }; 00140 00141 00142 static 00143 int 00144 VertexIt_Done( 00145 CSG_IteratorPtr it 00146 ) { 00147 // assume CSG_IteratorPtr is of the correct type. 00148 VertexIt * vertex_it = (VertexIt *)it; 00149 00150 if (vertex_it->pos < vertex_it->mesh->VertexSet().end()) return 0; 00151 return 1; 00152 }; 00153 00154 static 00155 void 00156 VertexIt_Fill( 00157 CSG_IteratorPtr it, 00158 CSG_IVertex *vert 00159 ) { 00160 // assume CSG_IteratorPtr is of the correct type. 00161 VertexIt * vertex_it = (VertexIt *)it; 00162 00163 MT_Point3 p = vertex_it->pos->m_pos; 00164 p = vertex_it->trans * p; 00165 00166 p.getValue(vert->position); 00167 }; 00168 00169 static 00170 void 00171 VertexIt_Step( 00172 CSG_IteratorPtr it 00173 ) { 00174 // assume CSG_IteratorPtr is of the correct type. 00175 VertexIt * vertex_it = (VertexIt *)it; 00176 00177 ++(vertex_it->pos); 00178 }; 00179 00180 static 00181 void 00182 VertexIt_Reset( 00183 CSG_IteratorPtr it 00184 ) { 00185 // assume CSG_IteratorPtr is of the correct type. 00186 VertexIt * vertex_it = (VertexIt *)it; 00187 00188 vertex_it->pos = vertex_it->mesh->VertexSet().begin(); 00189 }; 00190 00191 static 00192 CSG_VertexIteratorDescriptor * 00193 VertexIt_Construct( 00194 BSP_TMesh *mesh, 00195 MT_Transform trans 00196 ){ 00197 // user should have insured mesh is not equal to NULL. 00198 00199 CSG_VertexIteratorDescriptor * output = new CSG_VertexIteratorDescriptor; 00200 if (output == NULL) return NULL; 00201 output->Done = VertexIt_Done; 00202 output->Fill = VertexIt_Fill; 00203 output->Step = VertexIt_Step; 00204 output->Reset = VertexIt_Reset; 00205 output->num_elements = mesh->VertexSet().size(); 00206 00207 VertexIt * v_it = new VertexIt; 00208 v_it->mesh = mesh; 00209 v_it->pos = mesh->VertexSet().begin(); 00210 v_it->trans = trans; 00211 output->it = v_it; 00212 return output; 00213 }; 00214 00215 00220 struct FaceIt { 00221 BSP_TMesh * mesh; 00222 BSP_TFace *pos; 00223 }; 00224 00225 00226 static 00227 void 00228 FaceIt_Destruct( 00229 CSG_FaceIteratorDescriptor * iterator 00230 ) { 00231 delete ((FaceIt *)(iterator->it)); 00232 iterator->it = NULL; 00233 delete(iterator); 00234 }; 00235 00236 00237 static 00238 int 00239 FaceIt_Done( 00240 CSG_IteratorPtr it 00241 ) { 00242 // assume CSG_IteratorPtr is of the correct type. 00243 FaceIt * face_it = (FaceIt *)it; 00244 00245 if (face_it->pos < face_it->mesh->FaceSet().end()) { 00246 return 0; 00247 } 00248 return 1; 00249 }; 00250 00251 static 00252 void 00253 FaceIt_Fill( 00254 CSG_IteratorPtr it, 00255 CSG_IFace *face 00256 ){ 00257 // assume CSG_IteratorPtr is of the correct type. 00258 FaceIt * face_it = (FaceIt *)it; 00259 // essentially iterating through a triangle fan here. 00260 00261 face->vertex_index[0] = int(face_it->pos->m_verts[0]); 00262 face->vertex_index[1] = int(face_it->pos->m_verts[1]); 00263 face->vertex_index[2] = int(face_it->pos->m_verts[2]); 00264 00265 face->vertex_number = 3; 00266 }; 00267 00268 static 00269 void 00270 FaceIt_Step( 00271 CSG_IteratorPtr it 00272 ) { 00273 // assume CSG_IteratorPtr is of the correct type. 00274 FaceIt * face_it = (FaceIt *)it; 00275 00276 face_it->pos ++; 00277 }; 00278 00279 static 00280 void 00281 FaceIt_Reset( 00282 CSG_IteratorPtr it 00283 ) { 00284 // assume CSG_IteratorPtr is of the correct type. 00285 FaceIt * face_it = (FaceIt *)it; 00286 00287 face_it->pos = face_it->mesh->FaceSet().begin(); 00288 }; 00289 00290 static 00291 CSG_FaceIteratorDescriptor * 00292 FaceIt_Construct( 00293 BSP_TMesh * mesh 00294 ) { 00295 CSG_FaceIteratorDescriptor * output = new CSG_FaceIteratorDescriptor; 00296 if (output == NULL) return NULL; 00297 00298 output->Done = FaceIt_Done; 00299 output->Fill = FaceIt_Fill; 00300 output->Step = FaceIt_Step; 00301 output->Reset = FaceIt_Reset; 00302 00303 output->num_elements = mesh->FaceSet().size(); 00304 00305 FaceIt * f_it = new FaceIt; 00306 f_it->mesh = mesh; 00307 f_it->pos = mesh->FaceSet().begin(); 00308 00309 output->it = f_it; 00310 00311 return output; 00312 }; 00313 00318 static 00319 MEM_SmartPtr<BSP_TMesh> 00320 BuildMesh( 00321 CSG_MeshPropertyDescriptor &props, 00322 CSG_FaceIteratorDescriptor &face_it, 00323 CSG_VertexIteratorDescriptor &vertex_it 00324 ) { 00325 MEM_SmartPtr<BSP_TMesh> mesh = new BSP_TMesh(); 00326 00327 CSG_IVertex vert; 00328 00329 while (!vertex_it.Done(vertex_it.it)) { 00330 00331 vertex_it.Fill(vertex_it.it,&vert); 00332 00333 BSP_TVertex v; 00334 v.m_pos = MT_Point3(vert.position); 00335 mesh->VertexSet().push_back(v); 00336 00337 vertex_it.Step(vertex_it.it); 00338 } 00339 00340 00341 CSG_IFace face; 00342 00343 while (!face_it.Done(face_it.it)) { 00344 face_it.Fill(face_it.it,&face); 00345 00346 BSP_TFace f; 00347 00348 f.m_verts[0] = face.vertex_index[0], 00349 f.m_verts[1] = face.vertex_index[1], 00350 f.m_verts[2] = face.vertex_index[2], 00351 00352 mesh->BuildNormal(f); 00353 00354 mesh->FaceSet().push_back(f); 00355 00356 face_it.Step(face_it.it); 00357 } 00358 00359 return mesh; 00360 }; 00361 00362 00363 00364 00365 00366 00367 00368 00369 00370 00371 00372 00373 00374 00375 00376 00377 00378 00379 00380 00381 00382 00383 00384 00385 00386 00387 00388 00389 00390 00391 00392 00393 00394 00395 00396 00397 #endif 00398