/* Copyright (C) 1999-2006 Id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // // l3dslib.c: library for loading triangles from an Alias triangle file // #include #include "cmdlib.h" #include "inout.h" #include "mathlib.h" #include "trilib.h" #include "l3dslib.h" #define MAIN3DS 0x4D4D #define EDIT3DS 0x3D3D // this is the start of the editor config #define EDIT_OBJECT 0x4000 #define OBJ_TRIMESH 0x4100 #define TRI_VERTEXL 0x4110 #define TRI_FACEL1 0x4120 #define MAXVERTS 2000 typedef struct { int v[4]; } tri; float fverts[MAXVERTS][3]; tri tris[MAXTRIANGLES]; int bytesread, level, numtris, totaltris; int vertsfound, trisfound; triangle_t *ptri; // Alias stores triangles as 3 explicit vertices in .tri files, so even though we // start out with a vertex pool and vertex indices for triangles, we have to convert // to raw, explicit triangles void StoreAliasTriangles (void) { int i, j, k; if ((totaltris + numtris) > MAXTRIANGLES) Error ("Error: Too many triangles"); for (i=0; i MAXVERTS) Error ("Error: Too many vertices"); for (i=0 ; i MAXTRIANGLES) Error ("Error: Too many triangles"); for (i=0 ; i 0) { w -= ParseChunk (input); } retval = length; goto Done; default: // skip other chunks while (w > 0) { t = w; if (t > BLOCK_SIZE) t = BLOCK_SIZE; if (feof(input)) Error ("Error: unexpected end of file"); fread (&temp, t, 1, input); bytesread += t; w -= t; } retval = length; goto Done; } Done: level--; return retval; } void Load3DSTriangleList (char *filename, triangle_t **pptri, int *numtriangles) { FILE *input; short int tshort; bytesread = 0; level = 0; numtris = 0; totaltris = 0; vertsfound = 0; trisfound = 0; if ((input = fopen(filename, "rb")) == 0) { fprintf(stderr,"reader: could not open file '%s'\n", filename); exit(0); } fread(&tshort, sizeof(tshort), 1, input); // should only be MAIN3DS, but some files seem to start with EDIT3DS, with // no MAIN3DS if ((tshort != MAIN3DS) && (tshort != EDIT3DS)) { fprintf(stderr,"File is not a 3DS file.\n"); exit(0); } // back to top of file so we can parse the first chunk descriptor fseek(input, 0, SEEK_SET); ptri = malloc (MAXTRIANGLES * sizeof(triangle_t)); *pptri = ptri; // parse through looking for the relevant chunk tree (MAIN3DS | EDIT3DS | EDIT_OBJECT | // OBJ_TRIMESH | {TRI_VERTEXL, TRI_FACEL1}) and skipping other chunks ParseChunk (input); if (vertsfound || trisfound) Error ("Incomplete triangle set"); *numtriangles = totaltris; fclose (input); }