summaryrefslogtreecommitdiffstats
path: root/level.c
diff options
context:
space:
mode:
authorneoraider <devnull@localhost>2007-06-12 19:19:01 +0200
committerneoraider <devnull@localhost>2007-06-12 19:19:01 +0200
commitf5c8fc72ca1801a7771a75d652c58754b36db768 (patch)
treef8fcd8218e040274500115b6258544039697d325 /level.c
parenta4339f057080f9d8ea51dec8dfbc5a29ab586215 (diff)
downloadlibzoom-f5c8fc72ca1801a7771a75d652c58754b36db768.tar
libzoom-f5c8fc72ca1801a7771a75d652c58754b36db768.zip
libzoom: Added gates to level loader;
zoom: Added gate to level; some Makefile.am changes
Diffstat (limited to 'level.c')
-rw-r--r--level.c291
1 files changed, 181 insertions, 110 deletions
diff --git a/level.c b/level.c
index 9118499..73ed1fc 100644
--- a/level.c
+++ b/level.c
@@ -23,19 +23,130 @@ static int SortTextures(const void *t1, const void *t2) {
return strcmp(((TEXTURE*)t1)->name, ((TEXTURE*)t2)->name);
}
+static int SortRooms(const void *r1, const void *r2) {
+ return strcmp(((ROOM*)r1)->id, ((ROOM*)r2)->id);
+}
+
+
+static void LoadTriangles(xmlNodePtr node, LEVEL *level, WALL* walls, int nWalls) {
+ int i = 0, j;
+ xmlNodePtr node2;
+ xmlChar *data;
+ TEXTURE tex, *texp;
+ VECTOR v;
+
+
+ for(; node = node->next; node != NULL) {
+ if(node->type != XML_ELEMENT_NODE || xmlStrcmp(node->name, "triangle")) continue;
+
+ walls[i].visible = 1;
+ data = xmlGetProp(node, "visible");
+ if(data) {
+ if(!xmlStrcmp(data, "false")) walls[i].visible = 0;
+ xmlFree(data);
+ }
+
+ data = xmlGetProp(node, "texture");
+ if(data) {
+ tex.name = data;
+ texp = bsearch(&tex, level->textures, level->nTextures, sizeof(TEXTURE), SortTextures);
+
+ if(texp) walls[i].texture = texp->id;
+
+ xmlFree(data);
+ }
+
+ j = -1;
+ for(node2 = node->children; node2 = node2->next; node2 != NULL) {
+ if(node2->type != XML_ELEMENT_NODE) continue;
+
+ if(!xmlStrcmp(node2->name, "vertex")) {
+ if(++j > 2) break;
+
+ data = xmlGetProp(node2, "x");
+ if(data) {
+ walls[i].vertices[j].x = atof(data);
+ xmlFree(data);
+ }
+
+ data = xmlGetProp(node2, "y");
+ if(data) {
+ walls[i].vertices[j].y = atof(data);
+ xmlFree(data);
+ }
+
+ data = xmlGetProp(node2, "z");
+ if(data) {
+ walls[i].vertices[j].z = atof(data);
+ xmlFree(data);
+ }
+ }
+ else if(!xmlStrcmp(node2->name, "normal")) {
+ if(j < 0) continue;
+
+ data = xmlGetProp(node2, "x");
+ if(data) {
+ walls[i].normals[j].x = atof(data);
+ xmlFree(data);
+ }
+
+ data = xmlGetProp(node2, "y");
+ if(data) {
+ walls[i].normals[j].y = atof(data);
+ xmlFree(data);
+ }
+
+ data = xmlGetProp(node2, "z");
+ if(data) {
+ walls[i].normals[j].z = atof(data);
+ xmlFree(data);
+ }
+ }
+ else if(!xmlStrcmp(node2->name, "texcoords")) {
+ if(j < 0) continue;
+
+ data = xmlGetProp(node2, "s");
+ if(data) {
+ walls[i].texcoords[j].s = atof(data);
+ xmlFree(data);
+ }
+
+ data = xmlGetProp(node2, "t");
+ if(data) {
+ walls[i].texcoords[j].t = atof(data);
+ xmlFree(data);
+ }
+ }
+ }
+
+ v = VectorCross(
+ VectorSub(walls[i].vertices[1], walls[i].vertices[0]),
+ VectorSub(walls[i].vertices[2], walls[i].vertices[0])
+ );
+ if(VectorLengthSq(v) > 0.0) {
+ walls[i].normal = VectorNormalize(v);
+
+ for(j = 0; j < 3; j++) {
+ if(VectorLengthSq(walls[i].normals[j]) == 0.0)
+ walls[i].normals[j] = walls[i].normal;
+ }
+ }
+
+ i++;
+ }
+}
+
LEVEL *LoadLevel(char *filename) {
LEVEL *level;
xmlDocPtr doc;
xmlDtdPtr dtd;
xmlValidCtxtPtr validCtxt;
- xmlNodePtr root, node, node2, node3, rooms = NULL;
+ xmlNodePtr root, node, node2, node3, rooms = NULL, gates = NULL;
xmlChar *data;
char *name;
- int i, j, k;
- VECTOR v;
- TEXTURE tex;
- TEXTURE *texp;
+ int i, j;
+ ROOM room, *roomp;
name = malloc(strlen(filename)+8);
@@ -81,7 +192,9 @@ LEVEL *LoadLevel(char *filename) {
if(!root || xmlStrcmp(root->name, "level")) {
xmlFreeDoc(doc);
xmlCleanupParser();
- return NULL;
+ return NULL;puts("Loaded.");
+
+
}
level = calloc(1, sizeof(LEVEL));
@@ -133,6 +246,15 @@ LEVEL *LoadLevel(char *filename) {
if(node2->type == XML_ELEMENT_NODE && !xmlStrcmp(node2->name, "room")) level->nRooms++;
}
}
+ else if(!xmlStrcmp(node->name, "gates")) {
+ if(gates != NULL) continue;
+
+ gates = node;
+
+ for(node2 = node->children; node2 = node2->next; node2 != NULL) {
+ if(node2->type == XML_ELEMENT_NODE && !xmlStrcmp(node2->name, "gate")) level->nGates++;
+ }
+ }
else if(!xmlStrcmp(node->name, "textures")) {
if(level->textures != NULL) continue;
@@ -173,120 +295,60 @@ LEVEL *LoadLevel(char *filename) {
for(node = rooms->children; node = node->next; node != NULL) {
if(node->type != XML_ELEMENT_NODE || xmlStrcmp(node->name, "room")) continue;
+ data = xmlGetProp(node, "id");
+ if(data) {
+ level->rooms[i].id = strdup(data);
+
+ xmlFree(data);
+ }
+
for(node2 = node->children; node2 = node2->next; node2 != NULL) {
if(node2->type == XML_ELEMENT_NODE && !xmlStrcmp(node2->name, "triangle")) level->rooms[i].nWalls++;
}
level->rooms[i].walls = calloc(level->rooms[i].nWalls, sizeof(WALL));
- j = 0;
- for(node2 = node->children; node2 = node2->next; node2 != NULL) {
- if(node2->type != XML_ELEMENT_NODE || xmlStrcmp(node2->name, "triangle")) continue;
-
- data = xmlGetProp(node2, "type");
- if(data) {
- if(!xmlStrcmp(data, "wall")) level->rooms[i].walls[j].type = TRIANGLE_WALL;
- else if(!xmlStrcmp(data, "floor")) level->rooms[i].walls[j].type = TRIANGLE_FLOOR;
- else level->rooms[i].walls[j].type = TRIANGLE_UNKNOWN;
- xmlFree(data);
- }
-
- level->rooms[i].walls[j].visible = 1;
- data = xmlGetProp(node2, "visible");
- if(data) {
- if(!xmlStrcmp(data, "false")) level->rooms[i].walls[j].visible = 0;
- xmlFree(data);
- }
+ LoadTriangles(node->children, level, level->rooms[i].walls, level->rooms[i].nWalls);
+
+ i++;
+ }
+
+ qsort(level->rooms, level->nRooms, sizeof(ROOM), SortRooms);
+
+ level->gates = calloc(level->nGates, sizeof(GATE));
+
+ i = 0;
+ for(node = gates->children; node = node->next; node != NULL) {
+ if(node->type != XML_ELEMENT_NODE || xmlStrcmp(node->name, "gate")) continue;
+
+ data = xmlGetProp(node2, "room1");
+ if(data) {
+ room.id = data;
+ roomp = bsearch(&room, level->rooms, level->nRooms, sizeof(ROOM), SortRooms);
- data = xmlGetProp(node2, "texture");
- if(data) {
- tex.name = data;
- texp = bsearch(&tex, level->textures, level->nTextures, sizeof(TEXTURE), SortTextures);
-
- if(texp) level->rooms[i].walls[j].texture = texp->id;
-
- xmlFree(data);
- }
+ if(roomp) level->gates[i].room1 = roomp;
- k = -1;
- for(node3 = node2->children; node3 = node3->next; node3 != NULL) {
- if(node3->type != XML_ELEMENT_NODE) continue;
-
- if(!xmlStrcmp(node3->name, "vertex")) {
- if(++k > 2) break;
-
- data = xmlGetProp(node3, "x");
- if(data) {
- level->rooms[i].walls[j].vertices[k].x = atof(data);
- xmlFree(data);
- }
-
- data = xmlGetProp(node3, "y");
- if(data) {
- level->rooms[i].walls[j].vertices[k].y = atof(data);
- xmlFree(data);
- }
-
- data = xmlGetProp(node3, "z");
- if(data) {
- level->rooms[i].walls[j].vertices[k].z = atof(data);
- xmlFree(data);
- }
- }
- else if(!xmlStrcmp(node3->name, "normal")) {
- if(k < 0) continue;
-
- data = xmlGetProp(node3, "x");
- if(data) {
- level->rooms[i].walls[j].normals[k].x = atof(data);
- xmlFree(data);
- }
-
- data = xmlGetProp(node3, "y");
- if(data) {
- level->rooms[i].walls[j].normals[k].y = atof(data);
- xmlFree(data);
- }
-
- data = xmlGetProp(node3, "z");
- if(data) {
- level->rooms[i].walls[j].normals[k].z = atof(data);
- xmlFree(data);
- }
- }
- else if(!xmlStrcmp(node3->name, "texcoords")) {
- if(k < 0) continue;
-
- data = xmlGetProp(node3, "s");
- if(data) {
- level->rooms[i].walls[j].texcoords[k].s = atof(data);
- xmlFree(data);
- }
-
- data = xmlGetProp(node3, "t");
- if(data) {
- level->rooms[i].walls[j].texcoords[k].t = atof(data);
- xmlFree(data);
- }
- }
- }
+ xmlFree(data);
+ }
+
+ data = xmlGetProp(node2, "room2");
+ if(data) {
+ room.id = data;
+ roomp = bsearch(&room, level->rooms, level->nRooms, sizeof(ROOM), SortRooms);
- v = VectorCross(
- VectorSub(level->rooms[i].walls[j].vertices[1], level->rooms[i].walls[j].vertices[0]),
- VectorSub(level->rooms[i].walls[j].vertices[2], level->rooms[i].walls[j].vertices[0])
- );
- if(VectorLengthSq(v) > 0.0) {
- level->rooms[i].walls[j].normal = VectorNormalize(v);
-
- for(k = 0; k < 3; k++) {
- if(VectorLengthSq(level->rooms[i].walls[j].normals[k]) == 0.0)
- level->rooms[i].walls[j].normals[k] = level->rooms[i].walls[j].normal;
- }
- }
+ if(roomp) level->gates[i].room2 = roomp;
- j++;
+ xmlFree(data);
+ }
+
+ for(node2 = node->children; node2 = node2->next; node2 != NULL) {
+ if(node2->type == XML_ELEMENT_NODE && !xmlStrcmp(node2->name, "triangle")) level->gates[i].nWalls++;
}
+ level->gates[i].walls = calloc(level->gates[i].nWalls, sizeof(WALL));
+
+ LoadTriangles(node->children, level, level->gates[i].walls, level->gates[i].nWalls);
+
i++;
}
@@ -573,15 +635,24 @@ void FreeLevel(LEVEL *level) {
if(level->nRooms) {
for(i = 0; i < level->nRooms; i++) {
if(level->rooms[i].nWalls) free(level->rooms[i].walls);
- if(level->rooms[i].nThings) free(level->rooms[i].things);
+ /*if(level->rooms[i].nThings) free(level->rooms[i].things);
if(level->rooms[i].nGates) {
free(level->rooms[i].gates);
free(level->rooms[i].gateinfo);
- }
+ }*/
+
+ free(level->rooms[i].id);
}
free(level->rooms);
}
+ if(level->nGates) {
+ for(i = 0; i < level->nGates; i++) {
+ if(level->gates[i].nWalls) free(level->gates[i].walls);
+ }
+ free(level->gates);
+ }
+
if(level->nTextures) {
for(i = 0; i < level->nTextures; i++)
free(level->textures[i].name);