- procedure TQuake3BSP.RenderSurfaceShader(faceIndex, shaderId: integer);
- var shader : TShader;
- i, texId, 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);
- glTexCoordPointer(2, GL_FLOAT, 0, @texCoordBuffer[0]);
- if (shader.Layers[i].UseLightmap) then begin
- if not CG_MultiTexture then begin
- texId := 0;
- end
- else begin
- 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);
- {if LastTexID <> texId then
- begin}
- 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;