/* 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 )
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;
/* 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;
/* 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 */
/* get first drawsurface */
num2 = lightSurfaces[ lm->firstLightSurface ];
ds2 = &bspDrawSurfaces[ num2 ];
- info2 = &surfaceInfos[ num2 ];
verts = &yDrawVerts[ ds2->firstVert ];
/* calculate lightmap origin */
/* 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 )
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;
{
/* get info and attempt early out */
num2 = sortSurfaces[ j ];
- ds2 = &bspDrawSurfaces[ num2 ];
info2 = &surfaceInfos[ num2 ];
if( info2->hasLightmap == qfalse || info2->lm != NULL )
continue;
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 */
/* add luxel */
//% VectorSet( luxel2, 255, 0, 255 );
- luxels[ numLuxels++ ] = luxel2;
VectorAdd( average, luxel2, average );
totalColor += luxel2[ 3 ];
}
#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;
/* 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);
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()
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 */
{
/* get output lightmap */
olm = &outLightmaps[ i ];
+
+ /* fill output lightmap */
+ if(lightmapFill)
+ FillOutLightmap(olm);
/* is this a valid bsp lightmap? */
if( olm->lightmapNum >= 0 && !externalLightmaps )
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";
}
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 );