Changeset View
Changeset View
Standalone View
Standalone View
source/renderer/WaterManager.cpp
Show First 20 Lines • Show All 161 Lines • ▼ Show 20 Lines | WaterManager::~WaterManager() | ||||
glDeleteTextures(1, &m_depthTT); | glDeleteTextures(1, &m_depthTT); | ||||
glDeleteTextures(1, &m_FancyTextureNormal); | glDeleteTextures(1, &m_FancyTextureNormal); | ||||
glDeleteTextures(1, &m_FancyTextureOther); | glDeleteTextures(1, &m_FancyTextureOther); | ||||
glDeleteTextures(1, &m_FancyTextureDepth); | glDeleteTextures(1, &m_FancyTextureDepth); | ||||
glDeleteTextures(1, &m_ReflFboDepthTexture); | glDeleteTextures(1, &m_ReflFboDepthTexture); | ||||
glDeleteTextures(1, &m_RefrFboDepthTexture); | glDeleteTextures(1, &m_RefrFboDepthTexture); | ||||
pglDeleteFramebuffersEXT(1, &m_FancyEffectsFBO); | glDeleteFramebuffersEXT(1, &m_FancyEffectsFBO); | ||||
pglDeleteFramebuffersEXT(1, &m_RefractionFbo); | glDeleteFramebuffersEXT(1, &m_RefractionFbo); | ||||
pglDeleteFramebuffersEXT(1, &m_ReflectionFbo); | glDeleteFramebuffersEXT(1, &m_ReflectionFbo); | ||||
} | } | ||||
/////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////// | ||||
// Progressive load of water textures | // Progressive load of water textures | ||||
int WaterManager::LoadWaterTextures() | int WaterManager::LoadWaterTextures() | ||||
{ | { | ||||
// TODO: this doesn't need to be progressive-loading any more | // TODO: this doesn't need to be progressive-loading any more | ||||
▲ Show 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | #else | ||||
Resize(); | Resize(); | ||||
// Create the water framebuffers | // Create the water framebuffers | ||||
GLint currentFbo; | GLint currentFbo; | ||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, ¤tFbo); | glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, ¤tFbo); | ||||
m_ReflectionFbo = 0; | m_ReflectionFbo = 0; | ||||
pglGenFramebuffersEXT(1, &m_ReflectionFbo); | glGenFramebuffersEXT(1, &m_ReflectionFbo); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_ReflectionFbo); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_ReflectionFbo); | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_ReflectionTexture, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_ReflectionTexture, 0); | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_ReflFboDepthTexture, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_ReflFboDepthTexture, 0); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); | GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); | ||||
if (status != GL_FRAMEBUFFER_COMPLETE_EXT) | if (status != GL_FRAMEBUFFER_COMPLETE_EXT) | ||||
{ | { | ||||
LOGWARNING("Reflection framebuffer object incomplete: 0x%04X", status); | LOGWARNING("Reflection framebuffer object incomplete: 0x%04X", status); | ||||
g_Renderer.m_Options.m_WaterReflection = false; | g_Renderer.m_Options.m_WaterReflection = false; | ||||
} | } | ||||
m_RefractionFbo = 0; | m_RefractionFbo = 0; | ||||
pglGenFramebuffersEXT(1, &m_RefractionFbo); | glGenFramebuffersEXT(1, &m_RefractionFbo); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_RefractionFbo); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_RefractionFbo); | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_RefractionTexture, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_RefractionTexture, 0); | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_RefrFboDepthTexture, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_RefrFboDepthTexture, 0); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); | status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); | ||||
if (status != GL_FRAMEBUFFER_COMPLETE_EXT) | if (status != GL_FRAMEBUFFER_COMPLETE_EXT) | ||||
{ | { | ||||
LOGWARNING("Refraction framebuffer object incomplete: 0x%04X", status); | LOGWARNING("Refraction framebuffer object incomplete: 0x%04X", status); | ||||
g_Renderer.m_Options.m_WaterRefraction = false; | g_Renderer.m_Options.m_WaterRefraction = false; | ||||
} | } | ||||
pglGenFramebuffersEXT(1, &m_FancyEffectsFBO); | glGenFramebuffersEXT(1, &m_FancyEffectsFBO); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FancyEffectsFBO); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FancyEffectsFBO); | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_FancyTextureNormal, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_FancyTextureNormal, 0); | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_FancyTextureOther, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_FancyTextureOther, 0); | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_FancyTextureDepth, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_FancyTextureDepth, 0); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); | status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); | ||||
if (status != GL_FRAMEBUFFER_COMPLETE_EXT) | if (status != GL_FRAMEBUFFER_COMPLETE_EXT) | ||||
{ | { | ||||
LOGWARNING("Fancy Effects framebuffer object incomplete: 0x%04X", status); | LOGWARNING("Fancy Effects framebuffer object incomplete: 0x%04X", status); | ||||
g_Renderer.m_Options.m_WaterRefraction = false; | g_Renderer.m_Options.m_WaterRefraction = false; | ||||
} | } | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, currentFbo); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, currentFbo); | ||||
// Enable rendering, now that we've succeeded this far | // Enable rendering, now that we've succeeded this far | ||||
m_RenderWater = true; | m_RenderWater = true; | ||||
#endif | #endif | ||||
return 0; | return 0; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | void WaterManager::UnloadWaterTextures() | ||||
if (!g_Renderer.GetCapabilities().m_PrettyWater) | if (!g_Renderer.GetCapabilities().m_PrettyWater) | ||||
return; | return; | ||||
for(size_t i = 0; i < ARRAY_SIZE(m_NormalMap); i++) | for(size_t i = 0; i < ARRAY_SIZE(m_NormalMap); i++) | ||||
m_NormalMap[i].reset(); | m_NormalMap[i].reset(); | ||||
glDeleteTextures(1, &m_ReflectionTexture); | glDeleteTextures(1, &m_ReflectionTexture); | ||||
glDeleteTextures(1, &m_RefractionTexture); | glDeleteTextures(1, &m_RefractionTexture); | ||||
pglDeleteFramebuffersEXT(1, &m_RefractionFbo); | glDeleteFramebuffersEXT(1, &m_RefractionFbo); | ||||
pglDeleteFramebuffersEXT(1, &m_ReflectionFbo); | glDeleteFramebuffersEXT(1, &m_ReflectionFbo); | ||||
} | } | ||||
/////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////// | ||||
// Calculate our binary heightmap from the terrain heightmap. | // Calculate our binary heightmap from the terrain heightmap. | ||||
void WaterManager::RecomputeDistanceHeightmap() | void WaterManager::RecomputeDistanceHeightmap() | ||||
{ | { | ||||
CTerrain* terrain = g_Game->GetWorld()->GetTerrain(); | CTerrain* terrain = g_Game->GetWorld()->GetTerrain(); | ||||
if (!terrain || !terrain->GetHeightMap()) | if (!terrain || !terrain->GetHeightMap()) | ||||
▲ Show 20 Lines • Show All 450 Lines • ▼ Show 20 Lines | |||||
void WaterManager::RenderWaves(const CFrustum& frustrum) | void WaterManager::RenderWaves(const CFrustum& frustrum) | ||||
{ | { | ||||
#if CONFIG2_GLES | #if CONFIG2_GLES | ||||
#warning Fix WaterManager::RenderWaves on GLES | #warning Fix WaterManager::RenderWaves on GLES | ||||
#else | #else | ||||
if (g_Renderer.m_SkipSubmit || !m_WaterFancyEffects) | if (g_Renderer.m_SkipSubmit || !m_WaterFancyEffects) | ||||
return; | return; | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FancyEffectsFBO); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FancyEffectsFBO); | ||||
GLuint attachments[2] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; | GLuint attachments[2] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; | ||||
pglDrawBuffers(2, attachments); | glDrawBuffers(2, attachments); | ||||
glClearColor(0.0f,0.0f, 0.0f,0.0f); | glClearColor(0.0f,0.0f, 0.0f,0.0f); | ||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
glEnable(GL_BLEND); | glEnable(GL_BLEND); | ||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
glEnable(GL_DEPTH_TEST); | glEnable(GL_DEPTH_TEST); | ||||
glDepthFunc(GL_ALWAYS); | glDepthFunc(GL_ALWAYS); | ||||
Show All 17 Lines | for (size_t a = 0; a < m_ShoreWaves.size(); ++a) | ||||
CVertexBuffer::VBChunk* VBchunk = m_ShoreWaves[a]->m_VBvertices; | CVertexBuffer::VBChunk* VBchunk = m_ShoreWaves[a]->m_VBvertices; | ||||
SWavesVertex* base = (SWavesVertex*)VBchunk->m_Owner->Bind(); | SWavesVertex* base = (SWavesVertex*)VBchunk->m_Owner->Bind(); | ||||
// setup data pointers | // setup data pointers | ||||
GLsizei stride = sizeof(SWavesVertex); | GLsizei stride = sizeof(SWavesVertex); | ||||
shad->VertexPointer(3, GL_FLOAT, stride, &base[VBchunk->m_Index].m_BasePosition); | shad->VertexPointer(3, GL_FLOAT, stride, &base[VBchunk->m_Index].m_BasePosition); | ||||
shad->TexCoordPointer(GL_TEXTURE0, 2, GL_UNSIGNED_BYTE, stride, &base[VBchunk->m_Index].m_UV); | shad->TexCoordPointer(GL_TEXTURE0, 2, GL_UNSIGNED_BYTE, stride, &base[VBchunk->m_Index].m_UV); | ||||
// NormalPointer(gl_FLOAT, stride, &base[m_VBWater->m_Index].m_UV) | // NormalPointer(gl_FLOAT, stride, &base[m_VBWater->m_Index].m_UV) | ||||
pglVertexAttribPointerARB(2, 2, GL_FLOAT, GL_TRUE, stride, &base[VBchunk->m_Index].m_PerpVect); // replaces commented above because my normal is vec2 | glVertexAttribPointerARB(2, 2, GL_FLOAT, GL_TRUE, stride, &base[VBchunk->m_Index].m_PerpVect); // replaces commented above because my normal is vec2 | ||||
shad->VertexAttribPointer(str_a_apexPosition, 3, GL_FLOAT, false, stride, &base[VBchunk->m_Index].m_ApexPosition); | shad->VertexAttribPointer(str_a_apexPosition, 3, GL_FLOAT, false, stride, &base[VBchunk->m_Index].m_ApexPosition); | ||||
shad->VertexAttribPointer(str_a_splashPosition, 3, GL_FLOAT, false, stride, &base[VBchunk->m_Index].m_SplashPosition); | shad->VertexAttribPointer(str_a_splashPosition, 3, GL_FLOAT, false, stride, &base[VBchunk->m_Index].m_SplashPosition); | ||||
shad->VertexAttribPointer(str_a_retreatPosition, 3, GL_FLOAT, false, stride, &base[VBchunk->m_Index].m_RetreatPosition); | shad->VertexAttribPointer(str_a_retreatPosition, 3, GL_FLOAT, false, stride, &base[VBchunk->m_Index].m_RetreatPosition); | ||||
shad->AssertPointersBound(); | shad->AssertPointersBound(); | ||||
shad->Uniform(str_translation, m_ShoreWaves[a]->m_TimeDiff); | shad->Uniform(str_translation, m_ShoreWaves[a]->m_TimeDiff); | ||||
shad->Uniform(str_width, (int)m_ShoreWaves[a]->m_Width); | shad->Uniform(str_width, (int)m_ShoreWaves[a]->m_Width); | ||||
u8* indexBase = m_ShoreWaves_VBIndices->m_Owner->Bind(); | u8* indexBase = m_ShoreWaves_VBIndices->m_Owner->Bind(); | ||||
glDrawElements(GL_TRIANGLES, (GLsizei) (m_ShoreWaves[a]->m_Width-1)*(7*6), | glDrawElements(GL_TRIANGLES, (GLsizei) (m_ShoreWaves[a]->m_Width-1)*(7*6), | ||||
GL_UNSIGNED_SHORT, indexBase + sizeof(u16)*(m_ShoreWaves_VBIndices->m_Index)); | GL_UNSIGNED_SHORT, indexBase + sizeof(u16)*(m_ShoreWaves_VBIndices->m_Index)); | ||||
shad->Uniform(str_translation, m_ShoreWaves[a]->m_TimeDiff + 6.0f); | shad->Uniform(str_translation, m_ShoreWaves[a]->m_TimeDiff + 6.0f); | ||||
// TODO: figure out why this doesn't work. | // TODO: figure out why this doesn't work. | ||||
//g_Renderer.m_Stats.m_DrawCalls++; | //g_Renderer.m_Stats.m_DrawCalls++; | ||||
//g_Renderer.m_Stats.m_WaterTris += m_ShoreWaves_VBIndices->m_Count / 3; | //g_Renderer.m_Stats.m_WaterTris += m_ShoreWaves_VBIndices->m_Count / 3; | ||||
CVertexBuffer::Unbind(); | CVertexBuffer::Unbind(); | ||||
} | } | ||||
shad->Unbind(); | shad->Unbind(); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); | ||||
glDisable(GL_BLEND); | glDisable(GL_BLEND); | ||||
glDepthFunc(GL_LEQUAL); | glDepthFunc(GL_LEQUAL); | ||||
#endif | #endif | ||||
} | } | ||||
/////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////// | ||||
// Calculate The blurred normal map to get an idea of where water ought to go. | // Calculate The blurred normal map to get an idea of where water ought to go. | ||||
▲ Show 20 Lines • Show All 207 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator