source: GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/vmi/src/change.cpp @ 983

Revision 983, 7.4 KB checked in by gumbau, 18 years ago (diff)
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <memory.h>
4
5#include "../include/global.h"
6#include "../include/change.h"
7
8#define MAX_NUM_TRI 250
9
10using namespace VMI;
11
12Change *VMI::createChange (Mesh *mesh, int e) {
13    Change *c;
14   
15    c = (Change*) malloc (sizeof(Change));
16    if (NULL == c) {
17        fprintf (stderr, "no more memory for mesh changes");
18        exit(1);
19    }
20    c->e = e;
21    c->u = mesh->edges[e].u;
22    c->v = mesh->edges[e].v;
23    c->modified = NULL;
24    c->deleted = NULL;
25    c->numDel = 0;
26    c->numMod = 0;
27   
28    return c;
29}
30
31void VMI::deleteChange(Change *c) {
32   
33    if (NULL != c) {
34        if (c->deleted != NULL)   free(c->deleted);
35        if (c->modified != NULL)  free(c->modified);
36        c->modified = NULL;
37        c->deleted = NULL;
38        c->numDel = 0;
39        c->numMod = 0;
40       
41        free(c);
42        c = NULL;
43    }
44}
45
46void VMI::writeChange(FILE* file, Change *c) {
47    int i;
48
49    fputc('v',file);
50    fputc('%',file);
51    fprintf(file, " %d %d 0 0 0 ", c->v, c->u);
52
53    for (i=0; i<c->numDel; i++) {
54        fprintf(file, "%d ", c->deleted[i].id);
55    }
56
57    fputc('&',file);
58    for (i=0; i<c->numMod; i++) {
59        fprintf(file, " %d", c->modified[i].id);
60    }
61
62    fputc('\n',file);
63}
64
65void VMI::printChange(Change *c) {
66    int i;
67   
68    if (NULL != c) {
69       
70        printf("e%d(%d,%d)\n",c->e,c->u,c->v);
71       
72        printf("d %d\n", c->numDel);
73        for (i=0;i<c->numDel;i++) {
74            printf(" %d", c->deleted[i].id);
75        }
76        printf("\n");
77        printf("m %d\n", c->numMod);
78        for (i=0;i<c->numMod;i++) {
79            printf(" %d", c->modified[i].id);
80        }
81        printf("\n");
82    }
83}
84
85void VMI::modifyTriangle(Triangle *t, int c, int p) {
86   
87    if ((int)t->indices[0] == c)
88        t->indices[0]= p;
89    if ((int)t->indices[1] == c)
90        t->indices[1]= p;
91    if ((int)t->indices[2] == c)
92        t->indices[2]= p;
93}
94
95int VMI::isATriangleToModify(Triangle *t, int c, int p) {
96    int u = t->indices[0],
97        v = t->indices[1],
98        w = t->indices[2];
99   
100    if ((u == c) || (v == c) || (w == c)) return TRUE;
101
102    return FALSE;
103}
104
105void VMI::modifyTriangles(Mesh *mesh, Change *c) {
106    int i, t;
107   
108    for (i=0; i<c->numMod; i++) {
109        t = c->modified[i].id;
110        modifyTriangle(&mesh->triangles[t], c->u, c->v);
111
112        //printf("New area of triangle %d:\n", t);
113        mesh->triangles[t].area = computeTriangleArea(mesh->vertices, &mesh->triangles[t]);
114
115        computeTriangleNormal(mesh->vertices, &mesh->triangles[t]);
116    }
117}
118
119void VMI::unmodifyTriangles(Mesh *mesh, Change *c) {
120    int i, t;
121   
122    for (i=0; i<c->numMod; i++) {
123        t = c->modified[i].id;
124
125        memcpy(&mesh->triangles[t], &c->modified[i], sizeof(Triangle));
126        /*printf("t(%d %d %d)\n", mesh->triangles[t].indices[0],
127                                  mesh->triangles[t].indices[1],
128                                  mesh->triangles[t].indices[2]);*/
129    }
130}
131
132void VMI::deleteTriangles(Mesh *mesh, Change *c) {
133    int i, t;
134   
135    for (i=0; i<c->numDel; i++) {
136        t = c->deleted[i].id;
137
138        //printf("Deleting triangle %d\n",t);
139        mesh->triangles[t].enable = FALSE;
140        mesh->currentNumTriangles--;
141    }
142}
143
144void VMI::undeleteTriangles(Mesh *mesh, Change *c) {
145    int i, t;
146   
147    for (i=0; i<c->numDel; i++) {
148        t = c->deleted[i].id;
149       
150        memcpy(&mesh->triangles[t], &c->deleted[i], sizeof(Triangle));
151        /*printf("t(%d %d %d)\n", mesh->triangles[t].indices[0],
152                                  mesh->triangles[t].indices[1],
153                                  mesh->triangles[t].indices[2]);*/
154
155        mesh->triangles[t].enable = TRUE;
156        mesh->currentNumTriangles++;
157    }
158}
159
160int VMI::getTrianglesToModify(Mesh *mesh, int c, int p, Triangle *modified) {
161    GLuint i, num = 0;
162   
163    for (i=0; i<mesh->numTriangles; i++) {
164        if ((mesh->triangles[i].enable == TRUE) &&
165            isATriangleToModify(&mesh->triangles[i], c, p)) {
166                                                     
167                //printf("Triangle to modify %d\n", i);
168                // Save the original values of the triangle
169                memcpy(&modified[num], &mesh->triangles[i], sizeof(Triangle));
170                num++;
171        }
172    }
173   
174    return num;
175}
176
177int VMI::isATriangleToDelete(Triangle *t, int c, int p) {
178    int u = t->indices[0],
179        v = t->indices[1],
180        w = t->indices[2];
181   
182    if (((u == c) && ( v == p)) ||
183        ((u == c) && ( w == p)) ||
184        ((v == c) && ( w == p)))
185        return TRUE;
186    if (((u == p) && ( v == c)) ||
187        ((u == p) && ( w == c)) ||
188        ((v == p) && ( w == c)))
189        return TRUE;
190
191    return FALSE;
192}
193
194int VMI::getTrianglesToDelete(Mesh *mesh, int numMod, Triangle *modified, Triangle *deleted, int c, int p) {
195    int i, num = 0;
196    GLuint t;
197   
198    for (i=0; i<numMod; i++) {
199        t = modified[i].id;
200       
201        if (isATriangleToDelete(&mesh->triangles[t], c, p)) {
202                                                     
203            //printf("Triangle to delete %d\n",t);                   
204            memcpy(&deleted[num], &modified[i], sizeof(Triangle));
205            num++;
206        }
207    }
208    return num;
209}
210
211void VMI::printList(Triangle *list, int n) {
212    int i;
213   
214    for (i=0; i<n; i++)
215        printf("%d ",list[i].id);
216
217    printf("\n");
218}
219
220void VMI::deleteItem(Triangle *list, int *n, int item) {
221    int i, j;
222   
223    for (i=0; i<*n; i++) {
224        if (list[i].id == (GLuint)item) {
225            // delete it
226            for (j =i + 1 ; j<*n; j++)
227                list[j - 1] = list[j];
228            (*n)--;
229            i--; // Delete all ocurrencies of an item
230        }
231    }
232}
233
234///////////////////////////////////////////////////////////////////////////////
235
236// Compute the triangle mesh changes due to a heap node simplification
237void VMI::computeChanges(Mesh *mesh, Change *c) {
238    Triangle m[MAX_NUM_TRI], d[MAX_NUM_TRI/2];
239    int numMod = getTrianglesToModify(mesh, c->u, c->v, m);
240    int numDel = getTrianglesToDelete(mesh, numMod, m, d, c->u, c->v);
241    int i;
242   
243    //printf("d %d\n",numDel);
244    //printList(d, numDel);
245
246    for (i=0; i<numDel; i++)
247        deleteItem(m, &numMod, d[i].id);
248
249    //printf("m %d\n",numMod);
250    //printList(m, numMod);
251    //getchar();
252   
253    c->numDel = numDel;
254    // Free memory
255    if (c->deleted != NULL) free(c->deleted);
256    // Allocate memory
257    c->deleted = (Triangle *)malloc(sizeof(Triangle) * numDel);
258    if (c->deleted == NULL) {
259        fprintf(stderr, "Error allocating memory\n");
260        exit(1);
261    }
262    memcpy(c->deleted, d, sizeof(Triangle) * numDel);
263   
264    c->numMod = numMod;
265    // Free memory
266    if (c->modified != NULL) free(c->modified);
267    // Allocate memory
268    c->modified = (Triangle *)malloc(sizeof(Triangle) * numMod);
269    if (c->modified == NULL) {
270        fprintf(stderr, "Error allocating memory\n");
271        exit(1);
272    }
273    memcpy(c->modified, m, sizeof(Triangle) * numMod);
274
275    //printChange(c);
276    //getchar();
277}
278
279// Update the triangle mesh due to a heap node simplification
280void VMI::doChange(Mesh *mesh, Change *c) {
281   
282    modifyTriangles(mesh, c);
283   
284    deleteTriangles(mesh, c);
285
286    mesh->vertices[c->u].enable = FALSE;
287    mesh->currentNumVertices--;
288}
289
290void VMI::undoChange(Mesh *mesh, Change *c) {
291   
292    unmodifyTriangles(mesh, c);
293   
294    undeleteTriangles(mesh, c);
295
296    mesh->vertices[c->u].enable = TRUE;
297    mesh->currentNumVertices++;
298}
Note: See TracBrowser for help on using the repository browser.