00001
00002 #include <blort/TomGine/tgShapeCreator.h>
00003 #include <blort/TomGine/tgCollission.h>
00004 #include <stdlib.h>
00005 #include <string.h>
00006 #include <stdio.h>
00007
00008 using namespace TomGine;
00009
00010 void tgShapeCreator::init_tetrahedron(){
00011 float sqrt3 = 1.0f / sqrt(3.0f);
00012 float tetrahedron_vertices[] = {sqrt3, sqrt3, sqrt3,
00013 -sqrt3, -sqrt3, sqrt3,
00014 -sqrt3, sqrt3, -sqrt3,
00015 sqrt3, -sqrt3, -sqrt3};
00016 int tetrahedron_faces[] = {0, 2, 1, 0, 1, 3, 2, 3, 1, 3, 2, 0};
00017
00018 n_vertices = 4;
00019 n_faces = 4;
00020 n_edges = 6;
00021 vertices = (float*)malloc(3*n_vertices*sizeof(float));
00022 faces = (int*)malloc(3*n_faces*sizeof(int));
00023 memcpy ((void*)vertices, (void*)tetrahedron_vertices, 3*n_vertices*sizeof(float));
00024 memcpy ((void*)faces, (void*)tetrahedron_faces, 3*n_faces*sizeof(int));
00025 }
00026
00027 void tgShapeCreator::init_octahedron(){
00028 float octahedron_vertices[] = {0.0, 0.0, -1.0,
00029 1.0, 0.0, 0.0,
00030 0.0, -1.0, 0.0,
00031 -1.0, 0.0, 0.0,
00032 0.0, 1.0, 0.0,
00033 0.0, 0.0, 1.0};
00034 int octahedron_faces[] = {0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 5, 2, 1, 5, 3, 2, 5, 4, 3, 5, 1, 4};
00035
00036 n_vertices = 6;
00037 n_faces = 8;
00038 n_edges = 12;
00039 vertices = (float*)malloc(3*n_vertices*sizeof(float));
00040 faces = (int*)malloc(3*n_faces*sizeof(int));
00041 memcpy ((void*)vertices, (void*)octahedron_vertices, 3*n_vertices*sizeof(float));
00042 memcpy ((void*)faces, (void*)octahedron_faces, 3*n_faces*sizeof(int));
00043 }
00044
00045 void tgShapeCreator::init_icosahedron(){
00046 float t = (1+sqrt(5.0f))/2;
00047 float tau = t/sqrt(1+t*t);
00048 float one = 1/sqrt(1+t*t);
00049
00050 float icosahedron_vertices[] = {tau, one, 0.0,
00051 -tau, one, 0.0,
00052 -tau, -one, 0.0,
00053 tau, -one, 0.0,
00054 one, 0.0 , tau,
00055 one, 0.0 , -tau,
00056 -one, 0.0 , -tau,
00057 -one, 0.0 , tau,
00058 0.0 , tau, one,
00059 0.0 , -tau, one,
00060 0.0 , -tau, -one,
00061 0.0 , tau, -one};
00062 int icosahedron_faces[] = {4, 8, 7,
00063 4, 7, 9,
00064 5, 6, 11,
00065 5, 10, 6,
00066 0, 4, 3,
00067 0, 3, 5,
00068 2, 7, 1,
00069 2, 1, 6,
00070 8, 0, 11,
00071 8, 11, 1,
00072 9, 10, 3,
00073 9, 2, 10,
00074 8, 4, 0,
00075 11, 0, 5,
00076 4, 9, 3,
00077 5, 3, 10,
00078 7, 8, 1,
00079 6, 1, 11,
00080 7, 2, 9,
00081 6, 10, 2};
00082
00083 n_vertices = 12;
00084 n_faces = 20;
00085 n_edges = 30;
00086 vertices = (float*)malloc(3*n_vertices*sizeof(float));
00087 faces = (int*)malloc(3*n_faces*sizeof(int));
00088 memcpy ((void*)vertices, (void*)icosahedron_vertices, 3*n_vertices*sizeof(float));
00089 memcpy ((void*)faces, (void*)icosahedron_faces, 3*n_faces*sizeof(int));
00090 }
00091
00092 int tgShapeCreator::search_midpoint(int index_start, int index_end){
00093 int i;
00094 for (i=0; i<edge_walk; i++)
00095 if ((start[i] == index_start && end[i] == index_end) ||
00096 (start[i] == index_end && end[i] == index_start))
00097 {
00098 int res = midpoint[i];
00099
00100
00101 start[i] = start[edge_walk-1];
00102 end[i] = end[edge_walk-1];
00103 midpoint[i] = midpoint[edge_walk-1];
00104 edge_walk--;
00105
00106 return res;
00107 }
00108
00109
00110 start[edge_walk] = index_start;
00111 end[edge_walk] = index_end;
00112 midpoint[edge_walk] = n_vertices;
00113
00114
00115 vertices[3*n_vertices] = (vertices[3*index_start] + vertices[3*index_end]) / 2.0f;
00116 vertices[3*n_vertices+1] = (vertices[3*index_start+1] + vertices[3*index_end+1]) / 2.0f;
00117 vertices[3*n_vertices+2] = (vertices[3*index_start+2] + vertices[3*index_end+2]) / 2.0f;
00118
00119
00120 float length = sqrt (vertices[3*n_vertices] * vertices[3*n_vertices] +
00121 vertices[3*n_vertices+1] * vertices[3*n_vertices+1] +
00122 vertices[3*n_vertices+2] * vertices[3*n_vertices+2]);
00123 length = 1/length;
00124 vertices[3*n_vertices] *= length;
00125 vertices[3*n_vertices+1] *= length;
00126 vertices[3*n_vertices+2] *= length;
00127
00128 n_vertices++;
00129 edge_walk++;
00130 return midpoint[edge_walk-1];
00131 }
00132
00133 void tgShapeCreator::subdivide(){
00134 int n_vertices_new = n_vertices+2*n_edges;
00135 int n_faces_new = 4*n_faces;
00136 int i;
00137
00138 edge_walk = 0;
00139 n_edges = 2*n_vertices + 3*n_faces;
00140 start = (int*)malloc(n_edges*sizeof (int));
00141 end = (int*)malloc(n_edges*sizeof (int));
00142 midpoint = (int*)malloc(n_edges*sizeof (int));
00143
00144 int *faces_old = (int*)malloc (3*n_faces*sizeof(int));
00145 faces_old = (int*)memcpy((void*)faces_old, (void*)faces, 3*n_faces*sizeof(int));
00146 vertices = (float*)realloc ((void*)vertices, 3*n_vertices_new*sizeof(float));
00147 faces = (int*)realloc ((void*)faces, 3*n_faces_new*sizeof(int));
00148 n_faces_new = 0;
00149
00150 for (i=0; i<n_faces; i++)
00151 {
00152 int a = faces_old[3*i];
00153 int b = faces_old[3*i+1];
00154 int c = faces_old[3*i+2];
00155
00156 int ab_midpoint = search_midpoint (b, a);
00157 int bc_midpoint = search_midpoint (c, b);
00158 int ca_midpoint = search_midpoint (a, c);
00159
00160 faces[3*n_faces_new] = a;
00161 faces[3*n_faces_new+1] = ab_midpoint;
00162 faces[3*n_faces_new+2] = ca_midpoint;
00163 n_faces_new++;
00164 faces[3*n_faces_new] = ca_midpoint;
00165 faces[3*n_faces_new+1] = ab_midpoint;
00166 faces[3*n_faces_new+2] = bc_midpoint;
00167 n_faces_new++;
00168 faces[3*n_faces_new] = ca_midpoint;
00169 faces[3*n_faces_new+1] = bc_midpoint;
00170 faces[3*n_faces_new+2] = c;
00171 n_faces_new++;
00172 faces[3*n_faces_new] = ab_midpoint;
00173 faces[3*n_faces_new+1] = b;
00174 faces[3*n_faces_new+2] = bc_midpoint;
00175 n_faces_new++;
00176 }
00177 n_faces = n_faces_new;
00178 free (start);
00179 free (end);
00180 free (midpoint);
00181 free (faces_old);
00182 }
00183
00184 tgShapeCreator::tgShapeCreator(){
00185 vertices = 0;
00186 faces = 0;
00187 start = 0;
00188 end = 0;
00189 midpoint = 0;
00190 }
00191
00192 void tgShapeCreator::CreateSphere(tgModel& model, float radius, int subdevisions, int method){
00193 int i;
00194 int vidx = model.getVertexSize();
00195 tgVertex v;
00196 tgFace f;
00197
00198
00199 switch(method){
00200 case TETRAHEDRON:
00201 init_tetrahedron ();
00202 break;
00203 case OCTAHEDRON:
00204 init_octahedron ();
00205 break;
00206 case ICOSAHEDRON:
00207 init_icosahedron();
00208 break;
00209 default:
00210 init_icosahedron();
00211 break;
00212 }
00213
00214
00215 for(i=0; i<subdevisions; i++)
00216 subdivide();
00217
00218
00219 for(i=0; i<n_vertices; i++){
00220 v.pos.x = radius * vertices[3*i+0];
00221 v.pos.y = radius * vertices[3*i+1];
00222 v.pos.z = radius * vertices[3*i+2];
00223 v.normal = v.pos;
00224 v.normal.normalize();
00225 model.m_vertices.push_back(v);
00226 }
00227
00228
00229 for(i=0; i<n_faces; i++){
00230 f.v.clear();
00231 f.v.push_back(vidx+faces[3*i+0]);
00232 f.v.push_back(vidx+faces[3*i+1]);
00233 f.v.push_back(vidx+faces[3*i+2]);
00234 model.m_faces.push_back(f);
00235 }
00236
00237 if(vertices) free (vertices);
00238 if(faces) free (faces);
00239
00240 }
00241
00242 void tgShapeCreator::CreateBox(tgModel& model, float x, float y, float z){
00243 tgVertex v;
00244 tgFace f;
00245 int vidx = model.getVertexSize();
00246 x = x*0.5f;
00247 y = y*0.5f;
00248 z = z*0.5f;
00249
00250
00251
00252 v.pos = vec3(-x,-y, z); v.normal = vec3( 0.0f, 0.0f, 1.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00253 v.pos = vec3( x,-y, z); v.normal = vec3( 0.0f, 0.0f, 1.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00254 v.pos = vec3( x, y, z); v.normal = vec3( 0.0f, 0.0f, 1.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00255 v.pos = vec3(-x, y, z); v.normal = vec3( 0.0f, 0.0f, 1.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00256 model.m_faces.push_back(f); f.v.clear();
00257
00258
00259 v.pos = vec3( x,-y,-z); v.normal = vec3( 0.0f, 0.0f,-1.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00260 v.pos = vec3(-x,-y,-z); v.normal = vec3( 0.0f, 0.0f,-1.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00261 v.pos = vec3(-x, y,-z); v.normal = vec3( 0.0f, 0.0f,-1.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00262 v.pos = vec3( x, y,-z); v.normal = vec3( 0.0f, 0.0f,-1.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00263 model.m_faces.push_back(f); f.v.clear();
00264
00265
00266 v.pos = vec3( x,-y, z); v.normal = vec3( 1.0f, 0.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00267 v.pos = vec3( x,-y,-z); v.normal = vec3( 1.0f, 0.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00268 v.pos = vec3( x, y,-z); v.normal = vec3( 1.0f, 0.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00269 v.pos = vec3( x, y, z); v.normal = vec3( 1.0f, 0.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00270 model.m_faces.push_back(f); f.v.clear();
00271
00272
00273 v.pos = vec3(-x,-y,-z); v.normal = vec3(-1.0f, 0.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00274 v.pos = vec3(-x,-y, z); v.normal = vec3(-1.0f, 0.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00275 v.pos = vec3(-x, y, z); v.normal = vec3(-1.0f, 0.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00276 v.pos = vec3(-x, y,-z); v.normal = vec3(-1.0f, 0.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00277 model.m_faces.push_back(f); f.v.clear();
00278
00279
00280 v.pos = vec3(-x, y, z); v.normal = vec3( 0.0f, 1.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00281 v.pos = vec3( x, y, z); v.normal = vec3( 0.0f, 1.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00282 v.pos = vec3( x, y,-z); v.normal = vec3( 0.0f, 1.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00283 v.pos = vec3(-x, y,-z); v.normal = vec3( 0.0f, 1.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00284 model.m_faces.push_back(f); f.v.clear();
00285
00286
00287 v.pos = vec3( x,-y, z); v.normal = vec3( 0.0f,-1.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00288 v.pos = vec3(-x,-y, z); v.normal = vec3( 0.0f,-1.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00289 v.pos = vec3(-x,-y,-z); v.normal = vec3( 0.0f,-1.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00290 v.pos = vec3( x,-y,-z); v.normal = vec3( 0.0f,-1.0f, 0.0f); model.m_vertices.push_back(v); f.v.push_back(vidx++);
00291 model.m_faces.push_back(f); f.v.clear();
00292 }
00293
00294 void tgShapeCreator::CreateCylinder(tgModel &model, float radius, float height, int slices, int stacks, bool closed){
00295 int x,z;
00296 int vidx = model.getVertexSize();
00297 float alpha = 2*PI / slices;
00298 float deltaH = height / stacks;
00299 tgVertex v[4];
00300 tgFace f;
00301
00302 for(z=0; z<stacks; z++){
00303 for(x=0; x<slices; x++){
00304 f.v.clear();
00305
00306 v[0].pos.x = radius * cos(alpha*x);
00307 v[0].pos.y = radius * sin(alpha*x);
00308 v[0].pos.z = deltaH*z - height*0.5f;
00309 v[0].normal.x = v[0].pos.x;
00310 v[0].normal.y = v[0].pos.y;
00311 v[0].normal.z = 0.0f;
00312 v[0].normal = normalize(v[0].normal);
00313 model.m_vertices.push_back(v[0]);
00314 f.v.push_back(vidx++);
00315
00316 v[1].pos.x = radius * cos(alpha*(x+1));
00317 v[1].pos.y = radius * sin(alpha*(x+1));
00318 v[1].pos.z = deltaH*z - height*0.5f;
00319 v[1].normal.x = v[1].pos.x;
00320 v[1].normal.y = v[1].pos.y;
00321 v[1].normal.z = 0.0f;
00322 v[1].normal = normalize(v[1].normal);
00323 model.m_vertices.push_back(v[1]);
00324 f.v.push_back(vidx++);
00325
00326 v[2].pos.x = radius * cos(alpha*(x+1));
00327 v[2].pos.y = radius * sin(alpha*(x+1));
00328 v[2].pos.z = deltaH*(z+1) - height*0.5f;
00329 v[2].normal.x = v[2].pos.x;
00330 v[2].normal.y = v[2].pos.y;
00331 v[2].normal.z = 0.0f;
00332 v[2].normal = normalize(v[2].normal);
00333 model.m_vertices.push_back(v[2]);
00334 f.v.push_back(vidx++);
00335
00336 v[3].pos.x = radius * cos(alpha*x);
00337 v[3].pos.y = radius * sin(alpha*x);
00338 v[3].pos.z = deltaH*(z+1) - height*0.5f;
00339 v[3].normal.x = v[3].pos.x;
00340 v[3].normal.y = v[3].pos.y;
00341 v[3].normal.z = 0.0f;
00342 v[3].normal = normalize(v[3].normal);
00343 model.m_vertices.push_back(v[3]);
00344 f.v.push_back(vidx++);
00345 model.m_faces.push_back(f);
00346 }
00347 }
00348
00349 if(closed){
00350 for(z=0; z<2; z++){
00351 deltaH = height*z - height*0.5f;
00352
00353 for(x=0; x<slices; x++){
00354 f.v.clear();
00355
00356 v[0].pos = vec3(0.0,0.0,deltaH);
00357 v[0].normal = normalize(v[0].pos);
00358 model.m_vertices.push_back(v[0]);
00359 f.v.push_back(vidx++);
00360
00361 v[1].pos.x = radius * cos(alpha*x);
00362 v[1].pos.y = radius * sin(alpha*x);
00363 v[1].pos.z = deltaH;
00364 v[1].normal = v[0].normal;
00365 model.m_vertices.push_back(v[1]);
00366 f.v.push_back(vidx++);
00367
00368 v[2].pos.x = radius * cos(alpha*(x+(float(z)-0.5f)*2.0f));
00369 v[2].pos.y = radius * sin(alpha*(x+(float(z)-0.5f)*2.0f));
00370 v[2].pos.z = deltaH;
00371 v[2].normal = v[0].normal;
00372 model.m_vertices.push_back(v[2]);
00373 f.v.push_back(vidx++);
00374 model.m_faces.push_back(f);
00375 }
00376 }
00377 }
00378 }
00379
00380 void tgShapeCreator::CreateCone(tgModel &model, float radius, float height, int slices, int stacks, bool closed){
00381
00382 if(stacks<=0 || slices<=2)
00383 return;
00384
00385 int x,z;
00386 int vidx = model.getVertexSize();
00387 float alpha = 2*PI / slices;
00388 float deltaH = height / stacks;
00389 float deltaR = radius / stacks;
00390 tgVertex v[4];
00391 tgFace f;
00392
00393 for(z=0; z<stacks; z++){
00394 for(x=0; x<slices; x++){
00395 f.v.clear();
00396
00397 v[0].pos.x = deltaR*z * cos(alpha*x);
00398 v[0].pos.y = deltaR*z * sin(alpha*x);
00399 v[0].pos.z = deltaH*z;
00400 v[0].normal.x = v[0].pos.x;
00401 v[0].normal.y = v[0].pos.y;
00402 v[0].normal.z = 0.0f;
00403 v[0].normal = normalize(v[0].normal);
00404 model.m_vertices.push_back(v[0]);
00405 f.v.push_back(vidx++);
00406
00407 v[1].pos.x = deltaR*z * cos(alpha*(x+1));
00408 v[1].pos.y = deltaR*z * sin(alpha*(x+1));
00409 v[1].pos.z = deltaH*z;
00410 v[1].normal.x = v[1].pos.x;
00411 v[1].normal.y = v[1].pos.y;
00412 v[1].normal.z = 0.0f;
00413 v[1].normal = normalize(v[1].normal);
00414 model.m_vertices.push_back(v[1]);
00415 f.v.push_back(vidx++);
00416
00417 v[2].pos.x = deltaR*(z+1) * cos(alpha*(x+1));
00418 v[2].pos.y = deltaR*(z+1) * sin(alpha*(x+1));
00419 v[2].pos.z = deltaH*(z+1);
00420 v[2].normal.x = v[2].pos.x;
00421 v[2].normal.y = v[2].pos.y;
00422 v[2].normal.z = 0.0f;
00423 v[2].normal = normalize(v[2].normal);
00424 model.m_vertices.push_back(v[2]);
00425 f.v.push_back(vidx++);
00426
00427 v[3].pos.x = deltaR*(z+1) * cos(alpha*x);
00428 v[3].pos.y = deltaR*(z+1) * sin(alpha*x);
00429 v[3].pos.z = deltaH*(z+1);
00430 v[3].normal.x = v[3].pos.x;
00431 v[3].normal.y = v[3].pos.y;
00432 v[3].normal.z = 0.0f;
00433 v[3].normal = normalize(v[3].normal);
00434 model.m_vertices.push_back(v[3]);
00435 f.v.push_back(vidx++);
00436 model.m_faces.push_back(f);
00437 }
00438 }
00439
00440 if(closed){
00441 for(x=0; x<slices; x++){
00442 f.v.clear();
00443
00444 v[0].pos = vec3(0.0f,0.0f,height);
00445 v[0].normal = normalize(v[0].pos);
00446 model.m_vertices.push_back(v[0]);
00447 f.v.push_back(vidx++);
00448
00449 v[1].pos.x = radius * cos(alpha*x);
00450 v[1].pos.y = radius * sin(alpha*x);
00451 v[1].pos.z = height;
00452 v[1].normal = v[0].normal;
00453 model.m_vertices.push_back(v[1]);
00454 f.v.push_back(vidx++);
00455
00456 v[2].pos.x = radius * cos(alpha*(x+(float(z)-0.5f)*2.0f));
00457 v[2].pos.y = radius * sin(alpha*(x+(float(z)-0.5f)*2.0f));
00458 v[2].pos.z = height;
00459 v[2].normal = v[0].normal;
00460 model.m_vertices.push_back(v[2]);
00461 f.v.push_back(vidx++);
00462 model.m_faces.push_back(f);
00463 }
00464 }
00465 }
00466
00467
00468 void tgShapeCreator::TriangulatePolygon(tgModel& model, std::vector<vec3> points){
00469 int i,s;
00470 int idx = model.m_vertices.size();
00471 bool pointInTriangle;
00472 bool pointIsConvex;
00473 vec3 e1, e2, n, poly_normal;
00474 vec3 v0, v1, v2;
00475 tgVertex v;
00476 tgFace f;
00477 std::vector<tgVertex> vertices;
00478 std::vector<tgVertex>::iterator v_act, v_pre, v_post, v_in;
00479
00480 s=points.size();
00481 if(s<3){
00482 printf("[tgModel::TriangulatePolygon] Warning to few points for polygon: %d\n", s);
00483 return;
00484 }
00485
00486 for(i=0; i<s; i++){
00487
00488 v0 = points[i];
00489 v1 = points[(i+1)%s];
00490 v2 = points[(i+s-1)%s];
00491 e1 = v1-v0;
00492 e2 = v2-v0;
00493 e1.normalize();
00494 e2.normalize();
00495 n.cross(e1,e2);
00496 poly_normal = poly_normal + n;
00497 v.pos = v0;
00498 vertices.push_back(v);
00499 }
00500
00501 poly_normal.normalize();
00502 v_act = vertices.begin();
00503 while(vertices.size()>2){
00504
00505 if(v_act==vertices.end()-1){
00506 v_pre = v_act-1;
00507 v_post = vertices.begin();
00508 }else if(v_act==vertices.begin()){
00509 v_pre = vertices.end()-1;
00510 v_post = v_act+1;
00511 }else{
00512 v_pre = v_act-1;
00513 v_post = v_act+1;
00514 }
00515
00516
00517 v0 = (*v_act).pos;
00518 v1 = (*v_post).pos;
00519 v2 = (*v_pre).pos;
00520 e1 = v1-v0;
00521 e2 = v2-v0;
00522 e1.normalize();
00523 e2.normalize();
00524 (*v_act).normal.cross(e1,e2);
00525 (*v_act).normal.normalize();
00526
00527 if((*v_act).normal * poly_normal > 0.0){
00528 pointIsConvex = true;
00529 }
00530
00531
00532 pointInTriangle = false;
00533 if(pointIsConvex)
00534 {
00535 pointInTriangle = false;
00536 for(v_in=vertices.begin(); v_in<vertices.end() && vertices.size()>3; ++v_in)
00537 {
00538 if(v_in!=v_act && v_in!=v_pre && v_in!=v_post)
00539 pointInTriangle = tgCollission::PointInTriangle( (*v_in).pos, (*v_post).pos, (*v_act).pos, (*v_pre).pos );
00540 }
00541 }
00542
00543 if(pointIsConvex && !pointInTriangle){
00544
00545 f.v.clear();
00546
00547 (*v_pre).normal = poly_normal;
00548 (*v_act).normal = poly_normal;
00549 (*v_post).normal = poly_normal;
00550
00551 model.m_vertices.push_back(*v_pre); f.v.push_back(idx); idx++;
00552 model.m_vertices.push_back(*v_act); f.v.push_back(idx); idx++;
00553 model.m_vertices.push_back(*v_post); f.v.push_back(idx); idx++;
00554
00555 f.normal = poly_normal;
00556 model.m_faces.push_back(f);
00557 vertices.erase(v_act);
00558
00559 }else{
00560 v_act = v_post;
00561 }
00562 }
00563 }
00564