some stuff by 27:

- better BSP tree splitting (experimental, option -altsplit)
- also compare shaders when sorting surfaces (should give slightly more fps)
- misc_model spawnflag 32: set vertex alpha from vertex color (for terrain blending)


git-svn-id: svn://svn.icculus.org/netradiant/trunk@240 61c419a2-8eb2-4b30-bcec-8cead039b335
This commit is contained in:
divverent 2009-03-31 06:28:17 +00:00
parent 2f675b648f
commit 889347e958
6 changed files with 70 additions and 9 deletions

View File

@ -888,6 +888,11 @@ int BSPMain( int argc, char **argv )
Sys_Printf( "Debug portal surfaces enabled\n" ); Sys_Printf( "Debug portal surfaces enabled\n" );
debugPortals = qtrue; debugPortals = qtrue;
} }
else if( !strcmp( argv[ i ], "-altsplit" ) )
{
Sys_Printf( "Alternate BSP splitting (by 27) enabled\n" );
bspAlternateSplitWeights = qtrue;
}
else if( !strcmp( argv[ i ], "-bsp" ) ) else if( !strcmp( argv[ i ], "-bsp" ) )
Sys_Printf( "-bsp argument unnecessary\n" ); Sys_Printf( "-bsp argument unnecessary\n" );
else else

View File

@ -89,6 +89,9 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
vec3_t normal; vec3_t normal;
float dist; float dist;
int planenum; int planenum;
float sizeBias;
//int frontC,backC,splitsC,facingC;
/* ydnar: set some defaults */ /* ydnar: set some defaults */
@ -118,6 +121,7 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
bestValue = -99999; bestValue = -99999;
bestSplit = list; bestSplit = list;
for( split = list; split; split = split->next ) for( split = list; split; split = split->next )
split->checked = qfalse; split->checked = qfalse;
@ -146,15 +150,38 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
back++; back++;
} }
} }
if(bspAlternateSplitWeights)
{
// from 27
//Bigger is better
sizeBias=WindingArea(split->w);
//Base score = 20000 perfectly balanced
value = 20000-(abs(front-back));
value -= plane->counter;// If we've already used this plane sometime in the past try not to use it again
value -= facing ; // if we're going to have alot of other surfs use this plane, we want to get it in quickly.
value -= splits*5; //more splits = bad
value += sizeBias*10; //We want a huge score bias based on plane size
}
else
{
value = 5*facing - 5*splits; // - abs(front-back); value = 5*facing - 5*splits; // - abs(front-back);
if ( plane->type < 3 ) { if ( plane->type < 3 ) {
value+=5; // axial is better value+=5; // axial is better
} }
}
value += split->priority; // prioritize hints higher value += split->priority; // prioritize hints higher
if ( value > bestValue ) { if ( value > bestValue ) {
bestValue = value; bestValue = value;
bestSplit = split; bestSplit = split;
//frontC=front;
//backC=back;
//splitsC=splits;
//facingC=facing;
} }
} }
@ -162,9 +189,13 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
if( bestValue == -99999 ) if( bestValue == -99999 )
return; return;
//Sys_FPrintf (SYS_VRB, "F: %d B:%d S:%d FA:%ds\n",frontC,backC,splitsC,facingC );
/* set best split data */ /* set best split data */
*splitPlaneNum = bestSplit->planenum; *splitPlaneNum = bestSplit->planenum;
*compileFlags = bestSplit->compileFlags; *compileFlags = bestSplit->compileFlags;
if (*splitPlaneNum>-1) mapplanes[ *splitPlaneNum ].counter++;
} }
@ -324,6 +355,11 @@ tree_t *FaceBSP( face_t *list ) {
} }
Sys_FPrintf( SYS_VRB, "%9d faces\n", count ); Sys_FPrintf( SYS_VRB, "%9d faces\n", count );
for( i = 0; i < nummapplanes; i++)
{
mapplanes[ i ].counter=0;
}
tree->headnode = AllocNode(); tree->headnode = AllocNode();
VectorCopy( tree->mins, tree->headnode->mins ); VectorCopy( tree->mins, tree->headnode->mins );
VectorCopy( tree->maxs, tree->headnode->maxs ); VectorCopy( tree->maxs, tree->headnode->maxs );

View File

@ -403,6 +403,7 @@ void CreateEntityLights( void )
intensity = intensity * pointScale; intensity = intensity * pointScale;
light->photons = intensity; light->photons = intensity;
light->type = EMIT_POINT; light->type = EMIT_POINT;
/* set falloff threshold */ /* set falloff threshold */

View File

@ -876,6 +876,13 @@ static int CompareSurfaceInfo( const void *a, const void *b )
else if( aInfo->hasLightmap > bInfo->hasLightmap ) else if( aInfo->hasLightmap > bInfo->hasLightmap )
return -1; return -1;
/* 27: then shader! */
if (aInfo->si < bInfo->si)
return 1;
else if (aInfo->si > bInfo->si)
return -1;
/* then lightmap sample size */ /* then lightmap sample size */
if( aInfo->sampleSize < bInfo->sampleSize ) if( aInfo->sampleSize < bInfo->sampleSize )
return 1; return 1;

View File

@ -382,12 +382,22 @@ void InsertModel( char *name, int frame, m4x4_t transform, remap_t *remap, shade
{ {
dv->lightmap[ j ][ 0 ] = 0.0f; dv->lightmap[ j ][ 0 ] = 0.0f;
dv->lightmap[ j ][ 1 ] = 0.0f; dv->lightmap[ j ][ 1 ] = 0.0f;
if(spawnFlags & 32) // spawnflag 32: model color -> alpha hack
{
dv->color[ j ][ 0 ] = 255.0f;
dv->color[ j ][ 1 ] = 255.0f;
dv->color[ j ][ 2 ] = 255.0f;
dv->color[ j ][ 3 ] = color[ 0 ] * 0.3f + color[ 1 ] * 0.59f + color[ 2 ] * 0.11f;
}
else
{
dv->color[ j ][ 0 ] = color[ 0 ]; dv->color[ j ][ 0 ] = color[ 0 ];
dv->color[ j ][ 1 ] = color[ 1 ]; dv->color[ j ][ 1 ] = color[ 1 ];
dv->color[ j ][ 2 ] = color[ 2 ]; dv->color[ j ][ 2 ] = color[ 2 ];
dv->color[ j ][ 3 ] = color[ 3 ]; dv->color[ j ][ 3 ] = color[ 3 ];
} }
} }
}
/* copy indexes */ /* copy indexes */
indexes = PicoGetSurfaceIndexes( surface, 0 ); indexes = PicoGetSurfaceIndexes( surface, 0 );

View File

@ -806,6 +806,7 @@ typedef struct plane_s
vec3_t normal; vec3_t normal;
vec_t dist; vec_t dist;
int type; int type;
int counter;
int hash_chain; int hash_chain;
} }
plane_t; plane_t;
@ -1953,6 +1954,7 @@ Q_EXTERN qboolean nofog Q_ASSIGN( qfalse );
Q_EXTERN qboolean noHint Q_ASSIGN( qfalse ); /* ydnar */ Q_EXTERN qboolean noHint Q_ASSIGN( qfalse ); /* ydnar */
Q_EXTERN qboolean renameModelShaders Q_ASSIGN( qfalse ); /* ydnar */ Q_EXTERN qboolean renameModelShaders Q_ASSIGN( qfalse ); /* ydnar */
Q_EXTERN qboolean skyFixHack Q_ASSIGN( qfalse ); /* ydnar */ Q_EXTERN qboolean skyFixHack Q_ASSIGN( qfalse ); /* ydnar */
Q_EXTERN qboolean bspAlternateSplitWeights Q_ASSIGN( qfalse ); /* 27 */
Q_EXTERN int patchSubdivisions Q_ASSIGN( 8 ); /* ydnar: -patchmeta subdivisions */ Q_EXTERN int patchSubdivisions Q_ASSIGN( 8 ); /* ydnar: -patchmeta subdivisions */