better shadeangle support by jal
git-svn-id: svn://svn.icculus.org/netradiant/trunk@355 61c419a2-8eb2-4b30-bcec-8cead039b335
This commit is contained in:
parent
d0244e3b2e
commit
65fcedfc4c
|
|
@ -1415,7 +1415,7 @@ static qboolean ParseMapEntity( qboolean onlyLights )
|
||||||
{
|
{
|
||||||
epair_t *ep;
|
epair_t *ep;
|
||||||
const char *classname, *value;
|
const char *classname, *value;
|
||||||
float lightmapScale;
|
float lightmapScale, shadeAngle;
|
||||||
char shader[ MAX_QPATH ];
|
char shader[ MAX_QPATH ];
|
||||||
shaderInfo_t *celShader = NULL;
|
shaderInfo_t *celShader = NULL;
|
||||||
brush_t *brush;
|
brush_t *brush;
|
||||||
|
|
@ -1569,7 +1569,7 @@ static qboolean ParseMapEntity( qboolean onlyLights )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
lightmapScale = 0.0f;
|
lightmapScale = 0.0f;
|
||||||
|
|
||||||
/* ydnar: get cel shader :) for this entity */
|
/* ydnar: get cel shader :) for this entity */
|
||||||
value = ValueForKey( mapEnt, "_celshader" );
|
value = ValueForKey( mapEnt, "_celshader" );
|
||||||
if( value[ 0 ] == '\0' )
|
if( value[ 0 ] == '\0' )
|
||||||
|
|
@ -1582,6 +1582,25 @@ static qboolean ParseMapEntity( qboolean onlyLights )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
celShader = *globalCelShader ? ShaderInfoForShader(globalCelShader) : NULL;
|
celShader = *globalCelShader ? ShaderInfoForShader(globalCelShader) : NULL;
|
||||||
|
|
||||||
|
/* jal : entity based _shadeangle */
|
||||||
|
shadeAngle = 0.0f;
|
||||||
|
if ( strcmp( "", ValueForKey( mapEnt, "_shadeangle" ) ) )
|
||||||
|
shadeAngle = FloatForKey( mapEnt, "_shadeangle" );
|
||||||
|
/* vortex' aliases */
|
||||||
|
else if ( strcmp( "", ValueForKey( mapEnt, "_smoothnormals" ) ) )
|
||||||
|
shadeAngle = FloatForKey( mapEnt, "_smoothnormals" );
|
||||||
|
else if ( strcmp( "", ValueForKey( mapEnt, "_sn" ) ) )
|
||||||
|
shadeAngle = FloatForKey( mapEnt, "_sn" );
|
||||||
|
else if ( strcmp( "", ValueForKey( mapEnt, "_smooth" ) ) )
|
||||||
|
shadeAngle = FloatForKey( mapEnt, "_smooth" );
|
||||||
|
|
||||||
|
if( shadeAngle < 0.0f )
|
||||||
|
shadeAngle = 0.0f;
|
||||||
|
|
||||||
|
if( shadeAngle > 0.0f )
|
||||||
|
Sys_Printf( "Entity %d (%s) has shading angle of %.4f\n", mapEnt->mapEntityNum, classname, shadeAngle );
|
||||||
|
|
||||||
|
|
||||||
/* attach stuff to everything in the entity */
|
/* attach stuff to everything in the entity */
|
||||||
for( brush = mapEnt->brushes; brush != NULL; brush = brush->next )
|
for( brush = mapEnt->brushes; brush != NULL; brush = brush->next )
|
||||||
|
|
@ -1591,6 +1610,7 @@ static qboolean ParseMapEntity( qboolean onlyLights )
|
||||||
brush->recvShadows = recvShadows;
|
brush->recvShadows = recvShadows;
|
||||||
brush->lightmapScale = lightmapScale;
|
brush->lightmapScale = lightmapScale;
|
||||||
brush->celShader = celShader;
|
brush->celShader = celShader;
|
||||||
|
brush->shadeAngleDegrees = shadeAngle;
|
||||||
}
|
}
|
||||||
|
|
||||||
for( patch = mapEnt->patches; patch != NULL; patch = patch->next )
|
for( patch = mapEnt->patches; patch != NULL; patch = patch->next )
|
||||||
|
|
|
||||||
|
|
@ -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 )
|
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, float shadeAngle )
|
||||||
{
|
{
|
||||||
int i, j, k, s, numSurfaces;
|
int i, j, k, s, numSurfaces;
|
||||||
m4x4_t identity, nTransform;
|
m4x4_t identity, nTransform;
|
||||||
|
|
@ -267,10 +267,6 @@ void InsertModel( char *name, int frame, m4x4_t transform, remap_t *remap, shade
|
||||||
if( PicoGetSurfaceType( surface ) != PICO_TRIANGLES )
|
if( PicoGetSurfaceType( surface ) != PICO_TRIANGLES )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* fix the surface's normals */
|
|
||||||
if( !(spawnFlags & 64) )
|
|
||||||
PicoFixSurfaceNormals( surface );
|
|
||||||
|
|
||||||
/* allocate a surface (ydnar: gs mods) */
|
/* allocate a surface (ydnar: gs mods) */
|
||||||
ds = AllocDrawSurface( SURFACE_TRIANGLES );
|
ds = AllocDrawSurface( SURFACE_TRIANGLES );
|
||||||
ds->entityNum = eNum;
|
ds->entityNum = eNum;
|
||||||
|
|
@ -321,13 +317,23 @@ void InsertModel( char *name, int frame, m4x4_t transform, remap_t *remap, shade
|
||||||
|
|
||||||
/* set shader */
|
/* set shader */
|
||||||
ds->shaderInfo = si;
|
ds->shaderInfo = si;
|
||||||
|
|
||||||
/* set lightmap scale */
|
|
||||||
ds->lightmapScale = lightmapScale;
|
|
||||||
|
|
||||||
/* force to meta? */
|
/* force to meta? */
|
||||||
if( (si != NULL && si->forceMeta) || (spawnFlags & 4) ) /* 3rd bit */
|
if( (si != NULL && si->forceMeta) || (spawnFlags & 4) ) /* 3rd bit */
|
||||||
ds->type = SURFACE_FORCED_META;
|
ds->type = SURFACE_FORCED_META;
|
||||||
|
|
||||||
|
/* get shading angle from shader or entity */
|
||||||
|
if( si->shadeAngleDegrees )
|
||||||
|
ds->shadeAngleDegrees = si->shadeAngleDegrees;
|
||||||
|
else if( shadeAngle )
|
||||||
|
ds->shadeAngleDegrees = shadeAngle; /* otherwise it's 0 */
|
||||||
|
|
||||||
|
/* fix the surface's normals (jal: conditioned by shader info) */
|
||||||
|
if( !(spawnFlags & 64) && ( shadeAngle == 0.0f || ds->type != SURFACE_FORCED_META ) )
|
||||||
|
PicoFixSurfaceNormals( surface );
|
||||||
|
|
||||||
|
/* set lightmap scale */
|
||||||
|
ds->lightmapScale = lightmapScale;
|
||||||
|
|
||||||
/* set particulars */
|
/* set particulars */
|
||||||
ds->numVerts = PicoGetSurfaceNumVertexes( surface );
|
ds->numVerts = PicoGetSurfaceNumVertexes( surface );
|
||||||
|
|
@ -598,6 +604,7 @@ void AddTriangleModels( entity_t *e )
|
||||||
char shader[ MAX_QPATH ];
|
char shader[ MAX_QPATH ];
|
||||||
shaderInfo_t *celShader;
|
shaderInfo_t *celShader;
|
||||||
float temp, baseLightmapScale, lightmapScale;
|
float temp, baseLightmapScale, lightmapScale;
|
||||||
|
float shadeAngle;
|
||||||
vec3_t origin, scale, angles;
|
vec3_t origin, scale, angles;
|
||||||
m4x4_t transform;
|
m4x4_t transform;
|
||||||
epair_t *ep;
|
epair_t *ep;
|
||||||
|
|
@ -752,9 +759,27 @@ void AddTriangleModels( entity_t *e )
|
||||||
lightmapScale = FloatForKey( e2, "_ls" );
|
lightmapScale = FloatForKey( e2, "_ls" );
|
||||||
if( lightmapScale <= 0.0f )
|
if( lightmapScale <= 0.0f )
|
||||||
lightmapScale = baseLightmapScale;
|
lightmapScale = baseLightmapScale;
|
||||||
|
|
||||||
|
/* jal : entity based _shadeangle */
|
||||||
|
shadeAngle = 0.0f;
|
||||||
|
if ( strcmp( "", ValueForKey( e2, "_shadeangle" ) ) )
|
||||||
|
shadeAngle = FloatForKey( e2, "_shadeangle" );
|
||||||
|
/* vortex' aliases */
|
||||||
|
else if ( strcmp( "", ValueForKey( mapEnt, "_smoothnormals" ) ) )
|
||||||
|
shadeAngle = FloatForKey( mapEnt, "_smoothnormals" );
|
||||||
|
else if ( strcmp( "", ValueForKey( mapEnt, "_sn" ) ) )
|
||||||
|
shadeAngle = FloatForKey( mapEnt, "_sn" );
|
||||||
|
else if ( strcmp( "", ValueForKey( mapEnt, "_smooth" ) ) )
|
||||||
|
shadeAngle = FloatForKey( mapEnt, "_smooth" );
|
||||||
|
|
||||||
|
if( shadeAngle < 0.0f )
|
||||||
|
shadeAngle = 0.0f;
|
||||||
|
|
||||||
|
if( shadeAngle > 0.0f )
|
||||||
|
Sys_Printf( "misc_model has shading angle of %.4f\n", shadeAngle );
|
||||||
|
|
||||||
/* insert the model */
|
/* insert the model */
|
||||||
InsertModel( (char*) model, frame, transform, remap, celShader, mapEntityNum, castShadows, recvShadows, spawnFlags, lightmapScale );
|
InsertModel( (char*) model, frame, transform, remap, celShader, mapEntityNum, castShadows, recvShadows, spawnFlags, lightmapScale, shadeAngle );
|
||||||
|
|
||||||
/* free shader remappings */
|
/* free shader remappings */
|
||||||
while( remap != NULL )
|
while( remap != NULL )
|
||||||
|
|
|
||||||
|
|
@ -890,6 +890,7 @@ typedef struct brush_s
|
||||||
|
|
||||||
/* ydnar: gs mods */
|
/* ydnar: gs mods */
|
||||||
float lightmapScale;
|
float lightmapScale;
|
||||||
|
float shadeAngleDegrees; /* jal : entity based _shadeangle */
|
||||||
vec3_t eMins, eMaxs;
|
vec3_t eMins, eMaxs;
|
||||||
indexMap_t *im;
|
indexMap_t *im;
|
||||||
|
|
||||||
|
|
@ -1037,6 +1038,9 @@ typedef struct mapDrawSurface_s
|
||||||
|
|
||||||
/* ydnar: per-surface (per-entity, actually) lightmap sample size scaling */
|
/* ydnar: per-surface (per-entity, actually) lightmap sample size scaling */
|
||||||
float lightmapScale;
|
float lightmapScale;
|
||||||
|
|
||||||
|
/* jal: per-surface (per-entity, actually) shadeangle */
|
||||||
|
float shadeAngleDegrees;
|
||||||
|
|
||||||
/* ydnar: surface classification */
|
/* ydnar: surface classification */
|
||||||
vec3_t mins, maxs;
|
vec3_t mins, maxs;
|
||||||
|
|
@ -1080,6 +1084,7 @@ typedef struct metaTriangle_s
|
||||||
shaderInfo_t *si;
|
shaderInfo_t *si;
|
||||||
side_t *side;
|
side_t *side;
|
||||||
int entityNum, surfaceNum, planeNum, fogNum, sampleSize, castShadows, recvShadows;
|
int entityNum, surfaceNum, planeNum, fogNum, sampleSize, castShadows, recvShadows;
|
||||||
|
float shadeAngleDegrees;
|
||||||
vec4_t plane;
|
vec4_t plane;
|
||||||
vec3_t lightmapAxis;
|
vec3_t lightmapAxis;
|
||||||
int indexes[ 3 ];
|
int indexes[ 3 ];
|
||||||
|
|
@ -1104,7 +1109,6 @@ typedef struct
|
||||||
int firstBrush, numBrushes; /* only valid during BSP compile */
|
int firstBrush, numBrushes; /* only valid during BSP compile */
|
||||||
epair_t *epairs;
|
epair_t *epairs;
|
||||||
vec3_t originbrush_origin;
|
vec3_t originbrush_origin;
|
||||||
qboolean forceNormalSmoothing; /* vortex: true if entity has _smoothnormals/_sn/_smooth key */
|
|
||||||
}
|
}
|
||||||
entity_t;
|
entity_t;
|
||||||
|
|
||||||
|
|
@ -1635,7 +1639,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 );
|
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, float shadeAngle );
|
||||||
void AddTriangleModels( entity_t *e );
|
void AddTriangleModels( entity_t *e );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -989,6 +989,12 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin
|
||||||
|
|
||||||
/* set cel shader */
|
/* set cel shader */
|
||||||
ds->celShader = b->celShader;
|
ds->celShader = b->celShader;
|
||||||
|
|
||||||
|
/* set shade angle */
|
||||||
|
if( si->shadeAngleDegrees )
|
||||||
|
ds->shadeAngleDegrees = ds->shadeAngleDegrees;
|
||||||
|
else
|
||||||
|
ds->shadeAngleDegrees = b->shadeAngleDegrees; /* otherwise it's 0 */
|
||||||
|
|
||||||
/* ydnar: gs mods: moved st biasing elsewhere */
|
/* ydnar: gs mods: moved st biasing elsewhere */
|
||||||
return ds;
|
return ds;
|
||||||
|
|
@ -3127,7 +3133,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 );
|
InsertModel( (char *) model->model, 0, transform, NULL, ds->celShader, ds->entityNum, ds->castShadows, ds->recvShadows, 0, ds->lightmapScale, 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 );
|
InsertModel( foliage->model, 0, transform, NULL, NULL, src->entityNum, src->castShadows, src->recvShadows, 0, src->lightmapScale, 0 );
|
||||||
|
|
||||||
/* walk each new surface */
|
/* walk each new surface */
|
||||||
for( i = oldNumMapDrawSurfs; i < numMapDrawSurfs; i++ )
|
for( i = oldNumMapDrawSurfs; i < numMapDrawSurfs; i++ )
|
||||||
|
|
|
||||||
|
|
@ -288,6 +288,7 @@ static void SurfaceToMetaTriangles( mapDrawSurface_t *ds )
|
||||||
src.recvShadows = ds->recvShadows;
|
src.recvShadows = ds->recvShadows;
|
||||||
src.fogNum = ds->fogNum;
|
src.fogNum = ds->fogNum;
|
||||||
src.sampleSize = ds->sampleSize;
|
src.sampleSize = ds->sampleSize;
|
||||||
|
src.shadeAngleDegrees = ds->shadeAngleDegrees;
|
||||||
VectorCopy( ds->lightmapAxis, src.lightmapAxis );
|
VectorCopy( ds->lightmapAxis, src.lightmapAxis );
|
||||||
|
|
||||||
/* copy drawverts */
|
/* copy drawverts */
|
||||||
|
|
@ -1005,7 +1006,6 @@ void SmoothMetaTriangles( void )
|
||||||
vec3_t average, diff;
|
vec3_t average, diff;
|
||||||
int indexes[ MAX_SAMPLES ];
|
int indexes[ MAX_SAMPLES ];
|
||||||
vec3_t votes[ MAX_SAMPLES ];
|
vec3_t votes[ MAX_SAMPLES ];
|
||||||
const char *classname;
|
|
||||||
|
|
||||||
/* note it */
|
/* note it */
|
||||||
Sys_FPrintf( SYS_VRB, "--- SmoothMetaTriangles ---\n" );
|
Sys_FPrintf( SYS_VRB, "--- SmoothMetaTriangles ---\n" );
|
||||||
|
|
@ -1027,33 +1027,18 @@ void SmoothMetaTriangles( void )
|
||||||
and set per-vertex smoothing angle */
|
and set per-vertex smoothing angle */
|
||||||
for( i = 0, tri = &metaTriangles[ i ]; i < numMetaTriangles; i++, tri++ )
|
for( i = 0, tri = &metaTriangles[ i ]; i < numMetaTriangles; i++, tri++ )
|
||||||
{
|
{
|
||||||
/* vortex: try get smoothing from entity key */
|
shadeAngle = defaultShadeAngle;
|
||||||
shadeAngle = FloatForKey(&entities[tri->entityNum], "_shadeangle");
|
|
||||||
if (shadeAngle <= 0.0f)
|
/* get shade angle from shader */
|
||||||
shadeAngle = FloatForKey(&entities[tri->entityNum], "_smoothnormals");
|
if( tri->si->shadeAngleDegrees > 0.0f )
|
||||||
if (shadeAngle <= 0.0f)
|
shadeAngle = DEG2RAD( tri->si->shadeAngleDegrees );
|
||||||
shadeAngle = FloatForKey(&entities[tri->entityNum], "_sn");
|
/* get shade angle from entity */
|
||||||
if (shadeAngle <= 0.0f)
|
else if( tri->shadeAngleDegrees > 0.0f )
|
||||||
shadeAngle = FloatForKey(&entities[tri->entityNum], "_smooth");
|
shadeAngle = DEG2RAD( tri->shadeAngleDegrees );
|
||||||
if (shadeAngle > 0.0f)
|
|
||||||
{
|
if( shadeAngle <= 0.0f )
|
||||||
if (entities[tri->entityNum].forceNormalSmoothing == qfalse)
|
shadeAngle = defaultShadeAngle;
|
||||||
{
|
|
||||||
entities[tri->entityNum].forceNormalSmoothing = qtrue;
|
|
||||||
classname = ValueForKey( &entities[tri->entityNum], "classname" );
|
|
||||||
Sys_Printf( "Entity %d (%s) has vertex normal smoothing with breaking angle of %3.0f\n", tri->entityNum, classname, shadeAngle );
|
|
||||||
}
|
|
||||||
shadeAngle = DEG2RAD( shadeAngle );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get shader for shade angle */
|
|
||||||
if (shadeAngle <= 0.0f)
|
|
||||||
{
|
|
||||||
if( tri->si->shadeAngleDegrees > 0.0f )
|
|
||||||
shadeAngle = DEG2RAD( tri->si->shadeAngleDegrees );
|
|
||||||
else
|
|
||||||
shadeAngle = defaultShadeAngle;
|
|
||||||
}
|
|
||||||
if( shadeAngle > maxShadeAngle )
|
if( shadeAngle > maxShadeAngle )
|
||||||
maxShadeAngle = shadeAngle;
|
maxShadeAngle = shadeAngle;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user