Skip to content

Commit 2fb3018

Browse files
authored
Make all artboard animations addressable from engine and editor (#128)
* Add anim+sm lists per artboard * Add editor support for setting a state machine or animation from a different artboard
1 parent a0b50c2 commit 2fb3018

File tree

13 files changed

+227
-109
lines changed

13 files changed

+227
-109
lines changed

defold-rive/editor/src/rive.clj

+43-34
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,7 @@
170170

171171
(property content g/Any)
172172
(property rive-handle g/Any) ; The cpp pointer
173-
(property animations g/Any)
174-
(property state-machine-ids g/Any)
173+
(property artboard-id-list g/Any)
175174
(property aabb g/Any)
176175
(property vertices g/Any)
177176
(property bones g/Any)
@@ -220,15 +219,25 @@
220219
; bones is a list of root Rive$Bone (Rive.java)
221220
(mapcat (fn [bone] (create-bone-hierarchy parent-id bone)) bones))
222221

222+
;; Converts a list of java objects into a clojure map where we can get
223+
;; all the animations and state machines based on an artboard name.
224+
(defn- to-artboard-id-list [artboard-id-list-from-java]
225+
(into {}
226+
(map (fn [id-list]
227+
[(.-artboardId id-list)
228+
{:animation-ids (into [] (.-animations id-list))
229+
:state-machine-ids (mapv (fn [sm] (.-name sm)) (.-stateMachines id-list))}])
230+
artboard-id-list-from-java)))
231+
223232
; Loads the .riv file
224233
(defn- load-rive-file
225234
[project node-id resource]
226235
(let [content (resource->bytes resource)
227236
rive-handle (plugin-load-file content (resource/resource->proj-path resource))
228-
animations (.-animations rive-handle)
237+
artboard-id-list-from-java (.-artboardId rive-handle)
238+
artboard-id-list (to-artboard-id-list artboard-id-list-from-java)
229239
artboards (.-artboards rive-handle)
230-
state-machines (.-stateMachines rive-handle)
231-
state-machine-ids (map (fn [state-machine] (.-name state-machine)) state-machines)
240+
232241
_ (.Update rive-handle 0.0)
233242
aabb (convert-aabb (.-aabb rive-handle))
234243
bones (.-bones rive-handle)
@@ -237,8 +246,7 @@
237246
(g/set-property node-id :content content)
238247
(g/set-property node-id :rive-handle rive-handle)
239248
(g/set-property node-id :artboards artboards)
240-
(g/set-property node-id :animations animations)
241-
(g/set-property node-id :state-machine-ids state-machine-ids)
249+
(g/set-property node-id :artboard-id-list artboard-id-list)
242250
(g/set-property node-id :aabb aabb)
243251
(g/set-property node-id :bones bones))
244252

@@ -542,7 +550,7 @@
542550
(assert (= (:pass render-args) pass/outline))
543551
(render/render-aabb-outline gl render-args ::rive-outline renderables rcount))
544552

545-
(g/defnk produce-main-scene [_node-id material-shader rive-file-handle rive-anim-ids aabb gpu-texture default-tex-params rive-scene-pb scene-structure texture-set-pb]
553+
(g/defnk produce-main-scene [_node-id material-shader rive-file-handle aabb gpu-texture default-tex-params rive-scene-pb scene-structure texture-set-pb]
546554
(when rive-file-handle
547555
(let [blend-mode :blend-mode-alpha]
548556
(assoc {:node-id _node-id :aabb aabb}
@@ -590,8 +598,7 @@
590598
[:rive-handle :rive-file-handle]
591599
[:structure :scene-structure]
592600
[:artboards :rive-artboards]
593-
[:animations :rive-anim-ids]
594-
[:state-machine-ids :rive-state-machine-ids]
601+
[:artboard-id-list :rive-artboard-id-list]
595602
[:aabb :aabb]
596603
[:node-outline :source-outline]
597604
[:build-targets :dep-build-targets])))
@@ -628,8 +635,7 @@
628635
(input rive-file-resource resource/Resource)
629636
(input rive-file-handle g/Any)
630637
(input rive-artboards g/Any)
631-
(input rive-anim-ids g/Any)
632-
(input rive-state-machine-ids g/Any)
638+
(input rive-artboard-id-list g/Any)
633639
(input aabb g/Any)
634640
(input atlas-resource resource/Resource)
635641

@@ -653,8 +659,7 @@
653659
(output material-shader ShaderLifecycle (gu/passthrough material-shader))
654660
(output rive-file-handle g/Any :cached (gu/passthrough rive-file-handle))
655661
(output rive-artboards g/Any :cached (gu/passthrough rive-artboards))
656-
(output rive-anim-ids g/Any :cached (gu/passthrough rive-anim-ids))
657-
(output rive-state-machine-ids g/Any :cached (gu/passthrough rive-state-machine-ids))
662+
(output rive-artboard-id-list g/Any :cached (gu/passthrough rive-artboard-id-list))
658663
(output aabb g/Any :cached (gu/passthrough aabb)))
659664

660665
; .rivescene
@@ -695,37 +700,39 @@
695700
artboard
696701
(set rive-artboards))))
697702

698-
(defn- validate-model-default-animation [node-id rive-scene rive-anim-ids default-animation]
703+
(defn- validate-model-default-animation [node-id rive-scene animation-ids default-animation]
699704
(when (and rive-scene (not-empty default-animation))
700705
(validation/prop-error :fatal node-id :default-animation
701706
(fn [anim ids]
702707
(when-not (contains? ids anim)
703708
(format "animation '%s' could not be found in the specified rive scene" anim)))
704709
default-animation
705-
(set rive-anim-ids))))
710+
(set animation-ids))))
706711

707-
(defn- validate-model-default-state-machine [node-id rive-scene rive-state-machine-ids default-state-machine]
712+
(defn- validate-model-default-state-machine [node-id rive-scene state-machine-ids default-state-machine]
708713
(when (and rive-scene (not-empty default-state-machine))
709714
(validation/prop-error :fatal node-id :default-state-machine
710715
(fn [anim ids]
711716
(when-not (contains? ids anim)
712-
(format "state machine '%s' could not be found in the specified rive scene" anim)))
717+
(format "state machine '%s' could not be found in the specified artboard or rive scene" anim)))
713718
default-state-machine
714-
(set rive-state-machine-ids))))
719+
(set state-machine-ids))))
715720

716721
(defn- validate-model-material [node-id material]
717722
(prop-resource-error node-id :material material "Material"))
718723

719724
(defn- validate-model-rive-scene [node-id rive-scene]
720725
(prop-resource-error node-id :scene rive-scene "Rive Scene"))
721726

722-
(g/defnk produce-model-own-build-errors [_node-id artboard default-animation default-state-machine material rive-artboards rive-anim-ids rive-state-machine-ids rive-scene scene-structure]
723-
(g/package-errors _node-id
727+
(g/defnk produce-model-own-build-errors [_node-id artboard default-animation default-state-machine material rive-artboards rive-artboard-id-list rive-scene scene-structure]
728+
(let [state-machine-ids (:state-machine-ids (get rive-artboard-id-list artboard))
729+
animation-ids (:animation-ids (get rive-artboard-id-list artboard))]
730+
(g/package-errors _node-id
724731
(validate-model-material _node-id material)
725732
(validate-model-rive-scene _node-id rive-scene)
726733
(validate-model-artboard _node-id rive-scene rive-artboards artboard)
727-
(validate-model-default-animation _node-id rive-scene rive-anim-ids default-animation)
728-
(validate-model-default-state-machine _node-id rive-scene rive-state-machine-ids default-state-machine)))
734+
(validate-model-default-animation _node-id rive-scene animation-ids default-animation)
735+
(validate-model-default-state-machine _node-id rive-scene state-machine-ids default-state-machine))))
729736

730737
(defn- build-rive-model [resource dep-resources user-data]
731738
(let [pb (:proto-msg user-data)
@@ -759,8 +766,7 @@
759766
[:main-scene :rive-main-scene]
760767
[:rive-file-handle :rive-file-handle]
761768
[:rive-artboards :rive-artboards]
762-
[:rive-anim-ids :rive-anim-ids]
763-
[:rive-state-machine-ids :rive-state-machine-ids]
769+
[:rive-artboard-id-list :rive-artboard-id-list]
764770
[:build-targets :dep-build-targets]
765771
[:anim-data :anim-data]
766772
[:scene-structure :scene-structure])))
@@ -781,20 +787,24 @@
781787
(dynamic edit-type (g/constantly {:type resource/Resource :ext "material"}))
782788
(dynamic error (g/fnk [_node-id material]
783789
(validate-model-material _node-id material))))
790+
784791
(property default-state-machine g/Str (default (protobuf/default rive-model-pb-class :default-state-machine))
785-
(dynamic error (g/fnk [_node-id rive-state-machine-ids default-state-machine rive-scene]
786-
(validate-model-default-state-machine _node-id rive-scene rive-state-machine-ids default-state-machine)))
787-
(dynamic edit-type (g/fnk [rive-state-machine-ids] (properties/->choicebox (cons "" rive-state-machine-ids)))))
792+
(dynamic error (g/fnk [_node-id artboard rive-artboard-id-list default-state-machine rive-scene]
793+
(validate-model-default-state-machine _node-id rive-scene (:state-machine-ids (get rive-artboard-id-list artboard)) default-state-machine)))
794+
(dynamic edit-type (g/fnk [artboard rive-artboard-id-list]
795+
(properties/->choicebox (cons "" (:state-machine-ids (get rive-artboard-id-list artboard)))))))
796+
797+
(property default-animation g/Str
798+
(dynamic error (g/fnk [_node-id artboard rive-artboard-id-list default-animation rive-scene]
799+
(validate-model-default-animation _node-id rive-scene (:animation-ids (get rive-artboard-id-list artboard)) default-animation)))
800+
(dynamic edit-type (g/fnk [artboard rive-artboard-id-list]
801+
(properties/->choicebox (cons "" (:animation-ids (get rive-artboard-id-list artboard)))))))
788802

789803
(property artboard g/Str (default (protobuf/default rive-model-pb-class :artboard))
790804
(dynamic error (g/fnk [_node-id rive-artboards artboard rive-scene]
791805
(validate-model-artboard _node-id rive-scene rive-artboards artboard)))
792806
(dynamic edit-type (g/fnk [rive-artboards] (properties/->choicebox (cons "" rive-artboards)))))
793807

794-
(property default-animation g/Str ; Required protobuf field.
795-
(dynamic error (g/fnk [_node-id rive-anim-ids default-animation rive-scene]
796-
(validate-model-default-animation _node-id rive-scene rive-anim-ids default-animation)))
797-
(dynamic edit-type (g/fnk [rive-anim-ids] (properties/->choicebox (cons "" rive-anim-ids)))))
798808
(property create-go-bones g/Bool (default (protobuf/default rive-model-pb-class :create-go-bones)))
799809

800810
(property coordinate-system g/Any (default (protobuf/default rive-model-pb-class :coordinate-system))
@@ -812,8 +822,7 @@
812822
(input rive-main-scene g/Any)
813823
(input scene-structure g/Any)
814824
(input rive-artboards g/Any)
815-
(input rive-anim-ids g/Any)
816-
(input rive-state-machine-ids g/Any)
825+
(input rive-artboard-id-list g/Any)
817826
(input texture-set-pb g/Any)
818827
(input atlas-resource resource/Resource)
819828
(input material-resource resource/Resource)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
674 Bytes
Binary file not shown.

defold-rive/pluginsrc/com/defold/bob/pipeline/Rive.java

+23-13
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ public static class StateMachine {
7575
public StateMachineInput[] inputs;
7676
}
7777

78+
public static class ArtboardIdList {
79+
public String artboardId;
80+
public StateMachine[] stateMachines;
81+
public String[] animations;
82+
}
83+
7884
public static class Bone {
7985
public String name;
8086
public int index;
@@ -99,12 +105,10 @@ public static class Bone {
99105
public static class RiveFile {
100106
public String path;
101107
public long pointer;
102-
103108
public Aabb aabb;
104109
public float[] vertices;
105110
public int[] indices;
106-
public String[] animations;
107-
public StateMachine[] stateMachines;
111+
public ArtboardIdList[] artboardId;
108112
public Bone[] bones;
109113
public RenderObject[] renderObjects;
110114
public byte[] texture_set_bytes;
@@ -319,19 +323,25 @@ public static void main(String[] args) throws IOException {
319323

320324
System.out.printf("--------------------------------\n");
321325

322-
System.out.printf("Num animations: %d\n", rive_file.animations.length);
323-
for (String animation : rive_file.animations)
324-
{
326+
System.out.printf("Num artboard id lists: %d\n", rive_file.artboardId.length);
327+
for (ArtboardIdList artboardIdEntry : rive_file.artboardId) {
325328
PrintIndent(1);
326-
System.out.printf("%s\n", animation);
327-
}
329+
System.out.printf("Id: %s\n", artboardIdEntry.artboardId);
328330

329-
System.out.printf("--------------------------------\n");
331+
PrintIndent(1);
332+
System.out.printf("Num animations: %d\n", artboardIdEntry.animations.length);
330333

331-
System.out.printf("Num state machines: %d\n", rive_file.stateMachines.length);
332-
for (StateMachine stateMachine : rive_file.stateMachines)
333-
{
334-
DebugStateMachine(stateMachine);
334+
for (String animation : artboardIdEntry.animations) {
335+
PrintIndent(2);
336+
System.out.printf("%s\n", animation);
337+
}
338+
339+
PrintIndent(1);
340+
System.out.printf("Num state machines: %d\n", artboardIdEntry.stateMachines.length);
341+
342+
for (StateMachine stateMachine : artboardIdEntry.stateMachines) {
343+
DebugStateMachine(stateMachine);
344+
}
335345
}
336346

337347
System.out.printf("--------------------------------\n");

defold-rive/pluginsrc/rive_file.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ RiveFile* LoadFileFromBuffer(const void* buffer, size_t buffer_size, const char*
3434
&result,
3535
&atlas_resolver);
3636

37-
if (result != rive::ImportResult::success) {
38-
//file = 0;
37+
if (result != rive::ImportResult::success)
38+
{
3939
dmLogError("Failed to load rive file '%s'", path);
4040
delete factory;
4141
return 0;
@@ -45,7 +45,8 @@ RiveFile* LoadFileFromBuffer(const void* buffer, size_t buffer_size, const char*
4545
out->m_Path = 0;
4646
out->m_File = 0;
4747

48-
if (file) {
48+
if (file)
49+
{
4950
out->m_Path = strdup(path);
5051
out->m_File = file.release();
5152
out->m_Factory = factory;
@@ -321,6 +322,10 @@ void SetArtboard(RiveFile* rive_file, const char* artboard)
321322
return;
322323
}
323324

325+
rive_file->m_ArtboardInstance.reset();
326+
rive_file->m_AnimationInstance.reset();
327+
rive_file->m_StateMachineInstance.reset();
328+
324329
if (artboard != 0)
325330
{
326331
rive_file->m_ArtboardInstance = rive_file->m_File->artboardNamed(artboard);

0 commit comments

Comments
 (0)