support .skin files for models (modelname_<n>.skin) like Q3A and DP
This commit is contained in:
parent
570c4f2bc4
commit
3dd2ff55b1
|
|
@ -206,7 +206,7 @@ InsertModel() - ydnar
|
||||||
adds a picomodel into the bsp
|
adds a picomodel into the bsp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void InsertModel( char *name, 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( 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;
|
||||||
|
|
@ -222,8 +222,11 @@ void InsertModel( char *name, int frame, m4x4_t transform, remap_t *remap, shade
|
||||||
byte *color;
|
byte *color;
|
||||||
picoIndex_t *indexes;
|
picoIndex_t *indexes;
|
||||||
remap_t *rm, *glob;
|
remap_t *rm, *glob;
|
||||||
|
skinfile_t *sf, *sf2;
|
||||||
double normalEpsilon_save;
|
double normalEpsilon_save;
|
||||||
double distanceEpsilon_save;
|
double distanceEpsilon_save;
|
||||||
|
char skinfilename[ MAX_QPATH ];
|
||||||
|
FILE *skinfilehandle;
|
||||||
|
|
||||||
|
|
||||||
/* get model */
|
/* get model */
|
||||||
|
|
@ -231,6 +234,53 @@ void InsertModel( char *name, int frame, m4x4_t transform, remap_t *remap, shade
|
||||||
if( model == NULL )
|
if( model == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* load skin file */
|
||||||
|
snprintf(skinfilename, sizeof(skinfilename), "%s_%d.skin", name, skin);
|
||||||
|
skinfilename[sizeof(skinfilename)-1] = 0;
|
||||||
|
skinfilehandle = fopen(skinfilename, "r");
|
||||||
|
if(!skinfilehandle)
|
||||||
|
{
|
||||||
|
/* fallback to skin 0 if invalid */
|
||||||
|
snprintf(skinfilename, sizeof(skinfilename), "%s_0.skin", name);
|
||||||
|
skinfilename[sizeof(skinfilename)-1] = 0;
|
||||||
|
skinfilehandle = fopen(skinfilename, "r");
|
||||||
|
if(skinfilehandle)
|
||||||
|
Sys_Printf( "Skin %d of %s does not exist, using 0 instead\n", skin, name );
|
||||||
|
}
|
||||||
|
sf = NULL;
|
||||||
|
if(skinfilehandle)
|
||||||
|
{
|
||||||
|
Sys_Printf( "Using skin %d of %s\n", skin, name );
|
||||||
|
int pos;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
// for fscanf
|
||||||
|
char format[64];
|
||||||
|
char buf[1024];
|
||||||
|
|
||||||
|
if(!fgets(buf, sizeof(buf), skinfilehandle))
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* create new item */
|
||||||
|
sf2 = sf;
|
||||||
|
sf = safe_malloc( sizeof( *sf ) );
|
||||||
|
sf->next = sf2;
|
||||||
|
|
||||||
|
sprintf(format, "replace %%%ds %%%ds%%n", (int)sizeof(sf->name)-1, (int)sizeof(sf->to)-1);
|
||||||
|
pos = 0;
|
||||||
|
if(sscanf(buf, format, &sf->name, &sf->to, &pos) > 0 && pos > 0)
|
||||||
|
continue;
|
||||||
|
sprintf(format, "%%%ds,%%%ds%%n", (int)sizeof(sf->name)-1, (int)sizeof(sf->to)-1);
|
||||||
|
pos = 0;
|
||||||
|
if(sscanf(buf, format, &sf->name, &sf->to, &pos) > 0 && pos > 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* invalid input line -> discard sf struct */
|
||||||
|
free(sf);
|
||||||
|
sf = sf2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* handle null matrix */
|
/* handle null matrix */
|
||||||
if( transform == NULL )
|
if( transform == NULL )
|
||||||
{
|
{
|
||||||
|
|
@ -284,6 +334,26 @@ void InsertModel( char *name, int frame, m4x4_t transform, remap_t *remap, shade
|
||||||
else
|
else
|
||||||
picoShaderName = PicoGetShaderName( shader );
|
picoShaderName = PicoGetShaderName( shader );
|
||||||
|
|
||||||
|
/* handle .skin file */
|
||||||
|
if(sf)
|
||||||
|
{
|
||||||
|
picoShaderName = NULL;
|
||||||
|
for(sf2 = sf; sf2 != NULL; sf2 = sf2->next)
|
||||||
|
{
|
||||||
|
if( !Q_stricmp( surface->name, sf2->name ) )
|
||||||
|
{
|
||||||
|
Sys_FPrintf( SYS_VRB, "Skin file: mapping %s to %s\n", surface->name, sf2->to );
|
||||||
|
picoShaderName = sf2->to;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!picoShaderName)
|
||||||
|
{
|
||||||
|
Sys_FPrintf( SYS_VRB, "Skin file: not mapping %s\n", surface->name );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* handle shader remapping */
|
/* handle shader remapping */
|
||||||
glob = NULL;
|
glob = NULL;
|
||||||
for( rm = remap; rm != NULL; rm = rm->next )
|
for( rm = remap; rm != NULL; rm = rm->next )
|
||||||
|
|
@ -603,7 +673,7 @@ adds misc_model surfaces to the bsp
|
||||||
|
|
||||||
void AddTriangleModels( entity_t *e )
|
void AddTriangleModels( entity_t *e )
|
||||||
{
|
{
|
||||||
int num, frame, castShadows, recvShadows, spawnFlags;
|
int num, frame, skin, castShadows, recvShadows, spawnFlags;
|
||||||
entity_t *e2;
|
entity_t *e2;
|
||||||
const char *targetName;
|
const char *targetName;
|
||||||
const char *target, *model, *value;
|
const char *target, *model, *value;
|
||||||
|
|
@ -806,12 +876,12 @@ void AddTriangleModels( entity_t *e )
|
||||||
if ( strcmp( "", ValueForKey( e2, "_shadeangle" ) ) )
|
if ( strcmp( "", ValueForKey( e2, "_shadeangle" ) ) )
|
||||||
shadeAngle = FloatForKey( e2, "_shadeangle" );
|
shadeAngle = FloatForKey( e2, "_shadeangle" );
|
||||||
/* vortex' aliases */
|
/* vortex' aliases */
|
||||||
else if ( strcmp( "", ValueForKey( mapEnt, "_smoothnormals" ) ) )
|
else if ( strcmp( "", ValueForKey( e2, "_smoothnormals" ) ) )
|
||||||
shadeAngle = FloatForKey( mapEnt, "_smoothnormals" );
|
shadeAngle = FloatForKey( e2, "_smoothnormals" );
|
||||||
else if ( strcmp( "", ValueForKey( mapEnt, "_sn" ) ) )
|
else if ( strcmp( "", ValueForKey( e2, "_sn" ) ) )
|
||||||
shadeAngle = FloatForKey( mapEnt, "_sn" );
|
shadeAngle = FloatForKey( e2, "_sn" );
|
||||||
else if ( strcmp( "", ValueForKey( mapEnt, "_smooth" ) ) )
|
else if ( strcmp( "", ValueForKey( e2, "_smooth" ) ) )
|
||||||
shadeAngle = FloatForKey( mapEnt, "_smooth" );
|
shadeAngle = FloatForKey( e2, "_smooth" );
|
||||||
|
|
||||||
if( shadeAngle < 0.0f )
|
if( shadeAngle < 0.0f )
|
||||||
shadeAngle = 0.0f;
|
shadeAngle = 0.0f;
|
||||||
|
|
@ -819,8 +889,10 @@ void AddTriangleModels( entity_t *e )
|
||||||
if( shadeAngle > 0.0f )
|
if( shadeAngle > 0.0f )
|
||||||
Sys_Printf( "misc_model has shading angle of %.4f\n", shadeAngle );
|
Sys_Printf( "misc_model has shading angle of %.4f\n", shadeAngle );
|
||||||
|
|
||||||
|
skin = IntForKey(e2, "skin");
|
||||||
|
|
||||||
/* insert the model */
|
/* insert the model */
|
||||||
InsertModel( (char*) model, frame, transform, remap, celShader, mapEntityNum, castShadows, recvShadows, spawnFlags, lightmapScale, lightmapSampleSize, shadeAngle );
|
InsertModel( (char*) 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 )
|
||||||
|
|
|
||||||
|
|
@ -645,6 +645,14 @@ typedef struct remap_s
|
||||||
}
|
}
|
||||||
remap_t;
|
remap_t;
|
||||||
|
|
||||||
|
typedef struct skinfile_s
|
||||||
|
{
|
||||||
|
struct skinfile_s *next;
|
||||||
|
char name[ 1024 ];
|
||||||
|
char to[ MAX_QPATH ];
|
||||||
|
}
|
||||||
|
skinfile_t;
|
||||||
|
|
||||||
|
|
||||||
/* wingdi.h hack, it's the same: 0 */
|
/* wingdi.h hack, it's the same: 0 */
|
||||||
#undef CM_NONE
|
#undef CM_NONE
|
||||||
|
|
@ -1651,7 +1659,7 @@ 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( char *name, int frame );
|
||||||
picoModel_t *LoadModel( char *name, int frame );
|
picoModel_t *LoadModel( char *name, int frame );
|
||||||
void InsertModel( char *name, 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( 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 );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3173,7 +3173,7 @@ int AddSurfaceModelsToTriangle_r( mapDrawSurface_t *ds, surfaceModel_t *model, b
|
||||||
}
|
}
|
||||||
|
|
||||||
/* insert the model */
|
/* insert the model */
|
||||||
InsertModel( (char *) model->model, 0, transform, NULL, ds->celShader, ds->entityNum, ds->castShadows, ds->recvShadows, 0, ds->lightmapScale, 0, 0 );
|
InsertModel( (char *) model->model, 0, 0, transform, NULL, ds->celShader, ds->entityNum, ds->castShadows, ds->recvShadows, 0, ds->lightmapScale, 0, 0 );
|
||||||
|
|
||||||
/* return to sender */
|
/* return to sender */
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
||||||
|
|
@ -275,7 +275,7 @@ void Foliage( mapDrawSurface_t *src )
|
||||||
m4x4_scale_for_vec3( transform, scale );
|
m4x4_scale_for_vec3( transform, scale );
|
||||||
|
|
||||||
/* add the model to the bsp */
|
/* add the model to the bsp */
|
||||||
InsertModel( foliage->model, 0, transform, NULL, NULL, src->entityNum, src->castShadows, src->recvShadows, 0, src->lightmapScale, 0, 0 );
|
InsertModel( foliage->model, 0, 0, transform, NULL, NULL, src->entityNum, src->castShadows, src->recvShadows, 0, src->lightmapScale, 0, 0 );
|
||||||
|
|
||||||
/* walk each new surface */
|
/* walk each new surface */
|
||||||
for( i = oldNumMapDrawSurfs; i < numMapDrawSurfs; i++ )
|
for( i = oldNumMapDrawSurfs; i < numMapDrawSurfs; i++ )
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user