-#include <assert.h>\r
-#ifdef _WIN32\r
-#include <io.h>\r
-#endif\r
-#include "md3lib.h"\r
-\r
-#if defined (__linux__) || defined (__APPLE__)\r
-#define filelength Q_filelength\r
-#endif\r
-\r
-/*\r
-** MD3_ComputeTagFromTri\r
-*/\r
-void MD3_ComputeTagFromTri( md3Tag_t *pTag, const float pTri[3][3] )\r
-{\r
- float len[3];\r
- vec3_t axes[3], sides[3];\r
- int longestSide, shortestSide, hypotSide;\r
- int origin;\r
- int j;\r
- float d;\r
-\r
- memset( axes, 0, sizeof( axes ) );\r
- memset( sides, 0, sizeof( sides ) );\r
-\r
- //\r
- // compute sides\r
- //\r
- for ( j = 0; j < 3; j++ )\r
- {\r
- sides[j][0] = pTri[(j+1)%3][0] - pTri[j][0];\r
- sides[j][1] = pTri[(j+1)%3][1] - pTri[j][1];\r
- sides[j][2] = pTri[(j+1)%3][2] - pTri[j][2];\r
-\r
- len[j] = ( float ) sqrt( DotProduct( sides[j], sides[j] ) );\r
- }\r
-\r
-#if 0\r
- if ( len[0] > len[1] && len[0] > len[2] )\r
- {\r
- longestSide = 0; shortestSide = 1; origin = 2;\r
- }\r
- else if ( len[1] > len[0] && len[1] > len[2] )\r
- {\r
- longestSide = 1; shortestSide = 2; origin = 0;\r
- }\r
- else if ( len[2] > len[0] && len[2] > len[1] )\r
- {\r
- longestSide = 2; shortestSide = 0; origin = 1;\r
- }\r
- else\r
- {\r
- Error( "invalid tag triangle, must be a right triangle with unequal length sides" );\r
- }\r
-#endif\r
- if ( len[0] > len[1] && len[0] > len[2] ) {\r
- hypotSide = 0;\r
- origin = 2;\r
- } else if ( len[1] > len[0] && len[1] > len[2] ) {\r
- hypotSide = 1;\r
- origin = 0;\r
- } else if ( len[2] > len[0] && len[2] > len[1] ) {\r
- hypotSide = 2;\r
- origin = 1;\r
- }\r
- len[hypotSide] = -1;\r
-\r
- if ( len[0] > len[1] && len[0] > len[2] ) {\r
- longestSide = 0;\r
- } else if ( len[1] > len[0] && len[1] > len[2] ) {\r
- longestSide = 1;\r
- } else if ( len[2] > len[0] && len[2] > len[1] ) {\r
- longestSide = 2;\r
- }\r
- len[longestSide] = -1;\r
-\r
- if ( len[0] > len[1] && len[0] > len[2] ) {\r
- shortestSide = 0;\r
- } else if ( len[1] > len[0] && len[1] > len[2] ) {\r
- shortestSide = 1;\r
- } else if ( len[2] > len[0] && len[2] > len[1] ) {\r
- shortestSide = 2;\r
- }\r
- len[shortestSide] = -1;\r
-\r
-\r
-\r
-// VectorNormalize( sides[shortestSide], axes[0] );\r
-// VectorNormalize( sides[longestSide], axes[1] );\r
- VectorNormalize( sides[longestSide], axes[0] );\r
- VectorNormalize( sides[shortestSide], axes[1] );\r
-\r
- // project shortest side so that it is exactly 90 degrees to the longer side\r
- d = DotProduct( axes[0], axes[1] );\r
- VectorMA( axes[0], -d, axes[1], axes[0] );\r
- VectorNormalize( axes[0], axes[0] );\r
-\r
- CrossProduct( sides[longestSide], sides[shortestSide], axes[2] );\r
- VectorNormalize( axes[2], axes[2] );\r
-\r
- pTag->origin[0] = pTri[origin][0];\r
- pTag->origin[1] = pTri[origin][1];\r
- pTag->origin[2] = pTri[origin][2];\r
-\r
- VectorCopy( axes[0], pTag->axis[0] );\r
- VectorCopy( axes[1], pTag->axis[1] );\r
- VectorCopy( axes[2], pTag->axis[2] );\r
-}\r
-\r
-/*\r
-==============\r
-MD3_Dump\r
-==============\r
-*/\r
-void MD3_Dump( const char *filename )\r
-{\r
- md3Header_t header;\r
- md3Tag_t *pTag;\r
- md3Surface_t *pSurface;\r
- FILE *fp;\r
- void *_buffer;\r
- void *buffer;\r
- long fileSize;\r
- int i;\r
-\r
- if ( ( fp = fopen( filename, "rb" ) ) == 0 )\r
- {\r
- Error( "Unable to open '%s'\n", filename );\r
- }\r
-\r
- fileSize = filelength( fileno( fp ) );\r
- _buffer = malloc( filelength( fileno( fp ) ) );\r
- fread( _buffer, fileSize, 1, fp );\r
- fclose( fp );\r
-\r
- buffer = ( char * ) _buffer;\r
- header = *( md3Header_t * ) _buffer;\r
-\r
- if ( header.ident != MD3_IDENT )\r
- {\r
- Error( "Incorrect ident for '%s'\n", filename );\r
- }\r
-\r
- printf( "Contents of '%s'\n", filename );\r
- printf( " version: %d\n", header.version );\r
- printf( " name: %s\n", header.name );\r
- printf( " num frames: %d\n", header.numFrames );\r
- printf( " num tags: %d\n", header.numTags );\r
- printf( " num surfaces: %d\n", header.numSurfaces );\r
- printf( " num skins: %d\n", header.numSkins );\r
- printf( " file size: %d\n", fileSize );\r
-\r
- printf( "--- TAGS ---\n" );\r
- pTag = ( md3Tag_t * ) ( ( ( char * ) buffer ) + header.ofsTags );\r
- for ( i = 0; i < header.numTags; i++, pTag++ )\r
- {\r
- printf( " tag %d ('%s')\n", i, pTag->name );\r
- printf( " origin: %f,%f,%f\n", pTag->origin[0], pTag->origin[1], pTag->origin[2] );\r
- printf( " vf: %f,%f,%f\n", pTag->axis[0][0], pTag->axis[0][1], pTag->axis[0][2] );\r
- printf( " vr: %f,%f,%f\n", pTag->axis[1][0], pTag->axis[1][1], pTag->axis[1][2] );\r
- printf( " vu: %f,%f,%f\n", pTag->axis[2][0], pTag->axis[2][1], pTag->axis[2][2] );\r
- }\r
-\r
- printf( "--- SURFACES ---\n" );\r
- pSurface = ( md3Surface_t * ) ( ( ( char * ) buffer ) + header.ofsSurfaces );\r
-\r
- for ( i = 0; i < header.numSurfaces; i++ )\r
- {\r
- int j;\r
-\r
- md3Shader_t *pShader = ( md3Shader_t * ) ( ( ( char * ) pSurface ) + pSurface->ofsShaders );\r
-\r
- printf( "\n surface %d ('%s')\n", i, pSurface->name );\r
- printf( " num frames: %d\n", pSurface->numFrames );\r
- printf( " num shaders: %d\n", pSurface->numShaders );\r
- printf( " num tris: %d\n", pSurface->numTriangles );\r
- printf( " num verts: %d\n", pSurface->numVerts );\r
-\r
- if ( pSurface->numShaders > 0 )\r
- {\r
- printf( " --- SHADERS ---\n" );\r
-\r
- for ( j = 0; j < pSurface->numShaders; j++, pShader++ )\r
- {\r
- printf( " shader %d ('%s')\n", j, pShader->name );\r
- }\r
- }\r
- pSurface = ( md3Surface_t * ) ( ( ( char * ) pSurface ) + pSurface->ofsEnd );\r
- }\r
-\r
- free( _buffer );\r
-}\r
-\r
+#include <assert.h>
+#ifdef _WIN32
+#include <io.h>
+#endif
+#include "md3lib.h"
+
+#if defined (__linux__) || defined (__APPLE__)
+#define filelength Q_filelength
+#endif
+
+/*
+** MD3_ComputeTagFromTri
+*/
+void MD3_ComputeTagFromTri( md3Tag_t *pTag, const float pTri[3][3] )
+{
+ float len[3];
+ vec3_t axes[3], sides[3];
+ int longestSide, shortestSide, hypotSide;
+ int origin;
+ int j;
+ float d;
+
+ memset( axes, 0, sizeof( axes ) );
+ memset( sides, 0, sizeof( sides ) );
+
+ //
+ // compute sides
+ //
+ for ( j = 0; j < 3; j++ )
+ {
+ sides[j][0] = pTri[(j+1)%3][0] - pTri[j][0];
+ sides[j][1] = pTri[(j+1)%3][1] - pTri[j][1];
+ sides[j][2] = pTri[(j+1)%3][2] - pTri[j][2];
+
+ len[j] = ( float ) sqrt( DotProduct( sides[j], sides[j] ) );
+ }
+
+#if 0
+ if ( len[0] > len[1] && len[0] > len[2] )
+ {
+ longestSide = 0; shortestSide = 1; origin = 2;
+ }
+ else if ( len[1] > len[0] && len[1] > len[2] )
+ {
+ longestSide = 1; shortestSide = 2; origin = 0;
+ }
+ else if ( len[2] > len[0] && len[2] > len[1] )
+ {
+ longestSide = 2; shortestSide = 0; origin = 1;
+ }
+ else
+ {
+ Error( "invalid tag triangle, must be a right triangle with unequal length sides" );
+ }
+#endif
+ if ( len[0] > len[1] && len[0] > len[2] ) {
+ hypotSide = 0;
+ origin = 2;
+ } else if ( len[1] > len[0] && len[1] > len[2] ) {
+ hypotSide = 1;
+ origin = 0;
+ } else if ( len[2] > len[0] && len[2] > len[1] ) {
+ hypotSide = 2;
+ origin = 1;
+ }
+ len[hypotSide] = -1;
+
+ if ( len[0] > len[1] && len[0] > len[2] ) {
+ longestSide = 0;
+ } else if ( len[1] > len[0] && len[1] > len[2] ) {
+ longestSide = 1;
+ } else if ( len[2] > len[0] && len[2] > len[1] ) {
+ longestSide = 2;
+ }
+ len[longestSide] = -1;
+
+ if ( len[0] > len[1] && len[0] > len[2] ) {
+ shortestSide = 0;
+ } else if ( len[1] > len[0] && len[1] > len[2] ) {
+ shortestSide = 1;
+ } else if ( len[2] > len[0] && len[2] > len[1] ) {
+ shortestSide = 2;
+ }
+ len[shortestSide] = -1;
+
+
+
+// VectorNormalize( sides[shortestSide], axes[0] );
+// VectorNormalize( sides[longestSide], axes[1] );
+ VectorNormalize( sides[longestSide], axes[0] );
+ VectorNormalize( sides[shortestSide], axes[1] );
+
+ // project shortest side so that it is exactly 90 degrees to the longer side
+ d = DotProduct( axes[0], axes[1] );
+ VectorMA( axes[0], -d, axes[1], axes[0] );
+ VectorNormalize( axes[0], axes[0] );
+
+ CrossProduct( sides[longestSide], sides[shortestSide], axes[2] );
+ VectorNormalize( axes[2], axes[2] );
+
+ pTag->origin[0] = pTri[origin][0];
+ pTag->origin[1] = pTri[origin][1];
+ pTag->origin[2] = pTri[origin][2];
+
+ VectorCopy( axes[0], pTag->axis[0] );
+ VectorCopy( axes[1], pTag->axis[1] );
+ VectorCopy( axes[2], pTag->axis[2] );
+}
+
+/*
+==============
+MD3_Dump
+==============
+*/
+void MD3_Dump( const char *filename )
+{
+ md3Header_t header;
+ md3Tag_t *pTag;
+ md3Surface_t *pSurface;
+ FILE *fp;
+ void *_buffer;
+ void *buffer;
+ long fileSize;
+ int i;
+
+ if ( ( fp = fopen( filename, "rb" ) ) == 0 )
+ {
+ Error( "Unable to open '%s'\n", filename );
+ }
+
+ fileSize = filelength( fileno( fp ) );
+ _buffer = malloc( filelength( fileno( fp ) ) );
+ fread( _buffer, fileSize, 1, fp );
+ fclose( fp );
+
+ buffer = ( char * ) _buffer;
+ header = *( md3Header_t * ) _buffer;
+
+ if ( header.ident != MD3_IDENT )
+ {
+ Error( "Incorrect ident for '%s'\n", filename );
+ }
+
+ printf( "Contents of '%s'\n", filename );
+ printf( " version: %d\n", header.version );
+ printf( " name: %s\n", header.name );
+ printf( " num frames: %d\n", header.numFrames );
+ printf( " num tags: %d\n", header.numTags );
+ printf( " num surfaces: %d\n", header.numSurfaces );
+ printf( " num skins: %d\n", header.numSkins );
+ printf( " file size: %d\n", fileSize );
+
+ printf( "--- TAGS ---\n" );
+ pTag = ( md3Tag_t * ) ( ( ( char * ) buffer ) + header.ofsTags );
+ for ( i = 0; i < header.numTags; i++, pTag++ )
+ {
+ printf( " tag %d ('%s')\n", i, pTag->name );
+ printf( " origin: %f,%f,%f\n", pTag->origin[0], pTag->origin[1], pTag->origin[2] );
+ printf( " vf: %f,%f,%f\n", pTag->axis[0][0], pTag->axis[0][1], pTag->axis[0][2] );
+ printf( " vr: %f,%f,%f\n", pTag->axis[1][0], pTag->axis[1][1], pTag->axis[1][2] );
+ printf( " vu: %f,%f,%f\n", pTag->axis[2][0], pTag->axis[2][1], pTag->axis[2][2] );
+ }
+
+ printf( "--- SURFACES ---\n" );
+ pSurface = ( md3Surface_t * ) ( ( ( char * ) buffer ) + header.ofsSurfaces );
+
+ for ( i = 0; i < header.numSurfaces; i++ )
+ {
+ int j;
+
+ md3Shader_t *pShader = ( md3Shader_t * ) ( ( ( char * ) pSurface ) + pSurface->ofsShaders );
+
+ printf( "\n surface %d ('%s')\n", i, pSurface->name );
+ printf( " num frames: %d\n", pSurface->numFrames );
+ printf( " num shaders: %d\n", pSurface->numShaders );
+ printf( " num tris: %d\n", pSurface->numTriangles );
+ printf( " num verts: %d\n", pSurface->numVerts );
+
+ if ( pSurface->numShaders > 0 )
+ {
+ printf( " --- SHADERS ---\n" );
+
+ for ( j = 0; j < pSurface->numShaders; j++, pShader++ )
+ {
+ printf( " shader %d ('%s')\n", j, pShader->name );
+ }
+ }
+ pSurface = ( md3Surface_t * ) ( ( ( char * ) pSurface ) + pSurface->ofsEnd );
+ }
+
+ free( _buffer );
+}
+