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 committed by Thomas Debesse
parent 79605bbc69
commit 23807ef4b3
5 changed files with 61 additions and 10 deletions

View File

@ -842,6 +842,11 @@ int BSPMain( int argc, char **argv ){
Sys_Printf( "Debug portal surfaces enabled\n" );
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" ) ) {
Sys_Printf( "-bsp argument unnecessary\n" );
}

View File

@ -88,7 +88,7 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
vec3_t normal;
float dist;
int planenum;
float sizeBias;
/* ydnar: set some defaults */
*splitPlaneNum = -1; /* leaf */
@ -148,10 +148,29 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
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);
if ( plane->type < 3 ) {
value+=5; // axial is better
}
}
value += split->priority; // prioritize hints higher
if ( value > bestValue ) {
@ -168,6 +187,8 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
/* set best split data */
*splitPlaneNum = bestSplit->planenum;
*compileFlags = bestSplit->compileFlags;
if (*splitPlaneNum>-1) mapplanes[ *splitPlaneNum ].counter++;
}
@ -324,6 +345,11 @@ tree_t *FaceBSP( face_t *list ) {
}
Sys_FPrintf( SYS_VRB, "%9d faces\n", count );
for( i = 0; i < nummapplanes; i++)
{
mapplanes[ i ].counter=0;
}
tree->headnode = AllocNode();
VectorCopy( tree->mins, tree->headnode->mins );
VectorCopy( tree->maxs, tree->headnode->maxs );

View File

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

View File

@ -389,12 +389,22 @@ void InsertModel( char *name, int frame, m4x4_t transform, remap_t *remap, shade
{
dv->lightmap[ j ][ 0 ] = 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 ][ 1 ] = color[ 1 ];
dv->color[ j ][ 2 ] = color[ 2 ];
dv->color[ j ][ 3 ] = color[ 3 ];
}
}
}
/* copy indexes */
indexes = PicoGetSurfaceIndexes( surface, 0 );

View File

@ -801,6 +801,7 @@ typedef struct plane_s
vec3_t normal;
vec_t dist;
int type;
int counter;
struct plane_s *hash_chain;
}
plane_t;
@ -1946,6 +1947,7 @@ Q_EXTERN qboolean nofog Q_ASSIGN( qfalse );
Q_EXTERN qboolean noHint Q_ASSIGN( qfalse ); /* ydnar */
Q_EXTERN qboolean renameModelShaders 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 */