* Add "less" target to view make output through less.
[matthijs/ABM2.git] / ABM2 / Amaltheia / md2reader.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005 by Dimitris Saougos & Filippos Papadopoulos   *
3  *   <psybases@gmail.com>                                                             *
4  *                                                                                                       *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU Library General Public License as       *
7  *   published by the Free Software Foundation; either version 2 of the    *
8  *   License, or (at your option) any later version.                                    *
9  *                                                                                                           *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU Library General Public     *
16  *   License along with this program; if not, write to the                 *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #include "md2model.h"
22
23 #include <GL/gl.h>
24 #include <cstring>
25 #include <iostream>
26 #include <cstdlib>
27 #include <SDL/SDL.h>
28 // extern FILE *errorfp;
29
30 struct vec3
31 {
32         float nx, ny, nz;
33 };
34
35 struct vec3 normalVectorArray[] =
36     {
37             { -0.525731f, 0.000000f, 0.850651f },
38             { -0.442863f, 0.238856f, 0.864188f },
39             { -0.295242f, 0.000000f, 0.955423f },
40             { -0.309017f, 0.500000f, 0.809017f },
41             { -0.162460f, 0.262866f, 0.951056f },
42             { 0.000000f, 0.000000f, 1.000000f },
43             { 0.000000f, 0.850651f, 0.525731f },
44             { -0.147621f, 0.716567f, 0.681718f },
45             { 0.147621f, 0.716567f, 0.681718f },
46             { 0.000000f, 0.525731f, 0.850651f },
47             { 0.309017f, 0.500000f, 0.809017f },
48             { 0.525731f, 0.000000f, 0.850651f },
49             { 0.295242f, 0.000000f, 0.955423f },
50             { 0.442863f, 0.238856f, 0.864188f },
51             { 0.162460f, 0.262866f, 0.951056f },
52             { -0.681718f, 0.147621f, 0.716567f },
53             { -0.809017f, 0.309017f, 0.500000f },
54             { -0.587785f, 0.425325f, 0.688191f },
55             { -0.850651f, 0.525731f, 0.000000f },
56             { -0.864188f, 0.442863f, 0.238856f },
57             { -0.716567f, 0.681718f, 0.147621f },
58             { -0.688191f, 0.587785f, 0.425325f },
59             { -0.500000f, 0.809017f, 0.309017f },
60             { -0.238856f, 0.864188f, 0.442863f },
61             { -0.425325f, 0.688191f, 0.587785f },
62             { -0.716567f, 0.681718f, -0.147621f },
63             { -0.500000f, 0.809017f, -0.309017f },
64             { -0.525731f, 0.850651f, 0.000000f },
65             { 0.000000f, 0.850651f, -0.525731f },
66             { -0.238856f, 0.864188f, -0.442863f },
67             { 0.000000f, 0.955423f, -0.295242f },
68             { -0.262866f, 0.951056f, -0.162460f },
69             { 0.000000f, 1.000000f, 0.000000f },
70             { 0.000000f, 0.955423f, 0.295242f },
71             { -0.262866f, 0.951056f, 0.162460f },
72             { 0.238856f, 0.864188f, 0.442863f },
73             { 0.262866f, 0.951056f, 0.162460f },
74             { 0.500000f, 0.809017f, 0.309017f },
75             { 0.238856f, 0.864188f, -0.442863f },
76             { 0.262866f, 0.951056f, -0.162460f },
77             { 0.500000f, 0.809017f, -0.309017f },
78             { 0.850651f, 0.525731f, 0.000000f },
79             { 0.716567f, 0.681718f, 0.147621f },
80             { 0.716567f, 0.681718f, -0.147621f },
81             { 0.525731f, 0.850651f, 0.000000f },
82             { 0.425325f, 0.688191f, 0.587785f },
83             { 0.864188f, 0.442863f, 0.238856f },
84             { 0.688191f, 0.587785f, 0.425325f },
85             { 0.809017f, 0.309017f, 0.500000f },
86             { 0.681718f, 0.147621f, 0.716567f },
87             { 0.587785f, 0.425325f, 0.688191f },
88             { 0.955423f, 0.295242f, 0.000000f },
89             { 1.000000f, 0.000000f, 0.000000f },
90             { 0.951056f, 0.162460f, 0.262866f },
91             { 0.850651f, -0.525731f, 0.000000f },
92             { 0.955423f, -0.295242f, 0.000000f },
93             { 0.864188f, -0.442863f, 0.238856f },
94             { 0.951056f, -0.162460f, 0.262866f },
95             { 0.809017f, -0.309017f, 0.500000f },
96             { 0.681718f, -0.147621f, 0.716567f },
97             { 0.850651f, 0.000000f, 0.525731f },
98             { 0.864188f, 0.442863f, -0.238856f },
99             { 0.809017f, 0.309017f, -0.500000f },
100             { 0.951056f, 0.162460f, -0.262866f },
101             { 0.525731f, 0.000000f, -0.850651f },
102             { 0.681718f, 0.147621f, -0.716567f },
103             { 0.681718f, -0.147621f, -0.716567f },
104             { 0.850651f, 0.000000f, -0.525731f },
105             { 0.809017f, -0.309017f, -0.500000f },
106             { 0.864188f, -0.442863f, -0.238856f },
107             { 0.951056f, -0.162460f, -0.262866f },
108             { 0.147621f, 0.716567f, -0.681718f },
109             { 0.309017f, 0.500000f, -0.809017f },
110             { 0.425325f, 0.688191f, -0.587785f },
111             { 0.442863f, 0.238856f, -0.864188f },
112             { 0.587785f, 0.425325f, -0.688191f },
113             { 0.688191f, 0.587785f, -0.425325f },
114             { -0.147621f, 0.716567f, -0.681718f },
115             { -0.309017f, 0.500000f, -0.809017f },
116             { 0.000000f, 0.525731f, -0.850651f },
117             { -0.525731f, 0.000000f, -0.850651f },
118             { -0.442863f, 0.238856f, -0.864188f },
119             { -0.295242f, 0.000000f, -0.955423f },
120             { -0.162460f, 0.262866f, -0.951056f },
121             { 0.000000f, 0.000000f, -1.000000f },
122             { 0.295242f, 0.000000f, -0.955423f },
123             { 0.162460f, 0.262866f, -0.951056f },
124             { -0.442863f, -0.238856f, -0.864188f },
125             { -0.309017f, -0.500000f, -0.809017f },
126             { -0.162460f, -0.262866f, -0.951056f },
127             { 0.000000f, -0.850651f, -0.525731f },
128             { -0.147621f, -0.716567f, -0.681718f },
129             { 0.147621f, -0.716567f, -0.681718f },
130             { 0.000000f, -0.525731f, -0.850651f },
131             { 0.309017f, -0.500000f, -0.809017f },
132             { 0.442863f, -0.238856f, -0.864188f },
133             { 0.162460f, -0.262866f, -0.951056f },
134             { 0.238856f, -0.864188f, -0.442863f },
135             { 0.500000f, -0.809017f, -0.309017f },
136             { 0.425325f, -0.688191f, -0.587785f },
137             { 0.716567f, -0.681718f, -0.147621f },
138             { 0.688191f, -0.587785f, -0.425325f },
139             { 0.587785f, -0.425325f, -0.688191f },
140             { 0.000000f, -0.955423f, -0.295242f },
141             { 0.000000f, -1.000000f, 0.000000f },
142             { 0.262866f, -0.951056f, -0.162460f },
143             { 0.000000f, -0.850651f, 0.525731f },
144             { 0.000000f, -0.955423f, 0.295242f },
145             { 0.238856f, -0.864188f, 0.442863f },
146             { 0.262866f, -0.951056f, 0.162460f },
147             { 0.500000f, -0.809017f, 0.309017f },
148             { 0.716567f, -0.681718f, 0.147621f },
149             { 0.525731f, -0.850651f, 0.000000f },
150             { -0.238856f, -0.864188f, -0.442863f },
151             { -0.500000f, -0.809017f, -0.309017f },
152             { -0.262866f, -0.951056f, -0.162460f },
153             { -0.850651f, -0.525731f, 0.000000f },
154             { -0.716567f, -0.681718f, -0.147621f },
155             { -0.716567f, -0.681718f, 0.147621f },
156             { -0.525731f, -0.850651f, 0.000000f },
157             { -0.500000f, -0.809017f, 0.309017f },
158             { -0.238856f, -0.864188f, 0.442863f },
159             { -0.262866f, -0.951056f, 0.162460f },
160             { -0.864188f, -0.442863f, 0.238856f },
161             { -0.809017f, -0.309017f, 0.500000f },
162             { -0.688191f, -0.587785f, 0.425325f },
163             { -0.681718f, -0.147621f, 0.716567f },
164             { -0.442863f, -0.238856f, 0.864188f },
165             { -0.587785f, -0.425325f, 0.688191f },
166             { -0.309017f, -0.500000f, 0.809017f },
167             { -0.147621f, -0.716567f, 0.681718f },
168             { -0.425325f, -0.688191f, 0.587785f },
169             { -0.162460f, -0.262866f, 0.951056f },
170             { 0.442863f, -0.238856f, 0.864188f },
171             { 0.162460f, -0.262866f, 0.951056f },
172             { 0.309017f, -0.500000f, 0.809017f },
173             { 0.147621f, -0.716567f, 0.681718f },
174             { 0.000000f, -0.525731f, 0.850651f },
175             { 0.425325f, -0.688191f, 0.587785f },
176             { 0.587785f, -0.425325f, 0.688191f },
177             { 0.688191f, -0.587785f, 0.425325f },
178             { -0.955423f, 0.295242f, 0.000000f },
179             { -0.951056f, 0.162460f, 0.262866f },
180             { -1.000000f, 0.000000f, 0.000000f },
181             { -0.850651f, 0.000000f, 0.525731f },
182             { -0.955423f, -0.295242f, 0.000000f },
183             { -0.951056f, -0.162460f, 0.262866f },
184             { -0.864188f, 0.442863f, -0.238856f },
185             { -0.951056f, 0.162460f, -0.262866f },
186             { -0.809017f, 0.309017f, -0.500000f },
187             { -0.864188f, -0.442863f, -0.238856f },
188             { -0.951056f, -0.162460f, -0.262866f },
189             { -0.809017f, -0.309017f, -0.500000f },
190             { -0.681718f, 0.147621f, -0.716567f },
191             { -0.681718f, -0.147621f, -0.716567f },
192             { -0.850651f, 0.000000f, -0.525731f },
193             { -0.688191f, 0.587785f, -0.425325f },
194             { -0.587785f, 0.425325f, -0.688191f },
195             { -0.425325f, 0.688191f, -0.587785f },
196             { -0.425325f, -0.688191f, -0.587785f },
197             { -0.587785f, -0.425325f, -0.688191f },
198             { -0.688191f, -0.587785f, -0.425325f }
199     };
200
201
202
203 model::model( char * md2_filename, char *bfilename, Graphics *g )
204 {
205         int i;
206
207         modelTexture = new Texture( bfilename, g);
208
209         graph = g;
210
211         FILE *fp = fopen( md2_filename, "rb" );
212         if ( fp == NULL )
213         {
214                 ok = false;
215                 return ;
216         }
217         fread( ( void * ) & md2h, 1, sizeof( md2h ), fp );
218
219         tex1 = ( struct tex * ) malloc( sizeof( struct tex ) * md2h.numTexCoords );
220
221         fseek( fp, md2h.offsetTexCoords, SEEK_SET );
222         fread( ( void * ) tex1, sizeof( struct tex ), md2h.numTexCoords, fp );
223
224         tc = ( struct texturecoord * ) malloc( sizeof( struct texturecoord ) * md2h.numTexCoords );
225
226         for ( i = 0;i < md2h.numTexCoords;i++ )
227         {
228                 tc[ i ].u = ( float ) ( tex1[ i ].u ) / ( float ) ( md2h.skinWidth );
229                 tc[ i ].v = ( float ) ( tex1[ i ].v ) / ( float ) ( md2h.skinHeight );
230         }
231         free( tex1 );
232
233         fc = ( struct face * ) malloc( sizeof( struct face ) * md2h.numTriangles );
234
235         fseek( fp, md2h.offsetTriangles, 0 );
236         fread ( ( void * ) fc, sizeof( struct face ), md2h.numTriangles, fp );
237
238         fseek( fp, md2h.offsetFrames, 0 );
239
240         fr = ( struct frame ** ) malloc( sizeof( struct frame * ) * md2h.numFrames );
241
242         for ( i = 0;i < md2h.numFrames;i++ )
243         {
244                 fr[ i ] = ( struct frame * ) malloc( sizeof( struct frame ) );
245                 fread( ( void * ) ( &( fr[ i ] ->scale[ 0 ] ) ), 3, sizeof( float ), fp );
246                 fread( ( void * ) ( &( fr[ i ] ->translate[ 0 ] ) ), 3, sizeof( float ), fp );
247                 fread( ( void * ) & ( fr[ i ] ->name[ 0 ] ), 1, sizeof( fr[ i ] ->name ), fp );
248                 fr[ i ] ->tr = ( struct triangle ** ) malloc( sizeof( struct triangle* ) * md2h.numVertices );
249                 int j;
250                 for ( j = 0;j < md2h.numVertices;j++ )
251                 {
252                         fr[ i ] ->tr[ j ] = ( struct triangle * ) malloc( sizeof( struct triangle ) );
253                         fread( ( void * ) & ( fr[ i ] ->tr[ j ] ->vertex[ 0 ] ), 3, sizeof( BYTE ), fp );
254                         fread( ( void * ) & ( fr[ i ] ->tr[ j ] ->lightNormalIndex ), 1, sizeof( BYTE ), fp );
255                 }
256
257         }
258
259         //      fhead=NULL;
260         //      ftail=NULL;
261
262         ok = true;
263         change = false;
264
265         mark = NULL;
266
267         FPS = 200.0f;
268
269         //      v = ( struct vertex * ) malloc( sizeof( struct vertex ) * ( md2h.numTriangles + 5 ) * 3 );
270         /* 12 einai to plh8os twn floats (vertices, normals, colour ktl*/
271         v = new GLfloat[12 * ( md2h.numTriangles + 5 ) * 3];
272         return ;
273 }
274
275
276
277 model::~model( void )
278 {
279         free( tc );
280         free( fc );
281
282         int i, j;
283         for ( i = 0;i < md2h.numFrames;i++ )
284         {
285                 for ( j = 0;j < md2h.numVertices;j++ )
286                         free ( fr[ i ] ->tr[ j ] );
287                 free( fr[ i ] ->tr );
288                 free( fr[ i ] );
289         }
290
291         delete modelTexture;
292
293         free( fr );
294         delete[] v ;
295
296         return ;
297 }
298
299
300
301
302
303 void model::render( float t )
304 {
305         int i;
306         int j = 0;
307         /*
308         if (mark!=NULL)
309                 (*mark)=false;
310
311         if (mark!=NULL && strcmp(current_frame_sequence,"run")==0 &&
312                         (cpointer->fnumber-current_offset==3 ||
313         cpointer->fnumber-current_offset==0))
314                 (*mark)=true;
315
316         t=gettime();
317         if (oldt>t) cpointer=cpointer->next;
318         oldt=t;
319
320         graph->setTexture(modelTexture);
321         */
322         for ( i = 0;i < md2h.numTriangles;i++ )
323         {
324                 int k;
325
326                 for ( k = 0;k < 3;k++ )
327                 {
328                         int p = fc[ i ].vindex[ k ];
329                         BYTE x, y, z;
330                         float xx, yy, zz;
331                         float nx1, ny1, nz1;
332
333                         framecounter = cpointer->fnumber;
334
335                         x = fr[ framecounter ] ->tr[ p ] ->vertex[ 0 ];
336                         y = fr[ framecounter ] ->tr[ p ] ->vertex[ 1 ];
337                         z = fr[ framecounter ] ->tr[ p ] ->vertex[ 2 ];
338
339                         xx = ( float ) x * fr[ framecounter ] ->scale[ 0 ];
340                         yy = ( float ) y * fr[ framecounter ] ->scale[ 1 ];
341                         zz = ( float ) z * fr[ framecounter ] ->scale[ 2 ];
342
343                         xx = xx + fr[ framecounter ] ->translate[ 0 ];
344                         yy = yy + fr[ framecounter ] ->translate[ 1 ];
345                         zz = zz + fr[ framecounter ] ->translate[ 2 ];
346
347
348                         nx1 = normalVectorArray[ fr[ framecounter ] ->tr[ p ] ->lightNormalIndex ].nx;
349                         ny1 = normalVectorArray[ fr[ framecounter ] ->tr[ p ] ->lightNormalIndex ].ny;
350                         nz1 = normalVectorArray[ fr[ framecounter ] ->tr[ p ] ->lightNormalIndex ].nz;
351
352
353                         float xx1, yy1, zz1;
354                         float nx2, ny2, nz2;
355
356                         framecounter = cpointer->next->fnumber;
357
358                         x = fr[ framecounter ] ->tr[ p ] ->vertex[ 0 ];
359                         y = fr[ framecounter ] ->tr[ p ] ->vertex[ 1 ];
360                         z = fr[ framecounter ] ->tr[ p ] ->vertex[ 2 ];
361
362                         xx1 = ( float ) x * fr[ framecounter ] ->scale[ 0 ];
363                         yy1 = ( float ) y * fr[ framecounter ] ->scale[ 1 ];
364                         zz1 = ( float ) z * fr[ framecounter ] ->scale[ 2 ];
365
366                         xx1 = xx1 + fr[ framecounter ] ->translate[ 0 ];
367                         yy1 = yy1 + fr[ framecounter ] ->translate[ 1 ];
368                         zz1 = zz1 + fr[ framecounter ] ->translate[ 2 ];
369
370                         nx2 = normalVectorArray[ fr[ framecounter ] ->tr[ p ] ->lightNormalIndex ].nx;
371                         ny2 = normalVectorArray[ fr[ framecounter ] ->tr[ p ] ->lightNormalIndex ].ny;
372                         nz2 = normalVectorArray[ fr[ framecounter ] ->tr[ p ] ->lightNormalIndex ].nz;
373
374                         
375                         p = fc[ i ].tindex[ k ];
376
377                         v[ 12 * j] = tc[ p ].u;
378                         v[ 12 * j  + 1] = 0.0 - tc[ p ].v;
379
380                         v[ 12 * j   + 2] = 1.0;
381                         v[ 12 * j   + 3] = 1.0;
382                         v[ 12 * j   + 4] = 1.0;
383                         v[ 12 * j   + 5] = 1.0;
384                         
385                         v[ 12 * j  + 6] = nx1 + t * ( nx2 - nx1 );
386                         v[ 12 * j  + 7] = nz1 + t * ( nz2 - nz1 );
387                         v[ 12 * j  + 8] = ny1 + t * ( ny2 - ny1 );
388                         
389                         v[ 12 * j  + 9] = xx + t * ( xx1 - xx );
390                         v[ 12 * j + 10] = zz + t * ( zz1 - zz );
391                         v[ 12 * j + 11] = yy + t * ( yy1 - yy );
392
393
394                         j++;
395                 }
396         }
397         i = 0;
398         
399         //    graph->renderMd2(v, (md2h.numTriangles+5)*3);
400         graph->setTexture( modelTexture );
401         unsigned int numOfTris = ( md2h.numTriangles + 5 ) * 3;
402 //      if ( graph->getAlpha() )
403         //      glDisable( GL_DEPTH_TEST );
404
405         //graph->setAlpha(true);
406         
407
408 //      graph->renderTriangles(AM_TRIANGLES, v, numOfTris);
409         graph->renderVertexArray((vertex *)v, numOfTris, AM_TRIANGLES);
410
411
412         //if ( graph->getAlpha() )
413 //              glEnable( GL_DEPTH_TEST );
414 //      glDisable(GL_DEPTH_TEST);
415
416         return ;
417 }
418
419
420
421
422
423 /*
424  
425 void model::delframelist(void)
426 {
427         fnode *tmp;
428         fnode *tmp1;
429  
430         if (fhead!=NULL)
431         {
432  
433                 tmp=fhead->next;
434                 tmp1=fhead;
435  
436                 if (fhead->next==fhead)
437                 {
438                         free(fhead);
439                         fhead=NULL;
440                         ftail=NULL;
441                 }
442                 else
443                 {
444                         while(1)
445                         {
446                                 if (tmp==fhead) break;
447                                 free(tmp1);
448                                 tmp1=tmp;
449                                 tmp=tmp->next;
450                         }
451                         free(tmp1);
452                 }
453                 fhead=NULL;
454                 ftail=NULL;
455         }
456         framecounter=-1;
457         nframes=-1;
458         return ;
459 }
460 */
461
462 /*
463 void model::setframesequence(char *name)
464 {
465         fnode *tmp;
466         int i, j;
467  
468    minMax = true;
469  
470         delframelist();
471  
472         nframes=0;
473         for (i=0;i<md2h.numFrames;i++)
474         {
475                 if (strstr(fr[i]->name,name)!=NULL)
476                 {
477  
478          for (j=0; j < md2h.numTriangles; j++)
479                 {
480                                 float x,y,z;
481                                 int k;
482                                 for (k=0;k<3;k++)
483                                 {
484                                         int p=fc[j].vindex[k];
485                     x=fr[i]->tr[p]->vertex[0]*fr[i]->scale[0]+fr[i]->translate[0];
486                                         y=fr[i]->tr[p]->vertex[1]*fr[i]->scale[1]+fr[i]->translate[1];
487                                         z=fr[i]->tr[p]->vertex[2]*fr[i]->scale[2]+fr[i]->translate[2];
488  
489                                         if (x>xmax) xmax=x;
490                                         if (x<xmin) xmin=x;
491                                         if (y<ymin) zmin=z;
492                                         if (y>ymax) zmax=z;
493                                         if (z<zmin) ymin=y;
494                                         if (z>zmax) ymax=y;
495                                 }
496          }
497                         tmp=(fnode *)malloc(sizeof(fnode));
498                         tmp->fnumber=i;
499                         tmp->next=NULL;
500                         if (fhead==NULL)
501                         {
502                                 fhead=tmp;
503                                 ftail=tmp;
504                                 current_offset=tmp->fnumber;
505                         }
506                         else
507                         {
508                                 ftail->next=tmp;
509                                 ftail=tmp;
510                         }
511                         nframes++;
512                 }
513         }
514         framecounter=0;
515         if (fhead==NULL)
516         {
517                 framecounter=-1;
518                 return ;
519         }
520  
521         cpointer=fhead;
522         current_frame_sequence=name;
523         ftail->next=fhead;
524         oldt=0.0f;
525  
526         return ;
527 }
528  
529 */
530
531 int model::getframecounter( void )
532 {
533         return framecounter;
534 }
535
536
537
538 c_model::c_model( model *m )
539 {
540         mod = m;
541         FPS = mod->FPS;
542
543         fhead = NULL;
544         ftail = NULL;
545
546         return ;
547 }
548
549 void c_model::setFrameSequence( char *name )
550 {
551         fnode * tmp;
552         int i;
553
554         delFrameSequence();
555
556         xmin = 0;ymin = 0;zmin = 0;
557         xmax = 0;ymax = 0;zmax = 0;
558
559         nframes = 0;
560         for ( i = 0;i < mod->md2h.numFrames;i++ )
561         {
562                 if ( strstr( mod->fr[ i ] ->name, name ) != NULL )
563                 {
564                         tmp = ( fnode * ) malloc( sizeof( fnode ) );
565                         tmp->fnumber = i;
566                         tmp->next = NULL;
567                         if ( fhead == NULL )
568                         {
569                                 fhead = tmp;
570                                 ftail = tmp;
571                         }
572                         else
573                         {
574                                 ftail->next = tmp;
575                                 ftail = tmp;
576                         }
577                         nframes++;
578                         for ( int j = 0;j < mod->md2h.numTriangles;j++ )
579                         {
580                                 float x, y, z;
581                                 for ( int k = 0;k < 3;k++ )
582                                 {
583                                         int p = mod->fc[ j ].vindex[ k ];
584
585
586                                         x = mod->fr[ i ] ->tr[ p ] ->vertex[ 0 ] * mod->fr[ i ] ->scale[ 0 ] + mod->fr[ i ] ->translate[ 0 ];
587
588
589                                         y = mod->fr[ i ] ->tr[ p ] ->vertex[ 2 ] * mod->fr[ i ] ->scale[ 2 ] + mod->fr[ i ] ->translate[ 2 ];
590
591
592                                         z = mod->fr[ i ] ->tr[ p ] ->vertex[ 1 ] * mod->fr[ i ] ->scale[ 1 ] + mod->fr[ i ] ->translate[ 1 ];
593                                         if ( x < xmin ) xmin = x;
594                                         if ( x > xmax ) xmax = x;
595                                         if ( y < ymin ) ymin = y;
596                                         if ( y > ymax ) ymax = y;
597                                         if ( z < zmin ) zmin = z;
598                                         if ( z > zmax ) zmax = z;
599                                 }
600                         }
601                 }
602         }
603         if ( fhead == NULL )
604         {
605                 cpointer = NULL;
606                 return ;
607         }
608
609         cpointer = fhead;
610         current_frame_sequence = name;
611         ftail->next = fhead;
612         oldt = 0.0f;
613
614         return ;
615 }
616
617 void c_model::delFrameSequence( void )
618 {
619         fnode * tmp;
620         fnode *tmp1;
621
622         if ( fhead != NULL )
623         {
624
625                 tmp = fhead->next;
626                 tmp1 = fhead;
627
628                 if ( fhead->next == fhead )
629                 {
630                         free( fhead );
631                         fhead = NULL;
632                         ftail = NULL;
633                 }
634                 else
635                 {
636                         while ( 1 )
637                         {
638                                 if ( tmp == fhead ) break;
639                                 free( tmp1 );
640                                 tmp1 = tmp;
641                                 tmp = tmp->next;
642                         }
643                         free( tmp1 );
644                 }
645                 fhead = NULL;
646                 ftail = NULL;
647         }
648         nframes = -1;
649         return ;
650 }
651
652 void c_model::render()
653 {
654         float t;
655         t = gettime();
656         if ( oldt > t ) cpointer = cpointer->next;
657         oldt = t;
658
659         mod->cpointer = cpointer;
660         mod->render( t );
661         return ;
662 }
663
664
665
666 float c_model::gettime( void )
667 {
668         int k = SDL_GetTicks();
669         k = k % ( ( int ) ( FPS + 1.0f ) );
670         return ( float ) k / ( float ) FPS;
671 }
672
673
674 c_model::~c_model( void )
675 {
676         delFrameSequence();
677         return ;
678 }
679