1
0
forked from 0ad/0ad

Force fancywater off if fragment shader extensions are not supported. See #270

This was SVN commit r7385.
This commit is contained in:
Ykkrosh 2010-03-21 14:18:15 +00:00
parent 148ff026ca
commit 58e79bfdbe
6 changed files with 25 additions and 5 deletions

View File

@ -330,6 +330,9 @@ static LibError Ogl_Program_reload(Ogl_Program* p, const VfsPath& pathname, Hand
ogl_WarnIfError(); ogl_WarnIfError();
// Check that we're not accidentally using shaders when they're not supported
debug_assert(pglCreateProgramObjectARB != NULL);
p->id = pglCreateProgramObjectARB(); p->id = pglCreateProgramObjectARB();
if (!p->id) if (!p->id)
{ {

View File

@ -432,6 +432,7 @@ void CRenderer::EnumCaps()
m_Caps.m_TextureBorderClamp=false; m_Caps.m_TextureBorderClamp=false;
m_Caps.m_GenerateMipmaps=false; m_Caps.m_GenerateMipmaps=false;
m_Caps.m_VertexShader=false; m_Caps.m_VertexShader=false;
m_Caps.m_FragmentShader=false;
m_Caps.m_DepthTextureShadows = false; m_Caps.m_DepthTextureShadows = false;
m_Caps.m_FramebufferObject = false; m_Caps.m_FramebufferObject = false;
@ -451,6 +452,8 @@ void CRenderer::EnumCaps()
{ {
if (ogl_HaveExtension("GL_ARB_vertex_shader")) if (ogl_HaveExtension("GL_ARB_vertex_shader"))
m_Caps.m_VertexShader=true; m_Caps.m_VertexShader=true;
if (ogl_HaveExtension("GL_ARB_fragment_shader"))
m_Caps.m_FragmentShader=true;
} }
if (0 == ogl_HaveExtensions(0, "GL_ARB_shadow", "GL_ARB_depth_texture", NULL)) { if (0 == ogl_HaveExtensions(0, "GL_ARB_shadow", "GL_ARB_depth_texture", NULL)) {
@ -1054,7 +1057,7 @@ void CRenderer::SetObliqueFrustumClipping(const CVector4D& cp, int sign)
// RenderReflections: render the water reflections to the reflection texture // RenderReflections: render the water reflections to the reflection texture
void CRenderer::RenderReflections() void CRenderer::RenderReflections()
{ {
MICROLOG(L"render reflections"); PROFILE("render reflections");
WaterManager& wm = m->waterManager; WaterManager& wm = m->waterManager;
@ -1130,7 +1133,7 @@ void CRenderer::RenderReflections()
// RenderRefractions: render the water refractions to the refraction texture // RenderRefractions: render the water refractions to the refraction texture
void CRenderer::RenderRefractions() void CRenderer::RenderRefractions()
{ {
MICROLOG(L"render refractions"); PROFILE("render refractions");
WaterManager& wm = m->waterManager; WaterManager& wm = m->waterManager;
@ -1231,7 +1234,7 @@ void CRenderer::RenderSubmissions()
ogl_WarnIfError(); ogl_WarnIfError();
if (m_WaterManager->m_RenderWater && m_Options.m_FancyWater) if (m_WaterManager->m_RenderWater && m_WaterManager->WillRenderFancyWater())
{ {
// render reflected and refracted scenes, then re-clear the screen // render reflected and refracted scenes, then re-clear the screen
RenderReflections(); RenderReflections();

View File

@ -151,6 +151,7 @@ public:
bool m_TextureBorderClamp; bool m_TextureBorderClamp;
bool m_GenerateMipmaps; bool m_GenerateMipmaps;
bool m_VertexShader; bool m_VertexShader;
bool m_FragmentShader;
bool m_DepthTextureShadows; bool m_DepthTextureShadows;
bool m_FramebufferObject; bool m_FramebufferObject;
}; };

View File

@ -413,7 +413,9 @@ void TerrainRenderer::RenderWater()
{ {
PROFILE( "render water" ); PROFILE( "render water" );
bool fancy = g_Renderer.m_Options.m_FancyWater; WaterManager* WaterMgr = g_Renderer.GetWaterManager();
bool fancy = WaterMgr->WillRenderFancyWater();
// If we're using fancy water, make sure its shader is loaded // If we're using fancy water, make sure its shader is loaded
if(fancy && !m->fancyWaterShader) if(fancy && !m->fancyWaterShader)
@ -442,7 +444,6 @@ void TerrainRenderer::RenderWater()
CTerrain* terrain = g_Game->GetWorld()->GetTerrain(); CTerrain* terrain = g_Game->GetWorld()->GetTerrain();
int mapSize = terrain->GetVerticesPerSide(); int mapSize = terrain->GetVerticesPerSide();
CLOSManager* losMgr = g_Game->GetWorld()->GetLOSManager(); CLOSManager* losMgr = g_Game->GetWorld()->GetLOSManager();
WaterManager* WaterMgr = g_Renderer.GetWaterManager();
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

View File

@ -197,3 +197,9 @@ void WaterManager::UnloadWaterTextures()
cur_loading_water_tex = 0; // so they will be reloaded if LoadWaterTextures is called again cur_loading_water_tex = 0; // so they will be reloaded if LoadWaterTextures is called again
cur_loading_normal_map = 0; cur_loading_normal_map = 0;
} }
bool WaterManager::WillRenderFancyWater()
{
return (g_Renderer.GetCapabilities().m_FragmentShader && g_Renderer.GetOptionBool(CRenderer::OPT_FANCYWATER));
}

View File

@ -95,6 +95,12 @@ public:
*/ */
void UnloadWaterTextures(); void UnloadWaterTextures();
/**
* Returns true if fancy water shaders will be used (i.e. the hardware is capable
* and it hasn't been configured off)
*/
bool WillRenderFancyWater();
private: private:
/// State of progressive loading (in # of loaded textures) /// State of progressive loading (in # of loaded textures)
size_t cur_loading_water_tex; size_t cur_loading_water_tex;