Ticket #2667: water-fbo-fixes.diff

File water-fbo-fixes.diff, 19.7 KB (added by historic_bruno, 10 years ago)
  • source/renderer/Renderer.cpp

    diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp
    index 3fd26e0..81d6d18 100644
    a b void CRenderer::EnumCaps()  
    494494    m_Caps.m_VertexShader = false;
    495495    m_Caps.m_FragmentShader = false;
    496496    m_Caps.m_Shadows = false;
     497    m_Caps.m_PrettyWater = false;
    497498
    498499    // now start querying extensions
    499     if (!m_Options.m_NoVBO) {
    500         if (ogl_HaveExtension("GL_ARB_vertex_buffer_object")) {
    501             m_Caps.m_VBO=true;
    502         }
    503     }
     500    if (!m_Options.m_NoVBO && ogl_HaveExtension("GL_ARB_vertex_buffer_object"))
     501        m_Caps.m_VBO = true;
    504502
    505503    if (0 == ogl_HaveExtensions(0, "GL_ARB_vertex_program", "GL_ARB_fragment_program", NULL))
    506504    {
    void CRenderer::EnumCaps()  
    526524            m_Caps.m_Shadows = true;
    527525    }
    528526#endif
     527
     528#if CONFIG2_GLES
     529    m_Caps.m_PrettyWater = true;
     530#else
     531    if (0 == ogl_HaveExtensions(0, "GL_ARB_vertex_shader", "GL_ARB_fragment_shader", "GL_EXT_framebuffer_object", NULL))
     532        m_Caps.m_PrettyWater = true;
     533#endif
    529534}
    530535
    531536void CRenderer::RecomputeSystemShaderDefines()
  • source/renderer/Renderer.h

    diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h
    index af3b16f..dd3d379 100644
    a b public:  
    174174        bool m_VertexShader;
    175175        bool m_FragmentShader;
    176176        bool m_Shadows;
     177        bool m_PrettyWater;
    177178    };
    178179
    179180public:
  • source/renderer/WaterManager.cpp

    diff --git a/source/renderer/WaterManager.cpp b/source/renderer/WaterManager.cpp
    index 19d65e7..7f640df 100644
    a b WaterManager::~WaterManager()  
    147147    SAFE_ARRAY_DELETE(m_BlurredNormalMap);
    148148    SAFE_ARRAY_DELETE(m_WindStrength);
    149149   
    150     glDeleteTextures(1, &m_depthTT);
    151     glDeleteTextures(1, &m_FancyTextureNormal);
    152     glDeleteTextures(1, &m_FancyTextureOther);
    153     glDeleteTextures(1, &m_FancyTextureDepth);
    154     glDeleteTextures(1, &m_ReflFboDepthTexture);
    155     glDeleteTextures(1, &m_RefrFboDepthTexture);
    156    
    157     pglDeleteFramebuffersEXT(1, &m_FancyEffectsFBO);
    158     pglDeleteFramebuffersEXT(1, &m_RefractionFbo);
    159     pglDeleteFramebuffersEXT(1, &m_ReflectionFbo);
     150    if (g_Renderer.GetCapabilities().m_PrettyWater)
     151    {
     152        glDeleteTextures(1, &m_depthTT);
     153        glDeleteTextures(1, &m_FancyTextureNormal);
     154        glDeleteTextures(1, &m_FancyTextureOther);
     155        glDeleteTextures(1, &m_FancyTextureDepth);
     156        glDeleteTextures(1, &m_ReflFboDepthTexture);
     157        glDeleteTextures(1, &m_RefrFboDepthTexture);
     158       
     159        pglDeleteFramebuffersEXT(1, &m_FancyEffectsFBO);
     160        pglDeleteFramebuffersEXT(1, &m_RefractionFbo);
     161        pglDeleteFramebuffersEXT(1, &m_ReflectionFbo);
     162    }
    160163}
    161164
    162165
    int WaterManager::LoadWaterTextures()  
    181184        m_WaterTexture[i] = texture;
    182185    }
    183186
    184     // Load normalmaps (for fancy water)
    185     for (size_t i = 0; i < ARRAY_SIZE(m_NormalMap); ++i)
     187    if (g_Renderer.GetCapabilities().m_PrettyWater)
    186188    {
    187         swprintf_s(pathname, ARRAY_SIZE(pathname), L"art/textures/animated/water/%ls/normal00%02d.png", m_WaterType.c_str(), (int)i+1);
    188         CTextureProperties textureProps(pathname);
    189         textureProps.SetWrap(GL_REPEAT);
    190         textureProps.SetMaxAnisotropy(4);
     189        // Load normalmaps (for fancy water)
     190        for (size_t i = 0; i < ARRAY_SIZE(m_NormalMap); ++i)
     191        {
     192            swprintf_s(pathname, ARRAY_SIZE(pathname), L"art/textures/animated/water/%ls/normal00%02d.png", m_WaterType.c_str(), (int)i+1);
     193            CTextureProperties textureProps(pathname);
     194            textureProps.SetWrap(GL_REPEAT);
     195            textureProps.SetMaxAnisotropy(4);
     196           
     197            CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
     198            texture->Prefetch();
     199            m_NormalMap[i] = texture;
     200        }
    191201       
    192         CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
    193         texture->Prefetch();
    194         m_NormalMap[i] = texture;
    195     }
    196    
    197     // Load CoastalWaves
    198     {
    199         CTextureProperties textureProps(L"art/textures/terrain/types/water/coastalWave.png");
    200         textureProps.SetWrap(GL_REPEAT);
    201         CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
    202         texture->Prefetch();
    203         m_WaveTex = texture;
    204     }
    205    
    206     // Load Foam
    207     {
    208         CTextureProperties textureProps(L"art/textures/terrain/types/water/foam.png");
    209         textureProps.SetWrap(GL_REPEAT);
    210         CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
    211         texture->Prefetch();
    212         m_FoamTex = texture;
    213     }
    214    
    215     m_ReflectionTextureSize = g_Renderer.GetHeight() * 0.66;    // Higher settings give a better result
    216     m_RefractionTextureSize = g_Renderer.GetHeight() * 0.33;    // Lower settings actually sorta look better since it blurs.
    217    
    218     if (round_down_to_pow2(m_ReflectionTextureSize)/m_ReflectionTextureSize < 0.65)
    219         m_ReflectionTextureSize = round_up_to_pow2(m_ReflectionTextureSize);
    220     else
    221         m_ReflectionTextureSize = round_down_to_pow2(m_ReflectionTextureSize);
    222    
    223     if (round_down_to_pow2(m_RefractionTextureSize)/m_RefractionTextureSize < 0.7)
    224         m_RefractionTextureSize = round_up_to_pow2(m_RefractionTextureSize);
    225     else
    226         m_RefractionTextureSize = round_down_to_pow2(m_RefractionTextureSize);
    227    
    228     // Create reflection texture
    229     glGenTextures(1, &m_ReflectionTexture);
    230     glBindTexture(GL_TEXTURE_2D, m_ReflectionTexture);
    231     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    232     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    233     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
    234     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
    235     glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)m_ReflectionTextureSize, (GLsizei)m_ReflectionTextureSize, 0,  GL_RGBA, GL_UNSIGNED_BYTE, 0);
    236    
    237     // Create refraction texture
    238     glGenTextures(1, &m_RefractionTexture);
    239     glBindTexture(GL_TEXTURE_2D, m_RefractionTexture);
    240     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    241     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    242     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
    243     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
    244     glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, (GLsizei)m_RefractionTextureSize, (GLsizei)m_RefractionTextureSize, 0,  GL_RGB, GL_UNSIGNED_BYTE, 0);
    245 
    246     // Create depth textures
    247     glGenTextures(1, &m_ReflFboDepthTexture);
    248     glBindTexture(GL_TEXTURE_2D, m_ReflFboDepthTexture);
    249     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    250     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    251     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    252     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    253     glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, (GLsizei)m_ReflectionTextureSize, (GLsizei)m_ReflectionTextureSize, 0,  GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);
    254    
    255     glGenTextures(1, &m_RefrFboDepthTexture);
    256     glBindTexture(GL_TEXTURE_2D, m_RefrFboDepthTexture);
    257     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    258     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    259     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    260     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    261     glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, (GLsizei)m_RefractionTextureSize, (GLsizei)m_RefractionTextureSize, 0,  GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);
    262 
    263     // Create the Fancy Effects texture
    264     glGenTextures(1, &m_FancyTextureNormal);
    265     glBindTexture(GL_TEXTURE_2D, m_FancyTextureNormal);
    266     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    267     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    268     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    269     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    270     glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)g_Renderer.GetWidth(), (GLsizei)g_Renderer.GetHeight(), 0,  GL_RGBA, GL_UNSIGNED_SHORT, NULL);
    271 
    272     glGenTextures(1, &m_FancyTextureOther);
    273     glBindTexture(GL_TEXTURE_2D, m_FancyTextureOther);
    274     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    275     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    276     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    277     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    278     glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)g_Renderer.GetWidth(), (GLsizei)g_Renderer.GetHeight(), 0,  GL_RGBA, GL_UNSIGNED_SHORT, NULL);
    279 
    280     glGenTextures(1, &m_FancyTextureDepth);
    281     glBindTexture(GL_TEXTURE_2D, m_FancyTextureDepth);
    282     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    283     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    284     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    285     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    286     glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, (GLsizei)g_Renderer.GetWidth(), (GLsizei)g_Renderer.GetHeight(), 0,  GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);
    287    
    288     glBindTexture(GL_TEXTURE_2D, 0);
    289    
    290     // Create the water framebuffers
    291    
    292     GLint currentFbo;
    293     glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &currentFbo);
     202        // Load CoastalWaves
     203        {
     204            CTextureProperties textureProps(L"art/textures/terrain/types/water/coastalWave.png");
     205            textureProps.SetWrap(GL_REPEAT);
     206            CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
     207            texture->Prefetch();
     208            m_WaveTex = texture;
     209        }
     210       
     211        // Load Foam
     212        {
     213            CTextureProperties textureProps(L"art/textures/terrain/types/water/foam.png");
     214            textureProps.SetWrap(GL_REPEAT);
     215            CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
     216            texture->Prefetch();
     217            m_FoamTex = texture;
     218        }
     219       
     220        m_ReflectionTextureSize = g_Renderer.GetHeight() * 0.66;    // Higher settings give a better result
     221        m_RefractionTextureSize = g_Renderer.GetHeight() * 0.33;    // Lower settings actually sorta look better since it blurs.
     222       
     223        if (round_down_to_pow2(m_ReflectionTextureSize)/m_ReflectionTextureSize < 0.65)
     224            m_ReflectionTextureSize = round_up_to_pow2(m_ReflectionTextureSize);
     225        else
     226            m_ReflectionTextureSize = round_down_to_pow2(m_ReflectionTextureSize);
     227       
     228        if (round_down_to_pow2(m_RefractionTextureSize)/m_RefractionTextureSize < 0.7)
     229            m_RefractionTextureSize = round_up_to_pow2(m_RefractionTextureSize);
     230        else
     231            m_RefractionTextureSize = round_down_to_pow2(m_RefractionTextureSize);
     232       
     233        // Create reflection texture
     234        glGenTextures(1, &m_ReflectionTexture);
     235        glBindTexture(GL_TEXTURE_2D, m_ReflectionTexture);
     236        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     237        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     238        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
     239        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
     240        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)m_ReflectionTextureSize, (GLsizei)m_ReflectionTextureSize, 0,  GL_RGBA, GL_UNSIGNED_BYTE, 0);
     241       
     242        // Create refraction texture
     243        glGenTextures(1, &m_RefractionTexture);
     244        glBindTexture(GL_TEXTURE_2D, m_RefractionTexture);
     245        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     246        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     247        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
     248        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
     249        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, (GLsizei)m_RefractionTextureSize, (GLsizei)m_RefractionTextureSize, 0,  GL_RGB, GL_UNSIGNED_BYTE, 0);
     250
     251        // Create depth textures
     252        glGenTextures(1, &m_ReflFboDepthTexture);
     253        glBindTexture(GL_TEXTURE_2D, m_ReflFboDepthTexture);
     254        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     255        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     256        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     257        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     258        glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, (GLsizei)m_ReflectionTextureSize, (GLsizei)m_ReflectionTextureSize, 0,  GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);
     259       
     260        glGenTextures(1, &m_RefrFboDepthTexture);
     261        glBindTexture(GL_TEXTURE_2D, m_RefrFboDepthTexture);
     262        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     263        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     264        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     265        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     266        glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, (GLsizei)m_RefractionTextureSize, (GLsizei)m_RefractionTextureSize, 0,  GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);
     267
     268        // Create the Fancy Effects texture
     269        glGenTextures(1, &m_FancyTextureNormal);
     270        glBindTexture(GL_TEXTURE_2D, m_FancyTextureNormal);
     271        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     272        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     273        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     274        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     275        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)g_Renderer.GetWidth(), (GLsizei)g_Renderer.GetHeight(), 0,  GL_RGBA, GL_UNSIGNED_SHORT, NULL);
     276
     277        glGenTextures(1, &m_FancyTextureOther);
     278        glBindTexture(GL_TEXTURE_2D, m_FancyTextureOther);
     279        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     280        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     281        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     282        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     283        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)g_Renderer.GetWidth(), (GLsizei)g_Renderer.GetHeight(), 0,  GL_RGBA, GL_UNSIGNED_SHORT, NULL);
     284
     285        glGenTextures(1, &m_FancyTextureDepth);
     286        glBindTexture(GL_TEXTURE_2D, m_FancyTextureDepth);
     287        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     288        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     289        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     290        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     291        glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, (GLsizei)g_Renderer.GetWidth(), (GLsizei)g_Renderer.GetHeight(), 0,  GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);
     292       
     293        glBindTexture(GL_TEXTURE_2D, 0);
     294       
     295        // Create the water framebuffers
     296       
     297        GLint currentFbo;
     298        glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &currentFbo);
    294299
    295     m_ReflectionFbo = 0;
    296     pglGenFramebuffersEXT(1, &m_ReflectionFbo);
    297     pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_ReflectionFbo);
    298     pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_ReflectionTexture, 0);
    299     pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_ReflFboDepthTexture, 0);
     300        m_ReflectionFbo = 0;
     301        pglGenFramebuffersEXT(1, &m_ReflectionFbo);
     302        pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_ReflectionFbo);
     303        pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_ReflectionTexture, 0);
     304        pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_ReflFboDepthTexture, 0);
    300305
    301     ogl_WarnIfError();
    302    
    303     GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    304     if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
    305     {
    306         LOGWARNING(L"Reflection framebuffer object incomplete: 0x%04X", status);
    307         g_Renderer.m_Options.m_WaterReflection = false;
    308     }
     306        ogl_WarnIfError();
     307       
     308        GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
     309        if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
     310        {
     311            LOGWARNING(L"Reflection framebuffer object incomplete: 0x%04X", status);
     312            g_Renderer.m_Options.m_WaterReflection = false;
     313        }
    309314
    310     m_RefractionFbo = 0;
    311     pglGenFramebuffersEXT(1, &m_RefractionFbo);
    312     pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_RefractionFbo);
    313     pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_RefractionTexture, 0);
    314     pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_RefrFboDepthTexture, 0);
     315        m_RefractionFbo = 0;
     316        pglGenFramebuffersEXT(1, &m_RefractionFbo);
     317        pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_RefractionFbo);
     318        pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_RefractionTexture, 0);
     319        pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_RefrFboDepthTexture, 0);
    315320
    316     ogl_WarnIfError();
    317    
    318     status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    319     if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
    320     {
    321         LOGWARNING(L"Refraction framebuffer object incomplete: 0x%04X", status);
    322         g_Renderer.m_Options.m_WaterRefraction = false;
    323     }
    324    
    325     pglGenFramebuffersEXT(1, &m_FancyEffectsFBO);
    326     pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FancyEffectsFBO);
    327     pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_FancyTextureNormal, 0);
    328     pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_FancyTextureOther, 0);
    329     pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_FancyTextureDepth, 0);
    330    
    331     ogl_WarnIfError();
    332    
    333     status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    334     if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
    335     {
    336         LOGWARNING(L"Fancy Effects framebuffer object incomplete: 0x%04X", status);
    337         g_Renderer.m_Options.m_WaterRefraction = false;
     321        ogl_WarnIfError();
     322       
     323        status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
     324        if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
     325        {
     326            LOGWARNING(L"Refraction framebuffer object incomplete: 0x%04X", status);
     327            g_Renderer.m_Options.m_WaterRefraction = false;
     328        }
     329       
     330        pglGenFramebuffersEXT(1, &m_FancyEffectsFBO);
     331        pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FancyEffectsFBO);
     332        pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_FancyTextureNormal, 0);
     333        pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_FancyTextureOther, 0);
     334        pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_FancyTextureDepth, 0);
     335       
     336        ogl_WarnIfError();
     337       
     338        status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
     339        if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
     340        {
     341            LOGWARNING(L"Fancy Effects framebuffer object incomplete: 0x%04X", status);
     342            g_Renderer.m_Options.m_WaterRefraction = false;
     343        }
     344       
     345        pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, currentFbo);
    338346    }
    339    
    340     pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, currentFbo);
    341347
    342348    // Enable rendering, now that we've succeeded this far
    343349    m_RenderWater = true;
    int WaterManager::LoadWaterTextures()  
    351357void WaterManager::UnloadWaterTextures()
    352358{
    353359    for(size_t i = 0; i < ARRAY_SIZE(m_WaterTexture); i++)
    354     {
    355360        m_WaterTexture[i].reset();
    356     }
    357361
    358     for(size_t i = 0; i < ARRAY_SIZE(m_NormalMap); i++)
     362    if (g_Renderer.GetCapabilities().m_PrettyWater)
    359363    {
    360         m_NormalMap[i].reset();
     364        for(size_t i = 0; i < ARRAY_SIZE(m_NormalMap); i++)
     365            m_NormalMap[i].reset();
     366
     367        glDeleteTextures(1, &m_ReflectionTexture);
     368        glDeleteTextures(1, &m_RefractionTexture);
     369        pglDeleteFramebuffersEXT(1, &m_RefractionFbo);
     370        pglDeleteFramebuffersEXT(1, &m_ReflectionFbo);
    361371    }
    362     glDeleteTextures(1, &m_ReflectionTexture);
    363     glDeleteTextures(1, &m_RefractionTexture);
    364     pglDeleteFramebuffersEXT(1, &m_RefractionFbo);
    365     pglDeleteFramebuffersEXT(1, &m_ReflectionFbo);
    366372}
    367373
    368374///////////////////////////////////////////////////////////////////
    void WaterManager::UpdateQuality()  
    10671073
    10681074bool WaterManager::WillRenderFancyWater()
    10691075{
    1070     if (!g_Renderer.GetCapabilities().m_FragmentShader)
     1076    if (!g_Renderer.GetCapabilities().m_PrettyWater)
    10711077        return false;
    10721078    if (!m_RenderWater || m_WaterUgly)
    10731079        return false;