----------------------------------------------------------------------------- */
-
-
-/* marker */
-#define PM_MD3_C
-
-
-
/* dependencies */
#include "picointernal.h"
/* md3 model format */
-#define MD3_MAGIC "IDP3"
-#define MD3_VERSION 15
+const char *MD3_MAGIC = "IDP3";
+const int MD3_VERSION = 15;
/* md3 vertex scale */
-#define MD3_SCALE ( 1.0f / 64.0f )
+const float MD3_SCALE = ( 1.0f / 64.0f );
/* md3 model frame information */
typedef struct md3Frame_s
*/
static int _md3_canload( PM_PARAMS_CANLOAD ){
- md3_t *md3;
-
+ const md3_t *md3;
- /* to keep the compiler happy */
- *fileName = *fileName;
/* sanity check */
- if ( bufSize < ( sizeof( *md3 ) * 2 ) ) {
+ if ( (size_t) bufSize < ( sizeof( *md3 ) * 2 ) ) {
return PICO_PMV_ERROR_SIZE;
}
/* set as md3 */
- md3 = (md3_t*) buffer;
+ md3 = (const md3_t*) buffer;
/* check md3 magic */
- if ( *( (int*) md3->magic ) != *( (int*) MD3_MAGIC ) ) {
+ if ( *( (const int*) md3->magic ) != *( (const int*) MD3_MAGIC ) ) {
return PICO_PMV_ERROR_IDENT;
}
static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
int i, j;
- picoByte_t *bb;
+ picoByte_t *bb, *bb0;
md3_t *md3;
md3Surface_t *surface;
md3Shader_t *shader;
picoShader_t *picoShader;
picoVec3_t xyz, normal;
picoVec2_t st;
- picoColor_t color;
/* -------------------------------------------------
/* set as md3 */
- bb = (picoByte_t*) buffer;
- md3 = (md3_t*) buffer;
+ bb0 = bb = (picoByte_t*) _pico_alloc( bufSize );
+ memcpy( bb, buffer, bufSize );
+ md3 = (md3_t*) bb;
/* check ident and version */
if ( *( (int*) md3->magic ) != *( (int*) MD3_MAGIC ) || _pico_little_long( md3->version ) != MD3_VERSION ) {
/* not an md3 file (todo: set error) */
+ _pico_free( bb0 );
return NULL;
}
/* do frame check */
if ( md3->numFrames < 1 ) {
_pico_printf( PICO_ERROR, "MD3 with 0 frames" );
+ _pico_free( bb0 );
return NULL;
}
if ( frameNum < 0 || frameNum >= md3->numFrames ) {
_pico_printf( PICO_ERROR, "Invalid or out-of-range MD3 frame specified" );
+ _pico_free( bb0 );
return NULL;
}
picoModel = PicoNewModel();
if ( picoModel == NULL ) {
_pico_printf( PICO_ERROR, "Unable to allocate a new model" );
+ _pico_free( bb0 );
return NULL;
}
if ( picoSurface == NULL ) {
_pico_printf( PICO_ERROR, "Unable to allocate a new model surface" );
PicoFreeModel( picoModel ); /* sea */
+ _pico_free( bb0 );
return NULL;
}
if ( picoShader == NULL ) {
_pico_printf( PICO_ERROR, "Unable to allocate a new model shader" );
PicoFreeModel( picoModel );
+ _pico_free( bb0 );
return NULL;
}
/* detox and set shader name */
shader = (md3Shader_t*) ( (picoByte_t*) surface + surface->ofsShaders );
- _pico_setfext( shader->name, "" );
+ _pico_setfext( shader->name, NULL );
_pico_unixify( shader->name );
PicoSetShaderName( picoShader, shader->name );
/* copy vertexes */
texCoord = (md3TexCoord_t*) ( (picoByte_t *) surface + surface->ofsSt );
vertex = (md3Vertex_t*) ( (picoByte_t*) surface + surface->ofsVertexes + surface->numVerts * frameNum * sizeof( md3Vertex_t ) );
- _pico_set_color( color, 255, 255, 255, 255 );
for ( j = 0; j < surface->numVerts; j++, texCoord++, vertex++ )
{
PicoSetSurfaceST( picoSurface, 0, j, st );
/* set color */
- PicoSetSurfaceColor( picoSurface, 0, j, color );
+ PicoSetSurfaceColor( picoSurface, 0, j, picoColor_white );
}
/* get next surface */
}
/* return the new pico model */
+ _pico_free( bb0 );
return picoModel;
}