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();
// Check that we're not accidentally using shaders when they're not supported
debug_assert(pglCreateProgramObjectARB != NULL);
p->id = pglCreateProgramObjectARB();
if (!p->id)
{

View File

@ -432,6 +432,7 @@ void CRenderer::EnumCaps()
m_Caps.m_TextureBorderClamp=false;
m_Caps.m_GenerateMipmaps=false;
m_Caps.m_VertexShader=false;
m_Caps.m_FragmentShader=false;
m_Caps.m_DepthTextureShadows = false;
m_Caps.m_FramebufferObject = false;
@ -451,6 +452,8 @@ void CRenderer::EnumCaps()
{
if (ogl_HaveExtension("GL_ARB_vertex_shader"))
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)) {
@ -1054,7 +1057,7 @@ void CRenderer::SetObliqueFrustumClipping(const CVector4D& cp, int sign)
// RenderReflections: render the water reflections to the reflection texture
void CRenderer::RenderReflections()
{
MICROLOG(L"render reflections");
PROFILE("render reflections");
WaterManager& wm = m->waterManager;
@ -1130,7 +1133,7 @@ void CRenderer::RenderReflections()
// RenderRefractions: render the water refractions to the refraction texture
void CRenderer::RenderRefractions()
{
MICROLOG(L"render refractions");
PROFILE("render refractions");
WaterManager& wm = m->waterManager;
@ -1231,7 +1234,7 @@ void CRenderer::RenderSubmissions()
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
RenderReflections();

View File

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

View File

@ -413,7 +413,9 @@ void TerrainRenderer::RenderWater()
{
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(fancy && !m->fancyWaterShader)
@ -442,7 +444,6 @@ void TerrainRenderer::RenderWater()
CTerrain* terrain = g_Game->GetWorld()->GetTerrain();
int mapSize = terrain->GetVerticesPerSide();
CLOSManager* losMgr = g_Game->GetWorld()->GetLOSManager();
WaterManager* WaterMgr = g_Renderer.GetWaterManager();
glEnable(GL_BLEND);
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_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();
/**
* 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:
/// State of progressive loading (in # of loaded textures)
size_t cur_loading_water_tex;