├── .gitattributes
├── LICENSE
├── README.md
├── art
├── weird_child.mhm
├── weird_child.thumb
├── weirdchild.psd
├── weirdchild_render_1.png
├── weirdchild_render_2.png
└── weirdchild_render_3.png
└── project
├── addons
└── messdeform
│ ├── MessyJoint.gd
│ ├── MessyJoint.png
│ ├── MessyJointManager.gd
│ ├── MessyJointManager.png
│ ├── MessyPolygon.gd
│ ├── MessyPolygon.png
│ ├── plugin.cfg
│ ├── plugin.gd
│ └── src
│ ├── MessyJoint.psd
│ ├── MessyJointManager.psd
│ └── MessyPolygon.psd
├── engine.cfg
├── icon.png
├── icon.png.flags
├── weirdchild.png
└── weirdchild.tscn
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text eol=lf
2 | # General
3 | *.png binary
4 | # Photoshop
5 | *.psd binary
6 | # MakeHuman
7 | *.mhm binary
8 | *.thumb binary
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016 Pedro J. Estébanez
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ~MessDeform: Hacky deformable mesh engine for Godot~ [Deprecated]
2 |
3 | ## Motivation
4 |
5 | For 2D game development is often desirable to be able to do skinned bone-based animation on characters. The Godot engine is not expected to be able to support that until the 3.0 release. It currently lacks a 2D deformable mesh node so there is no hope in being able to import animations from popular 2D animation tools and not even creating them right in it.
6 |
7 | So currently you can only perform cut-out animation in Godot, which is good for mechanical characters like robots but not usable for organic stuff like actual people.
8 |
9 | ### Cut-out animation vs. animation powered by *MessDeform*
10 |
11 |
12 |
13 | ## The project
14 |
15 | *MessDeform* is a plugin for Godot that abuses the `Polygon2D` node type trying to work with a number of them as if they formed a true 2D mesh. By doing what it achieves continuity of the character image at the joints, where the cut-out technique would disrupt them.
16 |
17 | Also it improves `Polygon2D` triangularization so instead of building it as a triangle fan it renders a triangle strip around the baricenter for less distortion.
18 |
19 | Obviously, *MessDeform* cannot overcome the limitations imposed by the lack of a true deformation system so its results are far from perfect. Anyway for ceratin use case it does the trick: very soft bodies, environments in which the lighting helps in hiding the distortion, etc.
20 |
21 | Those imperfections and the the reason behind the pun in the title of the project.
22 |
23 | ## Usage
24 |
25 | ### 1. Installing/enabling plugin
26 |
27 | Copy the *`messdeform`* directory into your project *`addons`* directory and enable the plugin in the Godot editor preferences.
28 |
29 | ### 2. Creating the character
30 |
31 | *NOTE: This is a lot of information but, once more, having a look at how the example is assembled everything will get crystal clear.*
32 |
33 | Your character will be composed of pieces arranged in one or more segments. In the case of the walking character you see in the sample image, there are three segments:
34 |
35 |
36 |
37 | Segment | Pieces |
38 |
39 |
40 | Main | Head, torso, front thigh, front calf, front foot |
41 |
42 |
43 | Back leg | Back thigh, back calf, back foot |
44 |
45 |
46 | Front arm | Upper arm, lower arm, hand |
47 |
48 |
49 | Back arm | Upper arm, lower arm, hand |
50 |
51 |
52 |
53 | The important thing here is that **every piece must be created as a `MessyPolygon` (a derivation of `Polygon2D`) with four vertices, arranged in clockwise order from top-left** so the top edge goes from vertex 0 to 1 and the bottom one from 3 to 2. That doesn't mean you can only create vertical segments; you can still orient a segment in any angle as long as the 3-2 edge of a piece matches the 0-1 edge of the next.
54 |
55 | This plugin works on the shared edge between adjacent pieces so you have to respect the segment concept. In other words, **joints involve exactly two pieces, which must have a parent-child relationship in the node hierarchy**.
56 |
57 | Had the character view front or back instead of a side one, the arms of the legs, despite in regular tools you'd been able to set it as a whole mesh, both arms or both legs would have needed a separate segment for each.
58 |
59 | Furthermore, **adjacent pieces cannot have different sizes at their shared edge**. In other words, for a vertical segment pieces must be perfectly stacked. For instance, when joining a thigh with a calf, the calf piece must be as wide as that of the thigh, leaving as much transparent space at the sides as needed.
60 |
61 | As another rule, **the UVs of your polygons must match its position**. The best way of achieving this is by having all the pieces in the same texture or at least each entire segment in its own dedicated texture. Actually this is pretty natural.
62 |
63 | #### DATA LOSS WARNING!!!
64 |
65 | *MessDeform* needs the UVs to match the positions because it works by changing the latter to make the polygons' boundaries match. The UVs are untouched and serve for it as the original copy of the data.
66 |
67 | ### 3. Applying *MessDeform*
68 |
69 | Wherever you set fit in your scene you have to instance a `MessyJointManager` node. Its only attribute is *Enabled* which lets you switch off the engine if for some reason you need to see your character as it is to work in cut-out mode to see something more clearly or so.
70 |
71 | Now for every joint (shared edge between parent-child adjacent pieces) you have to add one instance of `MessyJoint` as a child of the `MessyJointManager`.
72 |
73 | For each one you have to pick the parent and child pieces. *MessDeform* assumes the parent is the one whose 3-2 edge matches the 0-1 of the child. For any other purpuse, parentship does not matter.
74 |
75 | If you need to invert this relationship you could check the *Inverse* option of the `MessyJoint`. In the sample project that is done for the torso-head joint. As the torso is already the parent of the thigh the only way of adding another child would be at the opposite edge but you cannot just switch parent-child nodes because the head goes on top of the torso (its 3-2 edge fits the 0-1 edge of the torso).
76 |
77 | ### 4. Adjusting weights
78 |
79 | #### Joints
80 |
81 | `MessyJoint`s also have a *Parent Weight* attribute you can tweak. 1 means only the parent will be deformed by this joint; 0 means the same for the child.
82 |
83 | In many cases you'll want to leave it at 0.5 because it's the value producing less distortion. Nonetheless, for joints involving a terminal piece, like torso-head, you may get better results with values near 1. For small terminal child pieces it can be even necessary to do that so they don't degenerate and result in assertion errors about bad polygon in the Godot console.
84 |
85 | #### Polygons
86 |
87 | `MessyPolygon` has a weight setting for each vertex. With those you can control where the baricenter of the triangulated polygon will be. That way you can ponderate texture deformation across the polygon to reduce it on the worst cases. Furthermore, you can even keyframe these values for a fine-grained control, though not usually necessary.
88 |
89 | ## If something goes wrong
90 |
91 | If for any reason the engine started deforming the character in strange ways and you are sure your setup is right, you can force a `MessyJointManager` to reset by selecting it in the editor and clicking the *Reset* button that will appear in the editor toolbar or by disabling and re-enabling it.
92 |
93 | ## In case of accident
94 |
95 | If some piece stops being managed by *MessDeform* because you pick another one for a `MessyJoint` or you simply remove the joint without having reseted the character posture, you will be left with a semi-permanent deformed state.
96 |
97 | The easiest way of recovering its original geometry is to select the ruined `MessyPolygon` and opening the UV editor (*UV* button in the editor toolbar). Then pick *Edit -> UV to Polygon*. That will serve as an effective recovery of the original data.
98 |
--------------------------------------------------------------------------------
/art/weird_child.mhm:
--------------------------------------------------------------------------------
1 | # Written by MakeHuman 1.1.0
2 | version v1.1.0
3 | tags weird_child
4 | camera 0.0 90.0 0.00438818414171 0.531980824354 0.422565715929 1.325
5 | modifier torso/torso-vshape-decr|incr -0.091933
6 | modifier armslegs/l-hand-fingers-length-decr|incr -0.021580
7 | modifier nose/nose-flaring-decr|incr -0.125994
8 | modifier armslegs/l-leg-valgus-decr|incr -0.070637
9 | modifier mouth/mouth-dimples-in|out -0.395220
10 | modifier armslegs/l-lowerarm-scale-vert-decr|incr 0.022345
11 | modifier breast/breast-trans-down|up 0.320016
12 | modifier nose/nose-width1-decr|incr 0.027513
13 | modifier armslegs/l-upperarm-scale-vert-decr|incr 0.035219
14 | modifier eyes/r-eye-scale-decr|incr -0.122991
15 | modifier stomach/stomach-tone-decr|incr -0.078505
16 | modifier armslegs/r-upperleg-muscle-decr|incr 0.091988
17 | modifier ears/l-ear-lobe-decr|incr 0.039563
18 | modifier eyes/l-eye-corner2-down|up -0.116725
19 | modifier cheek/r-cheek-volume-decr|incr -0.307094
20 | modifier eyes/l-eye-bag-in|out 0.528421
21 | modifier eyes/l-eye-trans-down|up -0.147047
22 | modifier nose/nose-volume-decr|incr -0.200006
23 | modifier armslegs/r-foot-scale-decr|incr -0.166948
24 | modifier eyes/l-eye-eyefold-angle-down|up 0.228520
25 | modifier armslegs/r-upperarm-scale-horiz-decr|incr 0.245469
26 | modifier eyes/l-eye-epicanthus-in|out -0.082457
27 | modifier ears/r-ear-shape-pointed|triangle -0.004610
28 | modifier eyes/r-eye-height1-decr|incr 0.110842
29 | modifier nose/nose-trans-backward|forward -0.079391
30 | modifier eyes/r-eye-corner1-down|up 0.140873
31 | modifier macrodetails-universal/Muscle 0.407342
32 | modifier ears/r-ear-scale-vert-decr|incr -0.028017
33 | modifier mouth/mouth-scale-horiz-decr|incr 0.087582
34 | modifier macrodetails/African 0.372887
35 | modifier ears/r-ear-shape-square|round 0.061307
36 | modifier armslegs/r-leg-valgus-decr|incr -0.022114
37 | modifier cheek/r-cheek-trans-down|up -0.141653
38 | modifier neck/neck-trans-down|up 0.099381
39 | modifier hip/hip-scale-depth-decr|incr 0.082101
40 | modifier macrodetails-proportions/BodyProportions 0.810000
41 | modifier chin/chin-width-decr|incr -0.181935
42 | modifier ears/r-ear-flap-decr|incr 0.095740
43 | modifier mouth/mouth-laugh-lines-in|out 0.258269
44 | modifier armslegs/r-upperleg-fat-decr|incr -0.185381
45 | modifier torso/torso-scale-horiz-decr|incr 0.277418
46 | modifier breast/nipple-point-decr|incr -0.227903
47 | modifier neck/neck-scale-depth-decr|incr -0.294287
48 | modifier eyes/r-eye-trans-in|out 0.226569
49 | modifier torso/torso-trans-backward|forward -0.416783
50 | modifier neck/neck-scale-horiz-decr|incr -0.005508
51 | modifier armslegs/r-hand-fingers-length-decr|incr -0.062710
52 | modifier nose/nose-trans-down|up 0.263201
53 | modifier head/head-scale-depth-decr|incr -0.176309
54 | modifier eyes/r-eye-bag-decr|incr 0.075318
55 | modifier ears/l-ear-trans-down|up -0.112760
56 | modifier mouth/mouth-lowerlip-ext-down|up 0.101134
57 | modifier armslegs/r-lowerleg-scale-horiz-decr|incr 0.269254
58 | modifier hip/hip-trans-in|out 0.036224
59 | modifier macrodetails/Gender 0.921000
60 | modifier torso/torso-scale-vert-decr|incr -0.095498
61 | modifier armslegs/l-upperarm-shoulder-muscle-decr|incr -0.240072
62 | modifier head/head-angle-in|out 0.058862
63 | modifier forehead/forehead-trans-backward|forward 0.044295
64 | modifier pelvis/bulge-decr|incr -0.001047
65 | modifier nose/nose-point-width-decr|incr 0.006865
66 | modifier macrodetails-height/Height 0.500000
67 | modifier eyes/r-eye-eyefold-angle-down|up 0.155765
68 | modifier breast/BreastSize 0.478842
69 | modifier armslegs/l-hand-fingers-diameter-decr|incr 0.140287
70 | modifier cheek/r-cheek-inner-decr|incr -0.170821
71 | modifier eyes/l-eye-corner1-down|up 0.095625
72 | modifier mouth/mouth-scale-vert-decr|incr 0.129381
73 | modifier mouth/mouth-lowerlip-middle-down|up 0.153345
74 | modifier ears/r-ear-scale-decr|incr -0.124501
75 | modifier armslegs/l-upperleg-fat-decr|incr -0.237904
76 | modifier head/head-invertedtriangular 0.012986
77 | modifier cheek/l-cheek-inner-decr|incr -0.153290
78 | modifier chin/chin-cleft-decr|incr -0.307620
79 | modifier armslegs/l-foot-trans-in|out 0.385918
80 | modifier armslegs/r-hand-fingers-diameter-decr|incr 0.054883
81 | modifier nose/nose-hump-decr|incr -0.138757
82 | modifier eyes/r-eye-epicanthus-in|out 0.039061
83 | modifier nose/nose-septumangle-decr|incr 0.067004
84 | modifier torso/torso-muscle-dorsi-decr|incr 0.271428
85 | modifier armslegs/r-lowerarm-scale-vert-decr|incr 0.008614
86 | modifier armslegs/l-foot-scale-decr|incr -0.185618
87 | modifier armslegs/l-hand-scale-decr|incr -0.119591
88 | modifier nose/nose-base-down|up 0.312015
89 | modifier eyes/l-eye-bag-decr|incr 0.066104
90 | modifier cheek/r-cheek-bones-decr|incr 0.248889
91 | modifier torso/torso-trans-down|up -0.230239
92 | modifier armslegs/r-upperleg-scale-horiz-decr|incr 0.141840
93 | modifier torso/torso-muscle-pectoral-decr|incr -0.085244
94 | modifier forehead/forehead-scale-vert-decr|incr 0.207274
95 | modifier nose/nose-nostrils-width-decr|incr 0.099134
96 | modifier armslegs/l-lowerleg-scale-horiz-decr|incr 0.247515
97 | modifier mouth/mouth-trans-down|up -0.069492
98 | modifier macrodetails/Age 0.111000
99 | modifier mouth/mouth-angles-down|up 0.054664
100 | modifier armslegs/r-lowerarm-muscle-decr|incr 0.173517
101 | modifier neck/neck-double-decr|incr 0.151928
102 | modifier eyes/l-eye-bag-height-decr|incr 0.018501
103 | modifier breast/BreastFirmness 0.470719
104 | modifier stomach/stomach-navel-down|up -0.091036
105 | modifier ears/l-ear-trans-backward|forward -0.132976
106 | modifier neck/neck-back-scale-depth-decr|incr 0.162630
107 | modifier macrodetails/Asian 0.603000
108 | modifier chin/chin-height-decr|incr -0.030069
109 | modifier eyes/r-eye-push2-in|out 0.014352
110 | modifier armslegs/r-lowerleg-fat-decr|incr 0.179075
111 | modifier armslegs/r-upperleg-scale-depth-decr|incr -0.264766
112 | modifier eyebrows/eyebrows-angle-down|up 0.019116
113 | modifier cheek/l-cheek-trans-down|up -0.107390
114 | modifier armslegs/lowerlegs-height-decr|incr -0.546130
115 | modifier ears/l-ear-wing-decr|incr 0.227493
116 | modifier breast/breast-point-decr|incr 0.190773
117 | modifier armslegs/l-lowerleg-muscle-decr|incr 0.336819
118 | modifier mouth/mouth-philtrum-volume-decr|incr -0.108604
119 | modifier ears/r-ear-wing-decr|incr 0.211419
120 | modifier chin/chin-prominent-decr|incr 0.315248
121 | modifier armslegs/r-lowerarm-scale-horiz-decr|incr 0.113476
122 | modifier nose/nose-scale-depth-decr|incr 0.192676
123 | modifier armslegs/r-hand-scale-decr|incr -0.214389
124 | modifier armslegs/l-hand-trans-in|out 0.416585
125 | modifier armslegs/l-upperleg-scale-vert-decr|incr -0.255663
126 | modifier ears/l-ear-shape-pointed|triangle -0.023617
127 | modifier head/head-oval 0.091180
128 | modifier armslegs/l-hand-fingers-distance-decr|incr -0.129210
129 | modifier neck/neck-trans-backward|forward 0.049663
130 | modifier armslegs/l-lowerleg-scale-depth-decr|incr -0.044384
131 | modifier eyes/l-eye-push1-in|out -0.165289
132 | modifier forehead/forehead-temple-decr|incr 0.121531
133 | modifier head/head-trans-backward|forward -0.354562
134 | modifier eyes/l-eye-trans-in|out 0.151735
135 | modifier eyes/l-eye-eyefold-concave|convex -0.080577
136 | modifier armslegs/r-upperarm-scale-vert-decr|incr 0.025663
137 | modifier mouth/mouth-upperlip-middle-down|up -0.429335
138 | modifier eyes/r-eye-corner2-down|up -0.060687
139 | modifier mouth/mouth-trans-in|out 0.185108
140 | modifier ears/l-ear-rot-backward|forward -0.110585
141 | modifier armslegs/l-lowerarm-muscle-decr|incr 0.174149
142 | modifier eyes/r-eye-height2-decr|incr -0.237447
143 | modifier head/head-fat-decr|incr -0.031718
144 | modifier head/head-diamond 0.096893
145 | modifier cheek/l-cheek-bones-decr|incr 0.275140
146 | modifier armslegs/upperlegs-height-decr|incr 0.023724
147 | modifier ears/l-ear-shape-square|round 0.134220
148 | modifier armslegs/r-foot-trans-backward|forward -0.050601
149 | modifier armslegs/l-foot-trans-backward|forward -0.028261
150 | modifier head/head-age-decr|incr -0.288755
151 | modifier macrodetails/Caucasian 0.024113
152 | modifier armslegs/r-upperarm-shoulder-muscle-decr|incr -0.158360
153 | modifier nose/nose-trans-in|out 0.152717
154 | modifier chin/chin-jaw-drop-decr|incr -0.004404
155 | modifier nose/nose-curve-concave|convex 0.197835
156 | modifier head/head-trans-in|out 0.026152
157 | modifier armslegs/l-lowerarm-scale-horiz-decr|incr 0.106913
158 | modifier hip/hip-scale-horiz-decr|incr -0.096979
159 | modifier armslegs/l-upperarm-scale-horiz-decr|incr 0.285754
160 | modifier eyes/r-eye-height3-decr|incr 0.157162
161 | modifier head/head-triangular 0.031992
162 | modifier armslegs/r-lowerleg-scale-depth-decr|incr -0.027526
163 | modifier head/head-square 0.026002
164 | modifier armslegs/l-upperarm-scale-depth-decr|incr -0.141498
165 | modifier ears/l-ear-scale-vert-decr|incr -0.017757
166 | modifier eyes/r-eye-bag-in|out 0.499314
167 | modifier mouth/mouth-upperlip-volume-decr|incr 0.296926
168 | modifier head/head-scale-horiz-decr|incr -0.012259
169 | modifier cheek/l-cheek-volume-decr|incr -0.292897
170 | modifier torso/torso-scale-depth-decr|incr -0.141134
171 | modifier eyes/r-eye-eyefold-concave|convex 0.005173
172 | modifier eyes/r-eye-bag-height-decr|incr -0.038044
173 | modifier ears/r-ear-trans-backward|forward -0.124382
174 | modifier armslegs/r-upperarm-muscle-decr|incr 0.216036
175 | modifier stomach/stomach-navel-in|out 0.108785
176 | modifier eyes/l-eye-scale-decr|incr -0.018637
177 | modifier armslegs/l-upperleg-muscle-decr|incr 0.121118
178 | modifier breast/nipple-size-decr|incr -0.423647
179 | modifier ears/r-ear-trans-down|up -0.122546
180 | modifier chin/chin-prognathism-decr|incr -0.099664
181 | modifier nose/nose-scale-vert-decr|incr -0.053547
182 | modifier head/head-round 0.096041
183 | modifier armslegs/r-hand-fingers-distance-decr|incr -0.058654
184 | modifier ears/r-ear-rot-backward|forward -0.184251
185 | modifier mouth/mouth-lowerlip-width-decr|incr -0.026006
186 | modifier buttocks/buttocks-volume-decr|incr 0.224016
187 | modifier hip/hip-scale-vert-decr|incr 0.310000
188 | modifier nose/nose-nostrils-angle-down|up 0.215630
189 | modifier nose/nose-compression-compress|uncompress 0.288676
190 | modifier armslegs/r-lowerleg-muscle-decr|incr 0.234599
191 | modifier head/head-rectangular 0.066482
192 | modifier armslegs/r-upperleg-scale-vert-decr|incr -0.205481
193 | modifier armslegs/r-upperarm-scale-depth-decr|incr -0.153993
194 | modifier mouth/mouth-cupidsbow-decr|incr -0.120538
195 | modifier hip/hip-trans-down|up -0.455070
196 | modifier eyes/r-eye-push1-in|out -0.196974
197 | modifier armslegs/l-lowerleg-fat-decr|incr 0.138403
198 | modifier armslegs/l-upperarm-muscle-decr|incr 0.218915
199 | modifier eyes/l-eye-push2-in|out -0.012057
200 | modifier head/head-back-scale-depth-decr|incr -0.022894
201 | modifier armslegs/l-lowerarm-fat-decr|incr 0.047973
202 | modifier armslegs/l-upperarm-fat-decr|incr 0.128040
203 | modifier armslegs/r-lowerarm-fat-decr|incr 0.035198
204 | modifier eyes/l-eye-height1-decr|incr 0.053193
205 | modifier breast/breast-dist-decr|incr -0.231271
206 | modifier mouth/mouth-upperlip-height-decr|incr 0.141758
207 | modifier eyebrows/eyebrows-trans-backward|forward -0.115788
208 | modifier armslegs/r-hand-trans-in|out 0.399516
209 | modifier ears/l-ear-scale-decr|incr -0.128116
210 | modifier armslegs/r-lowerarm-scale-depth-decr|incr -0.333547
211 | modifier eyes/l-eye-height3-decr|incr 0.251420
212 | modifier eyebrows/eyebrows-trans-down|up 0.297284
213 | modifier nose/nose-point-down|up 0.104342
214 | modifier ears/l-ear-scale-depth-decr|incr -0.087575
215 | modifier nose/nose-scale-horiz-decr|incr 0.008998
216 | modifier mouth/mouth-upperlip-width-decr|incr -0.057622
217 | modifier head/head-scale-vert-decr|incr -0.114729
218 | modifier torso/torso-trans-in|out 0.154826
219 | modifier neck/neck-scale-vert-decr|incr 0.055933
220 | modifier eyes/r-eye-eyefold-down|up 0.153307
221 | modifier armslegs/r-foot-trans-in|out 0.373191
222 | modifier forehead/forehead-nubian-decr|incr -0.089967
223 | modifier chin/chin-bones-decr|incr -0.083698
224 | modifier ears/l-ear-flap-decr|incr 0.138192
225 | modifier armslegs/r-upperarm-fat-decr|incr 0.098273
226 | modifier armslegs/l-lowerarm-scale-depth-decr|incr -0.267216
227 | modifier macrodetails-universal/Weight 0.667000
228 | modifier breast/breast-volume-vert-down|up -0.041348
229 | modifier mouth/mouth-trans-backward|forward -0.310796
230 | modifier eyes/r-eye-trans-down|up -0.132371
231 | modifier eyes/l-eye-height2-decr|incr -0.271932
232 | modifier hip/hip-trans-backward|forward -0.000530
233 | modifier armslegs/l-upperleg-scale-horiz-decr|incr 0.157278
234 | modifier neck/neck-trans-in|out -0.142334
235 | modifier eyes/l-eye-eyefold-down|up 0.134212
236 | modifier mouth/mouth-upperlip-ext-down|up 0.121618
237 | modifier pelvis/pelvis-tone-decr|incr -0.044433
238 | modifier nose/nose-greek-decr|incr -0.160527
239 | modifier ears/r-ear-scale-depth-decr|incr -0.122494
240 | modifier mouth/mouth-scale-depth-decr|incr -0.222543
241 | modifier nose/nose-width2-decr|incr 0.484992
242 | modifier mouth/mouth-lowerlip-height-decr|incr -0.116909
243 | modifier head/head-trans-down|up -0.086585
244 | modifier mouth/mouth-cupidsbow-width-decr|incr -0.006460
245 | modifier nose/nose-width3-decr|incr 0.392540
246 | modifier mouth/mouth-lowerlip-volume-decr|incr 0.223602
247 | modifier armslegs/l-upperleg-scale-depth-decr|incr -0.251898
248 | modifier ears/r-ear-lobe-decr|incr -0.027763
249 | modifier hip/hip-waist-down|up -0.316900
250 | tongue tongue01 52ad91a3-caad-4e50-8c38-67634e5e789c
251 | teeth Teeth_Base 0a5ec82a-0d5f-43ce-a765-8f076f95692d
252 | eyelashes eyelashes04 efd75993-8de1-43fb-b410-adc203091d25
253 | eyebrows eyebrow009 55b3b52a-379e-426d-b320-562ed57202b3
254 | eyes HighPolyEyes 2c12f43b-1303-432c-b7ce-d78346baf2e6
255 | pose tpose.bvh
256 | clothes male_casualsuit06 be449715-fd7d-49d1-bca1-7fdd4264bc2d
257 | clothesHideFaces True
258 | skinMaterial skins/young_asian_male/young_asian_male.mhmat
259 | material HighPolyEyes 2c12f43b-1303-432c-b7ce-d78346baf2e6 eyes/materials/brown.mhmat
260 | subdivide False
261 |
--------------------------------------------------------------------------------
/art/weird_child.thumb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/art/weird_child.thumb
--------------------------------------------------------------------------------
/art/weirdchild.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/art/weirdchild.psd
--------------------------------------------------------------------------------
/art/weirdchild_render_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/art/weirdchild_render_1.png
--------------------------------------------------------------------------------
/art/weirdchild_render_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/art/weirdchild_render_2.png
--------------------------------------------------------------------------------
/art/weirdchild_render_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/art/weirdchild_render_3.png
--------------------------------------------------------------------------------
/project/addons/messdeform/MessyJoint.gd:
--------------------------------------------------------------------------------
1 | tool
2 | extends Node
3 |
4 | export(NodePath) var parent_path setget set_parent_path
5 | export(NodePath) var child_path setget set_child_path
6 | export(float, 0, 1, 0.1) var parent_weight = 0.5
7 | export(bool) var inverse = false setget set_inverse
8 |
9 | const PARENT_INDS = [ [ 3, 2 ], [ 0, 1 ] ]
10 | const CHILD_INDS = [ [ 0, 1 ], [ 3, 2 ] ]
11 |
12 | var parent
13 | var child
14 | var parent_sgmt = []
15 | var parent_sgmt_lngth
16 | var child_sgmt = []
17 |
18 | var ready = false
19 |
20 | func _enter_tree():
21 | set_meta("MessyJoint", true)
22 |
23 | func _exit_tree():
24 | ready = false
25 |
26 | func _ready():
27 | ready = true
28 | reset()
29 |
30 | func set_parent_path(path):
31 | parent_path = path
32 | reset()
33 |
34 | func set_child_path(path):
35 | child_path = path
36 | reset()
37 |
38 | func set_inverse(new_inverse):
39 | inverse = new_inverse
40 | reset()
41 |
42 | func reset():
43 | if !ready:
44 | return
45 |
46 | ready = false
47 |
48 | var node_parent = get_parent()
49 | if !node_parent || !node_parent.has_meta("MessyJointManager"):
50 | print(get_name(), " must be child of a MessyJointManager")
51 | return
52 |
53 | if parent_path:
54 | parent = get_node(parent_path)
55 | else:
56 | parent = null
57 |
58 | if child_path:
59 | child = get_node(child_path)
60 | else:
61 | child = null
62 |
63 | # Sanity check
64 | for node in [ parent, child ]:
65 | if !node || !node.is_type("Polygon2D"):
66 | print(get_name(), " is not correctly set up")
67 | return
68 |
69 | parent.set_polygon(parent.get_uv())
70 | child.set_polygon(child.get_uv())
71 |
72 | parent_sgmt.clear()
73 | child_sgmt.clear()
74 |
75 | var mode_ind = 0
76 | if inverse: mode_ind = 1
77 | for i in range(2):
78 | parent_sgmt.push_back(parent.get_uv()[PARENT_INDS[mode_ind][i]])
79 | child_sgmt.push_back(child.get_uv()[CHILD_INDS[mode_ind][i]])
80 |
81 | parent_sgmt_lngth = (parent_sgmt[1] - parent_sgmt[0]).length()
82 |
83 | ready = true
84 |
85 | func process_joint(out_update_data):
86 | if !ready:
87 | return
88 |
89 | var child_mat = child.get_relative_transform_to_parent(parent)
90 |
91 | for node in [child, parent]:
92 | if !out_update_data.has(node):
93 | out_update_data[node] = {}
94 |
95 | var new_parent_sgmt = []
96 | var new_child_sgmt = []
97 |
98 | var mode_ind = 0
99 | if inverse: mode_ind = 1
100 |
101 | for i in range(2):
102 | # In parent space
103 | var parent_vert = parent_sgmt[i] + parent.get_offset()
104 | var child_vert = child_sgmt[i] + child.get_offset()
105 |
106 | # Now much does the offset at this side differ from the rest one?
107 | var rest_offs = child_sgmt[i] - parent_sgmt[i]
108 | var current_offs = child_mat * child_vert - parent_vert
109 | var excess = current_offs - rest_offs
110 |
111 | # Compute new vertices positions
112 | new_parent_sgmt.push_back( \
113 | parent_sgmt[i] + parent_weight * excess)
114 | new_child_sgmt.push_back( \
115 | child_sgmt[i] - (1.0 - parent_weight) * excess.rotated(-child.get_rot()))
116 |
117 | # Opportuinity to refine
118 |
119 | # - Keep the length of the joint segment
120 | # (It doesn't matter computing against parent or child)
121 | var new_parent_ab = new_parent_sgmt[1] - new_parent_sgmt[0]
122 | var grow_coeff = parent_sgmt_lngth / new_parent_ab.length() - 1
123 | var grow_vector = grow_coeff * new_parent_ab
124 | var parent_grow = parent_weight * grow_vector
125 | var child_grow = ((1.0 - parent_weight) * grow_vector).rotated(-child.get_rot())
126 | for i in range(2):
127 | var sgn = i - 1
128 | new_parent_sgmt[i] += sgn * parent_grow
129 | new_child_sgmt[i] += sgn * child_grow
130 |
131 | # Store results
132 | for i in range(2):
133 | out_update_data[parent][PARENT_INDS[mode_ind][i]] = new_parent_sgmt[i]
134 | out_update_data[child][CHILD_INDS[mode_ind][i]] = new_child_sgmt[i]
135 |
--------------------------------------------------------------------------------
/project/addons/messdeform/MessyJoint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/project/addons/messdeform/MessyJoint.png
--------------------------------------------------------------------------------
/project/addons/messdeform/MessyJointManager.gd:
--------------------------------------------------------------------------------
1 | tool
2 | extends Node
3 |
4 | export(bool) var enabled = true setget set_enabled
5 |
6 | var updater = Updater.new(self)
7 |
8 | func _enter_tree():
9 | set_meta("MessyJointManager", true)
10 |
11 | func _ready():
12 | update_enabled()
13 |
14 | func get_joints():
15 | var joints = []
16 | for child in get_children():
17 | if child.has_meta("MessyJoint"):
18 | joints.push_back(child)
19 | return joints
20 |
21 | func reset_joints():
22 | for joint in get_joints():
23 | joint.reset()
24 |
25 | func update_joints():
26 | var update_data = {}
27 |
28 | for joint in get_joints():
29 | joint.process_joint(update_data)
30 |
31 | for node in update_data:
32 | var new_verts = node.get_uv()
33 |
34 | var node_update_data = update_data[node]
35 | for idx in node_update_data:
36 | new_verts[idx] = node_update_data[idx]
37 |
38 | node.set_messy_polygon(new_verts)
39 |
40 | func set_enabled(new_enabled):
41 | if new_enabled:
42 | add_child(updater)
43 | updater.set_draw_behind_parent(true)
44 | else:
45 | if updater.get_parent() != null:
46 | remove_child(updater)
47 | reset_joints()
48 |
49 | enabled = new_enabled
50 | update_enabled()
51 |
52 | func update_enabled():
53 | for joint in get_joints():
54 | # Should be done by the joint class
55 | if joint.parent:
56 | joint.parent.set_enabled(enabled)
57 | if joint.child:
58 | joint.child.set_enabled(enabled)
59 |
60 | class Updater extends Node2D:
61 | var joint_man
62 |
63 | func _init(joint_man):
64 | self.joint_man = joint_man
65 |
66 | func _ready():
67 | set_process(true)
68 |
69 | func _process(delta):
70 | update()
71 |
72 | func _draw():
73 | joint_man.update_joints()
74 |
--------------------------------------------------------------------------------
/project/addons/messdeform/MessyJointManager.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/project/addons/messdeform/MessyJointManager.png
--------------------------------------------------------------------------------
/project/addons/messdeform/MessyPolygon.gd:
--------------------------------------------------------------------------------
1 | tool
2 | extends Polygon2D
3 |
4 | export(float, 0.1, 2, 0.1) var mass_0 = 1.0
5 | export(float, 0.1, 2, 0.1) var mass_1 = 1.0
6 | export(float, 0.1, 2, 0.1) var mass_2 = 1.0
7 | export(float, 0.1, 2, 0.1) var mass_3 = 1.0
8 |
9 | onready var in_editor = get_tree().is_editor_hint()
10 |
11 | var enabled
12 |
13 | var polygon
14 | var scaled_uv # If called "uv", base would be assisgned
15 | var uv_center
16 |
17 | func _enter_tree():
18 | set_meta("MessyPolygon2D", true)
19 | enabled = false
20 |
21 | func _ready():
22 | reset()
23 |
24 | func set_enabled(enabled):
25 | self.enabled = enabled
26 | reset()
27 | update()
28 |
29 | func reset():
30 | if enabled:
31 | # Inhibit base Polygon2D draw (hidden would prevent custom drawing)
32 | set_polygon(Vector2Array())
33 | normalize_uv()
34 | if !get_texture():
35 | uv_center = Vector2()
36 | else:
37 | uv_center = compute_center(get_uv(), [ mass_0, mass_1, mass_2, mass_3 ])
38 | var inv_tex_size = Vector2(1 / get_texture().get_size().x, 1 / get_texture().get_size().y)
39 | uv_center *= inv_tex_size
40 | else:
41 | set_polygon(get_uv())
42 |
43 | func set_messy_polygon(polygon):
44 | self.polygon = polygon
45 | update()
46 |
47 | func _draw():
48 | if !enabled:
49 | return
50 | if in_editor:
51 | reset()
52 |
53 | draw_set_transform(get_offset(), 0, Vector2(1, 1))
54 |
55 | var center = compute_center(polygon, [ mass_0, mass_1, mass_2, mass_3 ])
56 | draw_subpoly(0, 1, center)
57 | draw_subpoly(1, 2, center)
58 | draw_subpoly(2, 3, center)
59 | draw_subpoly(3, 0, center)
60 |
61 | func draw_subpoly(idx0, idx1, center):
62 | var tri = Vector2Array([ polygon[idx0], polygon[idx1], center ])
63 | var uvs = Vector2Array([ scaled_uv[idx0], scaled_uv[idx1], uv_center ])
64 | if get_vertex_colors().size() > 0:
65 | draw_polygon(tri, get_vertex_colors(), uvs, get_texture())
66 | else:
67 | draw_colored_polygon(tri, get_color(), uvs, get_texture())
68 |
69 | func compute_center(points, weights = null):
70 | var sum = Vector2()
71 | var weight_sum = 0
72 | for i in range(points.size()):
73 | var weight
74 | if weights != null:
75 | weight = weights[i]
76 | else:
77 | weight = 1
78 |
79 | sum += weight * points[i]
80 | weight_sum += weight
81 | return sum / weight_sum
82 |
83 | func normalize_uv():
84 | if !get_texture():
85 | return
86 | scaled_uv = Vector2Array()
87 | var original_uv = get_uv()
88 | var inv_tex_size = Vector2(1 / get_texture().get_size().x, 1 / get_texture().get_size().y)
89 | for i in range(original_uv.size()):
90 | scaled_uv.push_back(original_uv[i] * inv_tex_size)
91 |
--------------------------------------------------------------------------------
/project/addons/messdeform/MessyPolygon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/project/addons/messdeform/MessyPolygon.png
--------------------------------------------------------------------------------
/project/addons/messdeform/plugin.cfg:
--------------------------------------------------------------------------------
1 | [plugin]
2 |
3 | name="MessDeform"
4 | description="Hacky deformable mesh engine for Godot"
5 | author="Pedro J. Esténez (RandomShaper)"
6 | version="1.3"
7 | script="plugin.gd"
8 |
--------------------------------------------------------------------------------
/project/addons/messdeform/plugin.gd:
--------------------------------------------------------------------------------
1 | tool
2 | extends EditorPlugin
3 |
4 | var btn_reset
5 |
6 | var joint_man
7 |
8 | func _enter_tree():
9 | add_custom_type("MessyJoint", "Node", preload("MessyJoint.gd"), preload("MessyJoint.png"))
10 | add_custom_type("MessyJointManager", "Node", preload("MessyJointManager.gd"), preload("MessyJointManager.png"))
11 | add_custom_type("MessyPolygon", "Polygon2D", preload("MessyPolygon.gd"), preload("MessyPolygon.png"))
12 |
13 | btn_reset = Button.new()
14 | btn_reset.set_text("Reset")
15 | btn_reset.set_h_size_flags(Control.SIZE_EXPAND)
16 | btn_reset.hide()
17 | add_control_to_container(EditorPlugin.CONTAINER_CANVAS_EDITOR_MENU, btn_reset)
18 | btn_reset.connect("pressed", self, "on_reset_pressed", []);
19 |
20 | func _exit_tree():
21 | remove_custom_type("MessyJointManager")
22 | remove_custom_type("MessyJoint")
23 |
24 | func handles(object):
25 | return object.has_meta("MessyJointManager")
26 |
27 | func make_visible(visible):
28 | if visible:
29 | btn_reset.show()
30 | else:
31 | btn_reset.hide()
32 |
33 | func edit(object):
34 | joint_man = object
35 |
36 | func clear():
37 | joint_man = null
38 |
39 | func on_reset_pressed():
40 | joint_man.reset_joints()
41 |
--------------------------------------------------------------------------------
/project/addons/messdeform/src/MessyJoint.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/project/addons/messdeform/src/MessyJoint.psd
--------------------------------------------------------------------------------
/project/addons/messdeform/src/MessyJointManager.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/project/addons/messdeform/src/MessyJointManager.psd
--------------------------------------------------------------------------------
/project/addons/messdeform/src/MessyPolygon.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/project/addons/messdeform/src/MessyPolygon.psd
--------------------------------------------------------------------------------
/project/engine.cfg:
--------------------------------------------------------------------------------
1 | [application]
2 |
3 | name="Weirdchild: a MessDeform sample"
4 | main_scene="res://weirdchild.tscn"
5 | icon="res://icon.png"
6 |
7 | [editor_plugins]
8 |
9 | enabled=["messdeform"]
10 |
--------------------------------------------------------------------------------
/project/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/project/icon.png
--------------------------------------------------------------------------------
/project/icon.png.flags:
--------------------------------------------------------------------------------
1 | gen_mipmaps=false
2 |
--------------------------------------------------------------------------------
/project/weirdchild.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RandomShaper/godot-plugin-messdeform/11adf0ffb433ad4ac7fb19bab139701121d8002e/project/weirdchild.png
--------------------------------------------------------------------------------
/project/weirdchild.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=10 format=1]
2 |
3 | [ext_resource path="res://addons/messdeform/MessyJointManager.gd" type="Script" id=1]
4 | [ext_resource path="res://addons/messdeform/MessyJointManager.png" type="Texture" id=2]
5 | [ext_resource path="res://addons/messdeform/MessyJoint.gd" type="Script" id=3]
6 | [ext_resource path="res://addons/messdeform/MessyJoint.png" type="Texture" id=4]
7 | [ext_resource path="res://weirdchild.png" type="Texture" id=5]
8 | [ext_resource path="res://addons/messdeform/MessyPolygon.gd" type="Script" id=6]
9 | [ext_resource path="res://addons/messdeform/MessyPolygon.png" type="Texture" id=7]
10 |
11 | [sub_resource type="Animation" id=1]
12 |
13 | resource/name = "rest"
14 | length = 0.01
15 | loop = false
16 | step = 0.1
17 | tracks/0/type = "value"
18 | tracks/0/path = NodePath("torso/thigh_b:transform/pos")
19 | tracks/0/interp = 1
20 | tracks/0/imported = false
21 | tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( 5, 43 ) ] }
22 | tracks/1/type = "value"
23 | tracks/1/path = NodePath("torso/thigh_b:transform/rot")
24 | tracks/1/interp = 1
25 | tracks/1/imported = false
26 | tracks/1/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
27 | tracks/2/type = "value"
28 | tracks/2/path = NodePath("torso/thigh_b/calf_b/foot_b:transform/pos")
29 | tracks/2/interp = 1
30 | tracks/2/imported = false
31 | tracks/2/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( -21, 83 ) ] }
32 | tracks/3/type = "value"
33 | tracks/3/path = NodePath("torso/thigh_b/calf_b/foot_b:transform/rot")
34 | tracks/3/interp = 1
35 | tracks/3/imported = false
36 | tracks/3/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
37 | tracks/4/type = "value"
38 | tracks/4/path = NodePath("torso/thigh_b/calf_b:transform/pos")
39 | tracks/4/interp = 1
40 | tracks/4/imported = false
41 | tracks/4/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( 12, 64 ) ] }
42 | tracks/5/type = "value"
43 | tracks/5/path = NodePath("torso/thigh_b/calf_b:transform/rot")
44 | tracks/5/interp = 1
45 | tracks/5/imported = false
46 | tracks/5/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
47 | tracks/6/type = "value"
48 | tracks/6/path = NodePath("torso/thigh_f:transform/pos")
49 | tracks/6/interp = 1
50 | tracks/6/imported = false
51 | tracks/6/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( 5, 43 ) ] }
52 | tracks/7/type = "value"
53 | tracks/7/path = NodePath("torso/thigh_f:transform/rot")
54 | tracks/7/interp = 1
55 | tracks/7/imported = false
56 | tracks/7/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
57 | tracks/8/type = "value"
58 | tracks/8/path = NodePath("torso/u_arm_f/l_arm_f:transform/pos")
59 | tracks/8/interp = 1
60 | tracks/8/imported = false
61 | tracks/8/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( -1, 65 ) ] }
62 | tracks/9/type = "value"
63 | tracks/9/path = NodePath("torso/u_arm_f/l_arm_f:transform/rot")
64 | tracks/9/interp = 1
65 | tracks/9/imported = false
66 | tracks/9/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
67 | tracks/10/type = "value"
68 | tracks/10/path = NodePath("torso/u_arm_f:transform/pos")
69 | tracks/10/interp = 1
70 | tracks/10/imported = false
71 | tracks/10/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( -4, -57 ) ] }
72 | tracks/11/type = "value"
73 | tracks/11/path = NodePath("torso/u_arm_f:transform/rot")
74 | tracks/11/interp = 1
75 | tracks/11/imported = false
76 | tracks/11/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
77 | tracks/12/type = "value"
78 | tracks/12/path = NodePath("torso/u_arm_f/l_arm_f/hand_f:transform/pos")
79 | tracks/12/interp = 1
80 | tracks/12/imported = false
81 | tracks/12/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( 6, 56 ) ] }
82 | tracks/13/type = "value"
83 | tracks/13/path = NodePath("torso/u_arm_f/l_arm_f/hand_f:transform/rot")
84 | tracks/13/interp = 1
85 | tracks/13/imported = false
86 | tracks/13/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
87 | tracks/14/type = "value"
88 | tracks/14/path = NodePath("torso/head:transform/pos")
89 | tracks/14/interp = 1
90 | tracks/14/imported = false
91 | tracks/14/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( -2, -87 ) ] }
92 | tracks/15/type = "value"
93 | tracks/15/path = NodePath("torso/head:transform/rot")
94 | tracks/15/interp = 1
95 | tracks/15/imported = false
96 | tracks/15/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
97 | tracks/16/type = "value"
98 | tracks/16/path = NodePath("torso/u_arm_b/l_arm_b:transform/pos")
99 | tracks/16/interp = 1
100 | tracks/16/imported = false
101 | tracks/16/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( -1, 65 ) ] }
102 | tracks/17/type = "value"
103 | tracks/17/path = NodePath("torso/u_arm_b/l_arm_b:transform/rot")
104 | tracks/17/interp = 1
105 | tracks/17/imported = false
106 | tracks/17/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
107 | tracks/18/type = "value"
108 | tracks/18/path = NodePath("torso/u_arm_b:transform/pos")
109 | tracks/18/interp = 1
110 | tracks/18/imported = false
111 | tracks/18/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( -4, -57 ) ] }
112 | tracks/19/type = "value"
113 | tracks/19/path = NodePath("torso/u_arm_b:transform/rot")
114 | tracks/19/interp = 1
115 | tracks/19/imported = false
116 | tracks/19/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
117 | tracks/20/type = "value"
118 | tracks/20/path = NodePath("torso/thigh_f/calf_f:transform/pos")
119 | tracks/20/interp = 1
120 | tracks/20/imported = false
121 | tracks/20/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( 12, 64 ) ] }
122 | tracks/21/type = "value"
123 | tracks/21/path = NodePath("torso/thigh_f/calf_f:transform/rot")
124 | tracks/21/interp = 1
125 | tracks/21/imported = false
126 | tracks/21/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
127 | tracks/22/type = "value"
128 | tracks/22/path = NodePath("torso/thigh_f/calf_f/foot_f:transform/pos")
129 | tracks/22/interp = 1
130 | tracks/22/imported = false
131 | tracks/22/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( -21, 83 ) ] }
132 | tracks/23/type = "value"
133 | tracks/23/path = NodePath("torso/thigh_f/calf_f/foot_f:transform/rot")
134 | tracks/23/interp = 1
135 | tracks/23/imported = false
136 | tracks/23/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
137 | tracks/24/type = "value"
138 | tracks/24/path = NodePath("torso/u_arm_b/l_arm_b/hand_b:transform/pos")
139 | tracks/24/interp = 1
140 | tracks/24/imported = false
141 | tracks/24/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( 6, 56 ) ] }
142 | tracks/25/type = "value"
143 | tracks/25/path = NodePath("torso/u_arm_b/l_arm_b/hand_b:transform/rot")
144 | tracks/25/interp = 1
145 | tracks/25/imported = false
146 | tracks/25/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
147 | tracks/26/type = "value"
148 | tracks/26/path = NodePath("torso:transform/pos")
149 | tracks/26/interp = 1
150 | tracks/26/imported = false
151 | tracks/26/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ Vector2( 248, 240 ) ] }
152 | tracks/27/type = "value"
153 | tracks/27/path = NodePath("torso:transform/rot")
154 | tracks/27/interp = 1
155 | tracks/27/imported = false
156 | tracks/27/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0.0 ] }
157 |
158 | [sub_resource type="Animation" id=2]
159 |
160 | resource/name = "walk"
161 | length = 2.0
162 | loop = true
163 | step = 0.1
164 | tracks/0/type = "value"
165 | tracks/0/path = NodePath("torso/u_arm_b/l_arm_b/hand_b/fingers_b:transform/pos")
166 | tracks/0/interp = 1
167 | tracks/0/imported = false
168 | tracks/0/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 3, 22 ), Vector2( 3, 22 ) ] }
169 | tracks/1/type = "value"
170 | tracks/1/path = NodePath("torso/u_arm_b/l_arm_b/hand_b/fingers_b:transform/rot")
171 | tracks/1/interp = 1
172 | tracks/1/imported = false
173 | tracks/1/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 0.0, 0.0 ] }
174 | tracks/2/type = "value"
175 | tracks/2/path = NodePath("torso/u_arm_b/l_arm_b/hand_b:transform/pos")
176 | tracks/2/interp = 1
177 | tracks/2/imported = false
178 | tracks/2/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 6, 56 ), Vector2( 6, 56 ) ] }
179 | tracks/3/type = "value"
180 | tracks/3/path = NodePath("torso/u_arm_b/l_arm_b/hand_b:transform/rot")
181 | tracks/3/interp = 1
182 | tracks/3/imported = false
183 | tracks/3/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 60.3349, -23.9188 ] }
184 | tracks/4/type = "value"
185 | tracks/4/path = NodePath("torso/u_arm_b/l_arm_b:transform/pos")
186 | tracks/4/interp = 1
187 | tracks/4/imported = false
188 | tracks/4/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( -1, 65 ), Vector2( -1, 65 ) ] }
189 | tracks/5/type = "value"
190 | tracks/5/path = NodePath("torso/u_arm_b/l_arm_b:transform/rot")
191 | tracks/5/interp = 1
192 | tracks/5/imported = false
193 | tracks/5/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 92.219, 24.7773 ] }
194 | tracks/6/type = "value"
195 | tracks/6/path = NodePath("torso/u_arm_b:transform/pos")
196 | tracks/6/interp = 1
197 | tracks/6/imported = false
198 | tracks/6/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( -4, -57 ), Vector2( -4, -57 ) ] }
199 | tracks/7/type = "value"
200 | tracks/7/path = NodePath("torso/u_arm_b:transform/rot")
201 | tracks/7/interp = 1
202 | tracks/7/imported = false
203 | tracks/7/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 81.1767, -86.3537 ] }
204 | tracks/8/type = "value"
205 | tracks/8/path = NodePath("torso/thigh_f/calf_f/foot_f/toes_f:transform/pos")
206 | tracks/8/interp = 1
207 | tracks/8/imported = false
208 | tracks/8/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 33, 5 ), Vector2( 33, 5 ) ] }
209 | tracks/9/type = "value"
210 | tracks/9/path = NodePath("torso/thigh_f/calf_f/foot_f/toes_f:transform/rot")
211 | tracks/9/interp = 1
212 | tracks/9/imported = false
213 | tracks/9/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 0.0, 0.0 ] }
214 | tracks/10/type = "value"
215 | tracks/10/path = NodePath("torso/thigh_f/calf_f/foot_f:transform/pos")
216 | tracks/10/interp = 1
217 | tracks/10/imported = false
218 | tracks/10/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( -21.0003, 83.0006 ), Vector2( -21, 83.001 ) ] }
219 | tracks/11/type = "value"
220 | tracks/11/path = NodePath("torso/thigh_f/calf_f/foot_f:transform/rot")
221 | tracks/11/interp = 1
222 | tracks/11/imported = false
223 | tracks/11/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ -2.96881, -52.7304 ] }
224 | tracks/12/type = "value"
225 | tracks/12/path = NodePath("torso/thigh_f/calf_f:transform/pos")
226 | tracks/12/interp = 1
227 | tracks/12/imported = false
228 | tracks/12/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 12, 64 ), Vector2( 12, 64 ) ] }
229 | tracks/13/type = "value"
230 | tracks/13/path = NodePath("torso/thigh_f/calf_f:transform/rot")
231 | tracks/13/interp = 1
232 | tracks/13/imported = false
233 | tracks/13/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ -68.385, -13.1665 ] }
234 | tracks/14/type = "value"
235 | tracks/14/path = NodePath("torso/thigh_f:transform/pos")
236 | tracks/14/interp = 1
237 | tracks/14/imported = false
238 | tracks/14/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 5, 43 ), Vector2( 5, 43 ) ] }
239 | tracks/15/type = "value"
240 | tracks/15/path = NodePath("torso/thigh_f:transform/rot")
241 | tracks/15/interp = 1
242 | tracks/15/imported = false
243 | tracks/15/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 77.1094, -32.5419 ] }
244 | tracks/16/type = "value"
245 | tracks/16/path = NodePath("torso/thigh_b/calf_b/foot_b/toes_b:transform/pos")
246 | tracks/16/interp = 1
247 | tracks/16/imported = false
248 | tracks/16/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 33, 5 ), Vector2( 33, 5 ) ] }
249 | tracks/17/type = "value"
250 | tracks/17/path = NodePath("torso/thigh_b/calf_b/foot_b/toes_b:transform/rot")
251 | tracks/17/interp = 1
252 | tracks/17/imported = false
253 | tracks/17/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 0.0, 0.0 ] }
254 | tracks/18/type = "value"
255 | tracks/18/path = NodePath("torso/u_arm_f/l_arm_f/hand_f/fingers_f:transform/pos")
256 | tracks/18/interp = 1
257 | tracks/18/imported = false
258 | tracks/18/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 2.80251, 21.9973 ), Vector2( 2.80251, 21.9973 ) ] }
259 | tracks/19/type = "value"
260 | tracks/19/path = NodePath("torso/u_arm_f/l_arm_f/hand_f/fingers_f:transform/rot")
261 | tracks/19/interp = 1
262 | tracks/19/imported = false
263 | tracks/19/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 0.0, 0.0 ] }
264 | tracks/20/type = "value"
265 | tracks/20/path = NodePath("torso/u_arm_f/l_arm_f/hand_f:transform/pos")
266 | tracks/20/interp = 1
267 | tracks/20/imported = false
268 | tracks/20/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 6, 56 ), Vector2( 6, 56 ) ] }
269 | tracks/21/type = "value"
270 | tracks/21/path = NodePath("torso/u_arm_f/l_arm_f/hand_f:transform/rot")
271 | tracks/21/interp = 1
272 | tracks/21/imported = false
273 | tracks/21/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ -19.8616, 40.1731 ] }
274 | tracks/22/type = "value"
275 | tracks/22/path = NodePath("torso/u_arm_f/l_arm_f:transform/pos")
276 | tracks/22/interp = 1
277 | tracks/22/imported = false
278 | tracks/22/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( -0.999969, 65 ), Vector2( -0.999969, 65 ) ] }
279 | tracks/23/type = "value"
280 | tracks/23/path = NodePath("torso/u_arm_f/l_arm_f:transform/rot")
281 | tracks/23/interp = 1
282 | tracks/23/imported = false
283 | tracks/23/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 44.7983, 92.0198 ] }
284 | tracks/24/type = "value"
285 | tracks/24/path = NodePath("torso/u_arm_f:transform/pos")
286 | tracks/24/interp = 1
287 | tracks/24/imported = false
288 | tracks/24/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( -4, -57 ), Vector2( -4, -57 ) ] }
289 | tracks/25/type = "value"
290 | tracks/25/path = NodePath("torso/u_arm_f:transform/rot")
291 | tracks/25/interp = 1
292 | tracks/25/imported = false
293 | tracks/25/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ -55.5368, 74.1633 ] }
294 | tracks/26/type = "value"
295 | tracks/26/path = NodePath("torso/thigh_b/calf_b/foot_b:transform/pos")
296 | tracks/26/interp = 1
297 | tracks/26/imported = false
298 | tracks/26/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( -21, 83 ), Vector2( -21.0002, 83.0003 ) ] }
299 | tracks/27/type = "value"
300 | tracks/27/path = NodePath("torso/thigh_b/calf_b/foot_b:transform/rot")
301 | tracks/27/interp = 1
302 | tracks/27/imported = false
303 | tracks/27/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ -41.2971, 0.680202 ] }
304 | tracks/28/type = "value"
305 | tracks/28/path = NodePath("torso/thigh_b/calf_b:transform/pos")
306 | tracks/28/interp = 1
307 | tracks/28/imported = false
308 | tracks/28/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 12, 64 ), Vector2( 12, 64 ) ] }
309 | tracks/29/type = "value"
310 | tracks/29/path = NodePath("torso/thigh_b/calf_b:transform/rot")
311 | tracks/29/interp = 1
312 | tracks/29/imported = false
313 | tracks/29/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ -19.9305, -70.7495 ] }
314 | tracks/30/type = "value"
315 | tracks/30/path = NodePath("torso/thigh_b:transform/pos")
316 | tracks/30/interp = 1
317 | tracks/30/imported = false
318 | tracks/30/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 5, 43 ), Vector2( 5, 43 ) ] }
319 | tracks/31/type = "value"
320 | tracks/31/path = NodePath("torso/thigh_b:transform/rot")
321 | tracks/31/interp = 1
322 | tracks/31/imported = false
323 | tracks/31/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ -35.1728, 79.9987 ] }
324 | tracks/32/type = "value"
325 | tracks/32/path = NodePath("torso/head:transform/pos")
326 | tracks/32/interp = 1
327 | tracks/32/imported = false
328 | tracks/32/keys = { "times":FloatArray( 0.5, 1, 1.5, 2 ), "transitions":FloatArray( 1, 1, 1, 1 ), "update":0, "values":[ Vector2( -2, -87 ), Vector2( -2, -87 ), Vector2( -2, -87 ), Vector2( -2, -87 ) ] }
329 | tracks/33/type = "value"
330 | tracks/33/path = NodePath("torso/head:transform/rot")
331 | tracks/33/interp = 1
332 | tracks/33/imported = false
333 | tracks/33/keys = { "times":FloatArray( 0.5, 1, 1.5, 2 ), "transitions":FloatArray( 1, 1, 1, 1 ), "update":0, "values":[ -18.2046, 26.1899, -12.5525, 18.3077 ] }
334 | tracks/34/type = "value"
335 | tracks/34/path = NodePath("torso:transform/pos")
336 | tracks/34/interp = 1
337 | tracks/34/imported = false
338 | tracks/34/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ Vector2( 248, 240 ), Vector2( 248, 240 ) ] }
339 | tracks/35/type = "value"
340 | tracks/35/path = NodePath("torso:transform/rot")
341 | tracks/35/interp = 1
342 | tracks/35/imported = false
343 | tracks/35/keys = { "times":FloatArray( 1, 2 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 0.0, 0.0 ] }
344 |
345 | [node name="weirdchild" type="Node2D"]
346 |
347 | [node name="MessyJointManager" type="Node" parent="."]
348 |
349 | editor/display_folded = true
350 | script/script = ExtResource( 1 )
351 | __meta__ = { "MessyJointManager":true, "_editor_icon":ExtResource( 2 ) }
352 | enabled = true
353 |
354 | [node name="MessyJoint1" type="Node" parent="MessyJointManager"]
355 |
356 | script/script = ExtResource( 3 )
357 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
358 | parent_path = NodePath("../../torso")
359 | child_path = NodePath("../../torso/head")
360 | parent_weight = 0.828675
361 | inverse = true
362 |
363 | [node name="MessyJoint2" type="Node" parent="MessyJointManager"]
364 |
365 | script/script = ExtResource( 3 )
366 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
367 | parent_path = NodePath("../../torso")
368 | child_path = NodePath("../../torso/thigh_f")
369 | parent_weight = 0.481349
370 | inverse = false
371 |
372 | [node name="MessyJoint3" type="Node" parent="MessyJointManager"]
373 |
374 | script/script = ExtResource( 3 )
375 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
376 | parent_path = NodePath("../../torso/thigh_f")
377 | child_path = NodePath("../../torso/thigh_f/calf_f")
378 | parent_weight = 0.526725
379 | inverse = false
380 |
381 | [node name="MessyJoint4" type="Node" parent="MessyJointManager"]
382 |
383 | script/script = ExtResource( 3 )
384 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
385 | parent_path = NodePath("../../torso/thigh_f/calf_f")
386 | child_path = NodePath("../../torso/thigh_f/calf_f/foot_f")
387 | parent_weight = 1.0
388 | inverse = false
389 |
390 | [node name="MessyJoint5" type="Node" parent="MessyJointManager"]
391 |
392 | script/script = ExtResource( 3 )
393 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
394 | parent_path = NodePath("../../torso/u_arm_f")
395 | child_path = NodePath("../../torso/u_arm_f/l_arm_f")
396 | parent_weight = 0.5
397 | inverse = false
398 |
399 | [node name="MessyJoint6" type="Node" parent="MessyJointManager"]
400 |
401 | script/script = ExtResource( 3 )
402 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
403 | parent_path = NodePath("../../torso/u_arm_f/l_arm_f")
404 | child_path = NodePath("../../torso/u_arm_f/l_arm_f/hand_f")
405 | parent_weight = 0.5
406 | inverse = false
407 |
408 | [node name="MessyJoint7" type="Node" parent="MessyJointManager"]
409 |
410 | script/script = ExtResource( 3 )
411 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
412 | parent_path = NodePath("../../torso/thigh_b")
413 | child_path = NodePath("../../torso/thigh_b/calf_b")
414 | parent_weight = 0.5
415 | inverse = false
416 |
417 | [node name="MessyJoint8" type="Node" parent="MessyJointManager"]
418 |
419 | script/script = ExtResource( 3 )
420 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
421 | parent_path = NodePath("../../torso/thigh_b/calf_b")
422 | child_path = NodePath("../../torso/thigh_b/calf_b/foot_b")
423 | parent_weight = 1.0
424 | inverse = false
425 |
426 | [node name="MessyJoint9" type="Node" parent="MessyJointManager"]
427 |
428 | script/script = ExtResource( 3 )
429 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
430 | parent_path = NodePath("../../torso/u_arm_b")
431 | child_path = NodePath("../../torso/u_arm_b/l_arm_b")
432 | parent_weight = 0.5
433 | inverse = false
434 |
435 | [node name="MessyJoint10" type="Node" parent="MessyJointManager"]
436 |
437 | script/script = ExtResource( 3 )
438 | __meta__ = { "MessyJoint":true, "_editor_icon":ExtResource( 4 ) }
439 | parent_path = NodePath("../../torso/u_arm_b/l_arm_b")
440 | child_path = NodePath("../../torso/u_arm_b/l_arm_b/hand_b")
441 | parent_weight = 0.5
442 | inverse = false
443 |
444 | [node name="torso" type="Polygon2D" parent="."]
445 |
446 | transform/pos = Vector2( 248, 240 )
447 | polygon = Vector2Array( 214.438, 157.004, 299.037, 165.103, 299.145, 263.155, 214.989, 284.596 )
448 | uv = Vector2Array( 215, 160, 300, 160, 300, 266, 215, 284 )
449 | color = Color( 1, 1, 1, 1 )
450 | vertex_colors = ColorArray( )
451 | offset = Vector2( -248, -240 )
452 | texture/texture = ExtResource( 5 )
453 | texture/offset = Vector2( 0, 0 )
454 | texture/scale = Vector2( 512, 512 )
455 | texture/rotation = 0.0
456 | invert/enable = false
457 | invert/border = 100.0
458 | script/script = ExtResource( 6 )
459 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_editor_icon":ExtResource( 7 ) }
460 | mass_0 = 0.1
461 | mass_1 = 2.0
462 | mass_2 = 2.0
463 | mass_3 = 0.1
464 |
465 | [node name="u_arm_b" type="Polygon2D" parent="torso"]
466 |
467 | visibility/behind_parent = true
468 | transform/pos = Vector2( -4, -57 )
469 | transform/rot = -29.2172
470 | polygon = Vector2Array( 406, 284, 444, 284, 438.747, 352.14, 405.491, 366.869 )
471 | uv = Vector2Array( 406, 284, 444, 284, 444, 360, 406, 360 )
472 | color = Color( 0.8, 0.8, 0.8, 1 )
473 | vertex_colors = ColorArray( )
474 | offset = Vector2( -422, -299 )
475 | texture/texture = ExtResource( 5 )
476 | texture/offset = Vector2( 0, 0 )
477 | texture/scale = Vector2( 512, 512 )
478 | texture/rotation = 0.0
479 | invert/enable = false
480 | invert/border = 100.0
481 | script/script = ExtResource( 6 )
482 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_edit_ik_":true, "_editor_icon":ExtResource( 7 ) }
483 | mass_0 = 1
484 | mass_1 = 1
485 | mass_2 = 1
486 | mass_3 = 1
487 |
488 | [node name="l_arm_b" type="Polygon2D" parent="torso/u_arm_b"]
489 |
490 | transform/pos = Vector2( -1, 65 )
491 | transform/rot = 47.7784
492 | polygon = Vector2Array( 408.453, 354.443, 441.709, 369.172, 443.802, 415.293, 405.852, 416.889 )
493 | uv = Vector2Array( 406, 360, 444, 360, 444, 416, 406, 416 )
494 | color = Color( 0.8, 0.8, 0.8, 1 )
495 | vertex_colors = ColorArray( )
496 | offset = Vector2( -421, -364 )
497 | texture/texture = ExtResource( 5 )
498 | texture/offset = Vector2( 0, 0 )
499 | texture/scale = Vector2( 512, 512 )
500 | texture/rotation = 0.0
501 | invert/enable = false
502 | invert/border = 100.0
503 | script/script = ExtResource( 6 )
504 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
505 | mass_0 = 1
506 | mass_1 = 1
507 | mass_2 = 1
508 | mass_3 = 1
509 |
510 | [node name="hand_b" type="Polygon2D" parent="torso/u_arm_b/l_arm_b"]
511 |
512 | transform/pos = Vector2( 6, 56 )
513 | transform/rot = 4.81606
514 | polygon = Vector2Array( 406.188, 415.125, 444.138, 416.721, 444, 456, 406, 456 )
515 | uv = Vector2Array( 406, 416, 444, 416, 444, 456, 406, 456 )
516 | color = Color( 0.8, 0.8, 0.8, 1 )
517 | vertex_colors = ColorArray( )
518 | offset = Vector2( -427, -420 )
519 | texture/texture = ExtResource( 5 )
520 | texture/offset = Vector2( 0, 0 )
521 | texture/scale = Vector2( 512, 512 )
522 | texture/rotation = 0.0
523 | invert/enable = false
524 | invert/border = 100.0
525 | script/script = ExtResource( 6 )
526 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
527 | mass_0 = 1
528 | mass_1 = 1
529 | mass_2 = 1
530 | mass_3 = 1
531 |
532 | [node name="fingers_b" type="Position2D" parent="torso/u_arm_b/l_arm_b/hand_b"]
533 |
534 | transform/pos = Vector2( 3, 22 )
535 | __meta__ = { "_edit_bone_":true }
536 |
537 | [node name="thigh_b" type="Polygon2D" parent="torso"]
538 |
539 | visibility/behind_parent = true
540 | transform/pos = Vector2( 5, 43 )
541 | transform/rot = 40.7193
542 | polygon = Vector2Array( 236.786, 286.978, 276.94, 286.978, 293.331, 362.255, 221.451, 326.089 )
543 | uv = Vector2Array( 236.786, 286.978, 276.94, 286.978, 300, 348, 215, 348 )
544 | color = Color( 0.8, 0.8, 0.8, 1 )
545 | vertex_colors = ColorArray( )
546 | offset = Vector2( -253, -285 )
547 | texture/texture = ExtResource( 5 )
548 | texture/offset = Vector2( 0, 0 )
549 | texture/scale = Vector2( 512, 512 )
550 | texture/rotation = 0.0
551 | invert/enable = false
552 | invert/border = 100.0
553 | script/script = ExtResource( 6 )
554 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_edit_ik_":true, "_editor_icon":ExtResource( 7 ) }
555 | mass_0 = 0.1
556 | mass_1 = 0.1
557 | mass_2 = 1.01564
558 | mass_3 = 0.9707
559 |
560 | [node name="calf_b" type="Polygon2D" parent="torso/thigh_b"]
561 |
562 | transform/pos = Vector2( 12, 64 )
563 | transform/rot = -53.4176
564 | polygon = Vector2Array( 220.648, 370.315, 292.528, 334.15, 299.129, 442.287, 216.525, 422.248 )
565 | uv = Vector2Array( 215, 348, 300, 348, 300, 429, 215, 429 )
566 | color = Color( 0.8, 0.8, 0.8, 1 )
567 | vertex_colors = ColorArray( )
568 | offset = Vector2( -265, -349 )
569 | texture/texture = ExtResource( 5 )
570 | texture/offset = Vector2( 0, 0 )
571 | texture/scale = Vector2( 512, 512 )
572 | texture/rotation = 0.0
573 | invert/enable = false
574 | invert/border = 100.0
575 | script/script = ExtResource( 6 )
576 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
577 | mass_0 = 1
578 | mass_1 = 1
579 | mass_2 = 1
580 | mass_3 = 1
581 |
582 | [node name="foot_b" type="Polygon2D" parent="torso/thigh_b/calf_b"]
583 |
584 | transform/pos = Vector2( -21.0001, 83.0002 )
585 | transform/rot = -13.6362
586 | polygon = Vector2Array( 215, 429, 300, 429, 300, 442, 215, 442 )
587 | uv = Vector2Array( 215, 429, 300, 429, 300, 442, 215, 442 )
588 | color = Color( 0.8, 0.8, 0.8, 1 )
589 | vertex_colors = ColorArray( )
590 | offset = Vector2( -244, -432 )
591 | texture/texture = ExtResource( 5 )
592 | texture/offset = Vector2( 0, 0 )
593 | texture/scale = Vector2( 512, 512 )
594 | texture/rotation = 0.0
595 | invert/enable = false
596 | invert/border = 100.0
597 | script/script = ExtResource( 6 )
598 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
599 | mass_0 = 1
600 | mass_1 = 1
601 | mass_2 = 1
602 | mass_3 = 1
603 |
604 | [node name="toes_b" type="Position2D" parent="torso/thigh_b/calf_b/foot_b"]
605 |
606 | transform/pos = Vector2( 33, 5 )
607 | __meta__ = { "_edit_bone_":true }
608 |
609 | [node name="head" type="Polygon2D" parent="torso"]
610 |
611 | transform/pos = Vector2( -2, -87 )
612 | transform/rot = -6.59746
613 | polygon = Vector2Array( 215, 95, 300, 95, 300.077, 158.929, 215.159, 160.603 )
614 | uv = Vector2Array( 215, 95, 300, 95, 300, 160, 215, 160 )
615 | color = Color( 1, 1, 1, 1 )
616 | vertex_colors = ColorArray( )
617 | offset = Vector2( -246, -153 )
618 | texture/texture = ExtResource( 5 )
619 | texture/offset = Vector2( 0, 0 )
620 | texture/scale = Vector2( 512, 512 )
621 | texture/rotation = 0.0
622 | invert/enable = false
623 | invert/border = 100.0
624 | script/script = ExtResource( 6 )
625 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
626 | mass_0 = 1
627 | mass_1 = 1
628 | mass_2 = 1
629 | mass_3 = 1
630 |
631 | [node name="thigh_f" type="Polygon2D" parent="torso"]
632 |
633 | transform/pos = Vector2( 5, 43 )
634 | transform/rot = 4.85486
635 | polygon = Vector2Array( 214.987, 283.374, 300.659, 269.132, 297.478, 357.849, 217.626, 333.622 )
636 | uv = Vector2Array( 215, 284, 300, 266, 300, 348, 215, 348 )
637 | color = Color( 1, 1, 1, 1 )
638 | vertex_colors = ColorArray( )
639 | offset = Vector2( -253, -285 )
640 | texture/texture = ExtResource( 5 )
641 | texture/offset = Vector2( 0, 0 )
642 | texture/scale = Vector2( 512, 512 )
643 | texture/rotation = 0.0
644 | invert/enable = false
645 | invert/border = 100.0
646 | script/script = ExtResource( 6 )
647 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_edit_ik_":true, "_editor_icon":ExtResource( 7 ) }
648 | mass_0 = 0.1
649 | mass_1 = 0.1
650 | mass_2 = 2.0
651 | mass_3 = 0.9953
652 |
653 | [node name="calf_f" type="Polygon2D" parent="torso/thigh_f"]
654 |
655 | transform/pos = Vector2( 12, 64 )
656 | transform/rot = -31.9989
657 | polygon = Vector2Array( 216.845, 361.017, 297.232, 339.294, 291.196, 462.292, 222.22, 412.619 )
658 | uv = Vector2Array( 215, 348, 300, 348, 300, 429, 215, 429 )
659 | color = Color( 1, 1, 1, 1 )
660 | vertex_colors = ColorArray( )
661 | offset = Vector2( -265, -349 )
662 | texture/texture = ExtResource( 5 )
663 | texture/offset = Vector2( 0, 0 )
664 | texture/scale = Vector2( 512, 512 )
665 | texture/rotation = 0.0
666 | invert/enable = false
667 | invert/border = 100.0
668 | script/script = ExtResource( 6 )
669 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
670 | mass_0 = 1
671 | mass_1 = 1
672 | mass_2 = 1
673 | mass_3 = 1
674 |
675 | [node name="foot_f" type="Polygon2D" parent="torso/thigh_f/calf_f"]
676 |
677 | transform/pos = Vector2( -21.0001, 83.0009 )
678 | transform/rot = -35.7591
679 | polygon = Vector2Array( 215, 429, 300, 429, 300, 442, 215, 442 )
680 | uv = Vector2Array( 215, 429, 300, 429, 300, 442, 215, 442 )
681 | color = Color( 1, 1, 1, 1 )
682 | vertex_colors = ColorArray( )
683 | offset = Vector2( -244, -432 )
684 | texture/texture = ExtResource( 5 )
685 | texture/offset = Vector2( 0, 0 )
686 | texture/scale = Vector2( 512, 512 )
687 | texture/rotation = 0.0
688 | invert/enable = false
689 | invert/border = 100.0
690 | script/script = ExtResource( 6 )
691 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
692 | mass_0 = 1
693 | mass_1 = 1
694 | mass_2 = 1
695 | mass_3 = 1
696 |
697 | [node name="toes_f" type="Position2D" parent="torso/thigh_f/calf_f/foot_f"]
698 |
699 | transform/pos = Vector2( 33, 5 )
700 | __meta__ = { "_edit_bone_":true }
701 |
702 | [node name="u_arm_f" type="Polygon2D" parent="torso"]
703 |
704 | transform/pos = Vector2( -4, -57 )
705 | transform/rot = 29.9289
706 | polygon = Vector2Array( 66, 284, 104, 284, 93.7372, 350.844, 66.9443, 371.745 )
707 | uv = Vector2Array( 66, 284, 104, 284, 104, 360, 66, 360 )
708 | color = Color( 1, 1, 1, 1 )
709 | vertex_colors = ColorArray( )
710 | offset = Vector2( -83, -299 )
711 | texture/texture = ExtResource( 5 )
712 | texture/offset = Vector2( 0, 0 )
713 | texture/scale = Vector2( 512, 512 )
714 | texture/rotation = 0.0
715 | invert/enable = false
716 | invert/border = 100.0
717 | script/script = ExtResource( 6 )
718 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_edit_ik_":true, "_editor_icon":ExtResource( 7 ) }
719 | mass_0 = 1
720 | mass_1 = 1
721 | mass_2 = 1
722 | mass_3 = 1
723 |
724 | [node name="l_arm_f" type="Polygon2D" parent="torso/u_arm_f"]
725 |
726 | transform/pos = Vector2( -0.999969, 65 )
727 | transform/rot = 75.9148
728 | polygon = Vector2Array( 70.824, 351.282, 97.6169, 372.183, 102.858, 413.421, 65.6937, 419.873 )
729 | uv = Vector2Array( 66, 360, 104, 360, 104, 416, 66, 416 )
730 | color = Color( 1, 1, 1, 1 )
731 | vertex_colors = ColorArray( )
732 | offset = Vector2( -82, -364 )
733 | texture/texture = ExtResource( 5 )
734 | texture/offset = Vector2( 0, 0 )
735 | texture/scale = Vector2( 512, 512 )
736 | texture/rotation = 0.0
737 | invert/enable = false
738 | invert/border = 100.0
739 | script/script = ExtResource( 6 )
740 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
741 | mass_0 = 1
742 | mass_1 = 1
743 | mass_2 = 1
744 | mass_3 = 1
745 |
746 | [node name="hand_f" type="Polygon2D" parent="torso/u_arm_f/l_arm_f"]
747 |
748 | transform/pos = Vector2( 6, 56 )
749 | transform/rot = 19.6982
750 | polygon = Vector2Array( 67.0419, 412.361, 104.206, 418.814, 104, 456, 66, 456 )
751 | uv = Vector2Array( 66, 416, 104, 416, 104, 456, 66, 456 )
752 | color = Color( 1, 1, 1, 1 )
753 | vertex_colors = ColorArray( )
754 | offset = Vector2( -88, -420 )
755 | texture/texture = ExtResource( 5 )
756 | texture/offset = Vector2( 0, 0 )
757 | texture/scale = Vector2( 512, 512 )
758 | texture/rotation = 0.0
759 | invert/enable = false
760 | invert/border = 100.0
761 | script/script = ExtResource( 6 )
762 | __meta__ = { "MessyPolygon":true, "MessyPolygon2D":true, "_edit_bone_":true, "_editor_icon":ExtResource( 7 ) }
763 | mass_0 = 1
764 | mass_1 = 1
765 | mass_2 = 1
766 | mass_3 = 1
767 |
768 | [node name="fingers_f" type="Position2D" parent="torso/u_arm_f/l_arm_f/hand_f"]
769 |
770 | transform/pos = Vector2( 2.80251, 21.9973 )
771 | __meta__ = { "_edit_bone_":true }
772 |
773 | [node name="AnimationPlayer" type="AnimationPlayer" parent="."]
774 |
775 | playback/process_mode = 1
776 | playback/default_blend_time = 0.0
777 | root/root = NodePath("..")
778 | anims/rest = SubResource( 1 )
779 | anims/walk = SubResource( 2 )
780 | next/walk = ""
781 | playback/active = true
782 | playback/speed = 1.0
783 | blend_times = [ ]
784 | autoplay = "walk"
785 |
786 |
787 |
--------------------------------------------------------------------------------