- procedure TQuake3BSP.RenderSurfaceShader(faceIndex, shaderId: integer);
- var shader : TShader;
- i, texId, planeIdx : integer;
- Face : PBSPFace;
- begin
- try
- Face := @Faces[faceIndex];
- shader := ShaderManager[shaderId];
- // culling
- if shader.Cull = GL_NONE then
- glDisable(GL_CULL_FACE)
- else begin
- glEnable(GL_CULL_FACE);
- glCullFace(shader.cull);
- end;
- if multiTexture then begin
- glActiveTexture(GL_TEXTURE1);
- glDisable(GL_TEXTURE_2D);
- glActiveTexture(GL_TEXTURE0);
- end;
- glDisable(GL_TEXTURE_2D);
- glEnable(GL_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glColor3ub(255,255,255);
- // prepare data for global deform operations - but texture coordinates must restored for each layer !!!!!
- for i := 0 to face.numMeshVerts-1 do
- inputBuffer[i] := Vertices[Face.startVertIndex+MeshVertices[face.meshVertIndex+i]];
- SetVertexCoords(shaderId, face.numMeshVerts);
- glVertexPointer(3, GL_FLOAT, sizeof(TBSPVertex), @inputBuffer[0].Position);
- if LockArrays then glLockArraysEXT(0, Face.numMeshVerts);
- if shader.numOfLayers > 0 then begin
- for i := 0 to shader.numOfLayers-1 do begin
- if (ShaderManager[shaderId].Layers[i].numOfrgbGen > 0) or (Face.FaceType = FACE_MESH) then begin
- SetVertexColors(shaderId, i, face.numMeshVerts);
- glColorPointer(4, GL_UNSIGNED_BYTE, 0, @colorBuffer[0]);
- glEnableClientState(GL_COLOR_ARRAY);
- end
- else
- glDisableClientState(GL_COLOR_ARRAY);
- if not pause then
- SetTextureCoordinates(shaderId, i, face.numMeshVerts);
- if multiTexture then
- glClientActiveTexture(GL_TEXTURE0);
- glTexCoordPointer(2, GL_FLOAT, 0, @texCoordBuffer[0]);
- if (shader.Layers[i].UseLightmap) then begin
- if not multiTexture then begin
- texId := 0;
- end
- else begin
- glClientActiveTexture(GL_TEXTURE0);
- glTexCoordPointer(2, GL_FLOAT, sizeof(TBSPVERTEX), @inputBuffer[0].LightmapCoord);
- if (face.lightmapId > -1) and (Lightmaps[face.lightmapID] > -1) then
- texId := Lightmaps[face.lightmapID]
- else
- texId := 0;
- end;
- end
- else begin
- texId := shader.Layers[i].TextureId[shader.Layers[i].curTexture];
- end;
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, texId);
- shaderManager.SetState(shaderId, i );
- glDrawArrays(GL_TRIANGLES, 0, Face.numMeshVerts);
- SetDefaults;
- end;
- end;
- if LockArrays then glUnlockArraysEXT();
- SetDefaults;
- if (numOfEffects > 0) and (Faces[faceIndex].effect > -1) and (not simpleRender) and (GetCvarB('Cg_Fog')) then begin
- //RenderFogFace(faceIndex, Effects[Faces[faceIndex].effect].shaderIndex, BrushSides[Brushes[Effects[Faces[faceIndex].effect].brushIndex].brushside].plane );
- //RenderFog(faceIndex, Effects[Faces[faceIndex].effect].shaderIndex, BrushSides[Effects[Faces[faceIndex].effect].visibleSide].plane);
- if (Effects[Faces[faceIndex].effect].visibleside >= 0) then
- planeIdx := BrushSides[Brushes[Effects[Faces[faceIndex].effect].brushIndex].brushside + Effects[Faces[faceIndex].effect].visibleside].plane
- else
- planeIdx := -1;
- RenderFog(faceIndex, Effects[Faces[faceIndex].effect].shaderIndex, planeIdx);
- SetDefaults;
- end;
- except
- lastError := glGetError();
- lastErrorString := gluErrorString(lastError);
- {$IfDef HELIOS_CONSOLE}
- //if ShowDetails then
- Cons.AddIfDifferent('RenderSurfaceShader ' + lastErrorString + ' ' + IntToStr(faceIndex));
- {$EndIf}
- // if DumpErrors then AddError('RenderSurfaceShader ' + lastErrorString);
- end;
- end;