Skip to content

Commit

Permalink
Don't overwork when drawing alpha units, features, projectiles when t…
Browse files Browse the repository at this point in the history
…here's no water is observed.

Fixes #1572
  • Loading branch information
lhog committed Jul 16, 2024
1 parent 54d8a38 commit be73aea
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 14 deletions.
4 changes: 2 additions & 2 deletions rts/Rendering/Env/IWater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ void IWater::DrawReflections(const double* clipPlaneEqs, bool drawGround, bool d
// transparent
unitDrawer->DrawAlphaPass(true);
featureDrawer->DrawAlphaPass(true);
projectileDrawer->DrawAlpha(true, true, false);
projectileDrawer->DrawAlpha(CProjectileDrawer::AlphaWaterRenderingStage::ALPHA_WATER_RENDERING_STAGE_ABOVE, true, false);
// sun-disc does not blend well with water
// sky->DrawSun();

Expand Down Expand Up @@ -201,7 +201,7 @@ void IWater::DrawRefractions(const double* clipPlaneEqs, bool drawGround, bool d
// transparent
unitDrawer->DrawAlphaPass(false, true);
featureDrawer->DrawAlphaPass(false, true);
projectileDrawer->DrawAlpha(false, false, true);
projectileDrawer->DrawAlpha(CProjectileDrawer::AlphaWaterRenderingStage::ALPHA_WATER_RENDERING_STAGE_BELOW, false, true);

eventHandler.DrawWorldRefraction();
glDisable(GL_CLIP_PLANE2);
Expand Down
12 changes: 10 additions & 2 deletions rts/Rendering/Env/Particles/ProjectileDrawer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -737,10 +737,16 @@ void CProjectileDrawer::DrawOpaque(bool drawReflection, bool drawRefraction)
glDisable(GL_FOG);
}

void CProjectileDrawer::DrawAlpha(bool drawAboveWater, bool drawReflection, bool drawRefraction)
void CProjectileDrawer::DrawAlpha(AlphaWaterRenderingStage awrs, bool drawReflection, bool drawRefraction)
{
ZoneScopedN("ProjectileDrawer::DrawAlpha");

static constexpr std::array<float, 4> clipPlanes[] {
{ 0.0f, -1.0f, 0.0f, 0.0f},
{ 0.0f, 1.0f, 0.0f, 0.0f},
{ 0.0f, 0.0f, 0.0f, 1.0f}
};

const uint8_t thisPassMask =
(1 - (drawReflection || drawRefraction)) * DrawFlags::SO_ALPHAF_FLAG +
(drawReflection * DrawFlags::SO_REFLEC_FLAG) +
Expand Down Expand Up @@ -817,7 +823,9 @@ void CProjectileDrawer::DrawAlpha(bool drawAboveWater, bool drawReflection, bool

fxShader->Enable();

fxShader->SetUniform("clipPlane", 0.0f, (drawAboveWater ? 1.0f : -1.0f), 0.0f, 0.0f);
const auto& clipPlane = clipPlanes[awrs];

fxShader->SetUniform("clipPlane", clipPlane[0], clipPlane[1], clipPlane[2], clipPlane[3]);
fxShader->SetUniform("alphaCtrl", 0.0f, 1.0f, 0.0f, 0.0f);
if (needSoften) {
fxShader->SetUniform("softenThreshold", CProjectileDrawer::softenThreshold[0]);
Expand Down
8 changes: 7 additions & 1 deletion rts/Rendering/Env/Particles/ProjectileDrawer.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ class LuaTable;


class CProjectileDrawer: public CEventClient {
public:
enum AlphaWaterRenderingStage {
ALPHA_WATER_RENDERING_STAGE_BELOW = 0,
ALPHA_WATER_RENDERING_STAGE_ABOVE = 1,
ALPHA_WATER_RENDERING_STAGE_ALL = 2
};
public:
CProjectileDrawer(): CEventClient("[CProjectileDrawer]", 123456, false), perlinFB(true) {}

Expand All @@ -37,7 +43,7 @@ class CProjectileDrawer: public CEventClient {
void UpdateDrawFlags();

void DrawOpaque(bool drawReflection, bool drawRefraction = false);
void DrawAlpha(bool drawAboveWater, bool drawReflection, bool drawRefraction);
void DrawAlpha(AlphaWaterRenderingStage alphaWaterRenderingStage, bool drawReflection, bool drawRefraction);

void DrawProjectilesMiniMap();

Expand Down
29 changes: 20 additions & 9 deletions rts/Rendering/WorldDrawer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,28 +378,39 @@ void CWorldDrawer::DrawAlphaObjects() const
static const double belowPlaneEq[4] = {0.0f, -1.0f, 0.0f, 0.0f};
static const double abovePlaneEq[4] = {0.0f, 1.0f, 0.0f, 0.0f};

const bool hasWaterRendering = globalRendering->drawWater && readMap->HasVisibleWater();
const auto firstAWRS = hasWaterRendering ?
CProjectileDrawer::AlphaWaterRenderingStage::ALPHA_WATER_RENDERING_STAGE_BELOW :
CProjectileDrawer::AlphaWaterRenderingStage::ALPHA_WATER_RENDERING_STAGE_ALL;

{
SCOPED_TIMER("Draw::World::Models::Alpha");
// clip in model-space
glPushMatrix();
glLoadIdentity();
glClipPlane(GL_CLIP_PLANE3, belowPlaneEq);
glPopMatrix();
glEnable(GL_CLIP_PLANE3);
if (hasWaterRendering) {
glPushMatrix();
glLoadIdentity();
glClipPlane(GL_CLIP_PLANE3, belowPlaneEq);
glPopMatrix();
glEnable(GL_CLIP_PLANE3);
}

// draw alpha-objects below water surface (farthest)
unitDrawer->DrawAlphaPass(false);
featureDrawer->DrawAlphaPass(false);
}
{
SCOPED_TIMER("Draw::World::Projectiles");
projectileDrawer->DrawAlpha(false, false, false);
projectileDrawer->DrawAlpha(firstAWRS, false, false);

glDisable(GL_CLIP_PLANE3);
if (hasWaterRendering)
glDisable(GL_CLIP_PLANE3);
}

if (!hasWaterRendering)
return;

// draw water (in-between)
if (globalRendering->drawWater && !mapRendering->voidWater) {
{
SCOPED_TIMER("Draw::World::Water");

const auto& water = IWater::GetWater();
Expand All @@ -425,7 +436,7 @@ void CWorldDrawer::DrawAlphaObjects() const
}
{
SCOPED_TIMER("Draw::World::Projectiles");
projectileDrawer->DrawAlpha(true, false, false);
projectileDrawer->DrawAlpha(CProjectileDrawer::AlphaWaterRenderingStage::ALPHA_WATER_RENDERING_STAGE_ABOVE, false, false);

glDisable(GL_CLIP_PLANE3);
}
Expand Down

0 comments on commit be73aea

Please sign in to comment.