X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=tools%2Fquake3%2Fq3map2%2Flightmaps_ydnar.c;h=5c5340534e14f60a87c6557327a097f67ca2e375;hb=c30d367a124dfe6342db19817e50964c44f17519;hp=58938880f943328603b785ae94eb4e32bd4c499c;hpb=d539f098644ba0d7c4c025db4612550a41483678;p=xonotic%2Fnetradiant.git diff --git a/tools/quake3/q3map2/lightmaps_ydnar.c b/tools/quake3/q3map2/lightmaps_ydnar.c index 58938880..5c534053 100644 --- a/tools/quake3/q3map2/lightmaps_ydnar.c +++ b/tools/quake3/q3map2/lightmaps_ydnar.c @@ -291,8 +291,8 @@ static int CompareLightSurface( const void *a, const void *b ) /* get shaders */ - asi = surfaceInfos[ *((int*) a) ].si; - bsi = surfaceInfos[ *((int*) b) ].si; + asi = surfaceInfos[ *((const int*) a) ].si; + bsi = surfaceInfos[ *((const int*) b) ].si; /* dummy check */ if( asi == NULL ) @@ -593,10 +593,10 @@ based on AllocateLightmapForSurface() qboolean AddSurfaceToRawLightmap( int num, rawLightmap_t *lm ) { bspDrawSurface_t *ds, *ds2; - surfaceInfo_t *info, *info2; + surfaceInfo_t *info; int num2, n, i, axisNum; float s, t, d, len, sampleSize; - vec3_t mins, maxs, origin, faxis, size, exactSize, delta, normalized, vecs[ 2 ]; + vec3_t mins, maxs, origin, faxis, size, delta, normalized, vecs[ 2 ]; vec4_t plane; bspDrawVert_t *verts; @@ -672,7 +672,6 @@ qboolean AddSurfaceToRawLightmap( int num, rawLightmap_t *lm ) /* round to the lightmap resolution */ for( i = 0; i < 3; i++ ) { - exactSize[ i ] = lm->maxs[ i ] - lm->mins[ i ]; mins[ i ] = sampleSize * floor( lm->mins[ i ] / sampleSize ); maxs[ i ] = sampleSize * ceil( lm->maxs[ i ] / sampleSize ); size[ i ] = (maxs[ i ] - mins[ i ]) / sampleSize + 1.0f; @@ -763,7 +762,6 @@ qboolean AddSurfaceToRawLightmap( int num, rawLightmap_t *lm ) /* get surface */ num2 = lightSurfaces[ lm->firstLightSurface + n ]; ds2 = &bspDrawSurfaces[ num2 ]; - info2 = &surfaceInfos[ num2 ]; verts = &yDrawVerts[ ds2->firstVert ]; /* set the lightmap texture coordinates in yDrawVerts in [0, superSample * lm->customWidth] space */ @@ -786,7 +784,6 @@ qboolean AddSurfaceToRawLightmap( int num, rawLightmap_t *lm ) /* get first drawsurface */ num2 = lightSurfaces[ lm->firstLightSurface ]; ds2 = &bspDrawSurfaces[ num2 ]; - info2 = &surfaceInfos[ num2 ]; verts = &yDrawVerts[ ds2->firstVert ]; /* calculate lightmap origin */ @@ -861,8 +858,8 @@ static int CompareSurfaceInfo( const void *a, const void *b ) /* get surface info */ - aInfo = &surfaceInfos[ *((int*) a) ]; - bInfo = &surfaceInfos[ *((int*) b) ]; + aInfo = &surfaceInfos[ *((const int*) a) ]; + bInfo = &surfaceInfos[ *((const int*) b) ]; /* model first */ if( aInfo->modelindex < bInfo->modelindex ) @@ -940,7 +937,7 @@ void SetupSurfaceLightmaps( void ) int i, j, k, s,num, num2; bspModel_t *model; bspLeaf_t *leaf; - bspDrawSurface_t *ds, *ds2; + bspDrawSurface_t *ds; surfaceInfo_t *info, *info2; rawLightmap_t *lm; qboolean added; @@ -1154,7 +1151,6 @@ void SetupSurfaceLightmaps( void ) { /* get info and attempt early out */ num2 = sortSurfaces[ j ]; - ds2 = &bspDrawSurfaces[ num2 ]; info2 = &surfaceInfos[ num2 ]; if( info2->hasLightmap == qfalse || info2->lm != NULL ) continue; @@ -1215,7 +1211,7 @@ void StitchSurfaceLightmaps( void ) numStitched, numCandidates, numLuxels, f, fOld, start; rawLightmap_t *lm, *a, *b, *c[ MAX_STITCH_CANDIDATES ]; float *luxel, *luxel2, *origin, *origin2, *normal, *normal2, - sampleSize, average[ 3 ], totalColor, ootc, *luxels[ MAX_STITCH_LUXELS ]; + sampleSize, average[ 3 ], totalColor, ootc; /* disabled for now */ @@ -1330,7 +1326,6 @@ void StitchSurfaceLightmaps( void ) /* add luxel */ //% VectorSet( luxel2, 255, 0, 255 ); - luxels[ numLuxels++ ] = luxel2; VectorAdd( average, luxel2, average ); totalColor += luxel2[ 3 ]; } @@ -1921,7 +1916,7 @@ for a given surface lightmap, find output lightmap pages and positions for it #define LIGHTMAP_RESERVE_COUNT 1 static void FindOutLightmaps( rawLightmap_t *lm ) { - int i, j, k, lightmapNum, xMax, yMax, x, y, sx, sy, ox, oy, offset; + int i, j, k, lightmapNum, xMax, yMax, x = -1, y = -1, sx, sy, ox, oy, offset; outLightmap_t *olm; surfaceInfo_t *info; float *luxel, *deluxel; @@ -2193,11 +2188,11 @@ static void FindOutLightmaps( rawLightmap_t *lm ) if( deluxemap ) { /* normalize average light direction */ - pixel = olm->bspDirBytes + (((oy * olm->customWidth) + ox) * 3); - VectorScale( deluxel, 1000.0f, direction ); - VectorNormalize( direction, direction ); - VectorScale( direction, 127.5f, direction ); - for( i = 0; i < 3; i++ ) + pixel = olm->bspDirBytes + (((oy * olm->customWidth) + ox) * 3); + VectorScale( deluxel, 1000.0f, direction ); + VectorNormalize( direction, direction ); + VectorScale( direction, 127.5f, direction ); + for( i = 0; i < 3; i++ ) pixel[ i ] = (byte)( 127.5f + direction[ i ] ); } } @@ -2220,8 +2215,8 @@ static int CompareRawLightmap( const void *a, const void *b ) /* get lightmaps */ - alm = &rawLightmaps[ *((int*) a) ]; - blm = &rawLightmaps[ *((int*) b) ]; + alm = &rawLightmaps[ *((const int*) a) ]; + blm = &rawLightmaps[ *((const int*) b) ]; /* get min number of surfaces */ min = (alm->numLightSurfaces < blm->numLightSurfaces ? alm->numLightSurfaces : blm->numLightSurfaces); @@ -2255,7 +2250,112 @@ static int CompareRawLightmap( const void *a, const void *b ) return 0; } +void FillOutLightmap(outLightmap_t *olm) +{ + int x, y; + int ofs; + vec3_t dir_sum, light_sum; + int cnt, filled; + byte *lightBitsNew = NULL; + byte *lightBytesNew = NULL; + byte *dirBytesNew = NULL; + + lightBitsNew = safe_malloc((olm->customWidth * olm->customHeight + 8) / 8); + lightBytesNew = safe_malloc(olm->customWidth * olm->customHeight * 3); + if(deluxemap) + dirBytesNew = safe_malloc(olm->customWidth * olm->customHeight * 3); + + /* + memset(olm->lightBits, 0, (olm->customWidth * olm->customHeight + 8) / 8); + olm->lightBits[0] |= 1; + olm->lightBits[(10 * olm->customWidth + 30) >> 3] |= 1 << ((10 * olm->customWidth + 30) & 7); + memset(olm->bspLightBytes, 0, olm->customWidth * olm->customHeight * 3); + olm->bspLightBytes[0] = 255; + olm->bspLightBytes[(10 * olm->customWidth + 30) * 3 + 2] = 255; + */ + + memcpy(lightBitsNew, olm->lightBits, (olm->customWidth * olm->customHeight + 8) / 8); + memcpy(lightBytesNew, olm->bspLightBytes, olm->customWidth * olm->customHeight * 3); + if(deluxemap) + memcpy(dirBytesNew, olm->bspDirBytes, olm->customWidth * olm->customHeight * 3); + + for(;;) + { + filled = 0; + for(y = 0; y < olm->customHeight; ++y) + { + for(x = 0; x < olm->customWidth; ++x) + { + ofs = y * olm->customWidth + x; + if(olm->lightBits[ofs >> 3] & (1 << (ofs & 7))) /* already filled */ + continue; + cnt = 0; + VectorClear(dir_sum); + VectorClear(light_sum); + + /* try all four neighbors */ + ofs = ((y + olm->customHeight - 1) % olm->customHeight) * olm->customWidth + x; + if(olm->lightBits[ofs >> 3] & (1 << (ofs & 7))) /* already filled */ + { + ++cnt; + VectorAdd(light_sum, olm->bspLightBytes + ofs * 3, light_sum); + if(deluxemap) + VectorAdd(dir_sum, olm->bspDirBytes + ofs * 3, dir_sum); + } + ofs = ((y + 1) % olm->customHeight) * olm->customWidth + x; + if(olm->lightBits[ofs >> 3] & (1 << (ofs & 7))) /* already filled */ + { + ++cnt; + VectorAdd(light_sum, olm->bspLightBytes + ofs * 3, light_sum); + if(deluxemap) + VectorAdd(dir_sum, olm->bspDirBytes + ofs * 3, dir_sum); + } + + ofs = y * olm->customWidth + (x + olm->customWidth - 1) % olm->customWidth; + if(olm->lightBits[ofs >> 3] & (1 << (ofs & 7))) /* already filled */ + { + ++cnt; + VectorAdd(light_sum, olm->bspLightBytes + ofs * 3, light_sum); + if(deluxemap) + VectorAdd(dir_sum, olm->bspDirBytes + ofs * 3, dir_sum); + } + + ofs = y * olm->customWidth + (x + 1) % olm->customWidth; + if(olm->lightBits[ofs >> 3] & (1 << (ofs & 7))) /* already filled */ + { + ++cnt; + VectorAdd(light_sum, olm->bspLightBytes + ofs * 3, light_sum); + if(deluxemap) + VectorAdd(dir_sum, olm->bspDirBytes + ofs * 3, dir_sum); + } + + if(cnt) + { + ++filled; + ofs = y * olm->customWidth + x; + lightBitsNew[ofs >> 3] |= (1 << (ofs & 7)); + VectorScale(light_sum, 1.0/cnt, lightBytesNew + ofs * 3); + if(deluxemap) + VectorScale(dir_sum, 1.0/cnt, dirBytesNew + ofs * 3); + } + } + } + + if(!filled) + break; + + memcpy(olm->lightBits, lightBitsNew, (olm->customWidth * olm->customHeight + 8) / 8); + memcpy(olm->bspLightBytes, lightBytesNew, olm->customWidth * olm->customHeight * 3); + if(deluxemap) + memcpy(olm->bspDirBytes, dirBytesNew, olm->customWidth * olm->customHeight * 3); + } + + free(lightBitsNew); + free(lightBytesNew); + if(deluxemap) + free(dirBytesNew); +} /* StoreSurfaceLightmaps() @@ -2281,8 +2381,8 @@ void StoreSurfaceLightmaps( void ) char dirname[ 1024 ], filename[ 1024 ]; shaderInfo_t *csi; char lightmapName[ 128 ]; - char *rgbGenValues[ 256 ]; - char *alphaGenValues[ 256 ]; + const char *rgbGenValues[ 256 ]; + const char *alphaGenValues[ 256 ]; /* note it */ @@ -2937,6 +3037,10 @@ void StoreSurfaceLightmaps( void ) { /* get output lightmap */ olm = &outLightmaps[ i ]; + + /* fill output lightmap */ + if(lightmapFill) + FillOutLightmap(olm); /* is this a valid bsp lightmap? */ if( olm->lightmapNum >= 0 && !externalLightmaps ) @@ -3170,7 +3274,7 @@ void StoreSurfaceLightmaps( void ) if( rgbGenValues[ style ] == NULL ) { sprintf( key, "_style%drgbgen", style ); - rgbGenValues[ style ] = (char*) ValueForKey( &entities[ 0 ], key ); + rgbGenValues[ style ] = ValueForKey( &entities[ 0 ], key ); if( rgbGenValues[ style ][ 0 ] == '\0' ) rgbGenValues[ style ] = "wave noise 0.5 1 0 5.37"; } @@ -3184,7 +3288,7 @@ void StoreSurfaceLightmaps( void ) if( alphaGenValues[ style ] == NULL ) { sprintf( key, "_style%dalphagen", style ); - alphaGenValues[ style ] = (char*) ValueForKey( &entities[ 0 ], key ); + alphaGenValues[ style ] = ValueForKey( &entities[ 0 ], key ); } if( alphaGenValues[ style ][ 0 ] != '\0' ) sprintf( alphaGen, "\t\talphaGen %s // style %d\n", alphaGenValues[ style ], style );