From f719c27f5725f34b072e5abc42a78bbea9327150 Mon Sep 17 00:00:00 2001 From: Struma Date: Wed, 10 Feb 2021 00:04:34 -0500 Subject: [PATCH] Move RGSS1 viewport elements to new parent when 'viewport=' is called --- binding/disposable-binding.h | 30 ++++++++++++++++++++++++++++-- binding/viewportelement-binding.h | 8 ++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/binding/disposable-binding.h b/binding/disposable-binding.h index bfe6b9c6..7c249e2a 100644 --- a/binding/disposable-binding.h +++ b/binding/disposable-binding.h @@ -31,16 +31,42 @@ inline void disposableAddChild(VALUE disp, VALUE child) { + if (NIL_P(disp) || NIL_P(child)) + return; + VALUE children = rb_iv_get(disp, "children"); + + bool exists = false; if (NIL_P(children)) { children = rb_ary_new(); rb_iv_set(disp, "children", children); } + else { + exists = RTEST(rb_funcall(children, rb_intern("include?"), 1, child)); + } - /* Assumes children are never removed until destruction */ - rb_ary_push(children, child); + if (!exists) + rb_ary_push(children, child); +} + +inline void +disposableRemoveChild(VALUE disp, VALUE child) +{ + if (NIL_P(disp) || NIL_P(child)) + return; + + VALUE children = rb_iv_get(disp, "children"); + if (NIL_P(children)) + return; + + VALUE index = rb_funcall(children, rb_intern("index"), 1, child); + if (NIL_P(index)) + return; + + rb_funcall(children, rb_intern("delete_at"), 1, index); + } inline void diff --git a/binding/viewportelement-binding.h b/binding/viewportelement-binding.h index 9f450574..b0571554 100644 --- a/binding/viewportelement-binding.h +++ b/binding/viewportelement-binding.h @@ -26,6 +26,7 @@ #include "sharedstate.h" #include "binding-util.h" #include "binding-types.h" +#include "debugwriter.h" #include "sceneelement-binding.h" #include "disposable-binding.h" @@ -54,6 +55,12 @@ RB_METHOD(viewportElementSetViewport) if (!NIL_P(viewportObj)) viewport = getPrivateDataCheck(viewportObj, ViewportType); + + if (rgssVer == 1) { + VALUE vp = viewportElementGetViewport(0, 0, self); + disposableRemoveChild(vp, self); + disposableAddChild(viewportObj, self); + } GUARD_EXC( ve->setViewport(viewport); ); @@ -83,6 +90,7 @@ viewportElementInitialize(int argc, VALUE *argv, VALUE self) /* Construct object */ C *ve = new C(viewport); + /* Set property objects */ rb_iv_set(self, "viewport", viewportObj);