Skip to content

Commit a0b50c2

Browse files
authored
Re-instantiate artboard when playing state machine (#126)
1 parent 7e422a3 commit a0b50c2

17 files changed

+44
-35
lines changed

defold-rive/include/common/atlas.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
#include <rive/assets/file_asset.hpp>
2222
#include <rive/file_asset_loader.hpp>
2323

24-
#include "renderer.h"
24+
#include "defold/renderer.h"
2525

2626
namespace dmGameSystemDDF {
2727
struct TextureSet;
File renamed without changes.

defold-rive/pluginsrc/rive_renderer_null.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
#include <rive/refcnt.hpp>
33

4-
#include <renderer.h>
4+
#include <defold/renderer.h>
55

66
namespace dmRive
77
{

defold-rive/src/comp_rive.cpp

+28-21
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,8 @@
4545
#include <common/tess_renderer.h>
4646

4747
// Defold Rive Renderer
48-
#include "renderer.h"
49-
50-
#include <private/defold_graphics.h>
48+
#include <defold/renderer.h>
49+
#include <defold/defold_graphics.h>
5150

5251
// DMSDK
5352
#include <dmsdk/script.h>
@@ -235,6 +234,26 @@ namespace dmRive
235234
return GetComponentFromIndex(world, index);
236235
}
237236

237+
static void InstantiateArtboard(RiveComponent* component)
238+
{
239+
dmRive::RiveSceneData* data = (dmRive::RiveSceneData*) component->m_Resource->m_Scene->m_Scene;
240+
241+
if (component->m_Resource->m_DDF->m_Artboard)
242+
{
243+
component->m_ArtboardInstance = data->m_File->artboardNamed(component->m_Resource->m_DDF->m_Artboard);
244+
245+
if (!component->m_ArtboardInstance)
246+
{
247+
dmLogWarning("Could not find artboard with name '%s'", component->m_Resource->m_DDF->m_Artboard);
248+
}
249+
}
250+
251+
if (!component->m_ArtboardInstance)
252+
{
253+
component->m_ArtboardInstance = data->m_File->artboardDefault();
254+
}
255+
}
256+
238257
dmGameObject::CreateResult CompRiveCreate(const dmGameObject::ComponentCreateParams& params)
239258
{
240259
RiveWorld* world = (RiveWorld*)params.m_World;
@@ -263,22 +282,8 @@ namespace dmRive
263282
component->m_DoRender = 0;
264283
component->m_RenderConstants = 0;
265284

266-
dmRive::RiveSceneData* data = (dmRive::RiveSceneData*) component->m_Resource->m_Scene->m_Scene;
267-
268-
if (component->m_Resource->m_DDF->m_Artboard)
269-
{
270-
component->m_ArtboardInstance = data->m_File->artboardNamed(component->m_Resource->m_DDF->m_Artboard);
285+
InstantiateArtboard(component);
271286

272-
if (!component->m_ArtboardInstance)
273-
{
274-
dmLogWarning("Could not find artboard with name '%s'", component->m_Resource->m_DDF->m_Artboard);
275-
}
276-
}
277-
278-
if (!component->m_ArtboardInstance)
279-
{
280-
component->m_ArtboardInstance = data->m_File->artboardDefault();
281-
}
282287
component->m_ArtboardInstance->advance(0.0f);
283288

284289
if (component->m_Resource->m_CreateGoBones)
@@ -578,7 +583,7 @@ namespace dmRive
578583
return dmGameObject::CREATE_RESULT_OK;
579584
}
580585

581-
static bool GetSender(RiveComponent* component, dmMessage::URL* out_sender)
586+
static bool GetSender(RiveComponent* component, dmMessage::URL* out_sender)
582587
{
583588
dmMessage::URL sender;
584589
sender.m_Socket = dmGameObject::GetMessageSocket(dmGameObject::GetCollection(component->m_Instance));
@@ -603,7 +608,6 @@ namespace dmRive
603608

604609
component->m_AnimationInstance.reset();
605610
component->m_StateMachineInstance.reset();
606-
607611
component->m_StateMachineInputs.SetSize(0);
608612
}
609613

@@ -1030,11 +1034,14 @@ namespace dmRive
10301034
CompRiveAnimationReset(component);
10311035
CompRiveClearCallback(component);
10321036

1037+
// For now, we need to create a new state machine instance when playing a state machine, because of nested artboards+state machine events
1038+
InstantiateArtboard(component);
1039+
10331040
component->m_Callback = callback_info;
10341041
component->m_CallbackId++;
10351042
component->m_AnimationInstance = nullptr;
1036-
component->m_StateMachineInstance = component->m_ArtboardInstance->stateMachineAt(state_machine_index);
10371043
component->m_AnimationPlaybackRate = playback_rate;
1044+
component->m_StateMachineInstance = component->m_ArtboardInstance->stateMachineAt(state_machine_index);
10381045

10391046
// update the list of current state machine inputs
10401047
uint32_t count = component->m_StateMachineInstance->inputCount();

defold-rive/src/comp_rive.h

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ namespace dmRive
5555
std::unique_ptr<rive::LinearAnimationInstance> m_AnimationInstance;
5656
std::unique_ptr<rive::StateMachineInstance> m_StateMachineInstance;
5757

58+
dmArray<std::unique_ptr<rive::StateMachineInstance>> m_AllSMSInstances;
59+
5860
dmGameObject::Playback m_AnimationPlayback;
5961
float m_AnimationPlaybackRate;
6062

defold-rive/src/private/renderer_context_metal.mm

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
#include <dmsdk/graphics/graphics_vulkan.h>
99

10-
#include <private/defold_graphics.h>
10+
#include <defold/defold_graphics.h>
1111

1212
#import <Metal/Metal.h>
1313
#import <QuartzCore/CAMetalLayer.h>

defold-rive/src/private/renderer_context_opengl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#include <rive/renderer/gl/render_context_gl_impl.hpp>
2525
#include <rive/renderer/gl/render_target_gl.hpp>
2626

27-
#include <private/defold_graphics.h>
27+
#include <defold/defold_graphics.h>
2828

2929
#ifdef RIVE_DESKTOP_GL
3030
#define GLFW_INCLUDE_NONE

defold-rive/src/private/renderer_private.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
#include <rive/renderer/rive_render_image.hpp>
1212

13-
#include <private/defold_graphics.h>
14-
#include <private/defold_render.h>
15-
#include <private/shaders/rivemodel_blit.vpc.gen.h>
16-
#include <private/shaders/rivemodel_blit.fpc.gen.h>
13+
#include <defold/defold_graphics.h>
14+
#include <defold/defold_render.h>
15+
#include <defold/shaders/rivemodel_blit.vpc.gen.h>
16+
#include <defold/shaders/rivemodel_blit.fpc.gen.h>
1717

1818
#include <common/vertices.h>
19-
#include <renderer.h>
19+
#include <defold/renderer.h>
2020

2121
#include <assert.h>
2222

defold-rive/src/private/renderer_wbgpu.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
#include <dmsdk/graphics/graphics_vulkan.h>
1111

12-
#include <private/defold_graphics.h>
12+
#include <defold/defold_graphics.h>
1313

1414
namespace dmRive
1515
{

defold-rive/src/res_rive_data.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#include <stdint.h>
1717
#include <dmsdk/dlib/array.h>
1818
#include <dmsdk/dlib/hash.h>
19-
#include "renderer.h"
19+
#include "defold/renderer.h"
2020

2121
namespace rive
2222
{

defold-rive/src/res_rive_scene.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include <dmsdk/dlib/log.h>
1919
#include <dmsdk/resource/resource.h>
2020

21-
#include "renderer.h"
21+
#include "defold/renderer.h"
2222

2323
namespace dmRive
2424
{

defold-rive/src/res_rive_scene.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
#include <dmsdk/gamesys/resources/res_textureset.h>
1717

18-
#include "renderer.h"
18+
#include "defold/renderer.h"
1919

2020
#include "rive_ddf.h" // generated from the rive_ddf.proto
2121

defold-rive/src/script_rive.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
#include "comp_rive.h"
2828
#include "rive_ddf.h"
2929

30-
#include <private/defold_graphics.h>
30+
#include <defold/defold_graphics.h>
3131

3232
namespace dmRive
3333
{

0 commit comments

Comments
 (0)