Add state tracking for depth
parent
e2bbd838a5
commit
41f6b95c72
|
@ -260,14 +260,14 @@ ArrowReferenceMark::render(Renderer* renderer,
|
|||
if (opacity == 1.0f)
|
||||
{
|
||||
// Enable depth buffering
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_TRUE);
|
||||
renderer->enableDepthTest();
|
||||
renderer->enableDepthMask();
|
||||
renderer->disableBlending();
|
||||
}
|
||||
else
|
||||
{
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->enableDepthTest();
|
||||
renderer->disableDepthMask();
|
||||
renderer->enableBlending();
|
||||
#ifdef USE_HDR
|
||||
renderer->setBlendingFactors(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
|
||||
|
@ -292,8 +292,8 @@ ArrowReferenceMark::render(Renderer* renderer,
|
|||
RenderArrow(vo);
|
||||
|
||||
glUseProgram(0);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->disableDepthTest();
|
||||
renderer->disableDepthMask();
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
|
||||
}
|
||||
|
@ -344,14 +344,14 @@ AxesReferenceMark::render(Renderer* renderer,
|
|||
if (opacity == 1.0f)
|
||||
{
|
||||
// Enable depth buffering
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_TRUE);
|
||||
renderer->enableDepthTest();
|
||||
renderer->enableDepthMask();
|
||||
renderer->disableBlending();
|
||||
}
|
||||
else
|
||||
{
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->enableDepthTest();
|
||||
renderer->disableDepthMask();
|
||||
renderer->enableBlending();
|
||||
#ifdef USE_HDR
|
||||
renderer->setBlendingFactors(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
|
||||
|
@ -420,8 +420,8 @@ AxesReferenceMark::render(Renderer* renderer,
|
|||
RenderZ(vo);
|
||||
|
||||
glUseProgram(0);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->disableDepthTest();
|
||||
renderer->disableDepthMask();
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
|
||||
}
|
||||
|
|
|
@ -335,7 +335,7 @@ void Renderer::renderSelectionPointer(const Observer& observer,
|
|||
#ifdef USE_HDR
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
|
||||
#endif
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
disableDepthTest();
|
||||
enableBlending();
|
||||
setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
|
|
|
@ -120,8 +120,8 @@ PlanetographicGrid::render(Renderer* renderer,
|
|||
Vector3d viewNormal = vn.cast<double>();
|
||||
|
||||
// Enable depth buffering
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_TRUE);
|
||||
renderer->enableDepthTest();
|
||||
renderer->enableDepthMask();
|
||||
renderer->disableBlending();
|
||||
|
||||
Affine3f transform = Translation3f(pos) * qf.conjugate() * Scaling(scale * semiAxes);
|
||||
|
@ -248,8 +248,8 @@ PlanetographicGrid::render(Renderer* renderer,
|
|||
glDisableVertexAttribArray(CelestiaGLProgram::VertexCoordAttributeIndex);
|
||||
|
||||
glUseProgram(0);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->disableDepthTest();
|
||||
renderer->disableDepthMask();
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
|
||||
}
|
||||
|
|
|
@ -655,21 +655,30 @@ GLSL_RenderContext::makeCurrent(const Material& m)
|
|||
case Material::NormalBlend:
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDepthMask(disableDepthWriteOnBlend ? GL_FALSE : GL_TRUE);
|
||||
if (disableDepthWriteOnBlend)
|
||||
renderer->disableDepthMask();
|
||||
else
|
||||
renderer->enableDepthMask();
|
||||
break;
|
||||
case Material::AdditiveBlend:
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
|
||||
glDepthMask(disableDepthWriteOnBlend ? GL_FALSE : GL_TRUE);
|
||||
if (disableDepthWriteOnBlend)
|
||||
renderer->disableDepthMask();
|
||||
else
|
||||
renderer->enableDepthMask();
|
||||
break;
|
||||
case Material::PremultipliedAlphaBlend:
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDepthMask(disableDepthWriteOnBlend ? GL_FALSE : GL_TRUE);
|
||||
if (disableDepthWriteOnBlend)
|
||||
renderer->disableDepthMask();
|
||||
else
|
||||
renderer->enableDepthMask();
|
||||
break;
|
||||
default:
|
||||
renderer->disableBlending();
|
||||
glDepthMask(GL_TRUE);
|
||||
renderer->enableDepthMask();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -801,21 +810,21 @@ GLSLUnlit_RenderContext::makeCurrent(const Material& m)
|
|||
case Material::NormalBlend:
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->disableDepthMask();
|
||||
break;
|
||||
case Material::AdditiveBlend:
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->disableDepthMask();
|
||||
break;
|
||||
case Material::PremultipliedAlphaBlend:
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->disableDepthMask();
|
||||
break;
|
||||
default:
|
||||
renderer->disableBlending();
|
||||
glDepthMask(GL_TRUE);
|
||||
renderer->enableDepthMask();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1684,7 +1684,7 @@ void Renderer::draw(const Observer& observer,
|
|||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
#endif
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
glDepthMask(GL_FALSE);
|
||||
disableDepthMask();
|
||||
|
||||
// Render sky grids first--these will always be in the background
|
||||
enableSmoothLines();
|
||||
|
@ -1783,7 +1783,7 @@ void Renderer::draw(const Observer& observer,
|
|||
|
||||
setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
disableBlending();
|
||||
glDepthMask(GL_TRUE);
|
||||
enableDepthMask();
|
||||
}
|
||||
|
||||
void renderPoint(const Renderer &renderer,
|
||||
|
@ -1909,7 +1909,7 @@ void Renderer::renderObjectAsPoint(const Vector3f& position,
|
|||
glareAlpha *= fade;
|
||||
}
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
enableDepthTest();
|
||||
bool useSprites = starStyle != PointStars;
|
||||
if (useSprites)
|
||||
gaussianDiscTex->bind();
|
||||
|
@ -1927,7 +1927,7 @@ void Renderer::renderObjectAsPoint(const Vector3f& position,
|
|||
renderPoint(*this, position, {color, glareAlpha}, glareSize, true, m);
|
||||
}
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
disableDepthTest();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1967,7 +1967,7 @@ void Renderer::renderEllipsoidAtmosphere(const Atmosphere& atmosphere,
|
|||
if (prog == nullptr)
|
||||
return;
|
||||
|
||||
glDepthMask(GL_FALSE);
|
||||
disableDepthMask();
|
||||
|
||||
// Gradually fade in the atmosphere if it's thickness on screen is just
|
||||
// over one pixel.
|
||||
|
@ -2641,8 +2641,8 @@ void Renderer::renderObject(const Vector3f& pos,
|
|||
}
|
||||
|
||||
// Enable depth buffering
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_TRUE);
|
||||
enableDepthTest();
|
||||
enableDepthMask();
|
||||
|
||||
disableBlending();
|
||||
|
||||
|
@ -2936,7 +2936,7 @@ void Renderer::renderObject(const Vector3f& pos,
|
|||
if (distance - radius < atmosphere->cloudHeight)
|
||||
glFrontFace(GL_CW);
|
||||
|
||||
glDepthMask(GL_FALSE);
|
||||
disableDepthMask();
|
||||
cloudTex->bind();
|
||||
enableBlending();
|
||||
setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
@ -2971,7 +2971,7 @@ void Renderer::renderObject(const Vector3f& pos,
|
|||
}
|
||||
|
||||
glDisable(GL_POLYGON_OFFSET_FILL);
|
||||
glDepthMask(GL_TRUE);
|
||||
enableDepthMask();
|
||||
glFrontFace(GL_CCW);
|
||||
}
|
||||
}
|
||||
|
@ -2987,7 +2987,7 @@ void Renderer::renderObject(const Vector3f& pos,
|
|||
|
||||
if (distance > obj.rings->innerRadius)
|
||||
{
|
||||
glDepthMask(GL_FALSE);
|
||||
disableDepthMask();
|
||||
renderRings_GLSL(*obj.rings, ri, ls,
|
||||
radius, 1.0f - obj.semiAxes.y(),
|
||||
textureResolution,
|
||||
|
@ -2997,8 +2997,8 @@ void Renderer::renderObject(const Vector3f& pos,
|
|||
}
|
||||
}
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
disableDepthTest();
|
||||
disableDepthMask();
|
||||
enableBlending();
|
||||
}
|
||||
|
||||
|
@ -3401,8 +3401,8 @@ void Renderer::renderPlanet(Body& body,
|
|||
cityRep = MarkerRepresentation(MarkerRepresentation::X, 3.0f, LocationLabelColor);
|
||||
genericLocationRep = MarkerRepresentation(MarkerRepresentation::Square, 8.0f, LocationLabelColor);
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
enableDepthTest();
|
||||
disableDepthMask();
|
||||
disableBlending();
|
||||
|
||||
// We need a double precision body-relative position of the
|
||||
|
@ -3410,7 +3410,7 @@ void Renderer::renderPlanet(Body& body,
|
|||
Vector3d posd = body.getPosition(observer.getTime()).offsetFromKm(observer.getPosition());
|
||||
locationsToAnnotations(body, posd, q);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
disableDepthTest();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3681,7 +3681,7 @@ void Renderer::renderCometTail(const Body& body,
|
|||
}
|
||||
}
|
||||
|
||||
glDepthMask(GL_FALSE);
|
||||
disableDepthMask();
|
||||
glDisable(GL_CULL_FACE);
|
||||
enableBlending();
|
||||
setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
|
||||
|
@ -3758,8 +3758,8 @@ void Renderer::renderReferenceMark(const ReferenceMark& refMark,
|
|||
|
||||
refMark.render(this, pos, discSizeInPixels, now, m);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
disableDepthTest();
|
||||
disableDepthMask();
|
||||
enableBlending();
|
||||
setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
|
||||
}
|
||||
|
@ -4934,9 +4934,9 @@ void Renderer::renderAnnotations(const vector<Annotation>& annotations,
|
|||
void
|
||||
Renderer::renderBackgroundAnnotations(FontStyle fs)
|
||||
{
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
enableDepthTest();
|
||||
renderAnnotations(backgroundAnnotations, fs);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
disableDepthTest();
|
||||
|
||||
clearAnnotations(backgroundAnnotations);
|
||||
}
|
||||
|
@ -4945,7 +4945,7 @@ Renderer::renderBackgroundAnnotations(FontStyle fs)
|
|||
void
|
||||
Renderer::renderForegroundAnnotations(FontStyle fs)
|
||||
{
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
disableDepthTest();
|
||||
renderAnnotations(foregroundAnnotations, fs);
|
||||
|
||||
clearAnnotations(foregroundAnnotations);
|
||||
|
@ -4974,7 +4974,7 @@ Renderer::renderAnnotations(vector<Annotation>::iterator startIter,
|
|||
if (font[fs] == nullptr)
|
||||
return endIter;
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
enableDepthTest();
|
||||
enableBlending();
|
||||
setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
|
@ -5012,7 +5012,7 @@ Renderer::renderAnnotations(vector<Annotation>::iterator startIter,
|
|||
}
|
||||
}
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
disableDepthTest();
|
||||
font[fs]->unbind();
|
||||
|
||||
return iter;
|
||||
|
@ -5301,6 +5301,42 @@ void Renderer::setBlendingFactors(GLenum sfactor, GLenum dfactor) noexcept
|
|||
}
|
||||
}
|
||||
|
||||
void Renderer::enableDepthMask() noexcept
|
||||
{
|
||||
if (!m_GLState.depthMask)
|
||||
{
|
||||
glDepthMask(GL_TRUE);
|
||||
m_GLState.depthMask = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Renderer::disableDepthMask() noexcept
|
||||
{
|
||||
if (m_GLState.depthMask)
|
||||
{
|
||||
glDepthMask(GL_FALSE);
|
||||
m_GLState.depthMask = false;
|
||||
}
|
||||
}
|
||||
|
||||
void Renderer::enableDepthTest() noexcept
|
||||
{
|
||||
if (!m_GLState.depthTest)
|
||||
{
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
m_GLState.depthTest = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Renderer::disableDepthTest() noexcept
|
||||
{
|
||||
if (m_GLState.depthTest)
|
||||
{
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
m_GLState.depthTest = false;
|
||||
}
|
||||
}
|
||||
|
||||
constexpr GLenum toGLFormat(Renderer::PixelFormat format)
|
||||
{
|
||||
return (GLenum) format;
|
||||
|
@ -6001,8 +6037,8 @@ Renderer::renderSolarSystemObjects(const Observer &observer,
|
|||
// Render orbit paths
|
||||
if (!orbitPathList.empty())
|
||||
{
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
enableDepthTest();
|
||||
disableDepthMask();
|
||||
#ifdef USE_HDR
|
||||
setBlendingFactors(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
|
||||
#else
|
||||
|
@ -6031,7 +6067,7 @@ Renderer::renderSolarSystemObjects(const Observer &observer,
|
|||
}
|
||||
|
||||
disableSmoothLines();
|
||||
glDepthMask(GL_FALSE);
|
||||
disableDepthMask();
|
||||
}
|
||||
|
||||
// Render transparent objects in the second pass
|
||||
|
@ -6052,7 +6088,7 @@ Renderer::renderSolarSystemObjects(const Observer &observer,
|
|||
FontNormal);
|
||||
endObjectAnnotations();
|
||||
disableSmoothLines();
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
disableDepthTest();
|
||||
}
|
||||
|
||||
// reset the depth range
|
||||
|
|
|
@ -261,6 +261,12 @@ class Renderer
|
|||
void disableBlending() noexcept;
|
||||
void setBlendingFactors(GLenum, GLenum) noexcept;
|
||||
|
||||
void enableDepthMask() noexcept;
|
||||
void disableDepthMask() noexcept;
|
||||
|
||||
void enableDepthTest() noexcept;
|
||||
void disableDepthTest() noexcept;
|
||||
|
||||
void drawRectangle(const Rect& r, const Eigen::Matrix4f& mvp);
|
||||
void setRenderRegion(int x, int y, int width, int height, bool withScissor = true);
|
||||
|
||||
|
@ -806,10 +812,12 @@ class Renderer
|
|||
bool blending : 1;
|
||||
bool scissor : 1;
|
||||
bool multisample : 1;
|
||||
bool depthMask : 1;
|
||||
bool depthTest : 1;
|
||||
|
||||
GLenum sfactor, dfactor; // blending
|
||||
};
|
||||
State m_GLState { false, false, false };
|
||||
State m_GLState { false, false, false, false, false };
|
||||
|
||||
private:
|
||||
typedef std::map<const Orbit*, CurvePlot*> OrbitCache;
|
||||
|
|
|
@ -338,7 +338,7 @@ void renderGeometry_GLSL(Geometry* geometry,
|
|||
tsec, renderer, &lightMatrix);
|
||||
renderer->setViewport(viewport);
|
||||
#ifdef DEPTH_BUFFER_DEBUG
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
renderer->disableDepthTest();
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadMatrixf(Ortho2D(0.0f, (float)viewport[2], 0.0f, (float)viewport[3]).data());
|
||||
|
@ -373,7 +373,7 @@ void renderGeometry_GLSL(Geometry* geometry,
|
|||
glPopMatrix();
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
renderer->enableDepthTest();
|
||||
#endif
|
||||
glDepthRange(range[0], range[1]);
|
||||
}
|
||||
|
@ -652,7 +652,7 @@ renderAtmosphere_GLSL(const RenderInfo& ri,
|
|||
|
||||
glFrontFace(GL_CW);
|
||||
renderer->enableBlending();
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->disableDepthMask();
|
||||
renderer->setBlendingFactors(GL_ONE, GL_SRC_ALPHA);
|
||||
|
||||
g_lodSphere->render(LODSphereMesh::Normals,
|
||||
|
@ -661,7 +661,7 @@ renderAtmosphere_GLSL(const RenderInfo& ri,
|
|||
nullptr);
|
||||
|
||||
renderer->disableBlending();
|
||||
glDepthMask(GL_TRUE);
|
||||
renderer->enableDepthMask();
|
||||
glFrontFace(GL_CCW);
|
||||
glUseProgram(0);
|
||||
}
|
||||
|
@ -926,8 +926,8 @@ void renderGeometryShadow_GLSL(Geometry* geometry,
|
|||
|
||||
// Write only to the depth buffer
|
||||
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||
glDepthMask(GL_TRUE);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
renderer->enableDepthMask();
|
||||
renderer->enableDepthTest();
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
// Render backfaces only in order to reduce self-shadowing artifacts
|
||||
glCullFace(GL_FRONT);
|
||||
|
|
|
@ -165,8 +165,8 @@ VisibleRegion::render(Renderer* renderer,
|
|||
Vector3f semiAxes = m_body.getSemiAxes();
|
||||
|
||||
// Enable depth buffering
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_TRUE);
|
||||
renderer->enableDepthTest();
|
||||
renderer->enableDepthMask();
|
||||
renderer->enableBlending();
|
||||
#ifdef USE_HDR
|
||||
renderer->setBlendingFactors(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
|
||||
|
@ -216,8 +216,8 @@ VisibleRegion::render(Renderer* renderer,
|
|||
Matrix4f mvp = (*m.projection) * (*m.modelview) * transform.matrix();
|
||||
renderTerminator(renderer, pos, Color(m_color, opacity), mvp);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_FALSE);
|
||||
renderer->disableDepthTest();
|
||||
renderer->disableDepthMask();
|
||||
renderer->enableBlending();
|
||||
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue