├── .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 | Cut-out sample 11 | Sample powered by MessDeform 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 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
SegmentPieces
MainHead, torso, front thigh, front calf, front foot
Back legBack thigh, back calf, back foot
Front armUpper arm, lower arm, hand
Back armUpper arm, lower arm, hand
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 | --------------------------------------------------------------------------------