skinfiles: use the VFS

This commit is contained in:
Rudolf Polzer 2010-10-01 11:49:38 +02:00
parent 7b7d0471b6
commit 43b05f81bc
2 changed files with 33 additions and 18 deletions

View File

@ -90,7 +90,7 @@ FindModel() - ydnar
finds an existing picoModel and returns a pointer to the picoModel_t struct or NULL if not found finds an existing picoModel and returns a pointer to the picoModel_t struct or NULL if not found
*/ */
picoModel_t *FindModel( char *name, int frame ) picoModel_t *FindModel( const char *name, int frame )
{ {
int i; int i;
@ -123,7 +123,7 @@ LoadModel() - ydnar
loads a picoModel and returns a pointer to the picoModel_t struct or NULL if not found loads a picoModel and returns a pointer to the picoModel_t struct or NULL if not found
*/ */
picoModel_t *LoadModel( char *name, int frame ) picoModel_t *LoadModel( const char *name, int frame )
{ {
int i; int i;
picoModel_t *model, **pm; picoModel_t *model, **pm;
@ -169,7 +169,7 @@ picoModel_t *LoadModel( char *name, int frame )
return NULL; return NULL;
/* set data */ /* set data */
PicoSetModelName( *pm, name ); PicoSetModelName( *pm, (char*) name );
PicoSetModelFrameNum( *pm, frame ); PicoSetModelFrameNum( *pm, frame );
} }
@ -206,7 +206,7 @@ InsertModel() - ydnar
adds a picomodel into the bsp adds a picomodel into the bsp
*/ */
void InsertModel( char *name, int skin, int frame, m4x4_t transform, remap_t *remap, shaderInfo_t *celShader, int eNum, int castShadows, int recvShadows, int spawnFlags, float lightmapScale, int lightmapSampleSize, float shadeAngle ) void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap_t *remap, shaderInfo_t *celShader, int eNum, int castShadows, int recvShadows, int spawnFlags, float lightmapScale, int lightmapSampleSize, float shadeAngle )
{ {
int i, j, k, s, numSurfaces; int i, j, k, s, numSurfaces;
m4x4_t identity, nTransform; m4x4_t identity, nTransform;
@ -226,6 +226,9 @@ void InsertModel( char *name, int skin, int frame, m4x4_t transform, remap_t *re
double normalEpsilon_save; double normalEpsilon_save;
double distanceEpsilon_save; double distanceEpsilon_save;
char skinfilename[ MAX_QPATH ]; char skinfilename[ MAX_QPATH ];
char *skinfilecontent;
int skinfilesize;
char *skinfileptr, *skinfilenextptr;
FILE *skinfilehandle; FILE *skinfilehandle;
@ -238,28 +241,39 @@ void InsertModel( char *name, int skin, int frame, m4x4_t transform, remap_t *re
snprintf(skinfilename, sizeof(skinfilename), "%s_%d.skin", name, skin); snprintf(skinfilename, sizeof(skinfilename), "%s_%d.skin", name, skin);
skinfilename[sizeof(skinfilename)-1] = 0; skinfilename[sizeof(skinfilename)-1] = 0;
skinfilehandle = fopen(skinfilename, "r"); skinfilehandle = fopen(skinfilename, "r");
if(!skinfilehandle) skinfilesize = vfsLoadFile(skinfilename, (void**) &skinfilecontent, 0);
if(skinfilesize < 0)
{ {
/* fallback to skin 0 if invalid */ /* fallback to skin 0 if invalid */
snprintf(skinfilename, sizeof(skinfilename), "%s_0.skin", name); snprintf(skinfilename, sizeof(skinfilename), "%s_0.skin", name);
skinfilename[sizeof(skinfilename)-1] = 0; skinfilename[sizeof(skinfilename)-1] = 0;
skinfilehandle = fopen(skinfilename, "r"); skinfilesize = vfsLoadFile(skinfilename, (void**) &skinfilecontent, 0);
if(skinfilehandle) if(skinfilesize < 0)
Sys_Printf( "Skin %d of %s does not exist, using 0 instead\n", skin, name ); Sys_Printf( "Skin %d of %s does not exist, using 0 instead\n", skin, name );
} }
sf = NULL; sf = NULL;
if(skinfilehandle) if(skinfilesize)
{ {
Sys_Printf( "Using skin %d of %s\n", skin, name ); Sys_Printf( "Using skin %d of %s\n", skin, name );
int pos; int pos;
for(;;) for(skinfileptr = skinfilecontent; *skinfileptr; skinfileptr = skinfilenextptr)
{ {
// for fscanf // for fscanf
char format[64]; char format[64];
char buf[1024];
if(!fgets(buf, sizeof(buf), skinfilehandle)) skinfilenextptr = strchr(skinfileptr, '\r');
break; if(skinfilenextptr)
{
*skinfilenextptr++ = 0;
}
else
{
skinfilenextptr = strchr(skinfileptr, '\n');
if(skinfilenextptr)
*skinfilenextptr++ = 0;
else
skinfilenextptr = skinfileptr + strlen(skinfileptr);
}
/* create new item */ /* create new item */
sf2 = sf; sf2 = sf;
@ -268,17 +282,18 @@ void InsertModel( char *name, int skin, int frame, m4x4_t transform, remap_t *re
sprintf(format, "replace %%%ds %%%ds%%n", (int)sizeof(sf->name)-1, (int)sizeof(sf->to)-1); sprintf(format, "replace %%%ds %%%ds%%n", (int)sizeof(sf->name)-1, (int)sizeof(sf->to)-1);
pos = 0; pos = 0;
if(sscanf(buf, format, &sf->name, &sf->to, &pos) > 0 && pos > 0) if(sscanf(skinfileptr, format, &sf->name, &sf->to, &pos) > 0 && pos > 0)
continue; continue;
sprintf(format, "%%%ds,%%%ds%%n", (int)sizeof(sf->name)-1, (int)sizeof(sf->to)-1); sprintf(format, "%%%ds,%%%ds%%n", (int)sizeof(sf->name)-1, (int)sizeof(sf->to)-1);
pos = 0; pos = 0;
if(sscanf(buf, format, &sf->name, &sf->to, &pos) > 0 && pos > 0) if(sscanf(skinfileptr, format, &sf->name, &sf->to, &pos) > 0 && pos > 0)
continue; continue;
/* invalid input line -> discard sf struct */ /* invalid input line -> discard sf struct */
free(sf); free(sf);
sf = sf2; sf = sf2;
} }
free(skinfilecontent);
} }
/* handle null matrix */ /* handle null matrix */
@ -892,7 +907,7 @@ void AddTriangleModels( entity_t *e )
skin = IntForKey(e2, "skin"); skin = IntForKey(e2, "skin");
/* insert the model */ /* insert the model */
InsertModel( (char*) model, skin, frame, transform, remap, celShader, mapEntityNum, castShadows, recvShadows, spawnFlags, lightmapScale, lightmapSampleSize, shadeAngle ); InsertModel( model, skin, frame, transform, remap, celShader, mapEntityNum, castShadows, recvShadows, spawnFlags, lightmapScale, lightmapSampleSize, shadeAngle );
/* free shader remappings */ /* free shader remappings */
while( remap != NULL ) while( remap != NULL )

View File

@ -1657,9 +1657,9 @@ tree_t *FaceBSP( face_t *list );
/* model.c */ /* model.c */
void PicoPrintFunc( int level, const char *str ); void PicoPrintFunc( int level, const char *str );
void PicoLoadFileFunc( char *name, byte **buffer, int *bufSize ); void PicoLoadFileFunc( char *name, byte **buffer, int *bufSize );
picoModel_t *FindModel( char *name, int frame ); picoModel_t *FindModel( const char *name, int frame );
picoModel_t *LoadModel( char *name, int frame ); picoModel_t *LoadModel( const char *name, int frame );
void InsertModel( char *name, int skin, int frame, m4x4_t transform, remap_t *remap, shaderInfo_t *celShader, int eNum, int castShadows, int recvShadows, int spawnFlags, float lightmapScale, int lightmapSampleSize, float shadeAngle ); void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap_t *remap, shaderInfo_t *celShader, int eNum, int castShadows, int recvShadows, int spawnFlags, float lightmapScale, int lightmapSampleSize, float shadeAngle );
void AddTriangleModels( entity_t *e ); void AddTriangleModels( entity_t *e );