procedure TQuake3BSP.RenderSurfaceShader(faceIndex, shaderId: integer);
var shader : TShader;
i, texId,lmId, planeIdx : integer;
Face : PBSPFace;
const
multi = true;
begin
try
Face := @Faces[faceIndex];
shader := ShaderManager[ShaderId];
If shader.Name = 'textures\terrain\mxterra10_0' then
begin
{$IfDef HELIOS_CONSOLE}
cons.AddIfDifferent('Aborting RenderSurfaceShader: probmatic texture <textures\terrain\mxterra10_0>');
{$EndIf}
exit;
end;
// culling
if shader.Cull = GL_NONE then
glDisable(GL_CULL_FACE)
else begin
glEnable(GL_CULL_FACE);
glCullFace(shader.cull);
end;
//glDisable(GL_TEXTURE_2D);
// prepare data for global deform operations - but texture coordinates must restored for each layer !!!!!
{ If shaderID = 30 then
ShowMessage(inttostr(face.numMeshVerts));
}
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
glColor3f(1,1,1)};
SetTextureCoordinates(shaderId, i, face.numMeshVerts);
if (shader.Layers[i].UseLightmap) then begin
if not CG_MultiTexture then begin
lmId := 0;
end
else
if (face.lightmapId > -1) and (Lightmaps[face.lightmapID] > -1) then
begin
glActiveTexture(GL_TEXTURE1);
glTexCoordPointer(2, GL_FLOAT, sizeof(TBSPVERTEX), @inputBuffer[0].LightmapCoord);
glActiveTexture(GL_TEXTURE0);
lmId := Lightmaps[face.lightmapID]
end
else
lmId := 0;
end;{
else begin}
texId := shader.Layers[i].TextureId[shader.Layers[i].curTexture];
// end;
glActiveTexture(GL_TEXTURE0);
glTexCoordPointer(2, GL_FLOAT, 0, @texCoordBuffer[0]);
// glEnable(GL_TEXTURE_2D);
{if LastTexID <> texId then
begin}
// glBindTexture(GL_TEXTURE_2D, texId);
glActiveTexture(GL_TEXTURE1);
if lmId > 0 then begin
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Lightmaps[lmId]);
end
else begin
glDisable(GL_TEXTURE_2D);
end;
glActiveTexture(GL_TEXTURE0);
//glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texId);
texId := LastTexID;
{end
else
Inc(SavedBindCalls);}
shaderManager.SetState(shaderId, i );
// glDisable(GL_Blend);
glDrawArrays(GL_TRIANGLES, 0, Face.numMeshVerts);
if (ShaderManager[shaderId].Layers[i].numOfrgbGen > 0) or (Face.FaceType = FACE_MESH) then
begin
glDisableClientState(GL_COLOR_ARRAY);
glColor3f(1,1,1);
end;
end;
end;
if LockArrays then glUnlockArraysEXT();
SetDefaults;
if (numOfEffects > 0) and (Faces[faceIndex].effect > -1) and (not CG_SimpleRender) and (CG_Fog) then begin
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;
if CG_MultiTexture then begin
glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
end;
end;
// Cons.AddIfDifferent(inttostr(shaderid));
LastShader := ShaderId;
except
lastError := glGetError();
lastErrorString := gluErrorString(lastError);
{$IfDef HELIOS_CONSOLE}Cons.AddIfDifferent('RenderSurfaceShader Error: ' + lastErrorString + ' Face:' + IntToStr(faceIndex) + ' Shader: ' + shader.Name + ' ShaderID: ' + inttostr(ShaderId) + ' LastShader: ' + ShaderManager[LastShader].Name); {$EndIf}
end;
end;