UFO: Alien Invasion
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
aselib.cpp
Go to the documentation of this file.
1 
6 /*
7 Copyright (C) 1999-2007 id Software, Inc. and contributors.
8 For a list of contributors, see the accompanying CONTRIBUTORS file.
9 
10 This file is part of GtkRadiant.
11 
12 GtkRadiant is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16 
17 GtkRadiant is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21 
22 You should have received a copy of the GNU General Public License
23 along with GtkRadiant; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 */
26 
27 #include "aselib.h"
28 #include "../bsp.h"
29 #include "shared.h"
30 
31 #define MAX_ASE_MATERIALS 32
32 #define MAX_ASE_OBJECTS 64
33 #define MAX_ASE_ANIMATIONS 32
34 #define MAX_ASE_ANIMATION_FRAMES 512
35 
36 #define VERBOSE(x) { if (ase.verbose) { Com_Printf x; } }
37 
38 typedef struct {
39  float x, y, z;
40  float nx, ny, nz;
41  float s, t;
42 } aseVertex_t;
43 
44 typedef struct {
45  float s, t;
46 } aseTVertex_t;
47 
48 typedef int aseFace_t[3];
49 
50 typedef struct {
51  int numFaces;
54 
55  int timeValue;
56 
59  aseFace_t* faces, *tfaces;
60 
61  int currentFace, currentVertex;
62 } aseMesh_t;
63 
64 typedef struct {
65  int numFrames;
67 
70 
71 typedef struct {
72  char name[MAX_QPATH];
74 
78 typedef struct {
79  char name[MAX_QPATH];
80 
83 
86 
87 typedef struct {
91 
92  char* buffer;
93  char* curpos;
94  int len;
95 
97  bool verbose;
98 } ase_t;
99 
100 static char s_token[1024];
101 static ase_t ase;
102 
103 static void ASE_Process(void);
104 static void ASE_FreeGeomObject(int ndx);
105 
106 void ASE_Load (const char* filename, bool verbose)
107 {
108  ScopedFile file;
109  FS_OpenFile(filename, &file, FILE_READ);
110  if (!file)
111  Sys_Error("File not found '%s'", filename);
112 
113  OBJZERO(ase);
114 
115  ase.verbose = verbose;
116  ase.len = FS_FileLength(&file);
117 
118  ase.curpos = ase.buffer = Mem_AllocTypeN(char, ase.len);
119  if (!ase.curpos)
120  Sys_Error("Could not allocate memory for ase loading");
121 
122  Verb_Printf(VERB_EXTRA, "Processing '%s'\n", filename);
123 
124  if (FS_Read(ase.buffer, ase.len, &file) != 1) {
125  Sys_Error("fread() != -1 for '%s'", filename);
126  }
127 
128  ASE_Process();
129 }
130 
131 void ASE_Free (void)
132 {
133  for (int i = 0; i < ase.currentObject; i++)
135 }
136 
138 {
139  return ase.currentObject;
140 }
141 
142 const char* ASE_GetSurfaceName (int which)
143 {
144  aseGeomObject_t* pObject = &ase.objects[which];
145 
146  if (!pObject->anim.numFrames)
147  return 0;
148 
149  return pObject->name;
150 }
151 
156 {
157  aseGeomObject_t* pObject = &ase.objects[whichSurface];
158  polyset_t* psets;
159  int numFramesInAnimation;
160  int i, f;
161 
162  if (!pObject->anim.numFrames)
163  return 0;
164 
165  numFramesInAnimation = pObject->anim.numFrames;
166 
167  psets = Mem_AllocTypeN(polyset_t, numFramesInAnimation);
168 
169  for (f = 0, i = 0; i < numFramesInAnimation; i++) {
170  int t;
171  aseMesh_t* pMesh = &pObject->anim.frames[i];
172  polyset_t* ps = &psets[f];
173 
174  strcpy(ps->name, pObject->name);
175  strcpy(ps->materialname, ase.materials[pObject->materialRef].name);
176 
178  ps->numtriangles = pObject->anim.frames[i].numFaces;
179 
180  for (t = 0; t < pObject->anim.frames[i].numFaces; t++) {
181  for (int k = 0; k < 3; k++) {
182  triangle_t* tri = &ps->triangles[t];
183  const int vIdx = pMesh->faces[t][k];
184  aseVertex_t* v = &pMesh->vertexes[vIdx];
185  VectorSet(tri->verts[k], v->x, v->y, v->z);
186 
187  if (pMesh->tvertexes && pMesh->tfaces) {
188  aseTVertex_t* tv = &pMesh->tvertexes[pMesh->tfaces[t][k]];
189  Vector2Set(tri->texcoords[k], tv->s, tv->t);
190  }
191  }
192  }
193 
194  f++;
195  }
196 
197  return psets;
198 }
199 
200 static void ASE_FreeGeomObject (int ndx)
201 {
202  aseGeomObject_t* pObject = &ase.objects[ndx];
203 
204  for (int i = 0; i < pObject->anim.numFrames; i++) {
205  Mem_Free(pObject->anim.frames[i].vertexes);
206  Mem_Free(pObject->anim.frames[i].tvertexes);
207  Mem_Free(pObject->anim.frames[i].faces);
208  Mem_Free(pObject->anim.frames[i].tfaces);
209  }
210 
211  OBJZERO(*pObject);
212 }
213 
215 {
216  aseGeomObject_t* pObject;
217 
218  if (ase.currentObject >= MAX_ASE_OBJECTS)
219  Sys_Error("Too many GEOMOBJECTs");
220 
221  pObject = &ase.objects[ase.currentObject];
222 
224  Sys_Error("Too many MESHes");
225 
226  return &pObject->anim.frames[pObject->anim.currentFrame];
227 }
228 
229 static inline int CharIsTokenDelimiter (int ch)
230 {
231  if (ch <= ' ')
232  return 1;
233  return 0;
234 }
235 
236 static int ASE_GetToken (bool restOfLine)
237 {
238  int i = 0;
239 
240  if (ase.buffer == 0)
241  return 0;
242 
243  if ((ase.curpos - ase.buffer) == ase.len)
244  return 0;
245 
246  /* skip over crap */
247  while (ase.curpos - ase.buffer < ase.len && *ase.curpos <= ' ') {
248  ase.curpos++;
249  }
250 
251  while ((ase.curpos - ase.buffer) < ase.len) {
252  s_token[i] = *ase.curpos;
253 
254  ase.curpos++;
255  i++;
256 
257  if ((CharIsTokenDelimiter(s_token[i - 1]) && !restOfLine) ||
258  (s_token[i - 1] == '\n' || s_token[i - 1] == '\r')) {
259  s_token[i - 1] = 0;
260  break;
261  }
262  }
263 
264  s_token[i] = 0;
265 
266  return 1;
267 }
268 
269 static void ASE_ParseBracedBlock (void (*parser)(const char* token))
270 {
271  int indent = 0;
272 
273  while (ASE_GetToken(false)) {
274  if (Q_streq(s_token, "{")) {
275  indent++;
276  } else if (Q_streq(s_token, "}")) {
277  --indent;
278  if (indent == 0)
279  break;
280  else if (indent < 0)
281  Sys_Error("Unexpected '}'");
282  } else {
283  if (parser)
284  parser(s_token);
285  }
286  }
287 }
288 
289 static void ASE_SkipEnclosingBraces (void)
290 {
291  int indent = 0;
292 
293  while (ASE_GetToken(false)) {
294  if (Q_streq(s_token, "{")) {
295  indent++;
296  } else if (Q_streq(s_token, "}")) {
297  indent--;
298  if (indent == 0)
299  break;
300  else if (indent < 0)
301  Sys_Error("Unexpected '}'");
302  }
303  }
304 }
305 
306 static void ASE_SkipRestOfLine (void)
307 {
308  ASE_GetToken(true);
309 }
310 
311 static void ASE_KeyMAP_DIFFUSE (const char* token)
312 {
313  if (Q_streq(token, "*BITMAP")) {
314  const char* bitmap;
315  size_t len;
316 
317  ASE_GetToken(false);
318 
319  /* skip the " */
320  bitmap = &s_token[1];
321  len = strlen(bitmap) - 1;
322  s_token[len] = '\0';
323 
325  Verb_Printf(VERB_EXTRA, "ase material name: \'%s\'\n", ase.materials[ase.numMaterials].name);
326  }
327 }
328 
329 static void ASE_KeyMATERIAL (const char* token)
330 {
331  if (Q_streq(token, "*MAP_DIFFUSE"))
333 }
334 
335 static void ASE_KeyMATERIAL_LIST (const char* token)
336 {
337  if (Q_streq(token, "*MATERIAL_COUNT")) {
338  ASE_GetToken(false);
339  VERBOSE(("..num materials: %s\n", s_token));
340  if (atoi(s_token) > MAX_ASE_MATERIALS) {
341  Sys_Error("Too many materials!");
342  }
343  ase.numMaterials = 0;
344  } else if (Q_streq(token, "*MATERIAL")) {
345  VERBOSE(("..material %d ", ase.numMaterials));
347  ase.numMaterials++;
348  }
349 }
350 
351 static void ASE_KeyMESH_VERTEX_LIST (const char* token)
352 {
353  aseMesh_t* pMesh = ASE_GetCurrentMesh();
354 
355  if (Q_streq(token, "*MESH_VERTEX")) {
356  ASE_GetToken(false); /* skip number */
357 
358  ASE_GetToken(false);
359  pMesh->vertexes[pMesh->currentVertex].y = atof(s_token);
360 
361  ASE_GetToken(false);
362  pMesh->vertexes[pMesh->currentVertex].x = -atof(s_token);
363 
364  ASE_GetToken(false);
365  pMesh->vertexes[pMesh->currentVertex].z = atof(s_token);
366 
367  pMesh->currentVertex++;
368 
369  if (pMesh->currentVertex > pMesh->numVertexes)
370  Sys_Error("pMesh->currentVertex >= pMesh->numVertexes");
371  } else
372  Sys_Error("Unknown token '%s' while parsing MESH_VERTEX_LIST", token);
373 }
374 
375 static void ASE_KeyMESH_FACE_LIST (const char* token)
376 {
377  aseMesh_t* pMesh = ASE_GetCurrentMesh();
378 
379  if (Q_streq(token, "*MESH_FACE")) {
380  ASE_GetToken(false); /* skip face number */
381 
382  ASE_GetToken(false); /* skip label */
383  ASE_GetToken(false); /* first vertex */
384  pMesh->faces[pMesh->currentFace][0] = atoi(s_token);
385 
386  ASE_GetToken(false); /* skip label */
387  ASE_GetToken(false); /* second vertex */
388  pMesh->faces[pMesh->currentFace][2] = atoi(s_token);
389 
390  ASE_GetToken(false); /* skip label */
391  ASE_GetToken(false); /* third vertex */
392  pMesh->faces[pMesh->currentFace][1] = atoi(s_token);
393 
394  ASE_GetToken(true);
395 
396 #if 0
397  if ((p = strstr(s_token, "*MESH_MTLID")) != 0) {
398  p += strlen("*MESH_MTLID") + 1;
399  mtlID = atoi(p);
400  } else {
401  Sys_Error("No *MESH_MTLID found for face!");
402  }
403 #endif
404 
405  pMesh->currentFace++;
406  } else
407  Sys_Error("Unknown token '%s' while parsing MESH_FACE_LIST", token);
408 }
409 
410 static void ASE_KeyTFACE_LIST (const char* token)
411 {
412  aseMesh_t* pMesh = ASE_GetCurrentMesh();
413 
414  if (Q_streq(token, "*MESH_TFACE")) {
415  int a, b, c;
416  aseFace_t* f;
417 
418  ASE_GetToken(false);
419 
420  ASE_GetToken(false);
421  a = atoi(s_token);
422  ASE_GetToken(false);
423  c = atoi(s_token);
424  ASE_GetToken(false);
425  b = atoi(s_token);
426 
427  f = &pMesh->tfaces[pMesh->currentFace];
428  *f[0] = a;
429  *f[1] = b;
430  *f[2] = c;
431 
432  pMesh->currentFace++;
433  } else
434  Sys_Error("Unknown token '%s' in MESH_TFACE", token);
435 }
436 
437 static void ASE_KeyMESH_TVERTLIST (const char* token)
438 {
439  aseMesh_t* pMesh = ASE_GetCurrentMesh();
440 
441  if (Q_streq(token, "*MESH_TVERT")) {
442  char u[80], v[80], w[80];
443 
444  ASE_GetToken(false);
445 
446  ASE_GetToken(false);
447  strcpy(u, s_token);
448 
449  ASE_GetToken(false);
450  strcpy(v, s_token);
451 
452  ASE_GetToken(false);
453  strcpy(w, s_token);
454 
455  pMesh->tvertexes[pMesh->currentVertex].s = atof(u);
456  pMesh->tvertexes[pMesh->currentVertex].t = 1.0f - atof(v);
457 
458  pMesh->currentVertex++;
459 
460  if (pMesh->currentVertex > pMesh->numTVertexes) {
461  Sys_Error("pMesh->currentVertex > pMesh->numTVertexes");
462  }
463  } else
464  Sys_Error("Unknown token '%s' while parsing MESH_TVERTLIST", token);
465 }
466 
467 static void ASE_KeyMESH (const char* token)
468 {
469  aseMesh_t* pMesh = ASE_GetCurrentMesh();
470 
471  if (Q_streq(token, "*TIMEVALUE")) {
472  ASE_GetToken(false);
473 
474  pMesh->timeValue = atoi(s_token);
475  VERBOSE((".....timevalue: %d\n", pMesh->timeValue));
476  } else if (Q_streq(token, "*MESH_NUMVERTEX")) {
477  ASE_GetToken(false);
478 
479  pMesh->numVertexes = atoi(s_token);
480  VERBOSE((".....TIMEVALUE: %d\n", pMesh->timeValue));
481  VERBOSE((".....num vertexes: %d\n", pMesh->numVertexes));
482  } else if (Q_streq(token, "*MESH_NUMFACES")) {
483  ASE_GetToken(false);
484 
485  pMesh->numFaces = atoi(s_token);
486  VERBOSE((".....num faces: %d\n", pMesh->numFaces));
487  } else if (Q_streq(token, "*MESH_NUMTVFACES")) {
488  ASE_GetToken(false);
489 
490  if (atoi(s_token) != pMesh->numFaces)
491  Sys_Error("MESH_NUMTVFACES != MESH_NUMFACES");
492  } else if (Q_streq(token, "*MESH_NUMTVERTEX")) {
493  ASE_GetToken(false);
494 
495  pMesh->numTVertexes = atoi(s_token);
496  VERBOSE((".....num tvertexes: %d\n", pMesh->numTVertexes));
497  } else if (Q_streq(token, "*MESH_VERTEX_LIST")) {
499  pMesh->currentVertex = 0;
500  VERBOSE((".....parsing MESH_VERTEX_LIST\n"));
502  } else if (Q_streq(token, "*MESH_TVERTLIST")) {
503  pMesh->currentVertex = 0;
505  VERBOSE((".....parsing MESH_TVERTLIST\n"));
507  } else if (Q_streq(token, "*MESH_FACE_LIST")) {
508  pMesh->faces = Mem_AllocTypeN(aseFace_t, pMesh->numFaces);
509  pMesh->currentFace = 0;
510  VERBOSE((".....parsing MESH_FACE_LIST\n"));
512  } else if (Q_streq(token, "*MESH_TFACELIST")) {
513  pMesh->tfaces = Mem_AllocTypeN(aseFace_t, pMesh->numFaces);
514  pMesh->currentFace = 0;
515  VERBOSE((".....parsing MESH_TFACE_LIST\n"));
517  } else if (Q_streq(token, "*MESH_NORMALS")) {
519  }
520 }
521 
522 static void ASE_KeyGEOMOBJECT (const char* token)
523 {
524  if (Q_streq(token, "*NODE_NAME")) {
525  char* name = ase.objects[ase.currentObject].name;
526 
527  ASE_GetToken(true);
528  VERBOSE((" %s\n", s_token));
529  strcpy(ase.objects[ase.currentObject].name, s_token + 1);
530  if (strchr(ase.objects[ase.currentObject].name, '"'))
531  *strchr(ase.objects[ase.currentObject].name, '"') = 0;
532 
533  if (strstr(name, "tag") == name) {
534  while (strchr(name, '_') != strrchr(name, '_')) {
535  *strrchr(name, '_') = 0;
536  }
537  while (strrchr(name, ' ')) {
538  *strrchr(name, ' ') = 0;
539  }
540  }
541  } else if (Q_streq(token, "*NODE_PARENT")) {
543  }
544  /* ignore unused data blocks */
545  else if (Q_streq(token, "*NODE_TM") || Q_streq(token, "*TM_ANIMATION")) {
547  }
548  /* ignore regular meshes that aren't part of animation */
549  else if (Q_streq(token, "*MESH")) {
550 #if 0
551  if (strstr(ase.objects[ase.currentObject].name, "tag_") == ase.objects[ase.currentObject].name) {
552  s_forceStaticMesh = true;
554  s_forceStaticMesh = false;
555  }
556 #endif
559  Sys_Error("Too many animation frames");
560  }
563 #if 0
564  /* ignore meshes that aren't part of animations if this object isn't a a tag */
565  else {
567  }
568 #endif
569  }
570  /* according to spec these are obsolete */
571  else if (Q_streq(token, "*MATERIAL_REF")) {
572  ASE_GetToken(false);
573 
574  ase.objects[ase.currentObject].materialRef = atoi(s_token);
575  }
576  /* ignore sequences of animation frames */
577  else if (Q_streq(token, "*MESH_ANIMATION")) {
579  }
580  /* skip unused info */
581  else if (Q_streq(token, "*PROP_MOTIONBLUR") || Q_streq(token, "*PROP_CASTSHADOW") || Q_streq(token, "*PROP_RECVSHADOW")) {
583  }
584 }
585 
587 {
588 }
589 
590 static void CollapseObjects (void)
591 {
592  int numObjects = ase.currentObject;
593 
594  for (int i = 0; i < numObjects; i++) {
595  int j;
596 
597  /* skip tags */
598  if (strstr(ase.objects[i].name, "tag") == ase.objects[i].name)
599  continue;
600 
601  if (!ase.objects[i].numAnimations)
602  continue;
603 
604  for (j = i + 1; j < numObjects; j++) {
605  if (strstr(ase.objects[j].name, "tag") == ase.objects[j].name)
606  continue;
607 
608  if (ase.objects[i].materialRef == ase.objects[j].materialRef)
609  if (ase.objects[j].numAnimations)
610  ConcatenateObjects(&ase.objects[i], &ase.objects[j]);
611  }
612  }
613 }
614 
615 static void ASE_Process (void)
616 {
617  while (ASE_GetToken(false)) {
618  if (Q_streq(s_token, "*3DSMAX_ASCIIEXPORT") || Q_streq(s_token, "*COMMENT")) {
620  } else if (Q_streq(s_token, "*SCENE"))
622  else if (Q_streq(s_token, "*MATERIAL_LIST")) {
623  VERBOSE(("MATERIAL_LIST\n"));
624 
626  } else if (Q_streq(s_token, "*GEOMOBJECT")) {
627  VERBOSE(("GEOMOBJECT"));
628 
630 
631  if (strstr(ase.objects[ase.currentObject].name, "Bip") ||
632  strstr(ase.objects[ase.currentObject].name, "ignore_")) {
634  VERBOSE(("(discarding BIP/ignore object)\n"));
635  } else {
636  if (++ase.currentObject == MAX_ASE_OBJECTS) {
637  Sys_Error("Too many GEOMOBJECTs");
638  }
639  }
640  } else if (s_token[0]) {
641  Com_Printf("Unknown token '%s'\n", s_token);
642  }
643  }
644 
645  if (!ase.currentObject)
646  Sys_Error("No animation data!");
647 
648  CollapseObjects();
649 }
bool verbose
Definition: aselib.cpp:97
static void ASE_KeyMATERIAL(const char *token)
Definition: aselib.cpp:329
static void ASE_KeyTFACE_LIST(const char *token)
Definition: aselib.cpp:410
#define Mem_AllocTypeN(type, n)
Definition: mem.h:38
float t
Definition: aselib.cpp:45
void Sys_Error(const char *error,...)
Definition: g_main.cpp:421
#define VERBOSE(x)
Definition: aselib.cpp:36
#define VectorSet(v, x, y, z)
Definition: vector.h:59
Definition: aselib.cpp:87
static void CollapseObjects(void)
Definition: aselib.cpp:590
int aseFace_t[3]
Definition: aselib.cpp:48
int FS_OpenFile(const char *filename, qFILE *file, filemode_t mode)
Finds and opens the file in the search path.
Definition: files.cpp:162
aseMesh_t frames[MAX_ASE_ANIMATION_FRAMES]
Definition: aselib.cpp:66
static void ASE_KeyMESH_VERTEX_LIST(const char *token)
Definition: aselib.cpp:351
float z
Definition: aselib.cpp:39
void Com_StripExtension(const char *in, char *out, const size_t size)
Removes the file extension from a filename.
Definition: shared.cpp:259
static void ASE_KeyMAP_DIFFUSE(const char *token)
Definition: aselib.cpp:311
contains the animate sequence of a single surface using a single material
Definition: aselib.cpp:78
const char * filename
Definition: ioapi.h:41
static void ASE_ParseBracedBlock(void(*parser)(const char *token))
Definition: aselib.cpp:269
float y
Definition: aselib.cpp:39
static void ASE_SkipEnclosingBraces(void)
Definition: aselib.cpp:289
aseVertex_t * vertexes
Definition: aselib.cpp:57
void Com_Printf(const char *const fmt,...)
Definition: common.cpp:386
void ASE_Load(const char *filename, bool verbose)
Definition: aselib.cpp:106
aseFace_t * tfaces
Definition: aselib.cpp:59
static void ConcatenateObjects(aseGeomObject_t *pObjA, aseGeomObject_t *pObjB)
Definition: aselib.cpp:586
aseFace_t * faces
Definition: aselib.cpp:59
static void ASE_KeyMESH_FACE_LIST(const char *token)
Definition: aselib.cpp:375
static void ASE_KeyMESH_TVERTLIST(const char *token)
Definition: aselib.cpp:437
int numtriangles
Definition: aselib.h:40
float s
Definition: aselib.cpp:45
#define MAX_ASE_MATERIALS
Definition: aselib.cpp:31
char materialname[100]
Definition: aselib.h:38
polyset_t * ASE_GetSurfaceAnimation(int whichSurface)
Returns an animation (sequence of polysets)
Definition: aselib.cpp:155
static aseMesh_t * ASE_GetCurrentMesh(void)
Definition: aselib.cpp:214
static void ASE_Process(void)
Definition: aselib.cpp:615
#define MAX_ASE_OBJECTS
Definition: aselib.cpp:32
#define OBJZERO(obj)
Definition: shared.h:178
#define Vector2Set(v, x, y)
Definition: vector.h:61
vec3_t verts[3]
Definition: aselib.h:31
static int CharIsTokenDelimiter(int ch)
Definition: aselib.cpp:229
int currentFace
Definition: aselib.cpp:61
int currentObject
Definition: aselib.cpp:96
const char * ASE_GetSurfaceName(int which)
Definition: aselib.cpp:142
static char s_token[1024]
Definition: aselib.cpp:100
int numTVertexes
Definition: aselib.cpp:53
aseMeshAnimation_t anim
Definition: aselib.cpp:84
char * buffer
Definition: aselib.cpp:92
void Verb_Printf(const verbosityLevel_t importance, const char *format,...) __attribute__((format(__printf__
int numFaces
Definition: aselib.cpp:51
#define MAX_ASE_ANIMATION_FRAMES
Definition: aselib.cpp:34
QGL_EXTERN GLfloat f
Definition: r_gl.h:114
float t
Definition: aselib.cpp:41
int FS_FileLength(qFILE *f)
Returns the size of a given file or -1 if no file is opened.
Definition: files.cpp:91
void ASE_Free(void)
Definition: aselib.cpp:131
int FS_Read(void *buffer, int len, qFILE *f)
Definition: files.cpp:371
char name[100]
Definition: aselib.h:37
float nz
Definition: aselib.cpp:40
int ASE_GetNumSurfaces(void)
Definition: aselib.cpp:137
char name[MAX_QPATH]
Definition: aselib.cpp:79
#define MAX_QPATH
Definition: filesys.h:40
QGL_EXTERN GLint i
Definition: r_gl.h:113
QGL_EXTERN GLuint GLchar GLuint * len
Definition: r_gl.h:99
int currentVertex
Definition: aselib.cpp:61
float x
Definition: aselib.cpp:39
triangle_t * triangles
Definition: aselib.h:39
QGL_EXTERN GLuint GLsizei GLsizei GLint GLenum GLchar * name
Definition: r_gl.h:110
#define Mem_Free(ptr)
Definition: mem.h:35
char * curpos
Definition: aselib.cpp:93
static ase_t ase
Definition: aselib.cpp:101
vec2_t texcoords[3]
Definition: aselib.h:33
aseMaterial_t materials[MAX_ASE_MATERIALS]
Definition: aselib.cpp:89
aseTVertex_t * tvertexes
Definition: aselib.cpp:58
static void ASE_KeyMESH(const char *token)
Definition: aselib.cpp:467
int numMaterials
Definition: aselib.cpp:88
static void ASE_FreeGeomObject(int ndx)
Definition: aselib.cpp:200
#define Q_streq(a, b)
Definition: shared.h:136
static int ASE_GetToken(bool restOfLine)
Definition: aselib.cpp:236
int len
Definition: aselib.cpp:94
static void ASE_KeyGEOMOBJECT(const char *token)
Definition: aselib.cpp:522
char name[MAX_QPATH]
Definition: aselib.cpp:72
QGL_EXTERN int GLboolean GLfloat * v
Definition: r_gl.h:120
int numVertexes
Definition: aselib.cpp:52
int timeValue
Definition: aselib.cpp:55
aseGeomObject_t objects[MAX_ASE_OBJECTS]
Definition: aselib.cpp:90
static void ASE_SkipRestOfLine(void)
Definition: aselib.cpp:306
int numAnimations
Definition: aselib.cpp:82
static void ASE_KeyMATERIAL_LIST(const char *token)
Definition: aselib.cpp:335