Ignore:
Timestamp:
02/05/07 13:29:55 (17 years ago)
Author:
gumbau
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/vmi/src/mesh.cpp

    r983 r2090  
    1111using namespace VMI; 
    1212 
    13 #define MAX_NUM_TRI 450 
    14  
     13#define OUTPUT_SEVERAL_GROUPS 
     14 
     15/////////////////////////////////////////////////////////////////////////////// 
     16// list of integers 
    1517void VMI::printItemList(int *list, int n) { 
    1618    int i; 
     
    3537        list[(*n)++] = item; 
    3638} 
     39 
     40void VMI::delItem(int *list, int *n, int item) { 
     41    int i, j; 
     42     
     43    for (i=0; i<*n; i++) { 
     44        if (list[i] == item) { 
     45            // delete it 
     46            for (j =i + 1 ; j<*n; j++) 
     47                list[j - 1] = list[j]; 
     48            (*n)--; 
     49            i--; // Delete all ocurrencies of an item 
     50        } 
     51    } 
     52} 
     53/////////////////////////////////////////////////////////////////////////////// 
    3754 
    3855int VMI::findEdge(Edge *e, GLuint num, GLuint _u, GLuint _v) { 
     
    5673 
    5774    return found; 
     75} 
     76 
     77// Adds a new edge at the end of the mesh edge list 
     78Edge *VMI::addEdge(Edge *list, int *n, int u, int v, int *pos) { 
     79          Edge *newList; 
     80 
     81                // Reallocate memory for the new edge 
     82    newList = (Edge *)realloc(list, ((*n) + 1) * sizeof(Edge)); 
     83 
     84                // New vertex indices 
     85                newList[*n].u = u; 
     86    newList[*n].v = v; 
     87 
     88                // This edge has no triangle adjancency 
     89                newList[*n].numTriangles = 0; 
     90                newList[*n].triangles = NULL; 
     91                 
     92                // Enable the new edge 
     93                newList[*n].enable = TRUE; 
     94 
     95                // New edge position 
     96                *pos = *n; 
     97 
     98                // New number of edges 
     99          (*n)++; 
     100 
     101                return newList; 
    58102} 
    59103 
     
    131175Mesh *VMI::initMesh(GLMmodel* pmodel) { 
    132176 
    133     GLuint i, j, v1, v2, v3, n, e, t; 
     177    GLuint i, j, curGroup, v1, v2, v3, n, m, t; 
     178    int e; 
    134179    Mesh *mesh; 
     180    GLMgroup *group; 
    135181 
    136182    mesh = (Mesh *)malloc (sizeof(Mesh)); 
     
    157203    printf("Adding vertices..."); 
    158204    for (i=1; i<=pmodel->numvertices; i++) { // Vertices start at 1 
    159  
    160205        mesh->vertices[i - 1].x = pmodel->vertices[3 * i + 0]; 
    161206        mesh->vertices[i - 1].y = pmodel->vertices[3 * i + 1]; 
     
    170215 
    171216    printf("Adding triangles..."); 
     217 
     218#ifdef OUTPUT_SEVERAL_GROUPS 
     219    group = pmodel->groups; 
     220    curGroup=0; // current group 
     221    while(group) { 
     222         
     223        for (i=0; i<group->numtriangles; i++) { 
     224             
     225            t = group->triangles[i]; 
     226 
     227            mesh->triangles[t].id = t; 
     228            mesh->triangles[t].group = curGroup; // set group 
     229            mesh->triangles[t].indices[0] = pmodel->triangles[t].vindices[0] - 1; 
     230            mesh->triangles[t].indices[1] = pmodel->triangles[t].vindices[1] - 1; 
     231            mesh->triangles[t].indices[2] = pmodel->triangles[t].vindices[2] - 1; 
     232            mesh->triangles[t].area = computeTriangleArea(mesh->vertices, &mesh->triangles[t]); 
     233            //printf("\n%d a: %f",i , mesh->triangles[i].area); 
     234            computeTriangleNormal(mesh->vertices, &mesh->triangles[t]); 
     235             
     236            mesh->triangles[t].saliency = 0.0; 
     237             
     238            mesh->triangles[t].enable = GL_TRUE; 
     239             
     240            for (j=0; j<3; j++) { 
     241                // Adding triangle i adjacent to 3 vertices 
     242                v1 = mesh->triangles[t].indices[j]; 
     243                 
     244                // Reallocate memory for the new adjacent triangle 
     245                mesh->vertices[v1].triangles =  
     246                                        (GLuint *)realloc(mesh->vertices[v1].triangles, (mesh->vertices[v1].numTriangles + 1) * sizeof(GLuint)); 
     247                addItem((int *)mesh->vertices[v1].triangles, (int *)&mesh->vertices[v1].numTriangles, t); 
     248            } 
     249        } 
     250        curGroup++; 
     251        group = group->next; 
     252    } 
     253#else // One single group 
    172254    for (i=0; i<pmodel->numtriangles; i++) { 
    173255        mesh->triangles[i].id = i; 
     
    188270    
    189271            // Reallocate memory for the new adjacent triangle 
    190             mesh->vertices[v1].triangles = (GLuint *)realloc(mesh->vertices[v1].triangles, (mesh->vertices[v1].numTriangles + 1) * sizeof(GLuint)); 
     272            mesh->vertices[v1].triangles =  
     273                            (GLuint *)realloc(mesh->vertices[v1].triangles, (mesh->vertices[v1].numTriangles + 1) * sizeof(GLuint)); 
    191274            addItem((int *)mesh->vertices[v1].triangles, (int *)&mesh->vertices[v1].numTriangles, i); 
    192275        } 
    193276    } 
    194     //printf("\n"); 
     277    printf("\n"); 
     278#endif 
    195279    printf("Ok\n"); 
    196280 
    197281    mesh->numTriangles = pmodel->numtriangles; 
    198282    mesh->currentNumTriangles = pmodel->numtriangles; 
     283    printf("Number of triangles: %d\n", mesh->numTriangles); 
    199284 
    200285    mesh->edges = (Edge *)malloc (sizeof(Edge) * mesh->numTriangles * 3);  // E = 3 T / 2 
     
    205290    } 
    206291     
    207     // Init edges 
    208     for (i=0; i<mesh->numTriangles * 3; i++) { 
    209          
    210         mesh->edges[i].triangles    = NULL; 
    211         mesh->edges[i].numTriangles = 0; 
    212     } 
    213  
    214292    printf("Adding edges..."); 
    215293    n = 0; 
     
    221299        v3 = mesh->triangles[i].indices[2]; 
    222300         
     301        ///////////////////////////////////////////////////////////////////////////////// 
     302                // edge (v1,v2) 
    223303        if ((e = findEdge(mesh->edges, n, v1, v2)) == -1) { 
    224304            mesh->edges[n].u = v1; 
    225305            mesh->edges[n].v = v2; 
     306                                                mesh->edges[n].triangles    = NULL; 
     307                        mesh->edges[n].numTriangles = 0; 
    226308            mesh->edges[n].enable = GL_TRUE; 
    227              
    228             // Reallocate memory for the new adjacent triangle 
    229             mesh->edges[n].triangles = (GLuint *)realloc(mesh->edges[n].triangles, (mesh->edges[n].numTriangles + 1) * sizeof(GLuint)); 
    230             // Adding triangle i adjacent to edge n 
    231             addItem((int *)mesh->edges[n].triangles, (int *)&mesh->edges[n].numTriangles, i); 
    232             //printf("n:%d i:%d\n", n, i); 
    233              
    234             // Adding edge n adjacent to triangle i 
    235             addItem((int *)mesh->triangles[i].edges, (int *)&t, n); 
     309            m = n; 
    236310            n++; 
    237         } else { 
    238             // Reallocate memory for the new adjacent triangle 
    239             mesh->edges[e].triangles = (GLuint *)realloc(mesh->edges[e].triangles, (mesh->edges[e].numTriangles + 1) * sizeof(GLuint)); 
    240             // Adding triangle i adjacent to edge e 
    241             addItem((int *)mesh->edges[e].triangles, (int *)&mesh->edges[e].numTriangles, i); 
    242             //printf("n:%d i:%d\n", e, i); 
    243              
    244             // Adding edge e adjacent to triangle i 
    245             addItem((int *)mesh->triangles[i].edges, (int *)&t, e); 
    246         } 
     311        } else m = e; 
     312                // Reallocate memory for the new adjacent triangle 
     313        mesh->edges[m].triangles =  
     314                        (GLuint *)realloc(mesh->edges[m].triangles, (mesh->edges[m].numTriangles + 1) * sizeof(GLuint)); 
     315        // Adding triangle i adjacent to edge m 
     316        addItem((int *)mesh->edges[m].triangles, (int *)&mesh->edges[m].numTriangles, i); 
     317        //printf("n:%d i:%d\n", m, i); 
     318         
     319        // Adding edge m adjacent to triangle i 
     320        addItem((int *)mesh->triangles[i].edges, (int *)&t, m); 
     321 
     322        ///////////////////////////////////////////////////////////////////////////////// 
     323        // edge (v2,v3) 
    247324        if (( e = findEdge(mesh->edges, n, v2, v3)) == -1) { 
    248325            mesh->edges[n].u = v2; 
    249326            mesh->edges[n].v = v3; 
     327                                                mesh->edges[n].triangles    = NULL; 
     328                        mesh->edges[n].numTriangles = 0; 
    250329            mesh->edges[n].enable = GL_TRUE; 
    251              
    252             // Reallocate memory for the new adjacent triangle 
    253             mesh->edges[n].triangles = (GLuint *)realloc(mesh->edges[n].triangles, (mesh->edges[n].numTriangles + 1) * sizeof(GLuint)); 
    254             // Adding triangle i adjacent to edge n 
    255             addItem((int *)mesh->edges[n].triangles, (int *)&mesh->edges[n].numTriangles, i); 
    256             //printf("n:%d i:%d\n", n, i); 
    257              
    258             // Adding edge n adjacent to triangle i 
    259             addItem((int *)mesh->triangles[i].edges, (int *)&t, n); 
     330            m = n; 
    260331            n++; 
    261         } else { 
    262             // Reallocate memory for the new adjacent triangle 
    263             mesh->edges[e].triangles = (GLuint *)realloc(mesh->edges[e].triangles, (mesh->edges[e].numTriangles + 1) * sizeof(GLuint)); 
    264             // Adding triangle i adjacent to edge e 
    265             addItem((int *)mesh->edges[e].triangles, (int *)&mesh->edges[e].numTriangles, i); 
    266             //printf("n:%d i:%d\n", e, i); 
    267              
    268             // Adding edge e adjacent to triangle i 
    269             addItem((int *)mesh->triangles[i].edges, (int *)&t, e); 
    270         } 
     332        } else m = e; 
     333                // Reallocate memory for the new adjacent triangle 
     334        mesh->edges[m].triangles =  
     335                        (GLuint *)realloc(mesh->edges[m].triangles, (mesh->edges[m].numTriangles + 1) * sizeof(GLuint)); 
     336        // Adding triangle i adjacent to edge m 
     337        addItem((int *)mesh->edges[m].triangles, (int *)&mesh->edges[m].numTriangles, i); 
     338        //printf("n:%d i:%d\n", m, i); 
     339         
     340        // Adding edge m adjacent to triangle i 
     341        addItem((int *)mesh->triangles[i].edges, (int *)&t, m); 
     342 
     343        ///////////////////////////////////////////////////////////////////////////////// 
     344        // edge (v3,v1) 
    271345        if ((e = findEdge(mesh->edges, n, v3, v1)) == -1) { 
    272346            mesh->edges[n].u = v3; 
    273347            mesh->edges[n].v = v1; 
     348                                                mesh->edges[n].triangles    = NULL; 
     349                        mesh->edges[n].numTriangles = 0; 
    274350            mesh->edges[n].enable = GL_TRUE; 
    275              
    276             // Reallocate memory for the new adjacent triangle 
    277             mesh->edges[n].triangles = (GLuint *)realloc(mesh->edges[n].triangles, (mesh->edges[n].numTriangles + 1) * sizeof(GLuint)); 
    278             // Adding triangle i adjacent to edge n 
    279             addItem((int *)mesh->edges[n].triangles, (int *)&mesh->edges[n].numTriangles, i); 
    280             //printf("n:%d i:%d\n", n, i); 
    281              
    282             // Adding edge n adjacent to triangle i 
    283             addItem((int *)mesh->triangles[i].edges, (int *)&t, n); 
     351            m = n; 
    284352            n++; 
    285         } else  { 
    286             // Reallocate memory for the new adjacent triangle 
    287             mesh->edges[e].triangles = (GLuint *)realloc(mesh->edges[e].triangles, (mesh->edges[e].numTriangles + 1) * sizeof(GLuint)); 
    288             // Adding triangle i adjacent to edge e 
    289             addItem((int *)mesh->edges[e].triangles, (int *)&mesh->edges[e].numTriangles, i); 
    290             //printf("n:%d i:%d\n", e, i); 
    291              
    292             // Adding edge e adjacent to triangle i 
    293             addItem((int *)mesh->triangles[i].edges, (int *)&t, e); 
    294         } 
     353        } else m = e; 
     354                // Reallocate memory for the new adjacent triangle 
     355        mesh->edges[m].triangles =  
     356                        (GLuint *)realloc(mesh->edges[m].triangles, (mesh->edges[m].numTriangles + 1) * sizeof(GLuint)); 
     357        // Adding triangle i adjacent to edge m 
     358        addItem((int *)mesh->edges[m].triangles, (int *)&mesh->edges[m].numTriangles, i); 
     359        //printf("n:%d i:%d\n", m, i); 
     360         
     361        // Adding edge m adjacent to triangle i 
     362        addItem((int *)mesh->triangles[i].edges, (int *)&t, m); 
    295363    } 
    296364    printf("Ok\n"); 
     
    322390    printf("------------------------\n"); 
    323391    for (i=0; i<mesh->numEdges; i++) { 
    324         printf("e%d (%d,%d)\n", i, mesh->edges[i].u, mesh->edges[i].v); 
     392        printf("e%d (%d,%d) %d\n", i, mesh->edges[i].u, mesh->edges[i].v, mesh->edges[i].enable); 
    325393        printf("  t(%d)[", mesh->edges[i].numTriangles); 
    326394        if (mesh->edges[i].triangles != NULL) { 
     
    329397                printf(",%d", mesh->edges[i].triangles[j]); 
    330398            } 
    331         } 
     399                                } 
    332400        printf("]\n"); 
    333401    } 
     
    336404    printf("------------------------\n"); 
    337405    for (i=0; i<mesh->numTriangles; i++) { 
    338         printf("t%d (%d,%d,%d)\n", i, mesh->triangles[i].indices[0], mesh->triangles[i].indices[1], 
    339                                      mesh->triangles[i].indices[2]); 
     406        printf("t%d (%d,%d,%d) %d\n", i, mesh->triangles[i].indices[0], mesh->triangles[i].indices[1], 
     407                                     mesh->triangles[i].indices[2],  mesh->triangles[i].enable); 
    340408        printf("  e(3)["); 
    341409        printf("%d", mesh->triangles[i].edges[0]); 
     
    385453 
    386454int *VMI::trianglesAdjToEdge(Mesh *mesh, int e, int *n) { 
    387     int triangles[MAX_NUM_TRI]; 
    388     int i, n0, n1, n2,  
     455    int i, n0, n1, n2, num = 0, t,  
    389456        u = mesh->edges[e].u,  
    390457        v = mesh->edges[e].v; 
    391     int *list, num = 0; 
    392  
    393     for (i=0; i<(int)mesh->numTriangles; i++) { 
    394          
    395         if (mesh->triangles[i].enable == TRUE) { 
    396              
    397             n0 = mesh->triangles[i].indices[0]; 
    398             n1 = mesh->triangles[i].indices[1]; 
    399             n2 = mesh->triangles[i].indices[2]; 
     458    int *triangles = NULL; 
     459 
     460        if ((mesh->vertices[u].numTriangles +  
     461         mesh->vertices[v].numTriangles) > 0) 
     462                 triangles = (int *)malloc((mesh->vertices[u].numTriangles +  
     463                                    mesh->vertices[v].numTriangles) * sizeof(int)); 
     464 
     465    for (i=0; i<(int)mesh->vertices[u].numTriangles; i++) { 
     466 
     467        t = mesh->vertices[u].triangles[i]; 
     468         
     469        if (mesh->triangles[t].enable == TRUE) { 
     470             
     471            n0 = mesh->triangles[t].indices[0]; 
     472            n1 = mesh->triangles[t].indices[1]; 
     473            n2 = mesh->triangles[t].indices[2]; 
    400474             
    401475            if ((n0 == v) || (n1 == v) || (n2 == v) || 
    402476                (n0 == u) || (n1 == u) || (n2 == u)) 
    403477                 
    404                 triangles[num++] = i; 
    405         } 
    406     } 
    407  
    408     list = (int*) malloc (sizeof(int) * num); 
    409     if (NULL == list) { 
    410         fprintf (stderr, "no more memory for list"); 
    411         exit(1); 
    412     } 
    413  
    414     memcpy(list, triangles, sizeof(int) * num); 
    415  
     478                addItem(triangles, &num, t); 
     479        } 
     480    } 
     481 
     482    for (i=0; i<(int)mesh->vertices[v].numTriangles; i++) { 
     483 
     484        t = mesh->vertices[v].triangles[i]; 
     485         
     486        if (mesh->triangles[t].enable == TRUE) { 
     487             
     488            n0 = mesh->triangles[t].indices[0]; 
     489            n1 = mesh->triangles[t].indices[1]; 
     490            n2 = mesh->triangles[t].indices[2]; 
     491             
     492            if ((n0 == v) || (n1 == v) || (n2 == v) || 
     493                (n0 == u) || (n1 == u) || (n2 == u)) 
     494                 
     495                addItem(triangles, &num, t); 
     496        } 
     497    } 
    416498    *n = num; 
    417499 
    418     return list; 
    419 } 
    420  
    421 int *VMI::trianglesAdjToVertex(Mesh *mesh, int v, int *n) { 
    422     int triangles[MAX_NUM_TRI]; 
    423     int i, n0, n1, n2; 
    424     int *list, num = 0; 
    425  
    426     for (i=0; i<(int)mesh->numTriangles; i++) { 
    427          
    428         if (mesh->triangles[i].enable == TRUE) { 
    429              
    430             n0 = mesh->triangles[i].indices[0]; 
    431             n1 = mesh->triangles[i].indices[1]; 
    432             n2 = mesh->triangles[i].indices[2]; 
    433              
    434             if ((n0 == v) || (n1 == v) || (n2 == v)) 
    435                  
    436                 triangles[num++] = i; 
    437         } 
    438     } 
    439  
    440     list = (int*) malloc (sizeof(int) * num); 
    441     if (NULL == list) { 
    442         fprintf (stderr, "no more memory for list"); 
    443         exit(1); 
    444     } 
    445  
    446     memcpy(list, triangles, sizeof(int) * num); 
    447  
    448     *n = num; 
    449  
    450     return list; 
     500    return triangles; 
    451501} 
    452502 
    453503int *VMI::verticesAdjToVertex(Mesh *mesh, int v, int *n) { 
    454     int numTr; 
    455     int *triangles = trianglesAdjToVertex(mesh, v, &numTr); 
    456     int *vertices = (int*) malloc (sizeof(int) * numTr * 2); 
     504    int *vertices = NULL; 
    457505    int i, t, n0, n1, n2; 
    458506    int num = 0; 
    459507 
    460     for (i=0; i<numTr; i++) { 
    461         t = triangles[i]; 
     508        if (mesh->vertices[v].numTriangles > 0) 
     509                vertices = (int*)malloc(sizeof(int) * mesh->vertices[v].numTriangles * 2); 
     510 
     511    for (i=0; i<(int)mesh->vertices[v].numTriangles; i++) { 
     512        t = mesh->vertices[v].triangles[i]; 
    462513 
    463514        n0 = mesh->triangles[t].indices[0]; 
     
    469520        if (n2 != v) addItem(vertices, &num, n2); 
    470521    } 
    471  
    472522    *n = num; 
    473523 
    474     free(triangles); 
    475  
    476524    return vertices; 
    477525} 
    478526 
    479527int *VMI::edgesAdjToVertex(Mesh *mesh, int v, int *n) { 
    480     int numTr; 
    481     int *triangles = trianglesAdjToVertex(mesh, v, &numTr); 
    482     int *edges = (int*) malloc (sizeof(int) * numTr * 2); 
    483     int i, t, n0, n1, n2, e; 
     528    int *edges = NULL; 
     529    int i, t, e; 
     530#ifndef USE_EDGE_ADJACENCY 
     531    int n0, n1, n2; 
     532#else 
     533    int j; 
     534#endif 
    484535    int num = 0; 
    485536 
    486     for (i=0; i<numTr; i++) { 
    487         t = triangles[i]; 
    488  
     537        if (mesh->vertices[v].numTriangles > 0)  
     538                edges = (int*)malloc(sizeof(int) * mesh->vertices[v].numTriangles * 2); 
     539 
     540    for (i=0; i<(int)mesh->vertices[v].numTriangles; i++) { 
     541 
     542        t = mesh->vertices[v].triangles[i]; 
     543 
     544#ifdef USE_EDGE_ADJACENCY 
     545        for (j=0; j<3; j++) { 
     546            e = mesh->triangles[t].edges[j]; 
     547             
     548            if ((int)mesh->edges[e].u == v || (int)mesh->edges[e].v == v) 
     549                 
     550                addItem(edges, &num, e); 
     551        } 
     552#else 
    489553        n0 = mesh->triangles[t].indices[0]; 
    490554        n1 = mesh->triangles[t].indices[1]; 
     
    498562         
    499563        if (((n0 == v) || (n2 == v)) && 
    500             ((e = findEdge(mesh->edges, mesh->numEdges, n0, n2)) != -1)) addItem(edges, &num, e);   
    501     } 
    502  
     564            ((e = findEdge(mesh->edges, mesh->numEdges, n0, n2)) != -1)) addItem(edges, &num, e); 
     565 
     566#endif 
     567    } 
    503568    *n = num; 
    504569 
    505     free(triangles); 
    506  
    507570    return edges; 
    508571} 
    509572 
    510573int *VMI::edgesAdjToVertices(Mesh *mesh, int *vertices, int numVertices, int *n) { 
    511     int edges[MAX_NUM_TRI*2]; 
    512     int i, j, v, num = 0, e; 
    513     int *list, numEdges; 
    514  
    515     for (i=0; i<numVertices; i++) { 
    516         v = vertices[i]; 
    517  
    518         list = edgesAdjToVertex(mesh, v, &numEdges); 
    519  
    520         for (j=0; j<numEdges; j++) { 
    521             e = list[j]; 
    522              
    523             addItem(edges, &num, e); 
    524         } 
     574    int *edges = NULL; 
     575    int i, j, num = 0; 
     576    int *list = NULL, numEdges; 
     577 
     578    if (numVertices > 0) { 
     579        // Add the first 
     580        list = edgesAdjToVertex(mesh, vertices[0], &numEdges); 
     581 
     582        // Allocate memory 
     583        edges = (int *)malloc(numEdges * sizeof(int)); 
     584 
     585        memcpy(edges, list, sizeof(int) * numEdges); 
    525586 
    526587        free(list); 
    527     } 
    528  
    529     list = (int*) malloc (sizeof(int) * num); 
    530     if (NULL == list) { 
    531         fprintf (stderr, "no more memory for list"); 
    532         exit(1); 
    533     } 
    534  
    535     memcpy(list, edges, sizeof(int) * num); 
    536  
     588 
     589        num = numEdges; 
     590 
     591        // Add the rest 
     592        for (i=1; i<numVertices; i++) { 
     593 
     594            list = edgesAdjToVertex(mesh, vertices[i], &numEdges); 
     595 
     596            // Reallocate memory 
     597                        if (numEdges > 0) { 
     598 
     599                edges = (int *)realloc(edges, (num + numEdges + 1) * sizeof(int)); 
     600                 
     601                for (j=0; j<numEdges; j++) 
     602                    addItem(edges, &num, list[j]); 
     603                        } 
     604            free(list); 
     605        } 
     606    } 
    537607    *n = num; 
    538608 
    539     return list; 
     609    return edges; 
    540610} 
    541611 
     
    563633} 
    564634 
     635// Adds a new vertex at the end of the mesh vertex list 
     636Vertex *VMI::addVertex(Vertex *list, int *n, float x, float y, float z, int *pos) { 
     637          Vertex *newList; 
     638 
     639                // Reallocate memory for the new vertex 
     640    newList = (Vertex *)realloc(list, ((*n) + 1) * sizeof(Vertex)); 
     641 
     642                // New Vertex coordinates 
     643                newList[*n].x = x; 
     644    newList[*n].y = y; 
     645    newList[*n].z = z; 
     646 
     647                // This vertex has no triangle adjancency 
     648                newList[*n].numTriangles = 0; 
     649                newList[*n].triangles = NULL; 
     650         
     651    // Enable the new vertex 
     652                newList[*n].enable = TRUE; 
     653 
     654                // New vertex position 
     655                *pos = *n; 
     656 
     657                // New number of vertices 
     658          (*n)++; 
     659                 
     660                return newList; 
     661} 
     662 
     663 
     664 
    565665void VMI::updateModel(GLMmodel* pmodel, Mesh *mesh, GLuint numVertices, GLuint numTriangles) { 
    566666    GLuint i , v1, v2 ,v3, numV = 1, numT = 0; 
     
    569669     
    570670    if (pmodel->vertices != NULL) free(pmodel->vertices); 
    571  
    572671    pmodel->vertices = (GLfloat *)calloc ((numVertices + 1) * 3,  sizeof(GLfloat)); 
    573      
    574672 
    575673    if (pmodel->triangles != NULL) free(pmodel->triangles); 
    576  
    577674    pmodel->triangles = (GLMtriangle *)malloc (numTriangles * sizeof(GLMtriangle)); 
    578675 
    579      
    580676    for (i=0; i<mesh->numTriangles; i++) { 
    581677        if (mesh->triangles[i].enable) { 
     
    630726 
    631727void VMI::saveModel(char *filename, GLMmodel* pmodel, Mesh *mesh) { 
    632     GLuint i; 
    633  
     728    GLuint i, j, g, numT = 0; 
     729    GLMgroup *group; 
     730 
     731#ifdef OUTPUT_SEVERAL_GROUPS 
     732    // The output model maintains groups 
     733 
     734    // Empty all groups 
     735    group = pmodel->groups; 
     736    while(group) { 
     737        // Free memory for triangles 
     738        free(group->triangles); 
     739 
     740        // Reset group 
     741        group->triangles = NULL; 
     742        group->numtriangles = 0; 
     743 
     744        group = group->next; 
     745    } 
     746    // Fill all groups 
     747    for (i=0; i<mesh->numTriangles; i++) { 
     748 
     749        if (mesh->triangles[i].enable) { 
     750            g = mesh->triangles[i].group; 
     751 
     752            // Get group 
     753            group = pmodel->groups; 
     754            for (j=0; j <g; j++) 
     755                group = group->next; 
     756 
     757            // Reallocate memory for triangles 
     758            group->triangles = (GLuint *)realloc(group->triangles, (group->numtriangles + 1) * sizeof(GLuint)); 
     759            // Add triangle into group 
     760            addItem((int *)group->triangles, (int *)&group->numtriangles, numT); 
     761 
     762            numT++; 
     763        } 
     764    } 
     765#else 
    634766    // The output model contains only one group 
    635767    pmodel->numgroups = 1; 
     
    646778    for (i=0; i<mesh->currentNumTriangles; i++) 
    647779        pmodel->groups->triangles[i] = i; 
     780#endif 
    648781 
    649782    updateModel(pmodel, mesh, mesh->currentNumTriangles * 3, mesh->currentNumTriangles); 
Note: See TracChangeset for help on using the changeset viewer.