commit 965dc0d4ff2767ebab8ae29da8dafa292a8755bc
parent 8b3316b28e3d9129c6cb6552690e48d563653369
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Tue, 4 Oct 2011 11:03:11 +0200
Ajout de square.c au makefile et nettoyage des bugs de compilation.
Diffstat:
| M | Makefile | | | 2 | +- |
| M | roam.h | | | 33 | +++++++++++++++++---------------- |
| M | square.c | | | 62 | ++++++++++++++++++++++++++++++++++++++++---------------------- |
3 files changed, 58 insertions(+), 39 deletions(-)
diff --git a/Makefile b/Makefile
@@ -14,7 +14,7 @@ test: all
simple-terrain: simple-terrain.c
$(CC) $< -o $@
-display: display.o roam.o
+display: display.o roam.o square.o
$(CC) -lGLEW -lSDL -lGLU $^ -o $@
# Create objects from C source code
diff --git a/roam.h b/roam.h
@@ -3,25 +3,26 @@
#include <math.h>
typedef struct Vertex {
- int x;
- int y;
- int z;
- float xNormal;
- float yNormal;
- float zNormal;
- /* Ajouter des champs ici. */
+ int x;
+ int y;
+ int z;
+ float xNormal;
+ float yNormal;
+ float zNormal;
+ int refCount;
+ /* Ajouter des champs ici. */
} Vertex;
typedef struct Triangle {
- Vertex* vApex;
- Vertex* vLeft;
- Vertex* vRight;
- struct Triangle* tLeftChild;
- struct Triangle* tRightChild;
- struct Triangle* tBaseNeighbor;
- struct Triangle* tLeftNeighbor;
- struct Triangle* tRightNeighbor;
- struct Triangle* tParent;
+ Vertex* vApex;
+ Vertex* vLeft;
+ Vertex* vRight;
+ struct Triangle* tLeftChild;
+ struct Triangle* tRightChild;
+ struct Triangle* tBaseNeighbor;
+ struct Triangle* tLeftNeighbor;
+ struct Triangle* tRightNeighbor;
+ struct Triangle* tParent;
} Triangle;
Triangle* initDefaultExample();
diff --git a/square.c b/square.c
@@ -1,7 +1,10 @@
// get_z()
#include "roam.h"
-#define INIT_VERTEX(v,xx,yy) do { (v)->x=(xx); (v)->y=(yy); (v)->z=get_z((xx),(yy)); } while(0);
+#define INIT_VERTEX(v,xx,yy) do { (v)->refCount=0; (v)->x=(xx); (v)->y=(yy); (v)->z=get_z((xx),(yy)); } while(0);
+
+inline Vertex* use_vertex(Vertex* v) { v->refCount++; return v; }
+inline void unuse_vertex(Vertex* v) { if (--(v->refCount) == 0) free(v); }
// ROTATE4(x,r) == x+r % 4
#define ROTATE4(x,r) ((x+r) & 3)
@@ -34,10 +37,9 @@ void QT_split(QTNode* parent) {
int r;
QTNode* q[4];
- q[0] = malloc(sizeof(QTNode));
- q[1] = malloc(sizeof(QTNode));
- q[2] = malloc(sizeof(QTNode));
- q[3] = malloc(sizeof(QTNode));
+ for (r = 0; r < 4; r++) {
+ q[ROT_NE] = malloc(sizeof(QTNode));
+ }
Vertex* new_vertices[4];
for (r = 0; r < 4; r++) {
@@ -47,23 +49,24 @@ void QT_split(QTNode* parent) {
} else {
new_vertices[ROT_N] = malloc(sizeof(Vertex));
switch (r) { // Pourrait être factorisé, mais on y perdrait en clarté !
- case 0: INIT_VERTEX(new_vertices[0], parent->center->x, parent->children[QT_NE]->y); break;
- case 1: INIT_VERTEX(new_vertices[1], parent->children[QT_SE]->x, parent->center->y); break;
- case 2: INIT_VERTEX(new_vertices[2], parent->center->x, parent->children[QT_SO]->y); break;
- case 3: INIT_VERTEX(new_vertices[3], parent->children[QT_NO]->x, parent->center->y); break;
+ case 0: INIT_VERTEX(new_vertices[0], parent->center->x, parent->vertices[QT_NE]->y); break;
+ case 1: INIT_VERTEX(new_vertices[1], parent->vertices[QT_SE]->x, parent->center->y); break;
+ case 2: INIT_VERTEX(new_vertices[2], parent->center->x, parent->vertices[QT_SO]->y); break;
+ case 3: INIT_VERTEX(new_vertices[3], parent->vertices[QT_NO]->x, parent->center->y); break;
}
}
}
for (r = 0; r < 4; r++) { // Dans le corps de la boucle, positions pour le quadrant ne.
q[ROT_NE]->center = malloc(sizeof(Vertex));
- // Coordonnées du centre de qne = moyenne du center et de parent->children[QT_NE].
- INIT_VERTEX(q[ROT_NE]->center, (parent->center->x + parent->children[ROT_NE]->x) / 2, (parent->center->y + parent->children[ROT_NE]->y) / 2);
+ // Coordonnées du centre de qne = moyenne du center et de parent->vertices[QT_NE].
+ INIT_VERTEX(q[ROT_NE]->center, (parent->center->x + parent->vertices[ROT_NE]->x) / 2, (parent->center->y + parent->vertices[ROT_NE]->y) / 2);
+ use_vertex(q[ROT_NE]->center);
- q[ROT_NE]->children[ROT_NE] = parent->children[ROT_NE];
- q[ROT_NE]->children[ROT_SE] = new_vertices[ROT_E];
- q[ROT_NE]->children[ROT_SO] = parent->center;
- q[ROT_NE]->children[ROT_NO] = new_vertices[ROT_N];
+ q[ROT_NE]->vertices[ROT_NE] = use_vertex(parent->vertices[ROT_NE]);
+ q[ROT_NE]->vertices[ROT_SE] = use_vertex(new_vertices[ROT_E]);
+ q[ROT_NE]->vertices[ROT_SO] = use_vertex(parent->center);
+ q[ROT_NE]->vertices[ROT_NO] = use_vertex(new_vertices[ROT_N]);
q[ROT_NE]->children[ROT_NE] = NULL;
q[ROT_NE]->children[ROT_SE] = NULL;
@@ -99,8 +102,9 @@ void QT_merge(QTNode* parent) {
int r;
for (r = 0; r < 4; r++) {
+ // Merge récursif des enfants.
QT_merge(parent->children[ROT_NE]);
- parent->children[ROT_NE] = NULL;
+
// reset à NULL les voisins qui pointaient vers des enfants.
if (parent->neighbors[ROT_N] != NULL)
if (parent->neighbors[ROT_N]->children[ROT_SE] != NULL)
@@ -108,22 +112,36 @@ void QT_merge(QTNode* parent) {
if (parent->neighbors[ROT_E] != NULL)
if (parent->neighbors[ROT_E]->children[ROT_NO] != NULL)
parent->neighbors[ROT_E]->children[ROT_NO]->neighbors[ROT_O] = NULL;
+
+ unuse_vertex(parent->children[ROT_NE]->center);
+ int i;
+ for (i = 0; i < 4; i++)
+ unuse_vertex(parent->children[ROT_NE]->vertices[i]);
+
+ free(parent->children[ROT_NE]);
+ parent->children[ROT_NE] = NULL;
}
}
-QTNode QT_baseNode() {
+QTNode* QT_baseNode() {
QTNode* q = malloc(sizeof(QTNode));
Vertex** v = malloc(sizeof(Vertex)*5);
+
INIT_VERTEX(v[0], 0, 0);
INIT_VERTEX(v[1], +1024, +1024);
INIT_VERTEX(v[2], +1024, -1024);
INIT_VERTEX(v[3], -1024, -1024);
INIT_VERTEX(v[4], -1024, +1024);
- q->center = v[0];
- q->children[QT_NE] = v[1];
- q->children[QT_SE] = v[2];
- q->children[QT_SO] = v[3];
- q->children[QT_NO] = v[4];
+
+ q->center = use_vertex(v[0]);
+
+ int i;
+ for (i = 0; i < 4; i++) {
+ q->vertices[i] = use_vertex(v[1]);
+ q->children[i] = NULL;
+ q->neighbors[i] = NULL;
+ }
+
return q;
}