|
13 | 13 | (ns editor.spineext
|
14 | 14 | (:require [clojure.java.io :as io]
|
15 | 15 | [clojure.string :as str]
|
16 |
| - [editor.protobuf :as protobuf] |
17 | 16 | [dynamo.graph :as g]
|
18 |
| - [util.murmur :as murmur] |
19 | 17 | [editor.build-target :as bt]
|
20 |
| - [editor.graph-util :as gu] |
| 18 | + [editor.defold-project :as project] |
21 | 19 | [editor.geom :as geom]
|
22 |
| - [editor.material :as material] |
23 |
| - [editor.math :as math] |
24 | 20 | [editor.gl :as gl]
|
| 21 | + [editor.gl.pass :as pass] |
25 | 22 | [editor.gl.shader :as shader]
|
26 | 23 | [editor.gl.texture :as texture]
|
27 | 24 | [editor.gl.vertex :as vtx]
|
28 |
| - [editor.defold-project :as project] |
| 25 | + [editor.graph-util :as gu] |
| 26 | + [editor.material :as material] |
| 27 | + [editor.math :as math] |
| 28 | + [editor.outline :as outline] |
| 29 | + [editor.properties :as properties] |
| 30 | + [editor.protobuf :as protobuf] |
| 31 | + [editor.render :as render] |
29 | 32 | [editor.resource :as resource]
|
30 | 33 | [editor.resource-node :as resource-node]
|
31 |
| - [editor.scene-cache :as scene-cache] ; debug only |
32 |
| - [editor.scene-picking :as scene-picking] |
33 |
| - [editor.render :as render] |
| 34 | + [editor.types :as types] |
34 | 35 | [editor.validation :as validation]
|
35 | 36 | [editor.workspace :as workspace]
|
36 |
| - [editor.gl.pass :as pass] |
37 |
| - [editor.types :as types] |
38 |
| - [editor.outline :as outline] |
39 |
| - [editor.properties :as properties] |
40 |
| - [editor.rig :as rig]) |
| 37 | + [util.murmur :as murmur]) |
41 | 38 | (:import [com.dynamo.bob.textureset TextureSetGenerator$UVTransform]
|
42 |
| - [com.dynamo.bob.util BezierUtil RigUtil$Transform] |
| 39 | + [com.jogamp.opengl GL GL2] |
43 | 40 | [editor.gl.shader ShaderLifecycle]
|
44 | 41 | [editor.types AABB]
|
45 |
| - [com.jogamp.opengl GL GL2 GLContext] |
46 |
| - [org.apache.commons.io IOUtils] |
47 | 42 | [java.io IOException]
|
48 |
| - [java.util HashSet] |
49 |
| - [java.net URL] |
50 |
| - [javax.vecmath Matrix4d Vector3d Vector4d])) |
51 |
| - |
| 43 | + [javax.vecmath Matrix4d Vector3d Vector4d] |
| 44 | + [org.apache.commons.io IOUtils])) |
52 | 45 |
|
53 | 46 | (set! *warn-on-reflection* true)
|
54 | 47 |
|
|
187 | 180 |
|
188 | 181 |
|
189 | 182 | (g/defnk produce-spine-scene-pb [_node-id spine-json atlas]
|
190 |
| - {:spine_json (resource/resource->proj-path spine-json) |
191 |
| - :atlas (resource/resource->proj-path atlas)}) |
| 183 | + (protobuf/make-map-without-defaults spine-plugin-spinescene-cls |
| 184 | + :spine-json (resource/resource->proj-path spine-json) |
| 185 | + :atlas (resource/resource->proj-path atlas))) |
192 | 186 |
|
193 | 187 | ;; (defn- transform-positions [^Matrix4d transform mesh]
|
194 | 188 | ;; (let [p (Point3d.)]
|
|
466 | 460 | (inherits outline/OutlineNode)
|
467 | 461 | (property name g/Str (dynamic read-only? (g/constantly true)))
|
468 | 462 | (property position types/Vec3
|
469 |
| - (dynamic edit-type (g/constantly (properties/vec3->vec2 0.0))) |
| 463 | + (dynamic edit-type (g/constantly {:type types/Vec2})) |
470 | 464 | (dynamic read-only? (g/constantly true)))
|
471 | 465 | (property rotation g/Num (dynamic read-only? (g/constantly true)))
|
472 | 466 | (property scale types/Vec3
|
473 |
| - (dynamic edit-type (g/constantly (properties/vec3->vec2 1.0))) |
| 467 | + (dynamic edit-type (g/constantly {:type types/Vec2})) |
474 | 468 | (dynamic read-only? (g/constantly true)))
|
475 | 469 | (property length g/Num
|
476 | 470 | (dynamic read-only? (g/constantly true)))
|
|
509 | 503 | scale-y (.-scaleY spine-bone)
|
510 | 504 | length (.-length spine-bone)
|
511 | 505 | parent-graph-id (g/node-id->graph-id parent-id)
|
512 |
| - bone-tx-data (g/make-nodes parent-graph-id [bone [SpineBone :name name :position [x y 0] :rotation rotation :scale [scale-x scale-y 1.0] :length length]] |
| 506 | + bone-tx-data (g/make-nodes parent-graph-id [bone [SpineBone :name name :position [x y protobuf/float-zero] :rotation rotation :scale [scale-x scale-y protobuf/float-one] :length length]] |
513 | 507 | ; Hook this node into the parent's lists
|
514 | 508 | (g/connect bone :_node-id parent-id :nodes)
|
515 | 509 | (g/connect bone :node-outline parent-id :child-outlines)
|
|
636 | 630 | (handle-read-error error _node-id spine-json-resource))))
|
637 | 631 |
|
638 | 632 | (defn- sanitize-spine-scene [spine-scene-desc]
|
639 |
| - {:pre (map? spine-scene-desc)} ; Spine$SpineSceneDesc in map format. |
| 633 | + {:pre [(map? spine-scene-desc)]} ; Spine$SpineSceneDesc in map format. |
640 | 634 | (dissoc spine-scene-desc :sample-rate)) ; Deprecated field.
|
641 | 635 |
|
642 |
| -(defn- load-spine-scene [project self resource spine] |
643 |
| - (let [spine-resource (workspace/resolve-resource resource (:spine-json spine)) |
644 |
| - atlas (workspace/resolve-resource resource (:atlas spine)) |
645 |
| - ; used for previewing a .spinescene as it doesn't have a material specified |
646 |
| - material (workspace/resolve-resource resource spine-material-path)] |
| 636 | +(defn- load-spine-scene [project self resource spine-scene-desc] |
| 637 | + {:pre [(map? spine-scene-desc)]} ; Spine$SpineSceneDesc in map format. |
| 638 | + (let [resolve-resource #(workspace/resolve-resource resource %) |
| 639 | + default-material-resource (resolve-resource spine-material-path)] |
647 | 640 | (concat
|
648 |
| - (g/connect project :default-tex-params self :default-tex-params) |
649 |
| - (g/set-property self |
650 |
| - :spine-json spine-resource |
651 |
| - :atlas atlas |
652 |
| - :material material)))) |
| 641 | + (g/connect project :default-tex-params self :default-tex-params) |
| 642 | + (g/set-property self :material default-material-resource) |
| 643 | + (gu/set-properties-from-pb-map self spine-plugin-spinescene-cls spine-scene-desc |
| 644 | + spine-json (resolve-resource :spine-json) |
| 645 | + atlas (resolve-resource :atlas))))) |
653 | 646 |
|
654 | 647 | ;; (defn- make-spine-skeleton-scene [_node-id aabb gpu-texture scene-structure]
|
655 | 648 | ;; (let [scene {:node-id _node-id :aabb aabb}]
|
|
786 | 779 | ;;//////////////////////////////////////////////////////////////////////////////////////////////
|
787 | 780 |
|
788 | 781 | (g/defnk produce-model-pb [spine-scene-resource blend-mode default-animation skin material-resource create-go-bones playback-rate offset]
|
789 |
| - (cond-> {:spine-scene (resource/resource->proj-path spine-scene-resource) |
790 |
| - :default-animation default-animation |
791 |
| - :skin skin |
792 |
| - :material (resource/resource->proj-path material-resource) |
793 |
| - :blend-mode blend-mode |
794 |
| - :create-go-bones create-go-bones} |
795 |
| - |
796 |
| - (not= 1.0 playback-rate) |
797 |
| - (assoc :playback-rate playback-rate) |
798 |
| - |
799 |
| - (not= 0.0 offset) |
800 |
| - (assoc :offset offset))) |
| 782 | + (protobuf/make-map-without-defaults spine-plugin-spinemodel-cls |
| 783 | + :spine-scene (resource/resource->proj-path spine-scene-resource) |
| 784 | + :default-animation default-animation |
| 785 | + :skin skin |
| 786 | + :material (resource/resource->proj-path material-resource) |
| 787 | + :blend-mode blend-mode |
| 788 | + :create-go-bones create-go-bones |
| 789 | + :playback-rate playback-rate |
| 790 | + :offset offset)) |
801 | 791 |
|
802 | 792 | (defn ->skin-choicebox [spine-skins]
|
803 | 793 | (properties/->choicebox (cons "" (remove (partial = "default") spine-skins))))
|
|
840 | 830 | (defn- build-spine-model [resource dep-resources user-data]
|
841 | 831 | (let [pb (:proto-msg user-data)
|
842 | 832 | pb (reduce #(assoc %1 (first %2) (second %2)) pb (map (fn [[label res]] [label (resource/proj-path (get dep-resources res))]) (:dep-resources user-data)))]
|
843 |
| - {:resource resource :content (protobuf/map->bytes (workspace/load-class! "com.dynamo.spine.proto.Spine$SpineModelDesc") pb)})) |
| 833 | + {:resource resource :content (protobuf/map->bytes spine-plugin-spinemodel-cls pb)})) |
844 | 834 |
|
845 | 835 | (g/defnk produce-model-build-targets [_node-id own-build-errors resource model-pb spine-scene-resource material-resource dep-build-targets]
|
846 | 836 | (g/precluding-errors own-build-errors
|
|
856 | 846 | :dep-resources dep-resources}
|
857 | 847 | :deps dep-build-targets})])))
|
858 | 848 |
|
859 |
| -(defn load-spine-model [project self resource spine] |
860 |
| - (let [resolve-fn (partial workspace/resolve-resource resource) |
861 |
| - spine (-> spine |
862 |
| - (update :spine-scene resolve-fn) |
863 |
| - (update :material resolve-fn))] |
| 849 | +(defn load-spine-model [project self resource spine-model-desc] |
| 850 | + {:pre [(map? spine-model-desc)]} ; Spine$SpineModelDesc in map format. |
| 851 | + (let [resolve-resource #(workspace/resolve-resource resource %)] |
864 | 852 | (concat
|
865 |
| - (g/connect project :default-tex-params self :default-tex-params) |
866 |
| - (for [[k v] spine] |
867 |
| - (g/set-property self k v))))) |
| 853 | + (g/connect project :default-tex-params self :default-tex-params) |
| 854 | + (gu/set-properties-from-pb-map self spine-plugin-spinemodel-cls spine-model-desc |
| 855 | + spine-scene (resolve-resource :spine-scene) |
| 856 | + default-animation :default-animation |
| 857 | + skin :skin |
| 858 | + blend-mode :blend-mode |
| 859 | + material (resolve-resource (:material :or spine-material-path)) |
| 860 | + create-go-bones :create-go-bones |
| 861 | + playback-rate :playback-rate |
| 862 | + offset :offset)))) |
868 | 863 |
|
869 | 864 | (defn- step-animation
|
870 | 865 | [state dt spine-data-handle animation skin]
|
|
925 | 920 | (validate-model-skin _node-id spine-scene skins skin)))
|
926 | 921 | (dynamic edit-type (g/fnk [skins] (->skin-choicebox skins))))
|
927 | 922 | (property create-go-bones g/Bool (default false))
|
928 |
| - (property playback-rate g/Num (default 1.0)) |
929 |
| - (property offset g/Num (default 0.0) |
| 923 | + (property playback-rate g/Num (default (float 1.0))) |
| 924 | + (property offset g/Num (default (float 0.0)) |
930 | 925 | (dynamic edit-type (g/constantly {:type :slider
|
931 | 926 | :min 0.0
|
932 | 927 | :max 1.0
|
|
1000 | 995 |
|
1001 | 996 | (defn register-resource-types [workspace]
|
1002 | 997 | (concat
|
1003 |
| - (resource-node/register-ddf-resource-type workspace |
1004 |
| - :ext spine-scene-ext |
1005 |
| - :label "Spine Scene" |
1006 |
| - :node-type SpineSceneNode |
1007 |
| - :ddf-type spine-plugin-spinescene-cls |
1008 |
| - :sanitize-fn sanitize-spine-scene |
1009 |
| - :load-fn load-spine-scene |
1010 |
| - :icon spine-scene-icon |
1011 |
| - :view-types [:scene :text] |
1012 |
| - :view-opts {:scene {:grid true}} |
1013 |
| - :template "/defold-spine/editor/resources/templates/template.spinescene") |
1014 |
| - (resource-node/register-ddf-resource-type workspace |
1015 |
| - :ext spine-model-ext |
1016 |
| - :label "Spine Model" |
1017 |
| - :node-type SpineModelNode |
1018 |
| - :ddf-type spine-plugin-spinemodel-cls |
1019 |
| - :load-fn load-spine-model |
1020 |
| - :icon spine-model-icon |
1021 |
| - :view-types [:scene :text] |
1022 |
| - :view-opts {:scene {:grid true}} |
1023 |
| - :tags #{:component} |
1024 |
| - :tag-opts {:component {:transform-properties #{:position :rotation :scale}}} |
1025 |
| - :template "/defold-spine/editor/resources/templates/template.spinemodel") |
1026 |
| - (workspace/register-resource-type workspace |
1027 |
| - :ext spine-json-ext |
1028 |
| - :node-type SpineSceneJson |
1029 |
| - :textual? true |
1030 |
| - :load-fn load-spine-json |
1031 |
| - :icon spine-json-icon |
1032 |
| - :view-types [:default] |
1033 |
| - :tags #{:embeddable}))) |
1034 |
| - |
| 998 | + (resource-node/register-ddf-resource-type workspace |
| 999 | + :ext spine-scene-ext |
| 1000 | + :label "Spine Scene" |
| 1001 | + :node-type SpineSceneNode |
| 1002 | + :ddf-type spine-plugin-spinescene-cls |
| 1003 | + :read-defaults false |
| 1004 | + :sanitize-fn sanitize-spine-scene |
| 1005 | + :load-fn load-spine-scene |
| 1006 | + :icon spine-scene-icon |
| 1007 | + :view-types [:scene :text] |
| 1008 | + :view-opts {:scene {:grid true}} |
| 1009 | + :template "/defold-spine/editor/resources/templates/template.spinescene") |
| 1010 | + (resource-node/register-ddf-resource-type workspace |
| 1011 | + :ext spine-model-ext |
| 1012 | + :label "Spine Model" |
| 1013 | + :node-type SpineModelNode |
| 1014 | + :ddf-type spine-plugin-spinemodel-cls |
| 1015 | + :read-defaults false |
| 1016 | + :load-fn load-spine-model |
| 1017 | + :icon spine-model-icon |
| 1018 | + :view-types [:scene :text] |
| 1019 | + :view-opts {:scene {:grid true}} |
| 1020 | + :tags #{:component} |
| 1021 | + :tag-opts {:component {:transform-properties #{:position :rotation :scale}}} |
| 1022 | + :template "/defold-spine/editor/resources/templates/template.spinemodel") |
| 1023 | + (workspace/register-resource-type workspace |
| 1024 | + :ext spine-json-ext |
| 1025 | + :node-type SpineSceneJson |
| 1026 | + :textual? true |
| 1027 | + :load-fn load-spine-json |
| 1028 | + :icon spine-json-icon |
| 1029 | + :view-types [:default]))) |
1035 | 1030 |
|
1036 | 1031 | ; The plugin
|
1037 | 1032 | (defn load-plugin-spine [workspace]
|
|
0 commit comments