Working transparency for units! Not really perfect, but much better than before! Even shadows are rendered according to the textures now. The behaviour should be excatly the same as for the trees.

Some unit models which already used transparency might look a bit different with this change, but this change will allow so much better and detailed looking models that its a must have :) .
This commit is contained in:
Titus Tscharntke 2010-09-25 23:03:27 +00:00
parent 3b1ef055b1
commit e6ade03509
2 changed files with 52 additions and 12 deletions

View File

@ -1802,6 +1802,7 @@ void Renderer::renderUnits(const int renderFps, const int worldFrameCount) {
}
else {
glEnable(GL_COLOR_MATERIAL);
glAlphaFunc(GL_GREATER, 0.5f);
}
//render
@ -1884,6 +1885,7 @@ void Renderer::renderUnits(const int renderFps, const int worldFrameCount) {
}
else{
glEnable(GL_COLOR_MATERIAL);
glAlphaFunc(GL_GREATER, 0.5f);
}
//render
@ -1918,7 +1920,8 @@ void Renderer::renderUnits(const int renderFps, const int worldFrameCount) {
//restore
static_cast<ModelRendererGl*>(modelRenderer)->setDuplicateTexCoords(true);
}
// reset alpha
glAlphaFunc(GL_GREATER, 0.0f);
//assert
assertGl();
}
@ -2687,7 +2690,7 @@ void Renderer::renderShadowsToTexture(const int renderFps){
}
//render 3d
renderUnitsFast();
renderUnitsFast(true);
renderObjectsFast();
//read color buffer
@ -2968,7 +2971,7 @@ Vec4f Renderer::computeWaterColor(float waterLevel, float cellHeight) {
// ==================== fast render ====================
//render units for selection purposes
void Renderer::renderUnitsFast() {
void Renderer::renderUnitsFast(bool renderingShadows) {
assert(game != NULL);
const World *world= game->getWorld();
assert(world != NULL);
@ -2987,18 +2990,36 @@ void Renderer::renderUnitsFast() {
if(modelRenderStarted == false) {
modelRenderStarted = true;
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_TEXTURE_2D);
//glPushAttrib(GL_ENABLE_BIT| GL_TEXTURE_BIT);
glDisable(GL_LIGHTING);
modelRenderer->begin(false, false, false);
if (!renderingShadows) {
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_TEXTURE_2D);
} else {
glPushAttrib(GL_ENABLE_BIT| GL_TEXTURE_BIT);
glEnable(GL_TEXTURE_2D);
glAlphaFunc(GL_GREATER, 0.5f);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
//set color to the texture alpha
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
//set alpha to the texture alpha
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
}
modelRenderer->begin(false, renderingShadows, false);
glInitNames();
}
glPushName(visibleUnitIndex);
glMatrixMode(GL_MODELVIEW);
//debuxar modelo
glPushMatrix();
@ -3040,11 +3061,30 @@ void Renderer::renderUnitsFast() {
if(world->toRenderUnit(unit, visibleQuad)) {
if(modelRenderStarted == false) {
modelRenderStarted = true;
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_TEXTURE_2D);
glPushAttrib(GL_ENABLE_BIT| GL_TEXTURE_BIT);
glDisable(GL_LIGHTING);
if (!renderingShadows) {
glDisable(GL_TEXTURE_2D);
} else {
glEnable(GL_TEXTURE_2D);
glAlphaFunc(GL_GREATER, 0.5f);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
//set color to the texture alpha
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
//set alpha to the texture alpha
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
}
modelRenderer->begin(false, renderingShadows, false);
modelRenderer->begin(false, false, false);
glInitNames();
}
if(modelRenderFactionStarted == false) {

View File

@ -393,7 +393,7 @@ private:
//selection render
void renderObjectsFast();
void renderUnitsFast();
void renderUnitsFast(bool renderingShadows = false);
//gl requirements
void checkGlCaps();