mirror of
https://github.com/Garux/netradiant-custom.git
synced 2026-09-28 00:00:03 +02:00
lightmap allocation speed-up, add -fastallocate
- Allocate large lightmaps first to speed up the allocation process - Add `-fastallocate` option to trade lightmap size against allocation time (useful with hi res lightmaps on large maps: reduce allocation time from days to minutes for only some extra bytes: - If fast allocation, skip lightmap files that are more than 90% complete - If fast allocation, do not test allocation on every pixels, especially for large lightmaps Thanks to Kangz (Corentin Wallez) for his precious help and his kind availability.
This commit is contained in:
@@ -194,6 +194,7 @@ void HelpLight()
|
||||
{"-extravisnudge", "Broken feature to nudge the luxel origin to a better vis cluster"},
|
||||
{"-extrawide", "Deprecated alias for `-super 2 -filter`"},
|
||||
{"-extra", "Deprecated alias for `-super 2`"},
|
||||
{"-fastallocate", "Use `-fastallocate` to trade lightmap size against allocation time (useful with hi res lightmaps on large maps: reduce allocation time from days to minutes for only some extra bytes)"},
|
||||
{"-fastbounce", "Use `-fast` style lighting for radiosity"},
|
||||
{"-faster", "Use a faster falloff curve for lighting; also implies `-fast`"},
|
||||
{"-fastgrid", "Use `-fast` style lighting for the light grid"},
|
||||
|
||||
@@ -1890,7 +1890,7 @@ void SetupGrid( void ){
|
||||
does what it says...
|
||||
*/
|
||||
|
||||
void LightWorld( const char *BSPFilePath ){
|
||||
void LightWorld( const char *BSPFilePath, qboolean fastAllocate ){
|
||||
vec3_t color;
|
||||
float f;
|
||||
int b, bt;
|
||||
@@ -2033,7 +2033,7 @@ void LightWorld( const char *BSPFilePath ){
|
||||
while ( bounce > 0 )
|
||||
{
|
||||
/* store off the bsp between bounces */
|
||||
StoreSurfaceLightmaps();
|
||||
StoreSurfaceLightmaps( fastAllocate );
|
||||
UnparseEntities();
|
||||
Sys_Printf( "Writing %s\n", BSPFilePath );
|
||||
WriteBSPFile( BSPFilePath );
|
||||
@@ -2116,6 +2116,7 @@ int LightMain( int argc, char **argv ){
|
||||
const char *value;
|
||||
int lightmapMergeSize = 0;
|
||||
qboolean lightSamplesInsist = qfalse;
|
||||
qboolean fastAllocate = qfalse;
|
||||
|
||||
|
||||
/* note it */
|
||||
@@ -2636,6 +2637,11 @@ int LightMain( int argc, char **argv ){
|
||||
Sys_Printf( "Faster mode enabled\n" );
|
||||
}
|
||||
|
||||
else if ( !strcmp( argv[ i ], "-fastallocate" ) ) {
|
||||
fastAllocate = qtrue;
|
||||
Sys_Printf( "Fast allocation mode enabled\n" );
|
||||
}
|
||||
|
||||
else if ( !strcmp( argv[ i ], "-fastgrid" ) ) {
|
||||
fastgrid = qtrue;
|
||||
Sys_Printf( "Fast grid lighting enabled\n" );
|
||||
@@ -2984,10 +2990,10 @@ int LightMain( int argc, char **argv ){
|
||||
SetupTraceNodes();
|
||||
|
||||
/* light the world */
|
||||
LightWorld( BSPFilePath );
|
||||
LightWorld( BSPFilePath, fastAllocate );
|
||||
|
||||
/* ydnar: store off lightmaps */
|
||||
StoreSurfaceLightmaps();
|
||||
StoreSurfaceLightmaps( fastAllocate );
|
||||
|
||||
/* write out the bsp */
|
||||
UnparseEntities();
|
||||
|
||||
@@ -1976,7 +1976,7 @@ static void SetupOutLightmap( rawLightmap_t *lm, outLightmap_t *olm ){
|
||||
*/
|
||||
|
||||
#define LIGHTMAP_RESERVE_COUNT 1
|
||||
static void FindOutLightmaps( rawLightmap_t *lm ){
|
||||
static void FindOutLightmaps( rawLightmap_t *lm, qboolean fastAllocate ){
|
||||
int i, j, k, lightmapNum, xMax, yMax, x = -1, y = -1, sx, sy, ox, oy, offset;
|
||||
outLightmap_t *olm;
|
||||
surfaceInfo_t *info;
|
||||
@@ -1984,6 +1984,7 @@ static void FindOutLightmaps( rawLightmap_t *lm ){
|
||||
vec3_t color, direction;
|
||||
byte *pixel;
|
||||
qboolean ok;
|
||||
int xIncrement, yIncrement;
|
||||
|
||||
|
||||
/* set default lightmap number (-3 = LIGHTMAP_BY_VERTEX) */
|
||||
@@ -2094,6 +2095,13 @@ static void FindOutLightmaps( rawLightmap_t *lm ){
|
||||
continue;
|
||||
}
|
||||
|
||||
/* if fast allocation, skip lightmap files that are more than 90% complete */
|
||||
if ( fastAllocate == qtrue ) {
|
||||
if (olm->freeLuxels < (olm->customWidth * olm->customHeight) / 10) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* don't store non-custom raw lightmaps on custom bsp lightmaps */
|
||||
if ( olm->customWidth != lm->customWidth ||
|
||||
olm->customHeight != lm->customHeight ) {
|
||||
@@ -2111,10 +2119,20 @@ static void FindOutLightmaps( rawLightmap_t *lm ){
|
||||
yMax = ( olm->customHeight - lm->h ) + 1;
|
||||
}
|
||||
|
||||
/* if fast allocation, do not test allocation on every pixels, especially for large lightmaps */
|
||||
if ( fastAllocate == qtrue ) {
|
||||
xIncrement = MAX(1, lm->w / 15);
|
||||
yIncrement = MAX(1, lm->h / 15);
|
||||
}
|
||||
else {
|
||||
xIncrement = 1;
|
||||
yIncrement = 1;
|
||||
}
|
||||
|
||||
/* walk the origin around the lightmap */
|
||||
for ( y = 0; y < yMax; y++ )
|
||||
for ( y = 0; y < yMax; y += yIncrement )
|
||||
{
|
||||
for ( x = 0; x < xMax; x++ )
|
||||
for ( x = 0; x < xMax; x += xIncrement )
|
||||
{
|
||||
/* find a fine tract of lauhnd */
|
||||
ok = TestOutLightmapStamp( lm, lightmapNum, olm, x, y );
|
||||
@@ -2292,6 +2310,12 @@ static int CompareRawLightmap( const void *a, const void *b ){
|
||||
/* get min number of surfaces */
|
||||
min = ( alm->numLightSurfaces < blm->numLightSurfaces ? alm->numLightSurfaces : blm->numLightSurfaces );
|
||||
|
||||
/* compare size, allocate bigger first */
|
||||
diff = ( blm->w * blm->h ) - ( alm->w * alm->h );
|
||||
if ( diff != 0 ) {
|
||||
return diff;
|
||||
}
|
||||
|
||||
/* iterate */
|
||||
for ( i = 0; i < min; i++ )
|
||||
{
|
||||
@@ -2314,12 +2338,6 @@ static int CompareRawLightmap( const void *a, const void *b ){
|
||||
return diff;
|
||||
}
|
||||
|
||||
/* compare size */
|
||||
diff = ( blm->w * blm->h ) - ( alm->w * alm->h );
|
||||
if ( diff != 0 ) {
|
||||
return diff;
|
||||
}
|
||||
|
||||
/* must be equivalent */
|
||||
return 0;
|
||||
}
|
||||
@@ -2441,7 +2459,7 @@ void FillOutLightmap( outLightmap_t *olm ){
|
||||
stores the surface lightmaps into the bsp as byte rgb triplets
|
||||
*/
|
||||
|
||||
void StoreSurfaceLightmaps( void ){
|
||||
void StoreSurfaceLightmaps( qboolean fastAllocate ){
|
||||
int i, j, k, x, y, lx, ly, sx, sy, *cluster, mappedSamples;
|
||||
int style, size, lightmapNum, lightmapNum2;
|
||||
float *normal, *luxel, *bspLuxel, *bspLuxel2, *radLuxel, samples, occludedSamples;
|
||||
@@ -3059,7 +3077,7 @@ void StoreSurfaceLightmaps( void ){
|
||||
for ( i = 0; i < numRawLightmaps; i++ )
|
||||
{
|
||||
lm = &rawLightmaps[ sortLightmaps[ i ] ];
|
||||
FindOutLightmaps( lm );
|
||||
FindOutLightmaps( lm, fastAllocate );
|
||||
}
|
||||
|
||||
/* set output numbers in twinned lightmaps */
|
||||
|
||||
@@ -1848,7 +1848,7 @@ int ImportLightmapsMain( int argc, char **argv );
|
||||
|
||||
void SetupSurfaceLightmaps( void );
|
||||
void StitchSurfaceLightmaps( void );
|
||||
void StoreSurfaceLightmaps( void );
|
||||
void StoreSurfaceLightmaps( qboolean fastAllocate );
|
||||
|
||||
|
||||
/* image.c */
|
||||
|
||||
Reference in New Issue
Block a user