Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/renderer/TerrainRenderer.cpp
Show First 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | |||||
#include "tools/atlas/GameInterface/GameLoop.h" | #include "tools/atlas/GameInterface/GameLoop.h" | ||||
extern GameLoopState* g_AtlasGameLoop; | extern GameLoopState* g_AtlasGameLoop; | ||||
/////////////////////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////////////////////// | ||||
// TerrainRenderer implementation | // TerrainRenderer implementation | ||||
namespace | |||||
{ | |||||
CShaderProgramPtr GetDummyShader() | |||||
{ | |||||
const char* shaderName; | |||||
if (g_RenderingOptions.GetRenderPath() == RenderPath::SHADER) | |||||
{ | |||||
if (g_RenderingOptions.GetPreferGLSL()) | |||||
shaderName = "glsl/dummy"; | |||||
else | |||||
shaderName = "arb/dummy"; | |||||
} | |||||
else | |||||
shaderName = "fixed:dummy"; | |||||
return g_Renderer.GetShaderManager().LoadProgram(shaderName, CShaderDefines()); | |||||
} | |||||
} // anonymous namespace | |||||
/** | /** | ||||
* TerrainRenderer keeps track of which phase it is in, to detect | * TerrainRenderer keeps track of which phase it is in, to detect | ||||
* when Submit, PrepareForRendering etc. are called in the wrong order. | * when Submit, PrepareForRendering etc. are called in the wrong order. | ||||
*/ | */ | ||||
enum Phase { | enum Phase { | ||||
Phase_Submit, | Phase_Submit, | ||||
Phase_Render | Phase_Render | ||||
▲ Show 20 Lines • Show All 110 Lines • ▼ Show 20 Lines | |||||
#else | #else | ||||
ENSURE(m->phase == Phase_Render); | ENSURE(m->phase == Phase_Render); | ||||
std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | ||||
std::vector<CDecalRData*>& visibleDecals = m->visibleDecals[cullGroup]; | std::vector<CDecalRData*>& visibleDecals = m->visibleDecals[cullGroup]; | ||||
if (visiblePatches.empty() && visibleDecals.empty()) | if (visiblePatches.empty() && visibleDecals.empty()) | ||||
return; | return; | ||||
CShaderProgramPtr dummyShader = g_Renderer.GetShaderManager().LoadProgram("fixed:dummy", CShaderDefines()); | CShaderProgramPtr dummyShader = GetDummyShader(); | ||||
dummyShader->Bind(); | dummyShader->Bind(); | ||||
// render the solid black sides of the map first | // render the solid black sides of the map first | ||||
g_Renderer.BindTexture(0, 0); | g_Renderer.BindTexture(0, 0); | ||||
glEnableClientState(GL_VERTEX_ARRAY); | glEnableClientState(GL_VERTEX_ARRAY); | ||||
glColor3f(0, 0, 0); | glColor3f(0, 0, 0); | ||||
PROFILE_START("render terrain sides"); | PROFILE_START("render terrain sides"); | ||||
for (size_t i = 0; i < visiblePatches.size(); ++i) | for (size_t i = 0; i < visiblePatches.size(); ++i) | ||||
▲ Show 20 Lines • Show All 201 Lines • ▼ Show 20 Lines | #else | ||||
glDisable(GL_DEPTH_TEST); | glDisable(GL_DEPTH_TEST); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); | ||||
glMatrixMode(GL_TEXTURE); | glMatrixMode(GL_TEXTURE); | ||||
glLoadMatrixf(&textureMatrix._11); | glLoadMatrixf(&textureMatrix._11); | ||||
glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
CShaderProgramPtr dummyShader = g_Renderer.GetShaderManager().LoadProgram("fixed:dummy", CShaderDefines()); | CShaderProgramPtr dummyShader = GetDummyShader(); | ||||
dummyShader->Bind(); | dummyShader->Bind(); | ||||
CPatchRData::RenderStreams(visiblePatches, dummyShader, STREAM_POS|STREAM_POSTOUV0); | CPatchRData::RenderStreams(visiblePatches, dummyShader, STREAM_POS|STREAM_POSTOUV0); | ||||
dummyShader->Unbind(); | dummyShader->Unbind(); | ||||
// To make the overlay visible over water, render an additional map-sized | // To make the overlay visible over water, render an additional map-sized | ||||
// water-height patch | // water-height patch | ||||
CBoundingBoxAligned waterBounds; | CBoundingBoxAligned waterBounds; | ||||
for (size_t i = 0; i < visiblePatches.size(); ++i) | for (size_t i = 0; i < visiblePatches.size(); ++i) | ||||
▲ Show 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | void TerrainRenderer::RenderPatches(int cullGroup) | ||||
std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | ||||
if (visiblePatches.empty()) | if (visiblePatches.empty()) | ||||
return; | return; | ||||
#if CONFIG2_GLES | #if CONFIG2_GLES | ||||
#warning TODO: implement TerrainRenderer::RenderPatches for GLES | #warning TODO: implement TerrainRenderer::RenderPatches for GLES | ||||
#else | #else | ||||
CShaderProgramPtr dummyShader = g_Renderer.GetShaderManager().LoadProgram("fixed:dummy", CShaderDefines()); | CShaderProgramPtr dummyShader = GetDummyShader(); | ||||
dummyShader->Bind(); | dummyShader->Bind(); | ||||
glEnableClientState(GL_VERTEX_ARRAY); | glEnableClientState(GL_VERTEX_ARRAY); | ||||
CPatchRData::RenderStreams(visiblePatches, dummyShader, STREAM_POS); | CPatchRData::RenderStreams(visiblePatches, dummyShader, STREAM_POS); | ||||
glDisableClientState(GL_VERTEX_ARRAY); | glDisableClientState(GL_VERTEX_ARRAY); | ||||
dummyShader->Unbind(); | dummyShader->Unbind(); | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 346 Lines • ▼ Show 20 Lines | #else | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA); | ||||
CShaderProgramPtr dummyShader = g_Renderer.GetShaderManager().LoadProgram("fixed:dummy", CShaderDefines()); | CShaderProgramPtr dummyShader = GetDummyShader(); | ||||
dummyShader->Bind(); | dummyShader->Bind(); | ||||
glEnableClientState(GL_VERTEX_ARRAY); | glEnableClientState(GL_VERTEX_ARRAY); | ||||
std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | ||||
for (size_t i = 0; i < visiblePatches.size(); ++i) | for (size_t i = 0; i < visiblePatches.size(); ++i) | ||||
{ | { | ||||
CPatchRData* data = visiblePatches[i]; | CPatchRData* data = visiblePatches[i]; | ||||
▲ Show 20 Lines • Show All 58 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator