]> git.xonotic.org Git - xonotic/netradiant.git/commitdiff
some stuff by 27:
authordivverent <divverent@61c419a2-8eb2-4b30-bcec-8cead039b335>
Tue, 31 Mar 2009 06:28:17 +0000 (06:28 +0000)
committerdivverent <divverent@61c419a2-8eb2-4b30-bcec-8cead039b335>
Tue, 31 Mar 2009 06:28:17 +0000 (06:28 +0000)
- 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

tools/quake3/q3map2/bsp.c
tools/quake3/q3map2/facebsp.c
tools/quake3/q3map2/light.c
tools/quake3/q3map2/lightmaps_ydnar.c
tools/quake3/q3map2/model.c
tools/quake3/q3map2/q3map2.h

index a908809c5f9ed021edac71577d7ec6a5e5cf3192..c04f30d5e407ccebb88ec4e16d2c7bfe31afbaaa 100644 (file)
@@ -888,6 +888,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" );
                else
index 270eefe280014c415b15031a73ed1b331834a0f9..65532a17acea0976a5a7e6ab91d6942b01ae5e05 100644 (file)
@@ -89,7 +89,10 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
        vec3_t          normal;
        float           dist;
        int                     planenum;
-       
+       float       sizeBias;
+
+       //int frontC,backC,splitsC,facingC;
+
        
        /* ydnar: set some defaults */
        *splitPlaneNum = -1; /* leaf */
@@ -118,6 +121,7 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
        bestValue = -99999;
        bestSplit = list;
        
+
        for( split = list; split; split = split->next )
                split->checked = qfalse;
        
@@ -146,15 +150,38 @@ static void SelectSplitPlaneNum( node_t *node, face_t *list, int *splitPlaneNum,
                                back++;
                        }
                }
-               value =  5*facing - 5*splits; // - abs(front-back);
-               if ( plane->type < 3 ) {
-                       value+=5;               // axial is better
+
+               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
                }
-               value += split->priority;               // prioritize hints higher
+               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 ) {
                        bestValue = value;
                        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 )
                return;
        
+       //Sys_FPrintf (SYS_VRB, "F: %d B:%d S:%d FA:%ds\n",frontC,backC,splitsC,facingC );
+
        /* set best split data */
        *splitPlaneNum = bestSplit->planenum;
        *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 );
 
+   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 );
index 79ebf77fe4ea11d62933455e0a5da3549db84edb..9a50d825b3ab15604e3ec8d8256fa54e8296ae3f 100644 (file)
@@ -403,6 +403,7 @@ void CreateEntityLights( void )
 
                intensity = intensity * pointScale;
                light->photons = intensity;
+
                light->type = EMIT_POINT;
                
                /* set falloff threshold */
index 1c994ebf50f037be909c82543b935c063306704d..8ea7aa39b9aa29be29404c7a4229e284b8ef2e02 100644 (file)
@@ -875,6 +875,13 @@ static int CompareSurfaceInfo( const void *a, const void *b )
                return 1;
        else if( aInfo->hasLightmap > bInfo->hasLightmap )
                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 )
index 58fb1849bb0d79723f4254ca5e88ebc2ae873cf9..f6553701295f90d72a57667b9efbff6e665a8b84 100644 (file)
@@ -382,10 +382,20 @@ 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;
-                               dv->color[ j ][ 0 ] = color[ 0 ];
-                               dv->color[ j ][ 1 ] = color[ 1 ];
-                               dv->color[ j ][ 2 ] = color[ 2 ];
-                               dv->color[ j ][ 3 ] = color[ 3 ];
+                               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 ];
+                               }
                        }
                }
                
index b9521a85d3134a3544799021243491caf62903dd..0a6f3f3d5ce21cb355b417dcad923b4db64b36cf 100644 (file)
@@ -806,6 +806,7 @@ typedef struct plane_s
        vec3_t                          normal;
        vec_t                           dist;
        int                                     type;
+       int                 counter;
        int                                     hash_chain;
 }
 plane_t;
@@ -1953,6 +1954,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 */