@@ -13,8 +13,12 @@ namespace qmlwrap
1313class MakieRenderFunction : public RenderFunction
1414{
1515public:
16- MakieRenderFunction (jl_value_t * const & screen_ptr) : m_screen_ptr(screen_ptr)
16+ MakieRenderFunction (jl_value_t * const & screen_ptr, jl_value_t *& scene ) : m_screen_ptr(screen_ptr), m_scene(scene )
1717 {
18+ if (MakieViewport::m_default_render_function.fptr != nullptr )
19+ {
20+ m_scene_render_function = jlcxx::make_function_pointer<void (jl_value_t *, jl_value_t *)>(MakieViewport::m_default_render_function);
21+ }
1822 }
1923
2024 void setRenderFunction (jlcxx::SafeCFunction f) override
@@ -23,12 +27,22 @@ class MakieRenderFunction : public RenderFunction
2327 }
2428 void render () override
2529 {
26- m_render_function (m_screen_ptr);
30+ if (m_scene != nullptr )
31+ {
32+ m_scene_render_function (m_screen_ptr, m_scene);
33+ }
34+ else if (m_render_function != nullptr )
35+ {
36+ m_render_function (m_screen_ptr);
37+ }
2738 }
2839private:
2940 typedef void (*render_callback_t )(jl_value_t *);
30- render_callback_t m_render_function;
41+ render_callback_t m_render_function = nullptr ;
42+ typedef void (*scene_render_callback_t )(jl_value_t *, jl_value_t *); // Default render function takes an extra scene argument
43+ scene_render_callback_t m_scene_render_function;
3144 jl_value_t * const & m_screen_ptr;
45+ jl_value_t *& m_scene;
3246};
3347
3448jl_module_t * get_makie_support_module ()
@@ -73,7 +87,7 @@ struct MakieSupport
7387 jlcxx::JuliaFunction on_context_destroy;
7488};
7589
76- MakieViewport::MakieViewport (QQuickItem *parent) : OpenGLViewport(parent, new MakieRenderFunction(m_screen))
90+ MakieViewport::MakieViewport (QQuickItem *parent) : OpenGLViewport(parent, new MakieRenderFunction(m_screen, m_scene ))
7791{
7892 get_makie_support_module (); // Throw the possible error early
7993 QObject::connect (this , &QQuickItem::windowChanged, [this ] (QQuickWindow* w)
@@ -96,13 +110,33 @@ MakieViewport::~MakieViewport()
96110 {
97111 jlcxx::unprotect_from_gc (m_screen);
98112 }
113+ if (m_scene != nullptr )
114+ {
115+ jlcxx::unprotect_from_gc (m_scene);
116+ }
117+ }
118+
119+ qvariant_any_t MakieViewport::scene ()
120+ {
121+ return std::make_shared<QVariantAny>(m_scene);
122+ }
123+
124+ void MakieViewport::setScene (qvariant_any_t scene)
125+ {
126+ jl_value_t * scene_val = scene->value ;
127+ jlcxx::protect_from_gc (scene_val);
128+ if (m_scene != nullptr )
129+ {
130+ jlcxx::unprotect_from_gc (m_scene);
131+ }
132+ m_scene = scene_val;
99133}
100134
101135void MakieViewport::setup_buffer (QOpenGLFramebufferObject* fbo)
102136{
103137 if (m_screen == nullptr )
104138 {
105- m_screen = MakieSupport::instance ().setup_screen (std::forward<QOpenGLFramebufferObject*>(fbo));
139+ m_screen = MakieSupport::instance ().setup_screen (std::forward<QOpenGLFramebufferObject*>(fbo), window () );
106140 jlcxx::protect_from_gc (m_screen);
107141 }
108142 else
@@ -113,5 +147,6 @@ void MakieViewport::setup_buffer(QOpenGLFramebufferObject* fbo)
113147}
114148
115149jl_module_t * MakieViewport::m_qmlmakie_mod = nullptr ;
150+ jlcxx::SafeCFunction MakieViewport::m_default_render_function = {nullptr , nullptr , nullptr };
116151
117152} // namespace qmlwrap
0 commit comments