Skip to content

Commit

Permalink
fix #5851 crash
Browse files Browse the repository at this point in the history
  • Loading branch information
rt committed Dec 5, 2017
1 parent b55d2f9 commit 1de4e81
Showing 1 changed file with 30 additions and 46 deletions.
76 changes: 30 additions & 46 deletions rts/Rendering/Env/DynWater.cpp
Expand Up @@ -45,9 +45,7 @@ CDynWater::CDynWater()
: camPosX(0)
, camPosZ(0)
{
if (!FBO::IsSupported()) {
throw content_error("DynWater Error: missing FBO support");
}
assert(FBO::IsSupported());

lastWaveFrame = 0;
firstDraw = true;
Expand Down Expand Up @@ -94,24 +92,16 @@ CDynWater::CDynWater()
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, 64, 64, 0, GL_RGBA, GL_FLOAT, temp);

CBitmap foam;
if (!foam.Load(waterRendering->foamTexture))
throw content_error("Could not load foam from file " + waterRendering->foamTexture);

if ((count_bits_set(foam.xsize) != 1) || (count_bits_set(foam.ysize) != 1))
throw content_error("Foam texture not power of two!");
// NB: does not accept .dds
if (!foam.LoadGrayscale(waterRendering->foamTexture))
LOG_L(L_WARNING, "[%s] could not load grayscale foam-texture %s\n", __func__, waterRendering->foamTexture.c_str());

unsigned char* scrap = new unsigned char[foam.xsize * foam.ysize * 4];
for (int a = 0; a < (foam.xsize * foam.ysize); ++a) {
scrap[a] = foam.GetRawMem()[a * 4];
}
if ((count_bits_set(foam.xsize) != 1) || (count_bits_set(foam.ysize) != 1))
foam.CreateRescaled(next_power_of_2(foam.xsize), next_power_of_2(foam.ysize));

glGenTextures(1, &foamTex);
glBindTexture(GL_TEXTURE_2D, foamTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glBuildMipmaps(GL_TEXTURE_2D, GL_LUMINANCE, foam.xsize, foam.ysize, GL_LUMINANCE, GL_UNSIGNED_BYTE, scrap);
foamTex = foam.CreateTexture(0.0f, true);

delete[] scrap;

if (ProgramStringIsNative(GL_VERTEX_PROGRAM_ARB, "ARB/waterDyn.vp")) {
waterVP = LoadVertexProgram("ARB/waterDyn.vp");
Expand Down Expand Up @@ -275,6 +265,7 @@ CDynWater::~CDynWater()
glDeleteTextures (1, &hoverShape);
glDeleteTextures (1, &zeroTex);
glDeleteTextures (1, &fixedUpTex);

glSafeDeleteProgram(waterFP);
glSafeDeleteProgram(waterVP);
glSafeDeleteProgram(waveFP);
Expand All @@ -289,6 +280,7 @@ CDynWater::~CDynWater()
glSafeDeleteProgram(dwDetailNormalFP);
glSafeDeleteProgram(dwAddSplashVP);
glSafeDeleteProgram(dwAddSplashFP);

glDeleteFramebuffers(1, &frameBuffer);
}

Expand Down Expand Up @@ -323,16 +315,19 @@ void CDynWater::Draw()
glActiveTexture(GL_TEXTURE0);

glColor4f(1, 1, 1, 0.5f);

glBindProgram(GL_FRAGMENT_PROGRAM_ARB, waterFP);
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glBindProgram(GL_VERTEX_PROGRAM_ARB, waterVP);
glEnable(GL_VERTEX_PROGRAM_ARB);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE * wireFrameMode + GL_FILL * (1 - wireFrameMode));

const float dx = float(globalRendering->viewSizeX) / globalRendering->viewSizeY * camera->GetTanHalfFov();
const float dy = float(globalRendering->viewSizeY) / globalRendering->viewSizeY * camera->GetTanHalfFov();
const float3& L = sky->GetLight()->GetLightDir();


glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 10, 1.0f/(W_SIZE*256), 1.0f/(W_SIZE*256), 0, 0);
glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 11, -camPosX/256.0f + 0.5f, -camPosZ/256.0f + 0.5f, 0, 0);
glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 12, 1.0f/WF_SIZE, 1.0f/WF_SIZE, 0, 0);
Expand All @@ -355,6 +350,7 @@ void CDynWater::Draw()
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 14, 0.5f/dx, 0.5f/dy, 1, 1);
glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 15, refractForward.x, refractForward.y, refractForward.z, 0);


DrawWaterSurface();

glBindTexture(GL_TEXTURE_2D, fixedUpTex);
Expand Down Expand Up @@ -462,7 +458,7 @@ void CDynWater::DrawReflection(CGame* game)
reflectUp = curCam->GetUp();
reflectForward = curCam->GetDir();

DrawReflections(&clipPlaneEqs[0], true, true);
DrawReflections(true, true);
}

CCamera::SetActiveCamera(prvCam->GetCamType());
Expand Down Expand Up @@ -497,7 +493,7 @@ void CDynWater::DrawRefraction(CGame* game)
sunLighting->modelDiffuseColor *= float3(0.5f, 0.7f, 0.9f);
sunLighting->modelAmbientColor *= float3(0.6f, 0.8f, 1.0f);

DrawRefractions(&clipPlaneEqs[0], true, true);
DrawRefractions(true, true);

glViewport(globalRendering->viewPosX, 0, globalRendering->viewSizeX, globalRendering->viewSizeY);
glClearColor(sky->fogColor[0], sky->fogColor[1], sky->fogColor[2], 1);
Expand Down Expand Up @@ -532,7 +528,6 @@ void CDynWater::DrawWaves()
glActiveTexture(GL_TEXTURE0);*/


GLenum status;
float start = 0.1f / 1024;
float end = 1023.9f / 1024;

Expand All @@ -552,10 +547,8 @@ void CDynWater::DrawWaves()

glViewport(0, 0, 1024, 1024);

status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
LOG_L(L_WARNING, "FBO not ready - 2");
}
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
LOG_L(L_WARNING, "[DynWater::%s][1] FBO not ready", __func__);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, waveTex2);
Expand Down Expand Up @@ -595,10 +588,8 @@ void CDynWater::DrawWaves()
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, waveTex2, 0);

status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
LOG_L(L_WARNING, "FBO not ready - 1");
}
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
LOG_L(L_WARNING, "[DynWater::%s][2] FBO not ready", __func__);


glActiveTexture(GL_TEXTURE0);
Expand Down Expand Up @@ -651,10 +642,9 @@ void CDynWater::DrawWaves()
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, waveTex1, 0);

status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
LOG_L(L_WARNING, "FBO not ready - 3");
}
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
LOG_L(L_WARNING, "[DynWater::%s][3] FBO not ready", __func__);


glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, waveNormalFP);
glBindProgramARB(GL_VERTEX_PROGRAM_ARB, waveNormalVP);
Expand Down Expand Up @@ -707,10 +697,8 @@ void CDynWater::DrawHeightTex()

glViewport(0, 0, 256, 256);

const int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
LOG_L(L_WARNING, "FBO not ready - 4");
}
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
LOG_L(L_WARNING, "[DynWater::%s] FBO not ready", __func__);

glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, waveCopyHeightFP);
glEnable(GL_FRAGMENT_PROGRAM_ARB);
Expand Down Expand Up @@ -947,10 +935,8 @@ void CDynWater::DrawDetailNormalTex()

glViewport(0, 0, 256, 256);

const int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
LOG_L(L_WARNING, "FBO not ready - 5");
}
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
LOG_L(L_WARNING, "[DynWater::%s] FBO not ready", __func__);

glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, dwDetailNormalFP);
glEnable(GL_FRAGMENT_PROGRAM_ARB);
Expand Down Expand Up @@ -1011,7 +997,7 @@ void CDynWater::AddShipWakes()
glSpringMatrix2dSetupPV(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
LOG_L(L_WARNING, "FBO not ready - 6");
LOG_L(L_WARNING, "[DynWater::%s] FBO not ready", __func__);

glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, dwAddSplashFP);
glEnable(GL_FRAGMENT_PROGRAM_ARB);
Expand Down Expand Up @@ -1049,9 +1035,8 @@ void CDynWater::AddShipWakes()
{
continue;
}
if (!(unit->losStatus[gu->myAllyTeam] & LOS_INLOS) && !gu->spectatingFullView) {
if (!(unit->losStatus[gu->myAllyTeam] & LOS_INLOS) && !gu->spectatingFullView)
continue;
}

if ((pos.y > -4.0f) && (pos.y < 4.0f)) {
const float3 frontAdd = unit->frontdir * unit->radius * 0.75f;
Expand All @@ -1073,9 +1058,8 @@ void CDynWater::AddShipWakes()
{
continue;
}
if (!(unit->losStatus[gu->myAllyTeam] & LOS_INLOS) && !gu->spectatingFullView) {
if (!(unit->losStatus[gu->myAllyTeam] & LOS_INLOS) && !gu->spectatingFullView)
continue;
}

// skip submarines (which have deep waterlines)
if (unit->IsUnderWater() || !unit->IsInWater())
Expand Down Expand Up @@ -1132,7 +1116,7 @@ void CDynWater::AddExplosions()
glBindTexture(GL_TEXTURE_2D, splashTex);

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
LOG_L(L_WARNING, "FBO not ready - 7");
LOG_L(L_WARNING, "[DynWater::%s][1] FBO not ready", __func__);

glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, dwAddSplashFP);
glEnable(GL_FRAGMENT_PROGRAM_ARB);
Expand Down

0 comments on commit 1de4e81

Please sign in to comment.