diff --git a/libs/openFrameworks/app/ofAppNoWindow.cpp b/libs/openFrameworks/app/ofAppNoWindow.cpp index c1de76d323e..ad2e050c4e8 100644 --- a/libs/openFrameworks/app/ofAppNoWindow.cpp +++ b/libs/openFrameworks/app/ofAppNoWindow.cpp @@ -155,6 +155,7 @@ class ofNoopRenderer: public ofBaseRenderer{ void enablePointSprites(){}; void disablePointSprites(){}; void setDepthTest(bool){}; + void setDepthWrite(bool write){}; // color options void setColor(float r, float g, float b){}; // 0-1 diff --git a/libs/openFrameworks/gl/ofGLProgrammableRenderer.cpp b/libs/openFrameworks/gl/ofGLProgrammableRenderer.cpp index 205df2925f5..f4c4f54f682 100644 --- a/libs/openFrameworks/gl/ofGLProgrammableRenderer.cpp +++ b/libs/openFrameworks/gl/ofGLProgrammableRenderer.cpp @@ -1158,6 +1158,11 @@ void ofGLProgrammableRenderer::setDepthTest(bool depthTest) { } } +//---------------------------------------------------------- +void ofGLProgrammableRenderer::setDepthWrite(bool write) { + glDepthMask(write); +} + //---------------------------------------------------------- void ofGLProgrammableRenderer::setLineSmoothing(bool smooth) { currentStyle.smoothing = smooth; diff --git a/libs/openFrameworks/gl/ofGLProgrammableRenderer.h b/libs/openFrameworks/gl/ofGLProgrammableRenderer.h index ed54f27470a..e2231baa833 100644 --- a/libs/openFrameworks/gl/ofGLProgrammableRenderer.h +++ b/libs/openFrameworks/gl/ofGLProgrammableRenderer.h @@ -129,6 +129,7 @@ class ofGLProgrammableRenderer: public ofBaseGLRenderer{ void setLineWidth(float lineWidth); void setPointSize(float pointSize); void setDepthTest(bool depthTest); + void setDepthWrite(bool write); void setLineSmoothing(bool smooth); void setBlendMode(ofBlendMode blendMode); void enablePointSprites(); diff --git a/libs/openFrameworks/gl/ofGLRenderer.cpp b/libs/openFrameworks/gl/ofGLRenderer.cpp index 1a11eec06d5..2091231d47b 100644 --- a/libs/openFrameworks/gl/ofGLRenderer.cpp +++ b/libs/openFrameworks/gl/ofGLRenderer.cpp @@ -1275,6 +1275,11 @@ void ofGLRenderer::setDepthTest(bool depthTest) { } } +//---------------------------------------------------------- +void ofGLRenderer::setDepthWrite(bool write) { + glDepthMask(write); +} + //---------------------------------------------------------- void ofGLRenderer::setLineSmoothing(bool smooth) { currentStyle.smoothing = smooth; diff --git a/libs/openFrameworks/gl/ofGLRenderer.h b/libs/openFrameworks/gl/ofGLRenderer.h index 2a66ba700e2..fcede4e396d 100644 --- a/libs/openFrameworks/gl/ofGLRenderer.h +++ b/libs/openFrameworks/gl/ofGLRenderer.h @@ -114,6 +114,7 @@ class ofGLRenderer: public ofBaseGLRenderer{ void setLineWidth(float lineWidth); void setPointSize(float pointSize); void setDepthTest(bool depthTest); + void setDepthWrite(bool write); void setLineSmoothing(bool smooth); void setBlendMode(ofBlendMode blendMode); void enablePointSprites(); diff --git a/libs/openFrameworks/graphics/ofCairoRenderer.h b/libs/openFrameworks/graphics/ofCairoRenderer.h index 41f076f4dfc..af97ccac31f 100644 --- a/libs/openFrameworks/graphics/ofCairoRenderer.h +++ b/libs/openFrameworks/graphics/ofCairoRenderer.h @@ -90,6 +90,7 @@ class ofCairoRenderer: public ofBaseRenderer{ void enablePointSprites() {}; void disablePointSprites() {}; void setDepthTest(bool depthTest); + void setDepthWrite(bool write) {}; void setBlendMode(ofBlendMode blendMode); void setLineSmoothing(bool smooth); void enableAntiAliasing(); diff --git a/libs/openFrameworks/graphics/ofGraphics.cpp b/libs/openFrameworks/graphics/ofGraphics.cpp index 1e2dd151c07..091f32dbf52 100644 --- a/libs/openFrameworks/graphics/ofGraphics.cpp +++ b/libs/openFrameworks/graphics/ofGraphics.cpp @@ -489,6 +489,11 @@ void ofDisableDepthTest() { ofSetDepthTest(false); } +//---------------------------------------------------------- +void ofSetDepthWrite(bool write) { + ofGetCurrentRenderer()->setDepthWrite(write); +} + //---------------------------------------- void ofSetCurveResolution(int res) { ofGetCurrentRenderer()->setCurveResolution(res); @@ -1213,7 +1218,7 @@ void ofDrawBitmapStringHighlight(string text, int x, int y, const ofColor & back int width = maxLineLength * fontSize; ofPushStyle(); - glDepthMask(false); + ofSetDepthWrite(false); ofSetColor(background); ofFill(); ofPushMatrix(); @@ -1231,7 +1236,7 @@ void ofDrawBitmapStringHighlight(string text, int x, int y, const ofColor & back ofSetColor(foreground); ofNoFill(); ofDrawBitmapString(text, x, y); - glDepthMask(true); + ofSetDepthWrite(true); ofPopStyle(); } diff --git a/libs/openFrameworks/graphics/ofGraphics.h b/libs/openFrameworks/graphics/ofGraphics.h index f65cc4536d3..d8a032227e4 100644 --- a/libs/openFrameworks/graphics/ofGraphics.h +++ b/libs/openFrameworks/graphics/ofGraphics.h @@ -829,6 +829,10 @@ void ofEnableDepthTest(); /// \sa ofEnableDepthTest() void ofDisableDepthTest(); +/// \brief Enable / disable writing to the depth buffer. +/// Helpful when drawing transparent objects while depth testing is enabled. +void ofSetDepthWrite(bool write); + /// \brief Sets and enables the blend mode for drawing. The options are: /// /// OF_BLENDMODE_DISABLED diff --git a/libs/openFrameworks/graphics/ofGraphicsBaseTypes.h b/libs/openFrameworks/graphics/ofGraphicsBaseTypes.h index 410cca90188..4b8ef5e4daf 100644 --- a/libs/openFrameworks/graphics/ofGraphicsBaseTypes.h +++ b/libs/openFrameworks/graphics/ofGraphicsBaseTypes.h @@ -875,6 +875,9 @@ class ofBaseRenderer { /// /// \param depthTest True to enable depth testing. virtual void setDepthTest(bool depthTest) = 0; + + /// \brief Enable / disable writing to the depth buffer. + virtual void setDepthWrite( bool write ) = 0; /// \brief Set this renderer's current blend mode. /// diff --git a/libs/openFrameworks/graphics/ofRendererCollection.cpp b/libs/openFrameworks/graphics/ofRendererCollection.cpp index 1b807d04434..518338b8dda 100644 --- a/libs/openFrameworks/graphics/ofRendererCollection.cpp +++ b/libs/openFrameworks/graphics/ofRendererCollection.cpp @@ -562,6 +562,12 @@ void ofRendererCollection::setDepthTest(bool depthTest) { } } +void ofRendererCollection::setDepthWrite(bool write) { + for(auto renderer: renderers){ + renderer->setDepthWrite(write); + } +} + void ofRendererCollection::setBlendMode(ofBlendMode blendMode){ for(auto renderer: renderers){ renderer->setBlendMode(blendMode); diff --git a/libs/openFrameworks/graphics/ofRendererCollection.h b/libs/openFrameworks/graphics/ofRendererCollection.h index f5aca01ada5..059bb919a17 100644 --- a/libs/openFrameworks/graphics/ofRendererCollection.h +++ b/libs/openFrameworks/graphics/ofRendererCollection.h @@ -184,6 +184,7 @@ class ofRendererCollection: public ofBaseRenderer{ void setLineWidth(float lineWidth); void setPointSize(float pointSize); void setDepthTest(bool depthTest); + void setDepthWrite(bool write); void setBlendMode(ofBlendMode blendMode); void setLineSmoothing(bool smooth);