diff --git a/libs/wxutil/GLWidget.cpp b/libs/wxutil/GLWidget.cpp index dcb515572b..40a098a485 100644 --- a/libs/wxutil/GLWidget.cpp +++ b/libs/wxutil/GLWidget.cpp @@ -15,7 +15,7 @@ const int ATTRIBS [] = { 0 }; -GLWidget::GLWidget(wxWindow *parent, const std::function& renderCallback, const std::string& name) : +GLWidget::GLWidget(wxWindow *parent, const std::function& renderCallback, const std::string& name) : wxGLCanvas(parent, wxID_ANY, ATTRIBS, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE | wxWANTS_CHARS, wxString(name.c_str(), *wxConvCurrent)), @@ -88,9 +88,12 @@ void GLWidget::OnPaint(wxPaintEvent& WXUNUSED(event)) SetCurrent(GlobalOpenGL().getwxGLContext()); } - _renderCallback(); - - SwapBuffers(); + if (_renderCallback()) + { + // Render callback returned true, so drawing took place + // and we can swap the buffers + SwapBuffers(); + } } } // namespace diff --git a/libs/wxutil/GLWidget.h b/libs/wxutil/GLWidget.h index f5a4f0cf28..9dd218f5c5 100644 --- a/libs/wxutil/GLWidget.h +++ b/libs/wxutil/GLWidget.h @@ -20,14 +20,14 @@ class GLWidget : bool _registered; // The attached client method to invoke to render this view - std::function _renderCallback; + std::function _renderCallback; // Some widgets have their own openGL context, // If it is non-NULL _privateContext will be used. wxGLContext* _privateContext; public: - GLWidget(wxWindow *parent, const std::function& renderCallback, const std::string& name); + GLWidget(wxWindow *parent, const std::function& renderCallback, const std::string& name); // Call this to enable/disable the private GL context of this widget void SetHasPrivateContext(bool hasPrivateContext); diff --git a/libs/wxutil/preview/GuiView.cpp b/libs/wxutil/preview/GuiView.cpp index a6da3ef582..51f04dc06c 100644 --- a/libs/wxutil/preview/GuiView.cpp +++ b/libs/wxutil/preview/GuiView.cpp @@ -78,9 +78,9 @@ void GuiView::setGLViewPort() debug::assertNoGlErrors(); } -void GuiView::draw() +bool GuiView::draw() { - if (_gui == NULL) return; + if (!_gui) return false; debug::assertNoGlErrors(); @@ -117,6 +117,8 @@ void GuiView::draw() debug::assertNoGlErrors(); _renderer.render(); + + return true; } void GuiView::onSizeAllocate(wxSizeEvent& ev) diff --git a/libs/wxutil/preview/GuiView.h b/libs/wxutil/preview/GuiView.h index 3356c44f7a..f1e9bcc3a3 100644 --- a/libs/wxutil/preview/GuiView.h +++ b/libs/wxutil/preview/GuiView.h @@ -51,7 +51,7 @@ class GuiView : protected: // Performs the actual GL setup and drawing - virtual void draw(); + virtual bool draw(); // Calculates the visible area virtual void setGLViewPort(); diff --git a/libs/wxutil/preview/RenderPreview.cpp b/libs/wxutil/preview/RenderPreview.cpp index ef347fb905..84c213ae4d 100644 --- a/libs/wxutil/preview/RenderPreview.cpp +++ b/libs/wxutil/preview/RenderPreview.cpp @@ -419,9 +419,9 @@ RenderStateFlags RenderPreview::getRenderFlagsWireframe() RENDER_PROGRAM; } -void RenderPreview::drawPreview() +bool RenderPreview::drawPreview() { - if (_renderingInProgress) return; // avoid double-entering this method + if (_renderingInProgress) return false; // avoid double-entering this method if (!_initialised) { @@ -451,7 +451,7 @@ void RenderPreview::drawPreview() { // a return value of false means to cancel rendering drawTime(); - return; + return true; // swap buffers } // Set up the camera @@ -489,6 +489,8 @@ void RenderPreview::drawPreview() // Draw the render time drawTime(); + + return true; } void RenderPreview::renderWireFrame() diff --git a/libs/wxutil/preview/RenderPreview.h b/libs/wxutil/preview/RenderPreview.h index 17924a80d7..1bafc27a85 100644 --- a/libs/wxutil/preview/RenderPreview.h +++ b/libs/wxutil/preview/RenderPreview.h @@ -41,7 +41,7 @@ class RenderPreview : { private: void connectToolbarSignals(); - void drawPreview(); + bool drawPreview(); void onGLScroll(wxMouseEvent& ev); void onGLMouseClick(wxMouseEvent& ev); void onGLMouseRelease(wxMouseEvent& ev); diff --git a/radiant/camera/CamWnd.cpp b/radiant/camera/CamWnd.cpp index 125fbd7d01..f017d4ab17 100644 --- a/radiant/camera/CamWnd.cpp +++ b/radiant/camera/CamWnd.cpp @@ -780,14 +780,9 @@ void CamWnd::Cam_Draw() glBindTexture( GL_TEXTURE_2D, 0 ); } -void CamWnd::onRender() +bool CamWnd::onRender() { - draw(); -} - -void CamWnd::draw() -{ - if (_drawing) return; + if (_drawing) return false; util::ScopedBoolLock lock(_drawing); @@ -798,7 +793,11 @@ void CamWnd::draw() Cam_Draw(); debug::assertNoGlErrors(); + + return true; } + + return false; } void CamWnd::benchmark() diff --git a/radiant/camera/CamWnd.h b/radiant/camera/CamWnd.h index c39b265c57..dc53c56d5d 100644 --- a/radiant/camera/CamWnd.h +++ b/radiant/camera/CamWnd.h @@ -95,7 +95,6 @@ class CamWnd : void queueDraw() override; void forceRedraw() override; - void draw(); void update(); // The callback when the scene gets changed @@ -166,7 +165,7 @@ class CamWnd : void updateToolbarVisibility(); void Cam_Draw(); - void onRender(); + bool onRender(); void drawTime(); CameraMouseToolEvent createMouseEvent(const Vector2& point, const Vector2& delta = Vector2(0, 0)); diff --git a/radiant/textool/TexTool.cpp b/radiant/textool/TexTool.cpp index f5e30915fd..90c4530594 100644 --- a/radiant/textool/TexTool.cpp +++ b/radiant/textool/TexTool.cpp @@ -737,11 +737,11 @@ void TexTool::drawGrid() } } -void TexTool::onGLDraw() +bool TexTool::onGLDraw() { if (_updateNeeded) { - return; // stop here, wait for the next idle event to refresh + return false; // stop here, wait for the next idle event to refresh } // Initialise the viewport @@ -761,14 +761,15 @@ void TexTool::onGLDraw() // Do nothing, if the shader name is empty if (_shader == NULL || _shader->getName().empty()) { - return; + return true; } AABB& selAABB = getExtents(); // Is there a valid selection? - if (!selAABB.isValid()) { - return; + if (!selAABB.isValid()) + { + return true; } AABB& texSpaceAABB = getVisibleTexSpace(); @@ -845,6 +846,8 @@ void TexTool::onGLDraw() glEnd(); glDisable(GL_BLEND); } + + return true; } void TexTool::onGLResize(wxSizeEvent& ev) diff --git a/radiant/textool/TexTool.h b/radiant/textool/TexTool.h index b26a332d0c..a4445bfda4 100644 --- a/radiant/textool/TexTool.h +++ b/radiant/textool/TexTool.h @@ -184,7 +184,7 @@ class TexTool : */ Vector2 getTextureCoords(const double& x, const double& y); - void onGLDraw(); + bool onGLDraw(); void onGLResize(wxSizeEvent& ev); // The callbacks for capturing the mouse events diff --git a/radiant/ui/common/ShaderSelector.cpp b/radiant/ui/common/ShaderSelector.cpp index 95f1c6a7c1..0242987cea 100644 --- a/radiant/ui/common/ShaderSelector.cpp +++ b/radiant/ui/common/ShaderSelector.cpp @@ -250,12 +250,12 @@ void ShaderSelector::updateInfoTable() } // Callback to redraw the GL widget -void ShaderSelector::onPreviewRender() +bool ShaderSelector::onPreviewRender() { // Get the viewport size from the GL widget wxSize req = _glWidget->GetClientSize(); - if (req.GetWidth() == 0 || req.GetHeight() == 0) return; + if (req.GetWidth() == 0 || req.GetHeight() == 0) return false; glViewport(0, 0, req.GetWidth(), req.GetHeight()); @@ -325,6 +325,8 @@ void ShaderSelector::onPreviewRender() glVertex2f(0.5*req.GetWidth() - hfWidth, 0.5*req.GetHeight() + hfHeight); glEnd(); } + + return true; } namespace diff --git a/radiant/ui/common/ShaderSelector.h b/radiant/ui/common/ShaderSelector.h index c54a0ac824..52ead2cf11 100644 --- a/radiant/ui/common/ShaderSelector.h +++ b/radiant/ui/common/ShaderSelector.h @@ -156,7 +156,7 @@ class ShaderSelector : void updateInfoTable(); // callbacks - void onPreviewRender(); + bool onPreviewRender(); void _onSelChange(wxDataViewEvent& ev); }; diff --git a/radiant/ui/common/TexturePreviewCombo.cpp b/radiant/ui/common/TexturePreviewCombo.cpp index 4a09211217..e737b17100 100644 --- a/radiant/ui/common/TexturePreviewCombo.cpp +++ b/radiant/ui/common/TexturePreviewCombo.cpp @@ -99,12 +99,12 @@ void TexturePreviewCombo::_onContextMenu(wxDataViewEvent& ev) } // CALLBACKS -void TexturePreviewCombo::_onRender() +bool TexturePreviewCombo::_onRender() { // Get the viewport size from the GL widget wxSize req = _glWidget->GetClientSize(); - if (req.GetWidth() == 0 || req.GetHeight() == 0) return; + if (req.GetWidth() == 0 || req.GetHeight() == 0) return false; glPushAttrib(GL_ALL_ATTRIB_BITS); @@ -167,6 +167,8 @@ void TexturePreviewCombo::_onRender() } glPopAttrib(); + + return true; } } diff --git a/radiant/ui/common/TexturePreviewCombo.h b/radiant/ui/common/TexturePreviewCombo.h index fe66289a80..10c775b805 100644 --- a/radiant/ui/common/TexturePreviewCombo.h +++ b/radiant/ui/common/TexturePreviewCombo.h @@ -52,7 +52,7 @@ class TexturePreviewCombo : void _onCopyTexName(); // render callback - void _onRender(); + bool _onRender(); // Refresh info table utility function void refreshInfoTable(); diff --git a/radiant/ui/texturebrowser/TextureBrowser.cpp b/radiant/ui/texturebrowser/TextureBrowser.cpp index 37e99ce534..5eb908eb32 100644 --- a/radiant/ui/texturebrowser/TextureBrowser.cpp +++ b/radiant/ui/texturebrowser/TextureBrowser.cpp @@ -3,6 +3,7 @@ #include "i18n.h" #include "ieventmanager.h" #include "itextstream.h" +#include "imainframe.h" #include "iuimanager.h" #include "igroupdialog.h" #include "iradiant.h" @@ -940,8 +941,13 @@ void TextureBrowser::onIdle(wxIdleEvent& ev) } } -void TextureBrowser::onRender() +bool TextureBrowser::onRender() { + if (!GlobalMainFrame().screenUpdatesEnabled()) + { + return false; + } + debug::assertNoGlErrors(); if (_updateNeeded) @@ -952,6 +958,8 @@ void TextureBrowser::onRender() draw(); debug::assertNoGlErrors(); + + return true; } } // namespace ui diff --git a/radiant/ui/texturebrowser/TextureBrowser.h b/radiant/ui/texturebrowser/TextureBrowser.h index 258c9aca0e..c9b630b3ae 100644 --- a/radiant/ui/texturebrowser/TextureBrowser.h +++ b/radiant/ui/texturebrowser/TextureBrowser.h @@ -226,7 +226,7 @@ class TextureBrowser : // wx callbacks void onIdle(wxIdleEvent& ev); - void onRender(); + bool onRender(); void onScrollChanged(wxScrollEvent& ev); void onGLResize(wxSizeEvent& ev); void onGLMouseScroll(wxMouseEvent& ev); diff --git a/radiant/xyview/XYWnd.cpp b/radiant/xyview/XYWnd.cpp index 3ec7d1b121..69e3fa3e82 100644 --- a/radiant/xyview/XYWnd.cpp +++ b/radiant/xyview/XYWnd.cpp @@ -1540,14 +1540,19 @@ void XYWnd::onGLResize(wxSizeEvent& ev) ev.Skip(); } -void XYWnd::onRender() +bool XYWnd::onRender() { if (GlobalMainFrame().screenUpdatesEnabled()) { util::ScopedBoolLock drawLock(_drawing); draw(); + + return true; } + + + return false; // nothing rendered } void XYWnd::onGLWindowScroll(wxMouseEvent& ev) diff --git a/radiant/xyview/XYWnd.h b/radiant/xyview/XYWnd.h index e84825c572..52a1b83e98 100644 --- a/radiant/xyview/XYWnd.h +++ b/radiant/xyview/XYWnd.h @@ -185,7 +185,7 @@ class XYWnd : void handleGLCapturedMouseMotion(const MouseToolPtr& tool, int x, int y, unsigned int state); // wxGLWidget-attached render method - void onRender(); + bool onRender(); void onGLResize(wxSizeEvent& ev); void onGLWindowScroll(wxMouseEvent& ev);