From f5c8fc72ca1801a7771a75d652c58754b36db768 Mon Sep 17 00:00:00 2001 From: neoraider Date: Tue, 12 Jun 2007 17:19:01 +0000 Subject: libzoom: Added gates to level loader; zoom: Added gate to level; some Makefile.am changes --- level.c | 291 ++++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 181 insertions(+), 110 deletions(-) (limited to 'level.c') 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); -- cgit v1.2.3