]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake3/q3data/md3lib.c
use %ld instead of %d for “long int” arguments
[xonotic/netradiant.git] / tools / quake3 / q3data / md3lib.c
index 5bc90b108024a98dae417d89ef7a45c0bc654cdc..66dfa52d8283682dcb46b8706aa1100ea25526e3 100644 (file)
-#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
+/*
+   Copyright (C) 1999-2006 Id Software, Inc. and contributors.
+   For a list of contributors, see the accompanying CONTRIBUTORS file.
+
+   This file is part of GtkRadiant.
+
+   GtkRadiant is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   GtkRadiant is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GtkRadiant; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#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:      %ld\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 );
+}