| 1 | /**************************************************************************/ | 
|---|
| 2 | /*  skeleton_profile.cpp                                                  */ | 
|---|
| 3 | /**************************************************************************/ | 
|---|
| 4 | /*                         This file is part of:                          */ | 
|---|
| 5 | /*                             GODOT ENGINE                               */ | 
|---|
| 6 | /*                        https://godotengine.org                         */ | 
|---|
| 7 | /**************************************************************************/ | 
|---|
| 8 | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ | 
|---|
| 9 | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */ | 
|---|
| 10 | /*                                                                        */ | 
|---|
| 11 | /* Permission is hereby granted, free of charge, to any person obtaining  */ | 
|---|
| 12 | /* a copy of this software and associated documentation files (the        */ | 
|---|
| 13 | /* "Software"), to deal in the Software without restriction, including    */ | 
|---|
| 14 | /* without limitation the rights to use, copy, modify, merge, publish,    */ | 
|---|
| 15 | /* distribute, sublicense, and/or sell copies of the Software, and to     */ | 
|---|
| 16 | /* permit persons to whom the Software is furnished to do so, subject to  */ | 
|---|
| 17 | /* the following conditions:                                              */ | 
|---|
| 18 | /*                                                                        */ | 
|---|
| 19 | /* The above copyright notice and this permission notice shall be         */ | 
|---|
| 20 | /* included in all copies or substantial portions of the Software.        */ | 
|---|
| 21 | /*                                                                        */ | 
|---|
| 22 | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,        */ | 
|---|
| 23 | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF     */ | 
|---|
| 24 | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ | 
|---|
| 25 | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY   */ | 
|---|
| 26 | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,   */ | 
|---|
| 27 | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE      */ | 
|---|
| 28 | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                 */ | 
|---|
| 29 | /**************************************************************************/ | 
|---|
| 30 |  | 
|---|
| 31 | #include "skeleton_profile.h" | 
|---|
| 32 |  | 
|---|
| 33 | bool SkeletonProfile::_set(const StringName &p_path, const Variant &p_value) { | 
|---|
| 34 | ERR_FAIL_COND_V(is_read_only, false); | 
|---|
| 35 | String path = p_path; | 
|---|
| 36 |  | 
|---|
| 37 | if (path.begins_with( "groups/")) { | 
|---|
| 38 | int which = path.get_slicec('/', 1).to_int(); | 
|---|
| 39 | String what = path.get_slicec('/', 2); | 
|---|
| 40 | ERR_FAIL_INDEX_V(which, groups.size(), false); | 
|---|
| 41 |  | 
|---|
| 42 | if (what == "group_name") { | 
|---|
| 43 | set_group_name(which, p_value); | 
|---|
| 44 | } else if (what == "texture") { | 
|---|
| 45 | set_texture(which, p_value); | 
|---|
| 46 | } else { | 
|---|
| 47 | return false; | 
|---|
| 48 | } | 
|---|
| 49 | } | 
|---|
| 50 |  | 
|---|
| 51 | if (path.begins_with( "bones/")) { | 
|---|
| 52 | int which = path.get_slicec('/', 1).to_int(); | 
|---|
| 53 | String what = path.get_slicec('/', 2); | 
|---|
| 54 | ERR_FAIL_INDEX_V(which, bones.size(), false); | 
|---|
| 55 |  | 
|---|
| 56 | if (what == "bone_name") { | 
|---|
| 57 | set_bone_name(which, p_value); | 
|---|
| 58 | } else if (what == "bone_parent") { | 
|---|
| 59 | set_bone_parent(which, p_value); | 
|---|
| 60 | } else if (what == "tail_direction") { | 
|---|
| 61 | set_tail_direction(which, static_cast<TailDirection>((int)p_value)); | 
|---|
| 62 | } else if (what == "bone_tail") { | 
|---|
| 63 | set_bone_tail(which, p_value); | 
|---|
| 64 | } else if (what == "reference_pose") { | 
|---|
| 65 | set_reference_pose(which, p_value); | 
|---|
| 66 | } else if (what == "handle_offset") { | 
|---|
| 67 | set_handle_offset(which, p_value); | 
|---|
| 68 | } else if (what == "group") { | 
|---|
| 69 | set_group(which, p_value); | 
|---|
| 70 | } else if (what == "require") { | 
|---|
| 71 | set_require(which, p_value); | 
|---|
| 72 | } else { | 
|---|
| 73 | return false; | 
|---|
| 74 | } | 
|---|
| 75 | } | 
|---|
| 76 | return true; | 
|---|
| 77 | } | 
|---|
| 78 |  | 
|---|
| 79 | bool SkeletonProfile::_get(const StringName &p_path, Variant &r_ret) const { | 
|---|
| 80 | String path = p_path; | 
|---|
| 81 |  | 
|---|
| 82 | if (path.begins_with( "groups/")) { | 
|---|
| 83 | int which = path.get_slicec('/', 1).to_int(); | 
|---|
| 84 | String what = path.get_slicec('/', 2); | 
|---|
| 85 | ERR_FAIL_INDEX_V(which, groups.size(), false); | 
|---|
| 86 |  | 
|---|
| 87 | if (what == "group_name") { | 
|---|
| 88 | r_ret = get_group_name(which); | 
|---|
| 89 | } else if (what == "texture") { | 
|---|
| 90 | r_ret = get_texture(which); | 
|---|
| 91 | } else { | 
|---|
| 92 | return false; | 
|---|
| 93 | } | 
|---|
| 94 | } | 
|---|
| 95 |  | 
|---|
| 96 | if (path.begins_with( "bones/")) { | 
|---|
| 97 | int which = path.get_slicec('/', 1).to_int(); | 
|---|
| 98 | String what = path.get_slicec('/', 2); | 
|---|
| 99 | ERR_FAIL_INDEX_V(which, bones.size(), false); | 
|---|
| 100 |  | 
|---|
| 101 | if (what == "bone_name") { | 
|---|
| 102 | r_ret = get_bone_name(which); | 
|---|
| 103 | } else if (what == "bone_parent") { | 
|---|
| 104 | r_ret = get_bone_parent(which); | 
|---|
| 105 | } else if (what == "tail_direction") { | 
|---|
| 106 | r_ret = get_tail_direction(which); | 
|---|
| 107 | } else if (what == "bone_tail") { | 
|---|
| 108 | r_ret = get_bone_tail(which); | 
|---|
| 109 | } else if (what == "reference_pose") { | 
|---|
| 110 | r_ret = get_reference_pose(which); | 
|---|
| 111 | } else if (what == "handle_offset") { | 
|---|
| 112 | r_ret = get_handle_offset(which); | 
|---|
| 113 | } else if (what == "group") { | 
|---|
| 114 | r_ret = get_group(which); | 
|---|
| 115 | } else if (what == "require") { | 
|---|
| 116 | r_ret = is_require(which); | 
|---|
| 117 | } else { | 
|---|
| 118 | return false; | 
|---|
| 119 | } | 
|---|
| 120 | } | 
|---|
| 121 | return true; | 
|---|
| 122 | } | 
|---|
| 123 |  | 
|---|
| 124 | void SkeletonProfile::_validate_property(PropertyInfo &p_property) const { | 
|---|
| 125 | if (is_read_only) { | 
|---|
| 126 | if (p_property.name == ( "group_size") || p_property.name == ( "bone_size") || p_property.name == ( "root_bone") || p_property.name == ( "scale_base_bone")) { | 
|---|
| 127 | p_property.usage = PROPERTY_USAGE_NO_EDITOR; | 
|---|
| 128 | return; | 
|---|
| 129 | } | 
|---|
| 130 | } | 
|---|
| 131 |  | 
|---|
| 132 | if (p_property.name == ( "root_bone") || p_property.name == ( "scale_base_bone")) { | 
|---|
| 133 | String hint = ""; | 
|---|
| 134 | for (int i = 0; i < bones.size(); i++) { | 
|---|
| 135 | hint += i == 0 ? String(bones[i].bone_name) : ","+ String(bones[i].bone_name); | 
|---|
| 136 | } | 
|---|
| 137 | p_property.hint_string = hint; | 
|---|
| 138 | } | 
|---|
| 139 |  | 
|---|
| 140 | PackedStringArray split = p_property.name.split( "/"); | 
|---|
| 141 | if (split.size() == 3 && split[0] == "bones") { | 
|---|
| 142 | if (split[2] == "bone_tail"&& get_tail_direction(split[1].to_int()) != TAIL_DIRECTION_SPECIFIC_CHILD) { | 
|---|
| 143 | p_property.usage = PROPERTY_USAGE_NONE; | 
|---|
| 144 | } | 
|---|
| 145 | } | 
|---|
| 146 | } | 
|---|
| 147 |  | 
|---|
| 148 | void SkeletonProfile::_get_property_list(List<PropertyInfo> *p_list) const { | 
|---|
| 149 | if (is_read_only) { | 
|---|
| 150 | return; | 
|---|
| 151 | } | 
|---|
| 152 | String group_names = ""; | 
|---|
| 153 | for (int i = 0; i < groups.size(); i++) { | 
|---|
| 154 | String path = "groups/"+ itos(i) + "/"; | 
|---|
| 155 | p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "group_name")); | 
|---|
| 156 | p_list->push_back(PropertyInfo(Variant::OBJECT, path + "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D")); | 
|---|
| 157 | if (i > 0) { | 
|---|
| 158 | group_names = group_names + ","; | 
|---|
| 159 | } | 
|---|
| 160 | group_names = group_names + groups[i].group_name; | 
|---|
| 161 | } | 
|---|
| 162 | for (int i = 0; i < bones.size(); i++) { | 
|---|
| 163 | String path = "bones/"+ itos(i) + "/"; | 
|---|
| 164 | p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "bone_name")); | 
|---|
| 165 | p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "bone_parent")); | 
|---|
| 166 | p_list->push_back(PropertyInfo(Variant::INT, path + "tail_direction", PROPERTY_HINT_ENUM, "AverageChildren,SpecificChild,End")); | 
|---|
| 167 | p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "bone_tail")); | 
|---|
| 168 | p_list->push_back(PropertyInfo(Variant::TRANSFORM3D, path + "reference_pose")); | 
|---|
| 169 | p_list->push_back(PropertyInfo(Variant::VECTOR2, path + "handle_offset")); | 
|---|
| 170 | p_list->push_back(PropertyInfo(Variant::STRING_NAME, path + "group", PROPERTY_HINT_ENUM, group_names)); | 
|---|
| 171 | p_list->push_back(PropertyInfo(Variant::BOOL, path + "require")); | 
|---|
| 172 | } | 
|---|
| 173 |  | 
|---|
| 174 | for (PropertyInfo &E : *p_list) { | 
|---|
| 175 | _validate_property(E); | 
|---|
| 176 | } | 
|---|
| 177 | } | 
|---|
| 178 |  | 
|---|
| 179 | StringName SkeletonProfile::get_root_bone() { | 
|---|
| 180 | return root_bone; | 
|---|
| 181 | } | 
|---|
| 182 |  | 
|---|
| 183 | void SkeletonProfile::set_root_bone(StringName p_bone_name) { | 
|---|
| 184 | if (is_read_only) { | 
|---|
| 185 | return; | 
|---|
| 186 | } | 
|---|
| 187 | root_bone = p_bone_name; | 
|---|
| 188 | } | 
|---|
| 189 |  | 
|---|
| 190 | StringName SkeletonProfile::get_scale_base_bone() { | 
|---|
| 191 | return scale_base_bone; | 
|---|
| 192 | } | 
|---|
| 193 |  | 
|---|
| 194 | void SkeletonProfile::set_scale_base_bone(StringName p_bone_name) { | 
|---|
| 195 | if (is_read_only) { | 
|---|
| 196 | return; | 
|---|
| 197 | } | 
|---|
| 198 | scale_base_bone = p_bone_name; | 
|---|
| 199 | } | 
|---|
| 200 |  | 
|---|
| 201 | int SkeletonProfile::get_group_size() { | 
|---|
| 202 | return groups.size(); | 
|---|
| 203 | } | 
|---|
| 204 |  | 
|---|
| 205 | void SkeletonProfile::set_group_size(int p_size) { | 
|---|
| 206 | if (is_read_only) { | 
|---|
| 207 | return; | 
|---|
| 208 | } | 
|---|
| 209 | ERR_FAIL_COND(p_size < 0); | 
|---|
| 210 | groups.resize(p_size); | 
|---|
| 211 | emit_signal( "profile_updated"); | 
|---|
| 212 | notify_property_list_changed(); | 
|---|
| 213 | } | 
|---|
| 214 |  | 
|---|
| 215 | StringName SkeletonProfile::get_group_name(int p_group_idx) const { | 
|---|
| 216 | ERR_FAIL_INDEX_V(p_group_idx, groups.size(), StringName()); | 
|---|
| 217 | return groups[p_group_idx].group_name; | 
|---|
| 218 | } | 
|---|
| 219 |  | 
|---|
| 220 | void SkeletonProfile::set_group_name(int p_group_idx, const StringName p_group_name) { | 
|---|
| 221 | if (is_read_only) { | 
|---|
| 222 | return; | 
|---|
| 223 | } | 
|---|
| 224 | ERR_FAIL_INDEX(p_group_idx, groups.size()); | 
|---|
| 225 | groups.write[p_group_idx].group_name = p_group_name; | 
|---|
| 226 | emit_signal( "profile_updated"); | 
|---|
| 227 | } | 
|---|
| 228 |  | 
|---|
| 229 | Ref<Texture2D> SkeletonProfile::get_texture(int p_group_idx) const { | 
|---|
| 230 | ERR_FAIL_INDEX_V(p_group_idx, groups.size(), Ref<Texture2D>()); | 
|---|
| 231 | return groups[p_group_idx].texture; | 
|---|
| 232 | } | 
|---|
| 233 |  | 
|---|
| 234 | void SkeletonProfile::set_texture(int p_group_idx, const Ref<Texture2D> &p_texture) { | 
|---|
| 235 | if (is_read_only) { | 
|---|
| 236 | return; | 
|---|
| 237 | } | 
|---|
| 238 | ERR_FAIL_INDEX(p_group_idx, groups.size()); | 
|---|
| 239 | groups.write[p_group_idx].texture = p_texture; | 
|---|
| 240 | emit_signal( "profile_updated"); | 
|---|
| 241 | } | 
|---|
| 242 |  | 
|---|
| 243 | int SkeletonProfile::get_bone_size() { | 
|---|
| 244 | return bones.size(); | 
|---|
| 245 | } | 
|---|
| 246 |  | 
|---|
| 247 | void SkeletonProfile::set_bone_size(int p_size) { | 
|---|
| 248 | if (is_read_only) { | 
|---|
| 249 | return; | 
|---|
| 250 | } | 
|---|
| 251 | ERR_FAIL_COND(p_size < 0); | 
|---|
| 252 | bones.resize(p_size); | 
|---|
| 253 | emit_signal( "profile_updated"); | 
|---|
| 254 | notify_property_list_changed(); | 
|---|
| 255 | } | 
|---|
| 256 |  | 
|---|
| 257 | int SkeletonProfile::find_bone(StringName p_bone_name) const { | 
|---|
| 258 | if (p_bone_name == StringName()) { | 
|---|
| 259 | return -1; | 
|---|
| 260 | } | 
|---|
| 261 | for (int i = 0; i < bones.size(); i++) { | 
|---|
| 262 | if (bones[i].bone_name == p_bone_name) { | 
|---|
| 263 | return i; | 
|---|
| 264 | } | 
|---|
| 265 | } | 
|---|
| 266 | return -1; | 
|---|
| 267 | } | 
|---|
| 268 |  | 
|---|
| 269 | StringName SkeletonProfile::get_bone_name(int p_bone_idx) const { | 
|---|
| 270 | ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), StringName()); | 
|---|
| 271 | return bones[p_bone_idx].bone_name; | 
|---|
| 272 | } | 
|---|
| 273 |  | 
|---|
| 274 | void SkeletonProfile::set_bone_name(int p_bone_idx, const StringName p_bone_name) { | 
|---|
| 275 | if (is_read_only) { | 
|---|
| 276 | return; | 
|---|
| 277 | } | 
|---|
| 278 | ERR_FAIL_INDEX(p_bone_idx, bones.size()); | 
|---|
| 279 | bones.write[p_bone_idx].bone_name = p_bone_name; | 
|---|
| 280 | emit_signal( "profile_updated"); | 
|---|
| 281 | } | 
|---|
| 282 |  | 
|---|
| 283 | StringName SkeletonProfile::get_bone_parent(int p_bone_idx) const { | 
|---|
| 284 | ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), StringName()); | 
|---|
| 285 | return bones[p_bone_idx].bone_parent; | 
|---|
| 286 | } | 
|---|
| 287 |  | 
|---|
| 288 | void SkeletonProfile::set_bone_parent(int p_bone_idx, const StringName p_bone_parent) { | 
|---|
| 289 | if (is_read_only) { | 
|---|
| 290 | return; | 
|---|
| 291 | } | 
|---|
| 292 | ERR_FAIL_INDEX(p_bone_idx, bones.size()); | 
|---|
| 293 | bones.write[p_bone_idx].bone_parent = p_bone_parent; | 
|---|
| 294 | emit_signal( "profile_updated"); | 
|---|
| 295 | } | 
|---|
| 296 |  | 
|---|
| 297 | SkeletonProfile::TailDirection SkeletonProfile::get_tail_direction(int p_bone_idx) const { | 
|---|
| 298 | ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), TAIL_DIRECTION_AVERAGE_CHILDREN); | 
|---|
| 299 | return bones[p_bone_idx].tail_direction; | 
|---|
| 300 | } | 
|---|
| 301 |  | 
|---|
| 302 | void SkeletonProfile::set_tail_direction(int p_bone_idx, const TailDirection p_tail_direction) { | 
|---|
| 303 | if (is_read_only) { | 
|---|
| 304 | return; | 
|---|
| 305 | } | 
|---|
| 306 | ERR_FAIL_INDEX(p_bone_idx, bones.size()); | 
|---|
| 307 | bones.write[p_bone_idx].tail_direction = p_tail_direction; | 
|---|
| 308 | emit_signal( "profile_updated"); | 
|---|
| 309 | notify_property_list_changed(); | 
|---|
| 310 | } | 
|---|
| 311 |  | 
|---|
| 312 | StringName SkeletonProfile::get_bone_tail(int p_bone_idx) const { | 
|---|
| 313 | ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), StringName()); | 
|---|
| 314 | return bones[p_bone_idx].bone_tail; | 
|---|
| 315 | } | 
|---|
| 316 |  | 
|---|
| 317 | void SkeletonProfile::set_bone_tail(int p_bone_idx, const StringName p_bone_tail) { | 
|---|
| 318 | if (is_read_only) { | 
|---|
| 319 | return; | 
|---|
| 320 | } | 
|---|
| 321 | ERR_FAIL_INDEX(p_bone_idx, bones.size()); | 
|---|
| 322 | bones.write[p_bone_idx].bone_tail = p_bone_tail; | 
|---|
| 323 | emit_signal( "profile_updated"); | 
|---|
| 324 | } | 
|---|
| 325 |  | 
|---|
| 326 | Transform3D SkeletonProfile::get_reference_pose(int p_bone_idx) const { | 
|---|
| 327 | ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), Transform3D()); | 
|---|
| 328 | return bones[p_bone_idx].reference_pose; | 
|---|
| 329 | } | 
|---|
| 330 |  | 
|---|
| 331 | void SkeletonProfile::set_reference_pose(int p_bone_idx, const Transform3D p_reference_pose) { | 
|---|
| 332 | if (is_read_only) { | 
|---|
| 333 | return; | 
|---|
| 334 | } | 
|---|
| 335 | ERR_FAIL_INDEX(p_bone_idx, bones.size()); | 
|---|
| 336 | bones.write[p_bone_idx].reference_pose = p_reference_pose; | 
|---|
| 337 | emit_signal( "profile_updated"); | 
|---|
| 338 | } | 
|---|
| 339 |  | 
|---|
| 340 | Vector2 SkeletonProfile::get_handle_offset(int p_bone_idx) const { | 
|---|
| 341 | ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), Vector2()); | 
|---|
| 342 | return bones[p_bone_idx].handle_offset; | 
|---|
| 343 | } | 
|---|
| 344 |  | 
|---|
| 345 | void SkeletonProfile::set_handle_offset(int p_bone_idx, const Vector2 p_handle_offset) { | 
|---|
| 346 | if (is_read_only) { | 
|---|
| 347 | return; | 
|---|
| 348 | } | 
|---|
| 349 | ERR_FAIL_INDEX(p_bone_idx, bones.size()); | 
|---|
| 350 | bones.write[p_bone_idx].handle_offset = p_handle_offset; | 
|---|
| 351 | emit_signal( "profile_updated"); | 
|---|
| 352 | } | 
|---|
| 353 |  | 
|---|
| 354 | StringName SkeletonProfile::get_group(int p_bone_idx) const { | 
|---|
| 355 | ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), StringName()); | 
|---|
| 356 | return bones[p_bone_idx].group; | 
|---|
| 357 | } | 
|---|
| 358 |  | 
|---|
| 359 | void SkeletonProfile::set_group(int p_bone_idx, const StringName p_group) { | 
|---|
| 360 | if (is_read_only) { | 
|---|
| 361 | return; | 
|---|
| 362 | } | 
|---|
| 363 | ERR_FAIL_INDEX(p_bone_idx, bones.size()); | 
|---|
| 364 | bones.write[p_bone_idx].group = p_group; | 
|---|
| 365 | emit_signal( "profile_updated"); | 
|---|
| 366 | } | 
|---|
| 367 |  | 
|---|
| 368 | bool SkeletonProfile::is_require(int p_bone_idx) const { | 
|---|
| 369 | ERR_FAIL_INDEX_V(p_bone_idx, bones.size(), false); | 
|---|
| 370 | return bones[p_bone_idx].require; | 
|---|
| 371 | } | 
|---|
| 372 |  | 
|---|
| 373 | void SkeletonProfile::set_require(int p_bone_idx, const bool p_require) { | 
|---|
| 374 | if (is_read_only) { | 
|---|
| 375 | return; | 
|---|
| 376 | } | 
|---|
| 377 | ERR_FAIL_INDEX(p_bone_idx, bones.size()); | 
|---|
| 378 | bones.write[p_bone_idx].require = p_require; | 
|---|
| 379 | emit_signal( "profile_updated"); | 
|---|
| 380 | } | 
|---|
| 381 |  | 
|---|
| 382 | bool SkeletonProfile::has_bone(StringName p_bone_name) { | 
|---|
| 383 | bool is_found = false; | 
|---|
| 384 | for (int i = 0; i < bones.size(); i++) { | 
|---|
| 385 | if (bones[i].bone_name == p_bone_name) { | 
|---|
| 386 | is_found = true; | 
|---|
| 387 | break; | 
|---|
| 388 | } | 
|---|
| 389 | } | 
|---|
| 390 | return is_found; | 
|---|
| 391 | } | 
|---|
| 392 |  | 
|---|
| 393 | void SkeletonProfile::_bind_methods() { | 
|---|
| 394 | ClassDB::bind_method(D_METHOD( "set_root_bone", "bone_name"), &SkeletonProfile::set_root_bone); | 
|---|
| 395 | ClassDB::bind_method(D_METHOD( "get_root_bone"), &SkeletonProfile::get_root_bone); | 
|---|
| 396 |  | 
|---|
| 397 | ClassDB::bind_method(D_METHOD( "set_scale_base_bone", "bone_name"), &SkeletonProfile::set_scale_base_bone); | 
|---|
| 398 | ClassDB::bind_method(D_METHOD( "get_scale_base_bone"), &SkeletonProfile::get_scale_base_bone); | 
|---|
| 399 |  | 
|---|
| 400 | ClassDB::bind_method(D_METHOD( "set_group_size", "size"), &SkeletonProfile::set_group_size); | 
|---|
| 401 | ClassDB::bind_method(D_METHOD( "get_group_size"), &SkeletonProfile::get_group_size); | 
|---|
| 402 |  | 
|---|
| 403 | ClassDB::bind_method(D_METHOD( "get_group_name", "group_idx"), &SkeletonProfile::get_group_name); | 
|---|
| 404 | ClassDB::bind_method(D_METHOD( "set_group_name", "group_idx", "group_name"), &SkeletonProfile::set_group_name); | 
|---|
| 405 |  | 
|---|
| 406 | ClassDB::bind_method(D_METHOD( "get_texture", "group_idx"), &SkeletonProfile::get_texture); | 
|---|
| 407 | ClassDB::bind_method(D_METHOD( "set_texture", "group_idx", "texture"), &SkeletonProfile::set_texture); | 
|---|
| 408 |  | 
|---|
| 409 | ClassDB::bind_method(D_METHOD( "set_bone_size", "size"), &SkeletonProfile::set_bone_size); | 
|---|
| 410 | ClassDB::bind_method(D_METHOD( "get_bone_size"), &SkeletonProfile::get_bone_size); | 
|---|
| 411 |  | 
|---|
| 412 | ClassDB::bind_method(D_METHOD( "find_bone", "bone_name"), &SkeletonProfile::find_bone); | 
|---|
| 413 |  | 
|---|
| 414 | ClassDB::bind_method(D_METHOD( "get_bone_name", "bone_idx"), &SkeletonProfile::get_bone_name); | 
|---|
| 415 | ClassDB::bind_method(D_METHOD( "set_bone_name", "bone_idx", "bone_name"), &SkeletonProfile::set_bone_name); | 
|---|
| 416 |  | 
|---|
| 417 | ClassDB::bind_method(D_METHOD( "get_bone_parent", "bone_idx"), &SkeletonProfile::get_bone_parent); | 
|---|
| 418 | ClassDB::bind_method(D_METHOD( "set_bone_parent", "bone_idx", "bone_parent"), &SkeletonProfile::set_bone_parent); | 
|---|
| 419 |  | 
|---|
| 420 | ClassDB::bind_method(D_METHOD( "get_tail_direction", "bone_idx"), &SkeletonProfile::get_tail_direction); | 
|---|
| 421 | ClassDB::bind_method(D_METHOD( "set_tail_direction", "bone_idx", "tail_direction"), &SkeletonProfile::set_tail_direction); | 
|---|
| 422 |  | 
|---|
| 423 | ClassDB::bind_method(D_METHOD( "get_bone_tail", "bone_idx"), &SkeletonProfile::get_bone_tail); | 
|---|
| 424 | ClassDB::bind_method(D_METHOD( "set_bone_tail", "bone_idx", "bone_tail"), &SkeletonProfile::set_bone_tail); | 
|---|
| 425 |  | 
|---|
| 426 | ClassDB::bind_method(D_METHOD( "get_reference_pose", "bone_idx"), &SkeletonProfile::get_reference_pose); | 
|---|
| 427 | ClassDB::bind_method(D_METHOD( "set_reference_pose", "bone_idx", "bone_name"), &SkeletonProfile::set_reference_pose); | 
|---|
| 428 |  | 
|---|
| 429 | ClassDB::bind_method(D_METHOD( "get_handle_offset", "bone_idx"), &SkeletonProfile::get_handle_offset); | 
|---|
| 430 | ClassDB::bind_method(D_METHOD( "set_handle_offset", "bone_idx", "handle_offset"), &SkeletonProfile::set_handle_offset); | 
|---|
| 431 |  | 
|---|
| 432 | ClassDB::bind_method(D_METHOD( "get_group", "bone_idx"), &SkeletonProfile::get_group); | 
|---|
| 433 | ClassDB::bind_method(D_METHOD( "set_group", "bone_idx", "group"), &SkeletonProfile::set_group); | 
|---|
| 434 |  | 
|---|
| 435 | ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "root_bone", PROPERTY_HINT_ENUM_SUGGESTION, ""), "set_root_bone", "get_root_bone"); | 
|---|
| 436 | ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "scale_base_bone", PROPERTY_HINT_ENUM_SUGGESTION, ""), "set_scale_base_bone", "get_scale_base_bone"); | 
|---|
| 437 |  | 
|---|
| 438 | ADD_PROPERTY(PropertyInfo(Variant::INT, "group_size", PROPERTY_HINT_RANGE, "0,100,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Groups,groups/"), "set_group_size", "get_group_size"); | 
|---|
| 439 | ADD_PROPERTY(PropertyInfo(Variant::INT, "bone_size", PROPERTY_HINT_RANGE, "0,100,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_ARRAY, "Bones,bones/"), "set_bone_size", "get_bone_size"); | 
|---|
| 440 |  | 
|---|
| 441 | ADD_SIGNAL(MethodInfo( "profile_updated")); | 
|---|
| 442 |  | 
|---|
| 443 | BIND_ENUM_CONSTANT(TAIL_DIRECTION_AVERAGE_CHILDREN); | 
|---|
| 444 | BIND_ENUM_CONSTANT(TAIL_DIRECTION_SPECIFIC_CHILD); | 
|---|
| 445 | BIND_ENUM_CONSTANT(TAIL_DIRECTION_END); | 
|---|
| 446 | } | 
|---|
| 447 |  | 
|---|
| 448 | SkeletonProfile::SkeletonProfile() { | 
|---|
| 449 | } | 
|---|
| 450 |  | 
|---|
| 451 | SkeletonProfile::~SkeletonProfile() { | 
|---|
| 452 | } | 
|---|
| 453 |  | 
|---|
| 454 | SkeletonProfileHumanoid::SkeletonProfileHumanoid() { | 
|---|
| 455 | is_read_only = true; | 
|---|
| 456 |  | 
|---|
| 457 | root_bone = "Root"; | 
|---|
| 458 | scale_base_bone = "Hips"; | 
|---|
| 459 |  | 
|---|
| 460 | groups.resize(4); | 
|---|
| 461 |  | 
|---|
| 462 | groups.write[0].group_name = "Body"; | 
|---|
| 463 | groups.write[1].group_name = "Face"; | 
|---|
| 464 | groups.write[2].group_name = "LeftHand"; | 
|---|
| 465 | groups.write[3].group_name = "RightHand"; | 
|---|
| 466 |  | 
|---|
| 467 | bones.resize(56); | 
|---|
| 468 |  | 
|---|
| 469 | bones.write[0].bone_name = "Root"; | 
|---|
| 470 | bones.write[0].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0); | 
|---|
| 471 | bones.write[0].handle_offset = Vector2(0.5, 0.91); | 
|---|
| 472 | bones.write[0].group = "Body"; | 
|---|
| 473 |  | 
|---|
| 474 | bones.write[1].bone_name = "Hips"; | 
|---|
| 475 | bones.write[1].bone_parent = "Root"; | 
|---|
| 476 | bones.write[1].tail_direction = TAIL_DIRECTION_SPECIFIC_CHILD; | 
|---|
| 477 | bones.write[1].bone_tail = "Spine"; | 
|---|
| 478 | bones.write[1].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.75, 0); | 
|---|
| 479 | bones.write[1].handle_offset = Vector2(0.5, 0.5); | 
|---|
| 480 | bones.write[1].group = "Body"; | 
|---|
| 481 | bones.write[1].require = true; | 
|---|
| 482 |  | 
|---|
| 483 | bones.write[2].bone_name = "Spine"; | 
|---|
| 484 | bones.write[2].bone_parent = "Hips"; | 
|---|
| 485 | bones.write[2].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); | 
|---|
| 486 | bones.write[2].handle_offset = Vector2(0.5, 0.43); | 
|---|
| 487 | bones.write[2].group = "Body"; | 
|---|
| 488 | bones.write[2].require = true; | 
|---|
| 489 |  | 
|---|
| 490 | bones.write[3].bone_name = "Chest"; | 
|---|
| 491 | bones.write[3].bone_parent = "Spine"; | 
|---|
| 492 | bones.write[3].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); | 
|---|
| 493 | bones.write[3].handle_offset = Vector2(0.5, 0.36); | 
|---|
| 494 | bones.write[3].group = "Body"; | 
|---|
| 495 |  | 
|---|
| 496 | bones.write[4].bone_name = "UpperChest"; | 
|---|
| 497 | bones.write[4].bone_parent = "Chest"; | 
|---|
| 498 | bones.write[4].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); | 
|---|
| 499 | bones.write[4].handle_offset = Vector2(0.5, 0.29); | 
|---|
| 500 | bones.write[4].group = "Body"; | 
|---|
| 501 |  | 
|---|
| 502 | bones.write[5].bone_name = "Neck"; | 
|---|
| 503 | bones.write[5].bone_parent = "UpperChest"; | 
|---|
| 504 | bones.write[5].tail_direction = TAIL_DIRECTION_SPECIFIC_CHILD; | 
|---|
| 505 | bones.write[5].bone_tail = "Head"; | 
|---|
| 506 | bones.write[5].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); | 
|---|
| 507 | bones.write[5].handle_offset = Vector2(0.5, 0.23); | 
|---|
| 508 | bones.write[5].group = "Body"; | 
|---|
| 509 | bones.write[5].require = false; | 
|---|
| 510 |  | 
|---|
| 511 | bones.write[6].bone_name = "Head"; | 
|---|
| 512 | bones.write[6].bone_parent = "Neck"; | 
|---|
| 513 | bones.write[6].tail_direction = TAIL_DIRECTION_END; | 
|---|
| 514 | bones.write[6].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0); | 
|---|
| 515 | bones.write[6].handle_offset = Vector2(0.5, 0.18); | 
|---|
| 516 | bones.write[6].group = "Body"; | 
|---|
| 517 | bones.write[6].require = true; | 
|---|
| 518 |  | 
|---|
| 519 | bones.write[7].bone_name = "LeftEye"; | 
|---|
| 520 | bones.write[7].bone_parent = "Head"; | 
|---|
| 521 | bones.write[7].reference_pose = Transform3D(1, 0, 0, 0, 0, -1, 0, 1, 0, 0.05, 0.15, 0); | 
|---|
| 522 | bones.write[7].handle_offset = Vector2(0.6, 0.46); | 
|---|
| 523 | bones.write[7].group = "Face"; | 
|---|
| 524 |  | 
|---|
| 525 | bones.write[8].bone_name = "RightEye"; | 
|---|
| 526 | bones.write[8].bone_parent = "Head"; | 
|---|
| 527 | bones.write[8].reference_pose = Transform3D(1, 0, 0, 0, 0, -1, 0, 1, 0, -0.05, 0.15, 0); | 
|---|
| 528 | bones.write[8].handle_offset = Vector2(0.37, 0.46); | 
|---|
| 529 | bones.write[8].group = "Face"; | 
|---|
| 530 |  | 
|---|
| 531 | bones.write[9].bone_name = "Jaw"; | 
|---|
| 532 | bones.write[9].bone_parent = "Head"; | 
|---|
| 533 | bones.write[9].reference_pose = Transform3D(-1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0.05, 0.05); | 
|---|
| 534 | bones.write[9].handle_offset = Vector2(0.46, 0.75); | 
|---|
| 535 | bones.write[9].group = "Face"; | 
|---|
| 536 |  | 
|---|
| 537 | bones.write[10].bone_name = "LeftShoulder"; | 
|---|
| 538 | bones.write[10].bone_parent = "UpperChest"; | 
|---|
| 539 | bones.write[10].reference_pose = Transform3D(0, 1, 0, 0, 0, 1, 1, 0, 0, 0.05, 0.1, 0); | 
|---|
| 540 | bones.write[10].handle_offset = Vector2(0.55, 0.235); | 
|---|
| 541 | bones.write[10].group = "Body"; | 
|---|
| 542 | bones.write[10].require = true; | 
|---|
| 543 |  | 
|---|
| 544 | bones.write[11].bone_name = "LeftUpperArm"; | 
|---|
| 545 | bones.write[11].bone_parent = "LeftShoulder"; | 
|---|
| 546 | bones.write[11].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.05, 0); | 
|---|
| 547 | bones.write[11].handle_offset = Vector2(0.6, 0.24); | 
|---|
| 548 | bones.write[11].group = "Body"; | 
|---|
| 549 | bones.write[11].require = true; | 
|---|
| 550 |  | 
|---|
| 551 | bones.write[12].bone_name = "LeftLowerArm"; | 
|---|
| 552 | bones.write[12].bone_parent = "LeftUpperArm"; | 
|---|
| 553 | bones.write[12].reference_pose = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.25, 0); | 
|---|
| 554 | bones.write[12].handle_offset = Vector2(0.7, 0.24); | 
|---|
| 555 | bones.write[12].group = "Body"; | 
|---|
| 556 | bones.write[12].require = true; | 
|---|
| 557 |  | 
|---|
| 558 | bones.write[13].bone_name = "LeftHand"; | 
|---|
| 559 | bones.write[13].bone_parent = "LeftLowerArm"; | 
|---|
| 560 | bones.write[13].tail_direction = TAIL_DIRECTION_SPECIFIC_CHILD; | 
|---|
| 561 | bones.write[13].bone_tail = "LeftMiddleProximal"; | 
|---|
| 562 | bones.write[13].reference_pose = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0.25, 0); | 
|---|
| 563 | bones.write[13].handle_offset = Vector2(0.82, 0.235); | 
|---|
| 564 | bones.write[13].group = "Body"; | 
|---|
| 565 | bones.write[13].require = true; | 
|---|
| 566 |  | 
|---|
| 567 | bones.write[14].bone_name = "LeftThumbMetacarpal"; | 
|---|
| 568 | bones.write[14].bone_parent = "LeftHand"; | 
|---|
| 569 | bones.write[14].reference_pose = Transform3D(0, -0.577, 0.816, 0, 0.816, 0.577, -1, 0, 0, -0.025, 0.025, 0); | 
|---|
| 570 | bones.write[14].handle_offset = Vector2(0.4, 0.8); | 
|---|
| 571 | bones.write[14].group = "LeftHand"; | 
|---|
| 572 |  | 
|---|
| 573 | bones.write[15].bone_name = "LeftThumbProximal"; | 
|---|
| 574 | bones.write[15].bone_parent = "LeftThumbMetacarpal"; | 
|---|
| 575 | bones.write[15].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.043, 0); | 
|---|
| 576 | bones.write[15].handle_offset = Vector2(0.3, 0.69); | 
|---|
| 577 | bones.write[15].group = "LeftHand"; | 
|---|
| 578 |  | 
|---|
| 579 | bones.write[16].bone_name = "LeftThumbDistal"; | 
|---|
| 580 | bones.write[16].bone_parent = "LeftThumbProximal"; | 
|---|
| 581 | bones.write[16].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.043, 0); | 
|---|
| 582 | bones.write[16].handle_offset = Vector2(0.23, 0.555); | 
|---|
| 583 | bones.write[16].group = "LeftHand"; | 
|---|
| 584 |  | 
|---|
| 585 | bones.write[17].bone_name = "LeftIndexProximal"; | 
|---|
| 586 | bones.write[17].bone_parent = "LeftHand"; | 
|---|
| 587 | bones.write[17].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.025, 0.075, 0); | 
|---|
| 588 | bones.write[17].handle_offset = Vector2(0.413, 0.52); | 
|---|
| 589 | bones.write[17].group = "LeftHand"; | 
|---|
| 590 |  | 
|---|
| 591 | bones.write[18].bone_name = "LeftIndexIntermediate"; | 
|---|
| 592 | bones.write[18].bone_parent = "LeftIndexProximal"; | 
|---|
| 593 | bones.write[18].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); | 
|---|
| 594 | bones.write[18].handle_offset = Vector2(0.403, 0.36); | 
|---|
| 595 | bones.write[18].group = "LeftHand"; | 
|---|
| 596 |  | 
|---|
| 597 | bones.write[19].bone_name = "LeftIndexDistal"; | 
|---|
| 598 | bones.write[19].bone_parent = "LeftIndexIntermediate"; | 
|---|
| 599 | bones.write[19].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); | 
|---|
| 600 | bones.write[19].handle_offset = Vector2(0.403, 0.255); | 
|---|
| 601 | bones.write[19].group = "LeftHand"; | 
|---|
| 602 |  | 
|---|
| 603 | bones.write[20].bone_name = "LeftMiddleProximal"; | 
|---|
| 604 | bones.write[20].bone_parent = "LeftHand"; | 
|---|
| 605 | bones.write[20].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0); | 
|---|
| 606 | bones.write[20].handle_offset = Vector2(0.5, 0.51); | 
|---|
| 607 | bones.write[20].group = "LeftHand"; | 
|---|
| 608 |  | 
|---|
| 609 | bones.write[21].bone_name = "LeftMiddleIntermediate"; | 
|---|
| 610 | bones.write[21].bone_parent = "LeftMiddleProximal"; | 
|---|
| 611 | bones.write[21].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0); | 
|---|
| 612 | bones.write[21].handle_offset = Vector2(0.5, 0.345); | 
|---|
| 613 | bones.write[21].group = "LeftHand"; | 
|---|
| 614 |  | 
|---|
| 615 | bones.write[22].bone_name = "LeftMiddleDistal"; | 
|---|
| 616 | bones.write[22].bone_parent = "LeftMiddleIntermediate"; | 
|---|
| 617 | bones.write[22].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); | 
|---|
| 618 | bones.write[22].handle_offset = Vector2(0.5, 0.22); | 
|---|
| 619 | bones.write[22].group = "LeftHand"; | 
|---|
| 620 |  | 
|---|
| 621 | bones.write[23].bone_name = "LeftRingProximal"; | 
|---|
| 622 | bones.write[23].bone_parent = "LeftHand"; | 
|---|
| 623 | bones.write[23].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.025, 0.075, 0); | 
|---|
| 624 | bones.write[23].handle_offset = Vector2(0.586, 0.52); | 
|---|
| 625 | bones.write[23].group = "LeftHand"; | 
|---|
| 626 |  | 
|---|
| 627 | bones.write[24].bone_name = "LeftRingIntermediate"; | 
|---|
| 628 | bones.write[24].bone_parent = "LeftRingProximal"; | 
|---|
| 629 | bones.write[24].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); | 
|---|
| 630 | bones.write[24].handle_offset = Vector2(0.59, 0.36); | 
|---|
| 631 | bones.write[24].group = "LeftHand"; | 
|---|
| 632 |  | 
|---|
| 633 | bones.write[25].bone_name = "LeftRingDistal"; | 
|---|
| 634 | bones.write[25].bone_parent = "LeftRingIntermediate"; | 
|---|
| 635 | bones.write[25].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); | 
|---|
| 636 | bones.write[25].handle_offset = Vector2(0.591, 0.25); | 
|---|
| 637 | bones.write[25].group = "LeftHand"; | 
|---|
| 638 |  | 
|---|
| 639 | bones.write[26].bone_name = "LeftLittleProximal"; | 
|---|
| 640 | bones.write[26].bone_parent = "LeftHand"; | 
|---|
| 641 | bones.write[26].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.05, 0.05, 0); | 
|---|
| 642 | bones.write[26].handle_offset = Vector2(0.663, 0.543); | 
|---|
| 643 | bones.write[26].group = "LeftHand"; | 
|---|
| 644 |  | 
|---|
| 645 | bones.write[27].bone_name = "LeftLittleIntermediate"; | 
|---|
| 646 | bones.write[27].bone_parent = "LeftLittleProximal"; | 
|---|
| 647 | bones.write[27].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); | 
|---|
| 648 | bones.write[27].handle_offset = Vector2(0.672, 0.415); | 
|---|
| 649 | bones.write[27].group = "LeftHand"; | 
|---|
| 650 |  | 
|---|
| 651 | bones.write[28].bone_name = "LeftLittleDistal"; | 
|---|
| 652 | bones.write[28].bone_parent = "LeftLittleIntermediate"; | 
|---|
| 653 | bones.write[28].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); | 
|---|
| 654 | bones.write[28].handle_offset = Vector2(0.672, 0.32); | 
|---|
| 655 | bones.write[28].group = "LeftHand"; | 
|---|
| 656 |  | 
|---|
| 657 | bones.write[29].bone_name = "RightShoulder"; | 
|---|
| 658 | bones.write[29].bone_parent = "UpperChest"; | 
|---|
| 659 | bones.write[29].reference_pose = Transform3D(0, -1, 0, 0, 0, 1, -1, 0, 0, -0.05, 0.1, 0); | 
|---|
| 660 | bones.write[29].handle_offset = Vector2(0.45, 0.235); | 
|---|
| 661 | bones.write[29].group = "Body"; | 
|---|
| 662 | bones.write[29].require = true; | 
|---|
| 663 |  | 
|---|
| 664 | bones.write[30].bone_name = "RightUpperArm"; | 
|---|
| 665 | bones.write[30].bone_parent = "RightShoulder"; | 
|---|
| 666 | bones.write[30].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.05, 0); | 
|---|
| 667 | bones.write[30].handle_offset = Vector2(0.4, 0.24); | 
|---|
| 668 | bones.write[30].group = "Body"; | 
|---|
| 669 | bones.write[30].require = true; | 
|---|
| 670 |  | 
|---|
| 671 | bones.write[31].bone_name = "RightLowerArm"; | 
|---|
| 672 | bones.write[31].bone_parent = "RightUpperArm"; | 
|---|
| 673 | bones.write[31].reference_pose = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0.25, 0); | 
|---|
| 674 | bones.write[31].handle_offset = Vector2(0.3, 0.24); | 
|---|
| 675 | bones.write[31].group = "Body"; | 
|---|
| 676 | bones.write[31].require = true; | 
|---|
| 677 |  | 
|---|
| 678 | bones.write[32].bone_name = "RightHand"; | 
|---|
| 679 | bones.write[32].bone_parent = "RightLowerArm"; | 
|---|
| 680 | bones.write[32].tail_direction = TAIL_DIRECTION_SPECIFIC_CHILD; | 
|---|
| 681 | bones.write[32].bone_tail = "RightMiddleProximal"; | 
|---|
| 682 | bones.write[32].reference_pose = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.25, 0); | 
|---|
| 683 | bones.write[32].handle_offset = Vector2(0.18, 0.235); | 
|---|
| 684 | bones.write[32].group = "Body"; | 
|---|
| 685 | bones.write[32].require = true; | 
|---|
| 686 |  | 
|---|
| 687 | bones.write[33].bone_name = "RightThumbMetacarpal"; | 
|---|
| 688 | bones.write[33].bone_parent = "RightHand"; | 
|---|
| 689 | bones.write[33].reference_pose = Transform3D(0, 0.577, -0.816, 0, 0.816, 0.577, 1, 0, 0, 0.025, 0.025, 0); | 
|---|
| 690 | bones.write[33].handle_offset = Vector2(0.6, 0.8); | 
|---|
| 691 | bones.write[33].group = "RightHand"; | 
|---|
| 692 |  | 
|---|
| 693 | bones.write[34].bone_name = "RightThumbProximal"; | 
|---|
| 694 | bones.write[34].bone_parent = "RightThumbMetacarpal"; | 
|---|
| 695 | bones.write[34].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.043, 0); | 
|---|
| 696 | bones.write[34].handle_offset = Vector2(0.7, 0.69); | 
|---|
| 697 | bones.write[34].group = "RightHand"; | 
|---|
| 698 |  | 
|---|
| 699 | bones.write[35].bone_name = "RightThumbDistal"; | 
|---|
| 700 | bones.write[35].bone_parent = "RightThumbProximal"; | 
|---|
| 701 | bones.write[35].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.043, 0); | 
|---|
| 702 | bones.write[35].handle_offset = Vector2(0.77, 0.555); | 
|---|
| 703 | bones.write[35].group = "RightHand"; | 
|---|
| 704 |  | 
|---|
| 705 | bones.write[36].bone_name = "RightIndexProximal"; | 
|---|
| 706 | bones.write[36].bone_parent = "RightHand"; | 
|---|
| 707 | bones.write[36].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.025, 0.075, 0); | 
|---|
| 708 | bones.write[36].handle_offset = Vector2(0.587, 0.52); | 
|---|
| 709 | bones.write[36].group = "RightHand"; | 
|---|
| 710 |  | 
|---|
| 711 | bones.write[37].bone_name = "RightIndexIntermediate"; | 
|---|
| 712 | bones.write[37].bone_parent = "RightIndexProximal"; | 
|---|
| 713 | bones.write[37].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); | 
|---|
| 714 | bones.write[37].handle_offset = Vector2(0.597, 0.36); | 
|---|
| 715 | bones.write[37].group = "RightHand"; | 
|---|
| 716 |  | 
|---|
| 717 | bones.write[38].bone_name = "RightIndexDistal"; | 
|---|
| 718 | bones.write[38].bone_parent = "RightIndexIntermediate"; | 
|---|
| 719 | bones.write[38].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); | 
|---|
| 720 | bones.write[38].handle_offset = Vector2(0.597, 0.255); | 
|---|
| 721 | bones.write[38].group = "RightHand"; | 
|---|
| 722 |  | 
|---|
| 723 | bones.write[39].bone_name = "RightMiddleProximal"; | 
|---|
| 724 | bones.write[39].bone_parent = "RightHand"; | 
|---|
| 725 | bones.write[39].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0); | 
|---|
| 726 | bones.write[39].handle_offset = Vector2(0.5, 0.51); | 
|---|
| 727 | bones.write[39].group = "RightHand"; | 
|---|
| 728 |  | 
|---|
| 729 | bones.write[40].bone_name = "RightMiddleIntermediate"; | 
|---|
| 730 | bones.write[40].bone_parent = "RightMiddleProximal"; | 
|---|
| 731 | bones.write[40].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0); | 
|---|
| 732 | bones.write[40].handle_offset = Vector2(0.5, 0.345); | 
|---|
| 733 | bones.write[40].group = "RightHand"; | 
|---|
| 734 |  | 
|---|
| 735 | bones.write[41].bone_name = "RightMiddleDistal"; | 
|---|
| 736 | bones.write[41].bone_parent = "RightMiddleIntermediate"; | 
|---|
| 737 | bones.write[41].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); | 
|---|
| 738 | bones.write[41].handle_offset = Vector2(0.5, 0.22); | 
|---|
| 739 | bones.write[41].group = "RightHand"; | 
|---|
| 740 |  | 
|---|
| 741 | bones.write[42].bone_name = "RightRingProximal"; | 
|---|
| 742 | bones.write[42].bone_parent = "RightHand"; | 
|---|
| 743 | bones.write[42].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.025, 0.075, 0); | 
|---|
| 744 | bones.write[42].handle_offset = Vector2(0.414, 0.52); | 
|---|
| 745 | bones.write[42].group = "RightHand"; | 
|---|
| 746 |  | 
|---|
| 747 | bones.write[43].bone_name = "RightRingIntermediate"; | 
|---|
| 748 | bones.write[43].bone_parent = "RightRingProximal"; | 
|---|
| 749 | bones.write[43].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); | 
|---|
| 750 | bones.write[43].handle_offset = Vector2(0.41, 0.36); | 
|---|
| 751 | bones.write[43].group = "RightHand"; | 
|---|
| 752 |  | 
|---|
| 753 | bones.write[44].bone_name = "RightRingDistal"; | 
|---|
| 754 | bones.write[44].bone_parent = "RightRingIntermediate"; | 
|---|
| 755 | bones.write[44].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); | 
|---|
| 756 | bones.write[44].handle_offset = Vector2(0.409, 0.25); | 
|---|
| 757 | bones.write[44].group = "RightHand"; | 
|---|
| 758 |  | 
|---|
| 759 | bones.write[45].bone_name = "RightLittleProximal"; | 
|---|
| 760 | bones.write[45].bone_parent = "RightHand"; | 
|---|
| 761 | bones.write[45].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.05, 0.05, 0); | 
|---|
| 762 | bones.write[45].handle_offset = Vector2(0.337, 0.543); | 
|---|
| 763 | bones.write[45].group = "RightHand"; | 
|---|
| 764 |  | 
|---|
| 765 | bones.write[46].bone_name = "RightLittleIntermediate"; | 
|---|
| 766 | bones.write[46].bone_parent = "RightLittleProximal"; | 
|---|
| 767 | bones.write[46].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0); | 
|---|
| 768 | bones.write[46].handle_offset = Vector2(0.328, 0.415); | 
|---|
| 769 | bones.write[46].group = "RightHand"; | 
|---|
| 770 |  | 
|---|
| 771 | bones.write[47].bone_name = "RightLittleDistal"; | 
|---|
| 772 | bones.write[47].bone_parent = "RightLittleIntermediate"; | 
|---|
| 773 | bones.write[47].reference_pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.025, 0); | 
|---|
| 774 | bones.write[47].handle_offset = Vector2(0.328, 0.32); | 
|---|
| 775 | bones.write[47].group = "RightHand"; | 
|---|
| 776 |  | 
|---|
| 777 | bones.write[48].bone_name = "LeftUpperLeg"; | 
|---|
| 778 | bones.write[48].bone_parent = "Hips"; | 
|---|
| 779 | bones.write[48].reference_pose = Transform3D(-1, 0, 0, 0, -1, 0, 0, 0, 1, 0.1, 0, 0); | 
|---|
| 780 | bones.write[48].handle_offset = Vector2(0.549, 0.49); | 
|---|
| 781 | bones.write[48].group = "Body"; | 
|---|
| 782 | bones.write[48].require = true; | 
|---|
| 783 |  | 
|---|
| 784 | bones.write[49].bone_name = "LeftLowerLeg"; | 
|---|
| 785 | bones.write[49].bone_parent = "LeftUpperLeg"; | 
|---|
| 786 | bones.write[49].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.375, 0); | 
|---|
| 787 | bones.write[49].handle_offset = Vector2(0.548, 0.683); | 
|---|
| 788 | bones.write[49].group = "Body"; | 
|---|
| 789 | bones.write[49].require = true; | 
|---|
| 790 |  | 
|---|
| 791 | bones.write[50].bone_name = "LeftFoot"; | 
|---|
| 792 | bones.write[50].bone_parent = "LeftLowerLeg"; | 
|---|
| 793 | bones.write[50].reference_pose = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0.375, 0); | 
|---|
| 794 | bones.write[50].handle_offset = Vector2(0.545, 0.9); | 
|---|
| 795 | bones.write[50].group = "Body"; | 
|---|
| 796 | bones.write[50].require = true; | 
|---|
| 797 |  | 
|---|
| 798 | bones.write[51].bone_name = "LeftToes"; | 
|---|
| 799 | bones.write[51].bone_parent = "LeftFoot"; | 
|---|
| 800 | bones.write[51].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.15, 0); | 
|---|
| 801 | bones.write[51].handle_offset = Vector2(0.545, 0.95); | 
|---|
| 802 | bones.write[51].group = "Body"; | 
|---|
| 803 |  | 
|---|
| 804 | bones.write[52].bone_name = "RightUpperLeg"; | 
|---|
| 805 | bones.write[52].bone_parent = "Hips"; | 
|---|
| 806 | bones.write[52].reference_pose = Transform3D(-1, 0, 0, 0, -1, 0, 0, 0, 1, -0.1, 0, 0); | 
|---|
| 807 | bones.write[52].handle_offset = Vector2(0.451, 0.49); | 
|---|
| 808 | bones.write[52].group = "Body"; | 
|---|
| 809 | bones.write[52].require = true; | 
|---|
| 810 |  | 
|---|
| 811 | bones.write[53].bone_name = "RightLowerLeg"; | 
|---|
| 812 | bones.write[53].bone_parent = "RightUpperLeg"; | 
|---|
| 813 | bones.write[53].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.375, 0); | 
|---|
| 814 | bones.write[53].handle_offset = Vector2(0.452, 0.683); | 
|---|
| 815 | bones.write[53].group = "Body"; | 
|---|
| 816 | bones.write[53].require = true; | 
|---|
| 817 |  | 
|---|
| 818 | bones.write[54].bone_name = "RightFoot"; | 
|---|
| 819 | bones.write[54].bone_parent = "RightLowerLeg"; | 
|---|
| 820 | bones.write[54].reference_pose = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0.375, 0); | 
|---|
| 821 | bones.write[54].handle_offset = Vector2(0.455, 0.9); | 
|---|
| 822 | bones.write[54].group = "Body"; | 
|---|
| 823 | bones.write[54].require = true; | 
|---|
| 824 |  | 
|---|
| 825 | bones.write[55].bone_name = "RightToes"; | 
|---|
| 826 | bones.write[55].bone_parent = "RightFoot"; | 
|---|
| 827 | bones.write[55].reference_pose = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.15, 0); | 
|---|
| 828 | bones.write[55].handle_offset = Vector2(0.455, 0.95); | 
|---|
| 829 | bones.write[55].group = "Body"; | 
|---|
| 830 | } | 
|---|
| 831 |  | 
|---|
| 832 | SkeletonProfileHumanoid::~SkeletonProfileHumanoid() { | 
|---|
| 833 | } | 
|---|
| 834 |  | 
|---|
| 835 | ////////////////////////////////////// | 
|---|
| 836 |  | 
|---|