2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\r
7 GtkRadiant is free software; you can redistribute it and/or modify
\r
8 it under the terms of the GNU General Public License as published by
\r
9 the Free Software Foundation; either version 2 of the License, or
\r
10 (at your option) any later version.
\r
12 GtkRadiant is distributed in the hope that it will be useful,
\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 GNU General Public License for more details.
\r
17 You should have received a copy of the GNU General Public License
\r
18 along with GtkRadiant; if not, write to the Free Software
\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\r
23 // trilib.c: library for loading triangles from an Alias triangle file
\r
29 #include "mathlib.h"
\r
32 #include "l3dslib.h"
\r
35 #include "qd_skeletons.h"
\r
38 // on disk representation of a face
\r
39 #define FLOAT_START 99999.0
\r
40 #define FLOAT_END -FLOAT_START
\r
41 #define MAGIC 123322
\r
43 #define M_PI 3.14159265
\r
46 float FixHTRRotateX = 0.0;
\r
47 float FixHTRRotateY = 0.0;
\r
48 float FixHTRRotateZ = 0.0;
\r
49 float FixHTRTranslateX = 0.0;
\r
50 float FixHTRTranslateY = 0.0;
\r
51 float FixHTRTranslateZ = 0.0;
\r
61 vector n; /* normal */
\r
62 vector p; /* point */
\r
63 vector c; /* color */
\r
73 void ByteSwapTri (tf_triangle *tri)
\r
77 for (i=0 ; i<sizeof(tf_triangle)/4 ; i++)
\r
79 ((int *)tri)[i] = BigLong (((int *)tri)[i]);
\r
83 void LoadTRI (char *filename, triangle_t **pptri, int *numtriangles, mesh_node_t **nodesList, int *num_mesh_nodes)
\r
87 char name[256], tex[256];
\r
88 int i, count, magic;
\r
97 *num_mesh_nodes = 0;
\r
98 *nodesList = (mesh_node_t *) SafeMalloc(MAX_FM_MESH_NODES * sizeof(mesh_node_t), "Mesh Node List");
\r
102 *((unsigned char *)&exitpattern + 0) = *((unsigned char *)&t + 3);
\r
103 *((unsigned char *)&exitpattern + 1) = *((unsigned char *)&t + 2);
\r
104 *((unsigned char *)&exitpattern + 2) = *((unsigned char *)&t + 1);
\r
105 *((unsigned char *)&exitpattern + 3) = *((unsigned char *)&t + 0);
\r
107 if ((input = fopen(filename, "rb")) == 0)
\r
108 Error ("reader: could not open file '%s'", filename);
\r
112 fread(&magic, sizeof(int), 1, input);
\r
113 if (BigLong(magic) != MAGIC)
\r
114 Error ("%s is not a Alias object separated triangle file, magic number is wrong.", filename);
\r
116 ptri = malloc (MAXTRIANGLES * sizeof(triangle_t));
\r
120 while (feof(input) == 0) {
\r
121 if (fread(&start, sizeof(float), 1, input) < 1)
\r
123 *(int *)&start = BigLong(*(int *)&start);
\r
124 if (*(int *)&start != exitpattern)
\r
126 if (start == FLOAT_START) {
\r
127 /* Start of an object or group of objects. */
\r
130 /* There are probably better ways to read a string from */
\r
131 /* a file, but this does allow you to do error checking */
\r
132 /* (which I'm not doing) on a per character basis. */
\r
134 fread( &(name[i]), sizeof( char ), 1, input);
\r
135 } while( name[i] != '\0' );
\r
138 // fprintf(stdout,"OBJECT START: %s\n",name);
\r
139 fread( &count, sizeof(int), 1, input);
\r
140 count = BigLong(count);
\r
144 // fprintf(stdout,"NUMBER OF TRIANGLES: %d\n",count);
\r
149 fread( &(tex[i]), sizeof( char ), 1, input);
\r
150 } while( tex[i] != '\0' );
\r
153 // fprintf(stdout," Object texture name: '%s'\n",tex);
\r
156 /* Else (count == 0) this is the start of a group, and */
\r
157 /* no texture name is present. */
\r
159 else if (start == FLOAT_END) {
\r
160 /* End of an object or group. Yes, the name should be */
\r
161 /* obvious from context, but it is in here just to be */
\r
162 /* safe and to provide a little extra information for */
\r
163 /* those who do not wish to write a recursive reader. */
\r
169 fread( &(name[i]), sizeof( char ), 1, input);
\r
170 } while( name[i] != '\0' );
\r
173 // fprintf(stdout,"OBJECT END: %s\n",name);
\r
179 // read the triangles
\r
181 for (i = 0; i < count; ++i) {
\r
184 fread( &tri, sizeof(tf_triangle), 1, input );
\r
185 ByteSwapTri (&tri);
\r
186 for (j=0 ; j<3 ; j++)
\r
190 for (k=0 ; k<3 ; k++)
\r
192 ptri->verts[j][k] = tri.pt[j].p.v[k];
\r
198 if ((ptri - *pptri) >= MAXTRIANGLES)
\r
199 Error ("Error: too many triangles; increase MAXTRIANGLES\n");
\r
203 *numtriangles = ptri - *pptri;
\r
207 DefaultNodesList(nodesList,num_mesh_nodes,numtriangles);
\r
211 //==========================================================================
\r
215 //==========================================================================
\r
219 float translation[3];
\r
220 static char *hrc_name;
\r
227 void HandleHRCModel(triangle_t **triList, int *triangleCount, mesh_node_t **nodesList, int *num_mesh_nodes,
\r
228 int ActiveNode, int Depth, int numVerts)
\r
230 void ReadHRCClusterList(mesh_node_t *meshNode, int baseIndex);
\r
236 mesh_node_t *meshNode;
\r
240 tokenType_t nextToken;
\r
241 float orig_scaling[3];
\r
242 float orig_rotation[3];
\r
243 float orig_translation[3];
\r
248 // Update Node Info
\r
251 TK_BeyondRequire(TK_NAME, TK_STRING);
\r
253 if (Depth == 0 || tk_String[0] == '_')
\r
255 ActiveNode = *num_mesh_nodes;
\r
256 (*num_mesh_nodes)++;
\r
257 if ((*num_mesh_nodes) > MAX_FM_MESH_NODES)
\r
259 Error("Too many mesh nodes in file %s\n", hrc_name);
\r
261 meshNode = &(*nodesList)[ActiveNode];
\r
263 // memset(meshNode, 0, sizeof(mesh_node_t));
\r
264 strcpy(meshNode->name, tk_String);
\r
266 memset(meshNode->tris, 0, sizeof(meshNode->tris));
\r
267 memset(meshNode->verts, 0, sizeof(meshNode->verts));
\r
269 meshNode->start_glcmds = 0;
\r
270 meshNode->num_glcmds = 0;
\r
274 { // Childs under the children
\r
275 meshNode = &(*nodesList)[ActiveNode];
\r
276 vertIndexBase = numVerts;
\r
285 // Get the scaling, rotation, and translation values
\r
286 TK_Beyond(TK_SCALING);
\r
287 for(i = 0; i < 3; i++)
\r
289 orig_scaling[i] = scaling[i];
\r
291 TK_Require(TK_FLOATNUMBER);
\r
292 scaling[i] *= tk_FloatNumber;
\r
296 TK_Beyond(TK_ROTATION);
\r
297 for(i = 0; i < 3; i++)
\r
299 orig_rotation[i] = rotation[i];
\r
301 TK_Require(TK_FLOATNUMBER);
\r
302 rotation[i] = tk_FloatNumber;
\r
306 TK_Beyond(TK_TRANSLATION);
\r
307 for(i = 0; i < 3; i++)
\r
309 orig_translation[i] = translation[i];
\r
311 TK_Require(TK_FLOATNUMBER);
\r
312 translation[i] += tk_FloatNumber;
\r
317 rx = ((rotation[0]-90.0)/360.0)*2.0*M_PI;
\r
318 ry = (rotation[2]/360.0)*2.0*M_PI;
\r
319 rz = (rotation[1]/360.0)*2.0*M_PI;
\r
321 // rjr - might not work if there an item doesn't have a mesh
\r
322 nextToken = tk_Token;
\r
323 if (nextToken == TK_ACTOR_DATA)
\r
325 while (nextToken != TK_MODEL && nextToken != TK_RBRACE)
\r
327 nextToken = TK_Fetch();
\r
331 while (nextToken == TK_SPLINE)
\r
332 { // spline node has two right braces
\r
333 nextToken = TK_Beyond(TK_RBRACE);
\r
334 nextToken = TK_Beyond(TK_RBRACE);
\r
337 while (nextToken == TK_MATERIAL)
\r
339 nextToken = TK_Beyond(TK_RBRACE);
\r
342 while(nextToken == TK_MODEL)
\r
344 HandleHRCModel(triList,triangleCount,nodesList,num_mesh_nodes,ActiveNode, Depth+1, 0);
\r
346 nextToken = TK_Fetch();
\r
349 if (nextToken == TK_MESH)
\r
351 // Get all the tri and vertex info
\r
352 TK_BeyondRequire(TK_VERTICES, TK_INTNUMBER);
\r
353 vertexCount = tk_IntNumber;
\r
354 for(i = 0; i < vertexCount; i++)
\r
356 TK_BeyondRequire(TK_LBRACKET, TK_INTNUMBER);
\r
357 if(tk_IntNumber != i)
\r
359 Error("File '%s', line %d:\nVertex index mismatch.\n",
\r
360 tk_SourceName, tk_Line);
\r
362 TK_Beyond(TK_POSITION);
\r
363 // Apply the scaling, rotation, and translation in the order
\r
364 // specified in the HRC file. This could be wrong.
\r
365 TK_Require(TK_FLOATNUMBER);
\r
366 x = tk_FloatNumber*scaling[0];
\r
367 TK_FetchRequire(TK_FLOATNUMBER);
\r
368 y = tk_FloatNumber*scaling[1];
\r
369 TK_FetchRequire(TK_FLOATNUMBER);
\r
370 z = tk_FloatNumber*scaling[2];
\r
372 y2 = y*cos(rx)+z*sin(rx);
\r
373 z2 = -y*sin(rx)+z*cos(rx);
\r
377 x2 = x*cos(ry)-z*sin(ry);
\r
378 z2 = x*sin(ry)+z*cos(ry);
\r
382 x2 = x*cos(rz)+y*sin(rz);
\r
383 y2 = -x*sin(rz)+y*cos(rz);
\r
387 vList[i].v[0] = x+translation[0];
\r
388 vList[i].v[1] = y-translation[2];
\r
389 vList[i].v[2] = z+translation[1];
\r
391 TK_BeyondRequire(TK_POLYGONS, TK_INTNUMBER);
\r
392 triCount = tk_IntNumber;
\r
393 if(triCount >= MAXTRIANGLES)
\r
395 Error("Too many triangles in file %s\n", hrc_name);
\r
398 start_tri = *triangleCount;
\r
399 *triangleCount += triCount;
\r
403 for(i = 0; i < triCount; i++)
\r
406 { // Update the node
\r
407 pos = (i + start_tri) >> 3;
\r
408 bit = 1 << ((i + start_tri) & 7 );
\r
409 meshNode->tris[pos] |= bit;
\r
412 TK_BeyondRequire(TK_LBRACKET, TK_INTNUMBER);
\r
413 if(tk_IntNumber != i)
\r
415 Error("File '%s', line %d:\nTriangle index mismatch.\n",
\r
416 tk_SourceName, tk_Line);
\r
418 TK_BeyondRequire(TK_NODES, TK_INTNUMBER);
\r
419 if(tk_IntNumber != 3)
\r
421 Error("File '%s', line %d:\nBad polygon vertex count: %d.",
\r
422 tk_SourceName, tk_Line, tk_IntNumber);
\r
424 tList[i+start_tri].HasUV = true;
\r
425 for(j = 0; j < 3; j++)
\r
427 TK_BeyondRequire(TK_LBRACKET, TK_INTNUMBER);
\r
428 if(tk_IntNumber != j)
\r
430 Error("File '%s', line %d:\nTriangle vertex index"
\r
431 " mismatch. %d should be %d\n", tk_SourceName, tk_Line,
\r
434 TK_BeyondRequire(TK_VERTEX, TK_INTNUMBER);
\r
436 tList[i+start_tri].verts[2-j][0] = vList[tk_IntNumber].v[0];
\r
437 tList[i+start_tri].verts[2-j][1] = vList[tk_IntNumber].v[1];
\r
438 tList[i+start_tri].verts[2-j][2] = vList[tk_IntNumber].v[2];
\r
440 tList[i+start_tri].indicies[2-j] = tk_IntNumber+vertIndexBase;
\r
442 TK_BeyondRequire(TK_UVTEXTURE, TK_FLOATNUMBER);
\r
443 tList[i+start_tri].uv[2-j][0] = tk_FloatNumber;
\r
445 TK_Require(TK_FLOATNUMBER);
\r
446 tList[i+start_tri].uv[2-j][1] = tk_FloatNumber;
\r
449 /* printf("Face %i:\n v0: %f, %f, %f\n v1: %f, %f, %f\n"
\r
450 " v2: %f, %f, %f\n", i,
\r
451 tList[i].verts[0][0],
\r
452 tList[i].verts[0][1],
\r
453 tList[i].verts[0][2],
\r
454 tList[i].verts[1][0],
\r
455 tList[i].verts[1][1],
\r
456 tList[i].verts[1][2],
\r
457 tList[i].verts[2][0],
\r
458 tList[i].verts[2][1],
\r
459 tList[i].verts[2][2]);
\r
463 TK_Beyond(TK_RBRACE);
\r
464 TK_Beyond(TK_RBRACE);
\r
466 if (tk_Token == TK_EDGES)
\r
468 // TK_Beyond(TK_EDGES);
\r
469 TK_Beyond(TK_RBRACE);
\r
472 scaling[0] = scaling[1] = scaling[2] = 1.0;
\r
473 // rotation[0] = rotation[1] = rotation[2] = 0.0;
\r
474 // translation[0] = translation[1] = translation[2] = 0.0;
\r
476 // See if there are any other models belonging to this node
\r
481 nextToken = tk_Token;
\r
482 if(nextToken == TK_CLUSTERS)
\r
484 if(g_skelModel.clustered == -1)
\r
486 ReadHRCClusterList(meshNode, vertIndexBase);
\r
490 nextToken = TK_Get(TK_CLUSTER_NAME);
\r
492 while (nextToken == TK_CLUSTER_NAME)
\r
494 TK_BeyondRequire(TK_CLUSTER_STATE, TK_INTNUMBER);
\r
495 nextToken = TK_Fetch();
\r
499 // one right brace follow the list of clusters
\r
500 nextToken = TK_Beyond(TK_RBRACE);
\r
504 if(g_skelModel.clustered == -1 && !vertIndexBase)
\r
506 meshNode->clustered = false;
\r
511 nextToken = tk_Token;
\r
512 if(nextToken == TK_SPLINE)
\r
514 while (nextToken == TK_SPLINE)
\r
515 { // spline node has two right braces
\r
516 nextToken = TK_Beyond(TK_RBRACE);
\r
517 nextToken = TK_Beyond(TK_RBRACE);
\r
520 nextToken = TK_Beyond(TK_RBRACE);
\r
523 while (nextToken == TK_MATERIAL)
\r
525 nextToken = TK_Beyond(TK_RBRACE);
\r
528 while(nextToken == TK_MODEL)
\r
530 HandleHRCModel(triList,triangleCount,nodesList, num_mesh_nodes, ActiveNode, Depth+1, vertexCount+vertIndexBase);
\r
532 nextToken = TK_Fetch();
\r
538 scaling[i] = orig_scaling[i];
\r
539 rotation[i] = orig_rotation[i];
\r
540 translation[i] = orig_translation[i];
\r
544 static void LoadHRC(char *fileName, triangle_t **triList, int *triangleCount, mesh_node_t **nodesList, int *num_mesh_nodes)
\r
548 *num_mesh_nodes = 0;
\r
552 *nodesList = (mesh_node_t *) SafeMalloc(MAX_FM_MESH_NODES * sizeof(mesh_node_t), "Mesh Node List");
\r
556 hrc_name = fileName;
\r
558 scaling[0] = scaling[1] = scaling[2] = 1.0;
\r
559 rotation[0] = rotation[1] = rotation[2] = 0.0;
\r
560 translation[0] = translation[1] = translation[2] = 0.0;
\r
562 *triangleCount = 0;
\r
563 *triList = (triangle_t *) SafeMalloc(MAXTRIANGLES*sizeof(triangle_t), "Triangle list");
\r
564 memset(*triList,0,MAXTRIANGLES*sizeof(triangle_t));
\r
566 TK_OpenSource(fileName);
\r
567 TK_FetchRequire(TK_HRCH);
\r
568 TK_FetchRequire(TK_COLON);
\r
569 TK_FetchRequire(TK_SOFTIMAGE);
\r
572 TK_Beyond(TK_MODEL);
\r
574 HandleHRCModel(triList, triangleCount, nodesList, num_mesh_nodes, 0, 0, 0);
\r
578 //==========================================================================
\r
582 //==========================================================================
\r
584 static int Version2;
\r
586 void HandleHTRModel(triangle_t **triList, int *triangleCount, mesh_node_t **nodesList, int *num_mesh_nodes,
\r
587 int ActiveNode, int Depth, int numVerts)
\r
598 mesh_node_t *meshNode;
\r
605 TK_BeyondRequire(TK_NAME, TK_STRING);
\r
607 if (Depth == 0 || tk_String[0] == '_')
\r
609 ActiveNode = *num_mesh_nodes;
\r
610 (*num_mesh_nodes)++;
\r
611 if ((*num_mesh_nodes) > MAX_FM_MESH_NODES)
\r
613 Error("Too many mesh nodes in file %s\n", hrc_name);
\r
615 meshNode = &(*nodesList)[ActiveNode];
\r
617 // memset(meshNode, 0, sizeof(mesh_node_t));
\r
618 strcpy(meshNode->name, tk_String);
\r
620 memset(meshNode->tris, 0, sizeof(meshNode->tris));
\r
621 memset(meshNode->verts, 0, sizeof(meshNode->verts));
\r
623 meshNode->start_glcmds = 0;
\r
624 meshNode->num_glcmds = 0;
\r
628 { // Childs under the children
\r
629 meshNode = &(*nodesList)[ActiveNode];
\r
630 vertIndexBase = numVerts;
\r
638 // Get vertex count
\r
639 TK_BeyondRequire(TK_VERTICES, TK_INTNUMBER);
\r
640 vertexCount = tk_IntNumber;
\r
642 // Get triangle count
\r
643 TK_BeyondRequire(TK_FACES, TK_INTNUMBER);
\r
644 triCount = tk_IntNumber;
\r
645 if(triCount >= MAXTRIANGLES)
\r
647 Error("Too many triangles in file %s\n", hrc_name);
\r
651 TK_Beyond(TK_ORIGIN);
\r
652 TK_Require(TK_FLOATNUMBER);
\r
653 origin[0] = tk_FloatNumber;
\r
654 TK_FetchRequire(TK_FLOATNUMBER);
\r
655 origin[1] = tk_FloatNumber;
\r
656 TK_FetchRequire(TK_FLOATNUMBER);
\r
657 origin[2] = tk_FloatNumber;
\r
659 //rx = 90.0/360.0*2.0*M_PI;
\r
660 rx = FixHTRRotateX/360.0*2.0*M_PI;
\r
661 ry = FixHTRRotateY/360.0*2.0*M_PI;
\r
662 rz = FixHTRRotateZ/360.0*2.0*M_PI;
\r
665 for(i = 0; i < vertexCount; i++)
\r
667 TK_FetchRequire(TK_VERTEX);
\r
668 TK_FetchRequire(TK_FLOATNUMBER);
\r
669 x = tk_FloatNumber-origin[0];
\r
670 TK_FetchRequire(TK_FLOATNUMBER);
\r
671 y = tk_FloatNumber-origin[1];
\r
672 TK_FetchRequire(TK_FLOATNUMBER);
\r
673 z = tk_FloatNumber-origin[2];
\r
675 x += FixHTRTranslateX;
\r
676 y += FixHTRTranslateY;
\r
677 z += FixHTRTranslateZ;
\r
679 y2 = y*cos(rx)-z*sin(rx);
\r
680 z2 = y*sin(rx)+z*cos(rx);
\r
683 x2 = x*cos(ry)+z*sin(ry);
\r
684 z2 = -x*sin(ry)+z*cos(ry);
\r
687 x2 = x*cos(rz)-y*sin(rz);
\r
688 y2 = x*sin(rz)+y*cos(rz);
\r
697 start_tri = *triangleCount;
\r
698 *triangleCount += triCount;
\r
703 for(i = 0; i < triCount; i++)
\r
706 { // Update the node
\r
707 pos = (i + start_tri) >> 3;
\r
708 bit = 1 << ((i + start_tri) & 7 );
\r
709 meshNode->tris[pos] |= bit;
\r
712 TK_FetchRequire(TK_FACE);
\r
713 TK_FetchRequire(TK_LPAREN);
\r
714 for(j = 0; j < 3; j++)
\r
716 TK_FetchRequire(TK_INTNUMBER);
\r
717 vertexNum = tk_IntNumber-1;
\r
718 if(vertexNum >= vertexCount)
\r
720 Error("File '%s', line %d:\nVertex number"
\r
721 " >= vertexCount: %d\n", tk_SourceName, tk_Line,
\r
724 tList[i+start_tri].verts[2-j][0] = vList[vertexNum].v[0];
\r
725 tList[i+start_tri].verts[2-j][1] = vList[vertexNum].v[1];
\r
726 tList[i+start_tri].verts[2-j][2] = vList[vertexNum].v[2];
\r
728 TK_FetchRequire(TK_RPAREN);
\r
732 TK_FetchRequire(TK_FLOATNUMBER);
\r
733 tList[i+start_tri].uv[0][0]=tk_FloatNumber;
\r
734 TK_FetchRequire(TK_FLOATNUMBER);
\r
735 tList[i+start_tri].uv[0][1]=tk_FloatNumber;
\r
736 TK_FetchRequire(TK_FLOATNUMBER);
\r
737 tList[i+start_tri].uv[1][0]=tk_FloatNumber;
\r
738 TK_FetchRequire(TK_FLOATNUMBER);
\r
739 tList[i+start_tri].uv[1][1]=tk_FloatNumber;
\r
740 TK_FetchRequire(TK_FLOATNUMBER);
\r
741 tList[i+start_tri].uv[2][0]=tk_FloatNumber;
\r
742 TK_FetchRequire(TK_FLOATNUMBER);
\r
743 tList[i+start_tri].uv[2][1]=tk_FloatNumber;
\r
744 tList[i+start_tri].HasUV=1;
\r
747 tList[i+start_tri].HasUV=0;
\r
749 // printf("Face %i:\n v0: %f, %f, %f\n v1: %f, %f, %f\n"
\r
750 // " v2: %f, %f, %f\n", i,
\r
751 // tList[i].verts[0][0],
\r
752 // tList[i].verts[0][1],
\r
753 // tList[i].verts[0][2],
\r
754 // tList[i].verts[1][0],
\r
755 // tList[i].verts[1][1],
\r
756 // tList[i].verts[1][2],
\r
757 // tList[i].verts[2][0],
\r
758 // tList[i].verts[2][1],
\r
759 // tList[i].verts[2][2]);
\r
765 if (tk_Token == TK_VERTICES)
\r
767 HandleHTRModel(triList,triangleCount,nodesList, num_mesh_nodes, ActiveNode, Depth+1, vertexCount+vertIndexBase);
\r
771 static void LoadHTR(char *fileName, triangle_t **triList, int *triangleCount, mesh_node_t **nodesList, int *num_mesh_nodes)
\r
775 *num_mesh_nodes = 0;
\r
779 *nodesList = SafeMalloc(MAX_FM_MESH_NODES * sizeof(mesh_node_t), "Mesh Node List");
\r
783 hrc_name = fileName;
\r
785 scaling[0] = scaling[1] = scaling[2] = 1.0;
\r
786 rotation[0] = rotation[1] = rotation[2] = 0.0;
\r
787 translation[0] = translation[1] = translation[2] = 0.0;
\r
789 *triangleCount = 0;
\r
790 *triList = SafeMalloc(MAXTRIANGLES*sizeof(triangle_t), "Triangle list");
\r
791 memset(*triList,0,MAXTRIANGLES*sizeof(triangle_t));
\r
793 TK_OpenSource(fileName);
\r
795 TK_Beyond(TK_C_HEXEN);
\r
796 TK_Beyond(TK_C_TRIANGLES);
\r
797 TK_BeyondRequire(TK_C_VERSION, TK_INTNUMBER);
\r
798 if(tk_IntNumber != 1&&tk_IntNumber != 2)
\r
800 Error("Unsupported version (%d) in file %s\n", tk_IntNumber,
\r
803 Version2=(tk_IntNumber==2);
\r
806 HandleHTRModel(triList, triangleCount, nodesList, num_mesh_nodes, 0, 0, 0);
\r
811 static void LoadHTR(char *fileName, triangle_t **triList, int *triangleCount, mesh_node_t **nodesList, int *num_mesh_nodes)
\r
830 *num_mesh_nodes = 0;
\r
831 *nodesList = (mesh_node_t *) SafeMalloc(MAX_FM_MESH_NODES * sizeof(mesh_node_t), "Mesh Node List");
\r
834 TK_OpenSource(fileName);
\r
836 TK_Beyond(TK_C_HEXEN);
\r
837 TK_Beyond(TK_C_TRIANGLES);
\r
838 TK_BeyondRequire(TK_C_VERSION, TK_INTNUMBER);
\r
839 if(tk_IntNumber != 1&&tk_IntNumber != 2)
\r
841 Error("Unsupported version (%d) in file %s\n", tk_IntNumber,
\r
844 Version2=(tk_IntNumber==2);
\r
847 // Get vertex count
\r
848 TK_BeyondRequire(TK_VERTICES, TK_INTNUMBER);
\r
849 vertexCount = tk_IntNumber;
\r
850 vList = (void *) SafeMalloc(vertexCount*sizeof vList[0], "Vertex list");
\r
852 // Get triangle count
\r
853 TK_BeyondRequire(TK_FACES, TK_INTNUMBER);
\r
854 triCount = tk_IntNumber;
\r
855 if(triCount >= MAXTRIANGLES)
\r
857 Error("Too many triangles in file %s\n", fileName);
\r
859 *triangleCount = triCount;
\r
860 tList = (triangle_t *) SafeMalloc(MAXTRIANGLES*sizeof(triangle_t), "Triangle list");
\r
862 memset(*triList,0,MAXTRIANGLES*sizeof(triangle_t));
\r
865 TK_Beyond(TK_ORIGIN);
\r
866 TK_Require(TK_FLOATNUMBER);
\r
867 origin[0] = tk_FloatNumber;
\r
868 TK_FetchRequire(TK_FLOATNUMBER);
\r
869 origin[1] = tk_FloatNumber;
\r
870 TK_FetchRequire(TK_FLOATNUMBER);
\r
871 origin[2] = tk_FloatNumber;
\r
873 //rx = 90.0/360.0*2.0*M_PI;
\r
874 rx = FixHTRRotateX/360.0*2.0*M_PI;
\r
875 ry = FixHTRRotateY/360.0*2.0*M_PI;
\r
876 rz = FixHTRRotateZ/360.0*2.0*M_PI;
\r
879 for(i = 0; i < vertexCount; i++)
\r
881 TK_FetchRequire(TK_VERTEX);
\r
882 TK_FetchRequire(TK_FLOATNUMBER);
\r
883 x = tk_FloatNumber-origin[0];
\r
884 TK_FetchRequire(TK_FLOATNUMBER);
\r
885 y = tk_FloatNumber-origin[1];
\r
886 TK_FetchRequire(TK_FLOATNUMBER);
\r
887 z = tk_FloatNumber-origin[2];
\r
889 x += FixHTRTranslateX;
\r
890 y += FixHTRTranslateY;
\r
891 z += FixHTRTranslateZ;
\r
893 y2 = y*cos(rx)-z*sin(rx);
\r
894 z2 = y*sin(rx)+z*cos(rx);
\r
897 x2 = x*cos(ry)+z*sin(ry);
\r
898 z2 = -x*sin(ry)+z*cos(ry);
\r
901 x2 = x*cos(rz)-y*sin(rz);
\r
902 y2 = x*sin(rz)+y*cos(rz);
\r
912 for(i = 0; i < triCount; i++)
\r
914 TK_FetchRequire(TK_FACE);
\r
915 TK_FetchRequire(TK_LPAREN);
\r
916 for(j = 0; j < 3; j++)
\r
918 TK_FetchRequire(TK_INTNUMBER);
\r
919 vertexNum = tk_IntNumber-1;
\r
920 if(vertexNum >= vertexCount)
\r
922 Error("File '%s', line %d:\nVertex number"
\r
923 " >= vertexCount: %d\n", tk_SourceName, tk_Line,
\r
926 tList[i].verts[2-j][0] = vList[vertexNum].v[0];
\r
927 tList[i].verts[2-j][1] = vList[vertexNum].v[1];
\r
928 tList[i].verts[2-j][2] = vList[vertexNum].v[2];
\r
930 TK_FetchRequire(TK_RPAREN);
\r
934 TK_FetchRequire(TK_FLOATNUMBER);
\r
935 tList[i].uv[2][0]= fmod(1000+tk_FloatNumber,1);
\r
936 TK_FetchRequire(TK_FLOATNUMBER);
\r
937 tList[i].uv[2][1]=fmod(1000+tk_FloatNumber,1);
\r
938 TK_FetchRequire(TK_FLOATNUMBER);
\r
939 tList[i].uv[1][0]=fmod(1000+tk_FloatNumber,1);
\r
940 TK_FetchRequire(TK_FLOATNUMBER);
\r
941 tList[i].uv[1][1]=fmod(1000+tk_FloatNumber,1);
\r
942 TK_FetchRequire(TK_FLOATNUMBER);
\r
943 tList[i].uv[0][0]=fmod(1000+tk_FloatNumber,1);
\r
944 TK_FetchRequire(TK_FLOATNUMBER);
\r
945 tList[i].uv[0][1]=fmod(1000+tk_FloatNumber,1);
\r
951 /* printf("Face %i:\n v0: %f, %f, %f\n v1: %f, %f, %f\n"
\r
952 " v2: %f, %f, %f\n", i,
\r
953 tList[i].verts[0][0],
\r
954 tList[i].verts[0][1],
\r
955 tList[i].verts[0][2],
\r
956 tList[i].verts[1][0],
\r
957 tList[i].verts[1][1],
\r
958 tList[i].verts[1][2],
\r
959 tList[i].verts[2][0],
\r
960 tList[i].verts[2][1],
\r
961 tList[i].verts[2][2]);
\r
967 DefaultNodesList(nodesList,num_mesh_nodes,triangleCount);
\r
970 //==========================================================================
\r
972 // LoadTriangleList
\r
974 //==========================================================================
\r
976 void LoadTriangleList(char *fileName, triangle_t **triList, int *triangleCount, mesh_node_t **ppmnodes, int *num_mesh_nodes)
\r
981 char InputFileName[256];
\r
983 dotstart = strrchr(fileName,dot); // Does it already have an extension on the file name?
\r
987 strcpy(InputFileName, fileName);
\r
988 strcat(InputFileName, ".hrc");
\r
989 if((file1 = fopen(InputFileName, "rb")) != NULL)
\r
992 LoadHRC(InputFileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
993 printf(" - assuming .HRC\n");
\r
997 strcpy(InputFileName, fileName);
\r
998 strcat(InputFileName, ".asc");
\r
999 if((file1 = fopen(InputFileName, "rb")) != NULL)
\r
1002 LoadASC(InputFileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1003 printf(" - assuming .ASC\n");
\r
1007 strcpy(InputFileName, fileName);
\r
1008 strcat(InputFileName, ".tri");
\r
1009 if((file1 = fopen(InputFileName, "rb")) != NULL)
\r
1012 LoadTRI(InputFileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1013 printf(" - assuming .TRI\n");
\r
1017 strcpy(InputFileName, fileName);
\r
1018 strcat(InputFileName, ".3ds");
\r
1019 if((file1 = fopen(InputFileName, "rb")) != NULL)
\r
1022 Load3DSTriangleList (InputFileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1023 printf(" - assuming .3DS\n");
\r
1027 strcpy(InputFileName, fileName);
\r
1028 strcat(InputFileName, ".htr");
\r
1029 if((file1 = fopen(InputFileName, "rb")) != NULL)
\r
1032 LoadHTR (InputFileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1033 printf(" - assuming .HTR\n");
\r
1036 Error("\n Could not open file '%s':\n"
\r
1037 "No HRC, ASC, 3DS, HTR, or TRI match.\n", fileName);
\r
1041 if((file1 = fopen(fileName, "rb")) != NULL)
\r
1045 if (strcmp(dotstart,".hrc") == 0 || strcmp(dotstart,".HRC") == 0)
\r
1047 LoadHRC(fileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1049 else if (strcmp(dotstart,".asc") == 0 || strcmp(dotstart,".ASC") == 0)
\r
1051 LoadASC(fileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1053 else if (strcmp(dotstart,".tri") == 0 || strcmp(dotstart,".TRI") == 0)
\r
1055 LoadTRI(fileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1057 else if (strcmp(dotstart,".3ds") == 0 || strcmp(dotstart,".3DS") == 0)
\r
1059 Load3DSTriangleList (fileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1061 else if (strcmp(dotstart,".htr") == 0 || strcmp(dotstart,".HTR") == 0)
\r
1063 LoadHTR (fileName, triList, triangleCount, ppmnodes, num_mesh_nodes);
\r
1067 Error("Could not open file '%s':\n",fileName);
\r
1071 else //failed to load file
\r
1073 Error("Could not open file '%s':\n",fileName);
\r