X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=tools%2Fquake3%2Fq3map2%2Flightmaps_ydnar.c;fp=tools%2Fquake3%2Fq3map2%2Flightmaps_ydnar.c;h=19791c4a7118738b539d877e5d2d150c4fc534cd;hp=3db1a7f0f0b4da5682e62473e9896fb38bda91ec;hb=8bc246a01343d9c9dd3a8b678681710cf04a2953;hpb=8b22a94541ec912f1722878eb054dc82ed909e04 diff --git a/tools/quake3/q3map2/lightmaps_ydnar.c b/tools/quake3/q3map2/lightmaps_ydnar.c index 3db1a7f0..19791c4a 100644 --- a/tools/quake3/q3map2/lightmaps_ydnar.c +++ b/tools/quake3/q3map2/lightmaps_ydnar.c @@ -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 */