1515
1616using namespace rive ;
1717
18+ ScriptReffedArtboard* ScriptReffedArtboard::s_head = nullptr ;
19+
1820ScriptReffedArtboard::ScriptReffedArtboard (
21+ lua_State* L,
1922 rcp<File> file,
2023 std::unique_ptr<ArtboardInstance>&& artboardInstance,
2124 rcp<ViewModelInstance> viewModelInstance,
2225 rcp<DataContext> parentDataContext) :
2326 m_file(file),
2427 m_artboard(std::move(artboardInstance)),
25- m_stateMachine(m_artboard->defaultStateMachine ())
28+ m_stateMachine(m_artboard->defaultStateMachine ()),
29+ m_luaState(L)
2630{
2731 if (viewModelInstance)
2832 {
@@ -45,18 +49,58 @@ ScriptReffedArtboard::ScriptReffedArtboard(
4549 m_stateMachine->bindViewModelInstance (m_viewModelInstance);
4650 }
4751 }
52+ // Track this instance for cleanup during artboard destruction
53+ m_trackNext = s_head;
54+ m_trackPrev = nullptr ;
55+ if (s_head)
56+ {
57+ s_head->m_trackPrev = this ;
58+ }
59+ s_head = this ;
4860}
4961
5062ScriptReffedArtboard::~ScriptReffedArtboard ()
5163{
52- // Make sure state machine is deleted before artboard since
53- // StateMachineInstance destructor accesses the artboard.
64+ // Remove from tracking list
65+ if (m_trackPrev)
66+ {
67+ m_trackPrev->m_trackNext = m_trackNext;
68+ }
69+ else if (s_head == this )
70+ {
71+ s_head = m_trackNext;
72+ }
73+ if (m_trackNext)
74+ {
75+ m_trackNext->m_trackPrev = m_trackPrev;
76+ }
77+ releaseReferences ();
78+ }
79+
80+ void ScriptReffedArtboard::releaseReferences ()
81+ {
82+ // StateMachine must be deleted before artboard since its destructor
83+ // accesses the artboard.
5484 m_stateMachine = nullptr ;
55- // Make sure artboard is deleted before file.
5685 m_artboard = nullptr ;
86+ m_viewModelInstance = nullptr ;
5787 m_file = nullptr ;
5888}
5989
90+ void ScriptReffedArtboard::releaseAll (lua_State* state)
91+ {
92+ ScriptReffedArtboard* current = s_head;
93+ while (current)
94+ {
95+ ScriptReffedArtboard* next = current->m_trackNext ;
96+ if (current->m_luaState == state)
97+ {
98+ current->releaseReferences ();
99+ }
100+ current = next;
101+ }
102+ }
103+
60104rive::rcp<rive::File> ScriptReffedArtboard::file () { return m_file; }
61105
62106Artboard* ScriptReffedArtboard::artboard () { return m_artboard.get (); }
@@ -264,7 +308,7 @@ int ScriptedArtboard::instance(lua_State* L,
264308 m_scriptReffedArtboard->file (),
265309 std::move (artboardInstance),
266310 viewModelInstance,
267- m_dataContext );
311+ artboard ()-> dataContext () );
268312 return 1 ;
269313}
270314
@@ -384,11 +428,11 @@ ScriptedArtboard::ScriptedArtboard(
384428 rcp<DataContext> dataContext) :
385429 m_state(L),
386430 m_scriptReffedArtboard(
387- make_rcp<ScriptReffedArtboard>(file,
431+ make_rcp<ScriptReffedArtboard>(L,
432+ file,
388433 std::move (artboardInstance),
389434 viewModelInstance,
390- dataContext)),
391- m_dataContext(dataContext)
435+ dataContext))
392436{}
393437
394438ScriptedArtboard::~ScriptedArtboard ()
0 commit comments