From 5ff2d136f5603f023e54b33701deab7fae729e5f Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Thu, 9 Jan 2025 11:35:26 +0100 Subject: [PATCH] [render] add postDraw member function to Drawers --- vclib/render/include/vclib/bgfx/canvas.h | 12 +++++++----- .../render/include/vclib/render/concepts/drawer.h | 1 + .../include/vclib/render/drawers/plain_drawer.h | 2 ++ vclib/render/include/vclib/render/renderer.h | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/vclib/render/include/vclib/bgfx/canvas.h b/vclib/render/include/vclib/bgfx/canvas.h index caab25370..007f7881a 100644 --- a/vclib/render/include/vclib/bgfx/canvas.h +++ b/vclib/render/include/vclib/bgfx/canvas.h @@ -190,6 +190,13 @@ class CanvasBGFX } else { mCurrFrame = bgfx::frame(); + + // this is required only when using Qt in macOS +#if defined(__APPLE__) + bgfx::frame(); +#endif // __APPLE__ + + DRT::CNV::postDraw(derived()); } if (mReadRequest != std::nullopt) { @@ -200,11 +207,6 @@ class CanvasBGFX // solicit new frame derived()->update(); } - - // this is probably required only when using Qt -#if defined(__APPLE__) || defined(__linux__) - bgfx::frame(); // needed on unix systems -#endif // __APPLE__ || __linux__ } /** diff --git a/vclib/render/include/vclib/render/concepts/drawer.h b/vclib/render/include/vclib/render/concepts/drawer.h index b91afa22c..0dbdbeb2f 100644 --- a/vclib/render/include/vclib/render/concepts/drawer.h +++ b/vclib/render/include/vclib/render/concepts/drawer.h @@ -39,6 +39,7 @@ concept DrawerConcept = requires(T&& obj) { obj.onResize(uint(), uint()) } -> std::same_as; { obj.onDraw(uint()) } -> std::same_as; { obj.onDrawContent(uint()) } -> std::same_as; + { obj.onPostDraw() } -> std::same_as; }; }; diff --git a/vclib/render/include/vclib/render/drawers/plain_drawer.h b/vclib/render/include/vclib/render/drawers/plain_drawer.h index 3889ba807..3fd07117c 100644 --- a/vclib/render/include/vclib/render/drawers/plain_drawer.h +++ b/vclib/render/include/vclib/render/drawers/plain_drawer.h @@ -45,6 +45,8 @@ class PlainDrawer virtual void onDrawContent(uint viewId) {} + virtual void onPostDraw() {} + protected: auto* derived() { return static_cast(this); } diff --git a/vclib/render/include/vclib/render/renderer.h b/vclib/render/include/vclib/render/renderer.h index 6b649e02f..f620bb942 100644 --- a/vclib/render/include/vclib/render/renderer.h +++ b/vclib/render/include/vclib/render/renderer.h @@ -285,6 +285,14 @@ class Renderer : ...); } + void cnvPostDraw() + { + // call the onPostDraw member function of each Drawer object. + // NOTE: use static_cast(this)->function() to call the + // right VIRTUAL function of the Drawer object. + (static_cast*>(this)->onPostDraw(), ...); + } + /***** Member functions called by Drawer objects *****/ // Documentation is in the Renderer::DRW inner class @@ -528,6 +536,13 @@ class Renderer::CNV * `onDrawContent(uint())` function for every Drawer object. */ static void drawContent(Renderer* r) { r->cnvDrawContent(); } + + /** + * @brief The CanvasType has finished drawing and has submitted the new + * frame, and asks the Renderer to call the `onPostDraw()` function for + * every Drawer object. + */ + static void postDraw(Renderer* r) { r->cnvPostDraw(); } }; /**