UFO: Alien Invasion
Loading...
Searching...
No Matches
aselib.cpp
Go to the documentation of this file.
1
5
6/*
7Copyright (C) 1999-2007 id Software, Inc. and contributors.
8For a list of contributors, see the accompanying CONTRIBUTORS file.
9
10This file is part of GtkRadiant.
11
12GtkRadiant is free software; you can redistribute it and/or modify
13it under the terms of the GNU General Public License as published by
14the Free Software Foundation; either version 2 of the License, or
15(at your option) any later version.
16
17GtkRadiant is distributed in the hope that it will be useful,
18but WITHOUT ANY WARRANTY; without even the implied warranty of
19MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20GNU General Public License for more details.
21
22You should have received a copy of the GNU General Public License
23along with GtkRadiant; if not, write to the Free Software
24Foundation, 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
38typedef struct {
39 float x, y, z;
40 float nx, ny, nz;
41 float s, t;
43
44typedef struct {
45 float s, t;
47
48typedef int aseFace_t[3];
49
63
70
71typedef struct {
74
86
99
100static char s_token[1024];
101static ase_t ase;
102
103static void ASE_Process(void);
104static void ASE_FreeGeomObject(int ndx);
105
106void ASE_Load (const char* filename, bool verbose)
107{
108 ScopedFile file;
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
131void ASE_Free (void)
132{
133 for (int i = 0; i < ase.currentObject; i++)
135}
136
138{
139 return ase.currentObject;
140}
141
142const 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
200static 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
229static inline int CharIsTokenDelimiter (int ch)
230{
231 if (ch <= ' ')
232 return 1;
233 return 0;
234}
235
236static 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
269static 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
289static 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
306static void ASE_SkipRestOfLine (void)
307{
308 ASE_GetToken(true);
309}
310
311static 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
324 Com_StripExtension(bitmap, ase.materials[ase.numMaterials].name, MAX_QPATH);
325 Verb_Printf(VERB_EXTRA, "ase material name: \'%s\'\n", ase.materials[ase.numMaterials].name);
326 }
327}
328
329static void ASE_KeyMATERIAL (const char* token)
330{
331 if (Q_streq(token, "*MAP_DIFFUSE"))
333}
334
335static 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
351static 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
375static 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
410static 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
437static 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
467static 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
522static 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
558 if (++ase.objects[ase.currentObject].anim.currentFrame == MAX_ASE_ANIMATION_FRAMES) {
559 Sys_Error("Too many animation frames");
560 }
561 ase.objects[ase.currentObject].anim.numFrames = ase.objects[ase.currentObject].anim.currentFrame;
562 ase.objects[ase.currentObject].numAnimations++;
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
590static 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
615static 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_")) {
633 ASE_FreeGeomObject(ase.currentObject);
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
649}
const char * ASE_GetSurfaceName(int which)
Definition aselib.cpp:142
static void ASE_SkipEnclosingBraces(void)
Definition aselib.cpp:289
int ASE_GetNumSurfaces(void)
Definition aselib.cpp:137
static void ASE_KeyMAP_DIFFUSE(const char *token)
Definition aselib.cpp:311
void ASE_Load(const char *filename, bool verbose)
Definition aselib.cpp:106
static void ASE_KeyMATERIAL_LIST(const char *token)
Definition aselib.cpp:335
static void ASE_Process(void)
Definition aselib.cpp:615
static void ASE_KeyMESH(const char *token)
Definition aselib.cpp:467
static void ASE_KeyGEOMOBJECT(const char *token)
Definition aselib.cpp:522
static void ASE_KeyMESH_VERTEX_LIST(const char *token)
Definition aselib.cpp:351
static ase_t ase
Definition aselib.cpp:101
static int CharIsTokenDelimiter(int ch)
Definition aselib.cpp:229
#define MAX_ASE_OBJECTS
Definition aselib.cpp:32
static void ASE_SkipRestOfLine(void)
Definition aselib.cpp:306
#define MAX_ASE_ANIMATION_FRAMES
Definition aselib.cpp:34
static char s_token[1024]
Definition aselib.cpp:100
static void ASE_KeyMESH_FACE_LIST(const char *token)
Definition aselib.cpp:375
static aseMesh_t * ASE_GetCurrentMesh(void)
Definition aselib.cpp:214
static void ASE_ParseBracedBlock(void(*parser)(const char *token))
Definition aselib.cpp:269
polyset_t * ASE_GetSurfaceAnimation(int whichSurface)
Returns an animation (sequence of polysets).
Definition aselib.cpp:155
static void ConcatenateObjects(aseGeomObject_t *pObjA, aseGeomObject_t *pObjB)
Definition aselib.cpp:586
void ASE_Free(void)
Definition aselib.cpp:131
static void ASE_FreeGeomObject(int ndx)
Definition aselib.cpp:200
static int ASE_GetToken(bool restOfLine)
Definition aselib.cpp:236
static void ASE_KeyMESH_TVERTLIST(const char *token)
Definition aselib.cpp:437
int aseFace_t[3]
Definition aselib.cpp:48
#define MAX_ASE_MATERIALS
Definition aselib.cpp:31
#define VERBOSE(x)
Definition aselib.cpp:36
static void ASE_KeyMATERIAL(const char *token)
Definition aselib.cpp:329
static void ASE_KeyTFACE_LIST(const char *token)
Definition aselib.cpp:410
static void CollapseObjects(void)
Definition aselib.cpp:590
void Com_Printf(const char *const fmt,...)
Definition common.cpp:428
int FS_FileLength(qFILE *f)
Returns the size of a given file or -1 if no file is opened.
Definition files.cpp:91
int FS_Read(void *buffer, int len, qFILE *f)
Definition files.cpp:371
int FS_OpenFile(const char *filename, qFILE *file, filemode_t mode)
Finds and opens the file in the search path.
Definition files.cpp:162
#define MAX_QPATH
Definition filesys.h:40
@ FILE_READ
Definition filesys.h:111
void Sys_Error(const char *error,...)
Definition g_main.cpp:421
const char * filename
Definition ioapi.h:41
#define Mem_Free(ptr)
Definition mem.h:35
#define Mem_AllocTypeN(type, n)
Definition mem.h:38
QGL_EXTERN GLuint GLchar GLuint * len
Definition r_gl.h:99
QGL_EXTERN int GLboolean GLfloat * v
Definition r_gl.h:120
QGL_EXTERN GLfloat f
Definition r_gl.h:114
QGL_EXTERN GLint i
Definition r_gl.h:113
QGL_EXTERN GLuint GLsizei GLsizei GLint GLenum GLchar * name
Definition r_gl.h:110
#define Q_streq(a, b)
Definition shared.h:136
#define OBJZERO(obj)
Definition shared.h:178
void Com_StripExtension(const char *in, char *out, const size_t size)
Removes the file extension from a filename.
Definition shared.cpp:259
bool verbose
Definition aselib.cpp:97
int len
Definition aselib.cpp:94
int currentObject
Definition aselib.cpp:96
aseMaterial_t materials[MAX_ASE_MATERIALS]
Definition aselib.cpp:89
aseGeomObject_t objects[MAX_ASE_OBJECTS]
Definition aselib.cpp:90
char * buffer
Definition aselib.cpp:92
char * curpos
Definition aselib.cpp:93
int numMaterials
Definition aselib.cpp:88
contains the animate sequence of a single surface using a single material
Definition aselib.cpp:78
char name[MAX_QPATH]
Definition aselib.cpp:79
aseMeshAnimation_t anim
Definition aselib.cpp:84
char name[MAX_QPATH]
Definition aselib.cpp:72
int numFaces
Definition aselib.cpp:51
aseTVertex_t * tvertexes
Definition aselib.cpp:58
aseFace_t * faces
Definition aselib.cpp:59
int currentFace
Definition aselib.cpp:61
int numTVertexes
Definition aselib.cpp:53
int timeValue
Definition aselib.cpp:55
int currentVertex
Definition aselib.cpp:61
aseFace_t * tfaces
Definition aselib.cpp:59
int numVertexes
Definition aselib.cpp:52
aseVertex_t * vertexes
Definition aselib.cpp:57
aseMesh_t frames[MAX_ASE_ANIMATION_FRAMES]
Definition aselib.cpp:66
float t
Definition aselib.cpp:41
float nx
Definition aselib.cpp:40
float z
Definition aselib.cpp:39
float ny
Definition aselib.cpp:40
float s
Definition aselib.cpp:41
float x
Definition aselib.cpp:39
float nz
Definition aselib.cpp:40
float y
Definition aselib.cpp:39
char name[100]
Definition aselib.h:37
triangle_t * triangles
Definition aselib.h:39
char materialname[100]
Definition aselib.h:38
int numtriangles
Definition aselib.h:40
vec2_t texcoords[3]
Definition aselib.h:33
vec3_t verts[3]
Definition aselib.h:31
void Verb_Printf(const verbosityLevel_t importance, const char *format,...) __attribute__((format(__printf__
@ VERB_EXTRA
Definition shared.h:46
#define Vector2Set(v, x, y)
Definition vector.h:61
#define VectorSet(v, x, y, z)
Definition vector.h:59