Day/Night code / interior transparency problem
by Stefan Beffy Moises · in Torque Game Engine · 04/09/2003 (12:13 am) · 1 replies
Hey there,
I just tried to re-add Corvidae's interior trans code to our modified engine with Joshua's TGEDayNight patch applied...
it kinda works, but now I get 100% transparencey (=invisibility :P)
no matter what texture I use... so it seems the blending inside this function doesnt work correctly for the "trans" entities...
does anybody see a problem there and maybe knows how to fix it?
thanks!! :)
I just tried to re-add Corvidae's interior trans code to our modified engine with Joshua's TGEDayNight patch applied...
it kinda works, but now I get 100% transparencey (=invisibility :P)
no matter what texture I use... so it seems the blending inside this function doesnt work correctly for the "trans" entities...
does anybody see a problem there and maybe knows how to fix it?
thanks!! :)
void Interior::renderARB_FC(const bool useAlarmLighting, MaterialList* pMaterials, const LM_HANDLE instanceHandle)
{
U32 i;
Vector<U8>* pLMapIndices = useAlarmLighting ? &mAlarmLMapIndices : &mNormalLMapIndices;
OutputPoint* pFirstOutputPoint = (OutputPoint*)sgRenderBuffer;
U32 currRenderBufferPoint = 0;
U32 currIndexPoint = 0;
bool supportBuffers;
GLint bufferHandle;
OutputPointFC_VB *vertexBuffer = NULL;
// transparency bool
bool trans = false; // Set to 1 if this is trans, so we can reset the blend mode.
U32 numTMU = dglGetMaxTextureUnits();
//setup stuff for 3 TMU here (even if we have 2)...
//with 3 TMU no need to change OpenGL state (other than textures)!!!
//TMU 0
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_ONE, GL_ZERO);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->lmCoord);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->point);
//TMU1
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->lmCoord);
//TMU1 Combiner
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_EXT);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_EXT,GL_ADD);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE0_RGB_EXT,GL_PREVIOUS_EXT);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND0_RGB_EXT,GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE1_RGB_EXT,GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND1_RGB_EXT,GL_SRC_COLOR);
if (numTMU > 2)
{
//use 3 tmu's .. somewhat quickly
glClientActiveTextureARB(GL_TEXTURE2_ARB);
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->texCoord);
}
GLfloat matProp[] = {1.0f,1.0f,1.0f,0.0f};
GLfloat zeroColor[] = {0,0,0,0};
GLfloat tgecolor[4];
tgecolor[0]=tgeDNCurrentColor.x;
tgecolor[1]=tgeDNCurrentColor.y;
tgecolor[2]=tgeDNCurrentColor.z;
tgecolor[3]=0.0f;
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, zeroColor);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,matProp);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,matProp);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,tgecolor);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,zeroColor);
glEnable(GL_LIGHTING);
glNormal3f(0.0,-1.0,0.0);
// Draw the polys!
glColor4f(1, 1, 1, 1);
if (sgFogActive) {
// Need the fog coord pointer enabled here...
glEnableClientState(GL_FOG_COORDINATE_ARRAY_EXT);
glFogCoordPointerEXT(GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->fogCoord);
}
// Ok, our verts are set up, draw our polys.
U32 currentlyBound0 = U32(-1);
U32 currentlyBound1 = U32(-1);
U32 currentlyBound2 = U32(-1);
U32 currentlyBoundlm = U32(-1);
U32 currentTexGen = U32(-1);
U32 glName = U32(-1);
U32 glName2 = U32(-1);
U32 baseName = U32(-1);
U32 lmname = U32(-1);
supportBuffers=false;
/*
if ((supportBuffers = dglDoesSupportVertexBuffer()) == true)
{
bufferHandle = gInteriorLMManager.getVertexBuffer(GL_V12FMTVFMT_EXT);
// guess we ran out of video memory
if (bufferHandle == -1)
supportBuffers = false;
}
*/
bool draw=false;
for (i = 0; i < sgActivePolyListSize; i++) {
const Surface& rSurface = mSurfaces[sgActivePolyList[i]];
if (rSurface.surfaceFlags & SurfaceTrans) trans = true;
// Setup the base texture...
baseName = pMaterials->getMaterial(rSurface.textureIndex).getGLName();
if (baseName != currentlyBound1)
{
draw=true;
}
lmname=(*pLMapIndices)[sgActivePolyList[i]];
if (lmname != currentlyBoundlm)
{
draw=true;
}
if (currRenderBufferPoint + rSurface.windingCount >= 512 ||
currIndexPoint + (rSurface.windingCount - 2) * 3 >= 2048 || draw)
{
if (glName!=-1)
{
if (numTMU>2)
{
//3 TMU how nice and small!
flushPrimitives(sgRenderIndices, currIndexPoint, currRenderBufferPoint);
}
else if (numTMU==2)
{
//draw pass 1
//TMU 0
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_LIGHTING);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,tgecolor);
glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->lmCoord);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->point);
glBindTexture(GL_TEXTURE_2D, currentlyBound0);
//TMU1
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->lmCoord);
//TMU1 Combiner
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_EXT);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_EXT,GL_ADD);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE0_RGB_EXT,GL_PREVIOUS_EXT);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND0_RGB_EXT,GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE1_RGB_EXT,GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND1_RGB_EXT,GL_SRC_COLOR);
glBindTexture(GL_TEXTURE_2D, currentlyBound2);
flushPrimitives(sgRenderIndices, currIndexPoint, currRenderBufferPoint);
//setup pass 2
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_LIGHTING);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,zeroColor);
glDepthFunc(GL_EQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_DST_COLOR,GL_ZERO);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->texCoord);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->point);
glBindTexture(GL_TEXTURE_2D, currentlyBound1);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glActiveTextureARB(GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
flushPrimitives(sgRenderIndices, currIndexPoint, currRenderBufferPoint);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_BLEND);
glDepthFunc(GL_LEQUAL);
}
else
flushPrimitives(sgRenderIndices, currIndexPoint, currRenderBufferPoint);
}
currIndexPoint = 0;
currRenderBufferPoint = 0;
draw=false;
if (lmname!=currentlyBoundlm)
{
glName = gInteriorLMManager.getHandle(mLMHandle, instanceHandle, lmname)->getGLName();
glName2 = gInteriorLMManager.getHandle(mLMHandle, 0, lmname)->getGLName();
currentlyBound0=glName;
currentlyBound2=glName2;
currentlyBoundlm= lmname;
if (numTMU>2)
{
glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, glName);
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, glName2);
}
}
if (baseName!=currentlyBound1)
{
currentlyBound1=baseName;
if (numTMU>2)
{
glActiveTextureARB(GL_TEXTURE2_ARB);
glBindTexture(GL_TEXTURE_2D, baseName);
}
}
}
if (rSurface.texGenIndex != currentTexGen)
{
currentTexGen = rSurface.texGenIndex;
memcpy(texGen0, &mTexGenEQs[rSurface.texGenIndex], sizeof(F32)*8);
}
memcpy(texGen1, &mLMTexGenEQs[sgActivePolyList[i]], sizeof(F32)*8);
if (supportBuffers)
emitPrimitiveFC_VB(&vertexBuffer[currRenderBufferPoint],
&sgRenderIndices[currIndexPoint],
&mWindings[rSurface.windingStart],
rSurface.windingCount,
currRenderBufferPoint,
&mPoints[0]);
else
emitPrimitive(&sgRenderBuffer[currRenderBufferPoint],
&sgRenderIndices[currIndexPoint],
&mWindings[rSurface.windingStart],
rSurface.windingCount,
currRenderBufferPoint,
&mPoints[0]);
currRenderBufferPoint += rSurface.windingCount;
currIndexPoint += (rSurface.windingCount - 2) * 3;
AssertFatal(currRenderBufferPoint < 512 && currIndexPoint < 2048, "Aw, crap.");
}
// enable transparency
// beffy: FIXME - doesnt work as supposed,
// trans entities are 100% transparent instead of translucent
// due to the day/night changes... carp!
if (trans)
{
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.f);
glDepthMask(GL_FALSE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
if (supportBuffers)
{
//if (vertexBuffer)
// glUnlockVertexBufferEXT(bufferHandle);
//flushPrimitivesVB(sgRenderIndices, currIndexPoint, currRenderBufferPoint, bufferHandle);
}
else
{
if (numTMU>2)
{
//3 TMU how nice and small!
flushPrimitives(sgRenderIndices, currIndexPoint, currRenderBufferPoint);
}
else if (numTMU==2)
{
//draw pass 1
//TMU 0
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_LIGHTING);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,tgecolor);
glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->lmCoord);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->point);
glBindTexture(GL_TEXTURE_2D, currentlyBound0);
//TMU1
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->lmCoord);
//TMU1 Combiner
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_EXT);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_EXT,GL_ADD);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE0_RGB_EXT,GL_PREVIOUS_EXT);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND0_RGB_EXT,GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE1_RGB_EXT,GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV,GL_OPERAND1_RGB_EXT,GL_SRC_COLOR);
glBindTexture(GL_TEXTURE_2D, currentlyBound2);
flushPrimitives(sgRenderIndices, currIndexPoint, currRenderBufferPoint);
//setup pass 2
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_LIGHTING);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,zeroColor);
glDepthFunc(GL_EQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_DST_COLOR,GL_ZERO);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->texCoord);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(OutputPoint), &pFirstOutputPoint->point);
glBindTexture(GL_TEXTURE_2D, currentlyBound1);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glActiveTextureARB(GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
flushPrimitives(sgRenderIndices, currIndexPoint, currRenderBufferPoint);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_BLEND);
glDepthFunc(GL_LEQUAL);
}
}
// disable transparency
if (trans)
{
glDepthMask(GL_TRUE);
glDisable(GL_ALPHA_TEST);
glBlendFunc(GL_ONE, GL_ZERO);
glDisable(GL_BLEND);
}
glDisable(GL_LIGHTING);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,zeroColor);
currIndexPoint = 0;
currRenderBufferPoint = 0;
if (sgFogActive)
glDisableClientState(GL_FOG_COORDINATE_ARRAY_EXT);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
//TGEDNSUPPORT
// Base Lightmap
if (numTMU>2)
{
glActiveTextureARB(GL_TEXTURE2_ARB);
glClientActiveTextureARB(GL_TEXTURE2_ARB);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glActiveTextureARB(GL_TEXTURE0_ARB);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
glNormal3f(0.0,0.0,0.0);
glBlendFunc(GL_ONE, GL_ZERO);
//TGEDNSUPPORT
// Render environment maps...
if (smRenderEnvironmentMaps && sgEnvironPolyListSize) {
glDisable(GL_FOG);
currentlyBound1 = -1;
currentlyBound0 = -1;
// Base textures
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// Envmaps textures
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// Misc setup
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(-1,-1);
for (i = 0; i < sgEnvironPolyListSize; i++) {
const Surface& rSurface = mSurfaces[sgEnvironPolyList[i]];
// Setup the base texture...
U32 baseName = mMaterialList->getMaterial(rSurface.textureIndex).getGLName();
if (baseName != currentlyBound0) {
glBindTexture(GL_TEXTURE_2D, baseName);
currentlyBound0 = baseName;
}
// Setup the environment map...
baseName = mEnvironMaps[rSurface.textureIndex]->getGLName();
if (baseName != currentlyBound1) {
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, baseName);
currentlyBound1 = baseName;
glActiveTextureARB(GL_TEXTURE0_ARB);
}
const PlaneF& plane = getPlane(rSurface.planeIndex);
Point3F normal = plane;
if (planeIsFlipped(rSurface.planeIndex))
normal.neg();
// And the colors...
F32 baseLevel = mEnvironFactors[rSurface.textureIndex];
glBegin(GL_TRIANGLE_STRIP);
for (U32 j = rSurface.windingStart; j < rSurface.windingStart + rSurface.windingCount; j++) {
F32 s = mTexGenEQs[rSurface.texGenIndex].planeX.distToPlane(mPoints[mWindings[j]].point);
F32 t = mTexGenEQs[rSurface.texGenIndex].planeY.distToPlane(mPoints[mWindings[j]].point);
Point3F u = mPoints[mWindings[j]].point - sgOSCamPosition;
Point3F r = u;
F32 dot = mDot(normal, u) * 2.0f;
u = normal * dot;
r -= u;
F32 m = 2 * mSqrt(r.x*r.x + r.y*r.y + (r.z+1)*(r.z+1));
glColor4f(1, 1, 1, baseLevel * (1.0 - mPoints[mWindings[j]].fogCoord));
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, s, t);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, r.x/m + 0.5,
r.y/m + 0.5);
glVertex3fv(mPoints[mWindings[j]].point);
}
glEnd();
}
glDisable(GL_POLYGON_OFFSET_FILL);
} // if (environment render on);
glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
glBlendFunc(GL_ONE, GL_ZERO);
}About the author
Torque Owner Chris \"Hobbiticus\" Weiland