static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t vertColor ) { // // rgbGen // switch ( pStage->rgbGen ) { case CGEN_IDENTITY: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 1.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; break; case CGEN_IDENTITY_LIGHTING: baseColor[0] = baseColor[1] = baseColor[2] = tr.identityLight; baseColor[3] = 1.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; break; case CGEN_EXACT_VERTEX: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 0.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 1.0f; break; case CGEN_EXACT_VERTEX_LIT: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 0.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 1.0f; break; case CGEN_CONST: baseColor[0] = pStage->constantColor[0] / 255.0f; baseColor[1] = pStage->constantColor[1] / 255.0f; baseColor[2] = pStage->constantColor[2] / 255.0f; baseColor[3] = pStage->constantColor[3] / 255.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; break; case CGEN_VERTEX: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 0.0f; vertColor[0] = vertColor[1] = vertColor[2] = tr.identityLight; vertColor[3] = 1.0f; break; case CGEN_VERTEX_LIT: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 0.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = tr.identityLight; break; case CGEN_ONE_MINUS_VERTEX: baseColor[0] = baseColor[1] = baseColor[2] = tr.identityLight; baseColor[3] = 1.0f; vertColor[0] = vertColor[1] = vertColor[2] = -tr.identityLight; vertColor[3] = 0.0f; break; case CGEN_FOG: { fog_t *fog; fog = tr.world->fogs + tess.fogNum; baseColor[0] = ((unsigned char *)(&fog->colorInt))[0] / 255.0f; baseColor[1] = ((unsigned char *)(&fog->colorInt))[1] / 255.0f; baseColor[2] = ((unsigned char *)(&fog->colorInt))[2] / 255.0f; baseColor[3] = ((unsigned char *)(&fog->colorInt))[3] / 255.0f; } vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; break; case CGEN_WAVEFORM: baseColor[0] = baseColor[1] = baseColor[2] = RB_CalcWaveColorSingle( &pStage->rgbWave ); baseColor[3] = 1.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; break; case CGEN_ENTITY: if (backEnd.currentEntity) { baseColor[0] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[0] / 255.0f; baseColor[1] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[1] / 255.0f; baseColor[2] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[2] / 255.0f; baseColor[3] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; break; case CGEN_ONE_MINUS_ENTITY: if (backEnd.currentEntity) { baseColor[0] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[0] / 255.0f; baseColor[1] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[1] / 255.0f; baseColor[2] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[2] / 255.0f; baseColor[3] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; break; case CGEN_LIGHTING_DIFFUSE: case CGEN_BAD: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 1.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; break; } // // alphaGen // switch ( pStage->alphaGen ) { case AGEN_SKIP: break; case AGEN_IDENTITY: baseColor[3] = 1.0f; vertColor[3] = 0.0f; break; case AGEN_CONST: baseColor[3] = pStage->constantColor[3] / 255.0f; vertColor[3] = 0.0f; break; case AGEN_WAVEFORM: baseColor[3] = RB_CalcWaveAlphaSingle( &pStage->alphaWave ); vertColor[3] = 0.0f; break; case AGEN_ENTITY: if (backEnd.currentEntity) { baseColor[3] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } vertColor[3] = 0.0f; break; case AGEN_ONE_MINUS_ENTITY: if (backEnd.currentEntity) { baseColor[3] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } vertColor[3] = 0.0f; break; case AGEN_VERTEX: baseColor[3] = 0.0f; vertColor[3] = 1.0f; break; case AGEN_ONE_MINUS_VERTEX: baseColor[3] = 1.0f; vertColor[3] = -1.0f; break; case AGEN_LIGHTING_SPECULAR: case AGEN_PORTAL: case AGEN_FRESNEL: // Done entirely in vertex program baseColor[3] = 1.0f; vertColor[3] = 0.0f; break; } // FIXME: find some way to implement this. #if 0 // if in greyscale rendering mode turn all color values into greyscale. if(r_greyscale->integer) { int scale; for(i = 0; i < tess.numVertexes; i++) { scale = (tess.svars.colors[i][0] + tess.svars.colors[i][1] + tess.svars.colors[i][2]) / 3; tess.svars.colors[i][0] = tess.svars.colors[i][1] = tess.svars.colors[i][2] = scale; } } #endif }
static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t vertColor, int blend ) { qboolean isBlend = ((blend & GLS_SRCBLEND_BITS) == GLS_SRCBLEND_DST_COLOR) || ((blend & GLS_SRCBLEND_BITS) == GLS_SRCBLEND_ONE_MINUS_DST_COLOR) || ((blend & GLS_DSTBLEND_BITS) == GLS_DSTBLEND_SRC_COLOR) || ((blend & GLS_DSTBLEND_BITS) == GLS_DSTBLEND_ONE_MINUS_SRC_COLOR); #if defined(USE_OVERBRIGHT) float exactLight = 1.0f; #else qboolean isWorldDraw = !(backEnd.refdef.rdflags & RDF_NOWORLDMODEL); float exactLight = (isBlend || !isWorldDraw) ? 1.0f : (float)(1 << r_mapOverBrightBits->integer); #endif baseColor[0] = baseColor[1] = baseColor[2] = exactLight; baseColor[3] = 1.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = 0.0f; // // rgbGen // switch ( pStage->rgbGen ) { case CGEN_IDENTITY_LIGHTING: baseColor[0] = baseColor[1] = baseColor[2] = tr.identityLight; break; case CGEN_EXACT_VERTEX: case CGEN_EXACT_VERTEX_LIT: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 0.0f; vertColor[0] = vertColor[1] = vertColor[2] = exactLight; vertColor[3] = 1.0f; break; case CGEN_CONST: baseColor[0] = pStage->constantColor[0] / 255.0f; baseColor[1] = pStage->constantColor[1] / 255.0f; baseColor[2] = pStage->constantColor[2] / 255.0f; baseColor[3] = pStage->constantColor[3] / 255.0f; break; case CGEN_VERTEX: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 0.0f; vertColor[0] = vertColor[1] = vertColor[2] = tr.identityLight; vertColor[3] = 1.0f; break; case CGEN_VERTEX_LIT: baseColor[0] = baseColor[1] = baseColor[2] = baseColor[3] = 0.0f; vertColor[0] = vertColor[1] = vertColor[2] = vertColor[3] = tr.identityLight; break; case CGEN_ONE_MINUS_VERTEX: baseColor[0] = baseColor[1] = baseColor[2] = tr.identityLight; vertColor[0] = vertColor[1] = vertColor[2] = -tr.identityLight; break; case CGEN_FOG: { fog_t *fog; fog = tr.world->fogs + tess.fogNum; baseColor[0] = ((unsigned char *)(&fog->colorInt))[0] / 255.0f; baseColor[1] = ((unsigned char *)(&fog->colorInt))[1] / 255.0f; baseColor[2] = ((unsigned char *)(&fog->colorInt))[2] / 255.0f; baseColor[3] = ((unsigned char *)(&fog->colorInt))[3] / 255.0f; } break; case CGEN_WAVEFORM: baseColor[0] = baseColor[1] = baseColor[2] = RB_CalcWaveColorSingle( &pStage->rgbWave ); break; case CGEN_ENTITY: if (backEnd.currentEntity) { baseColor[0] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[0] / 255.0f; baseColor[1] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[1] / 255.0f; baseColor[2] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[2] / 255.0f; baseColor[3] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } break; case CGEN_ONE_MINUS_ENTITY: if (backEnd.currentEntity) { baseColor[0] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[0] / 255.0f; baseColor[1] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[1] / 255.0f; baseColor[2] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[2] / 255.0f; baseColor[3] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } break; case CGEN_IDENTITY: case CGEN_LIGHTING_DIFFUSE: case CGEN_BAD: break; } // // alphaGen // switch ( pStage->alphaGen ) { case AGEN_SKIP: break; case AGEN_CONST: baseColor[3] = pStage->constantColor[3] / 255.0f; vertColor[3] = 0.0f; break; case AGEN_WAVEFORM: baseColor[3] = RB_CalcWaveAlphaSingle( &pStage->alphaWave ); vertColor[3] = 0.0f; break; case AGEN_ENTITY: if (backEnd.currentEntity) { baseColor[3] = ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } vertColor[3] = 0.0f; break; case AGEN_ONE_MINUS_ENTITY: if (backEnd.currentEntity) { baseColor[3] = 1.0f - ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f; } vertColor[3] = 0.0f; break; case AGEN_VERTEX: baseColor[3] = 0.0f; vertColor[3] = 1.0f; break; case AGEN_ONE_MINUS_VERTEX: baseColor[3] = 1.0f; vertColor[3] = -1.0f; break; case AGEN_IDENTITY: case AGEN_LIGHTING_SPECULAR: case AGEN_PORTAL: // Done entirely in vertex program baseColor[3] = 1.0f; vertColor[3] = 0.0f; break; } // multiply color by overbrightbits if this isn't a blend if (tr.overbrightBits && !isBlend) { float scale = 1 << tr.overbrightBits; baseColor[0] *= scale; baseColor[1] *= scale; baseColor[2] *= scale; vertColor[0] *= scale; vertColor[1] *= scale; vertColor[2] *= scale; } // FIXME: find some way to implement this. #if 0 // if in greyscale rendering mode turn all color values into greyscale. if(r_greyscale->integer) { int scale; for(i = 0; i < tess.numVertexes; i++) { scale = (tess.svars.colors[i][0] + tess.svars.colors[i][1] + tess.svars.colors[i][2]) / 3; tess.svars.colors[i][0] = tess.svars.colors[i][1] = tess.svars.colors[i][2] = scale; } } #endif }