Game Development Community

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!! :)
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);
}

#1
04/09/2003 (8:03 am)
hmmm...get rid of it and use the code I'll be releasing in a few days (hopefully)? :)