|
- #pragma once
- #include <widget/Widget.hpp>
-
-
- namespace rack {
- namespace widget {
-
-
- /** Caches its children's draw() result to a framebuffer image.
- When dirty, its children will be re-rendered on the next call to step().
- */
- struct FramebufferWidget : Widget {
- struct Internal;
- Internal* internal;
-
- bool dirty = true;
- bool bypassed = false;
- float oversample = 1.0;
- /** Redraw when the world offset of the FramebufferWidget changes its fractional value. */
- bool dirtyOnSubpixelChange = true;
- /** If finite, the maximum size of the framebuffer is the viewport expanded by this margin.
- The framebuffer is re-rendered when the viewport moves outside the margin.
- */
- math::Vec viewportMargin = math::Vec(INFINITY, INFINITY);
-
- FramebufferWidget();
- ~FramebufferWidget();
- /** Requests to re-render children to the framebuffer on the next draw(). */
- void setDirty(bool dirty = true);
- int getImageHandle();
- NVGLUframebuffer* getFramebuffer();
- math::Vec getFramebufferSize();
- void deleteFramebuffer();
-
- void step() override;
- /** Draws the framebuffer to the NanoVG scene, re-rendering it if necessary.
- */
- void draw(const DrawArgs& args) override;
- /** Re-renders the framebuffer, re-creating it if necessary.
- Handles oversampling (if >1) by rendering to a temporary (larger) framebuffer and then downscaling it to the main persistent framebuffer.
- */
- void render(math::Vec scale = math::Vec(1, 1), math::Vec offsetF = math::Vec(0, 0), math::Rect clipBox = math::Rect::inf());
- /** Initializes the current GL context and draws children to it.
- */
- virtual void drawFramebuffer();
-
- void onDirty(const DirtyEvent& e) override;
- void onContextCreate(const ContextCreateEvent& e) override;
- void onContextDestroy(const ContextDestroyEvent& e) override;
- };
-
-
- } // namespace widget
- } // namespace rack
|