Blender  V2.59
BSP_TMesh.h
Go to the documentation of this file.
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