Merge pull request #36415 from reduz/skeleton-skin-named
Add support for named binds in Skin.
This commit is contained in:
commit
7ac0973e9a
8 changed files with 110 additions and 8 deletions
|
|
@ -2183,6 +2183,8 @@ Error EditorSceneImporterGLTF::_map_skin_joints_indices_to_skeleton_bone_indices
|
|||
const GLTFNodeIndex node_i = skin.joints_original[joint_index];
|
||||
const GLTFNode *node = state.nodes[node_i];
|
||||
|
||||
skin.joint_i_to_name.insert(joint_index, node->name);
|
||||
|
||||
const int bone_index = skeleton.godot_skeleton->find_bone(node->name);
|
||||
ERR_FAIL_COND_V(bone_index < 0, FAILED);
|
||||
|
||||
|
|
@ -2204,12 +2206,18 @@ Error EditorSceneImporterGLTF::_create_skins(GLTFState &state) {
|
|||
const bool has_ibms = !gltf_skin.inverse_binds.empty();
|
||||
|
||||
for (int joint_i = 0; joint_i < gltf_skin.joints_original.size(); ++joint_i) {
|
||||
int bone_i = gltf_skin.joint_i_to_bone_i[joint_i];
|
||||
|
||||
Transform xform;
|
||||
if (has_ibms) {
|
||||
skin->add_bind(bone_i, gltf_skin.inverse_binds[joint_i]);
|
||||
xform = gltf_skin.inverse_binds[joint_i];
|
||||
}
|
||||
|
||||
if (state.use_named_skin_binds) {
|
||||
StringName name = gltf_skin.joint_i_to_name[joint_i];
|
||||
skin->add_named_bind(name, xform);
|
||||
} else {
|
||||
skin->add_bind(bone_i, Transform());
|
||||
int bone_i = gltf_skin.joint_i_to_bone_i[joint_i];
|
||||
skin->add_bind(bone_i, xform);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2995,6 +3003,7 @@ Node *EditorSceneImporterGLTF::import_scene(const String &p_path, uint32_t p_fla
|
|||
|
||||
state.major_version = version.get_slice(".", 0).to_int();
|
||||
state.minor_version = version.get_slice(".", 1).to_int();
|
||||
state.use_named_skin_binds = p_flags & IMPORT_USE_NAMED_SKIN_BINDS;
|
||||
|
||||
/* STEP 0 PARSE SCENE */
|
||||
Error err = _parse_scenes(state);
|
||||
|
|
|
|||
|
|
@ -231,6 +231,7 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
|
|||
// A mapping from the joint indices (in the order of joints_original) to the
|
||||
// Godot Skeleton's bone_indices
|
||||
Map<int, int> joint_i_to_bone_i;
|
||||
Map<int, StringName> joint_i_to_name;
|
||||
|
||||
// The Actual Skin that will be created as a mapping between the IBM's of this skin
|
||||
// to the generated skeleton for the mesh instances.
|
||||
|
|
@ -298,6 +299,8 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
|
|||
int minor_version;
|
||||
Vector<uint8_t> glb_data;
|
||||
|
||||
bool use_named_skin_binds;
|
||||
|
||||
Vector<GLTFNode *> nodes;
|
||||
Vector<Vector<uint8_t> > buffers;
|
||||
Vector<GLTFBufferView> buffer_views;
|
||||
|
|
|
|||
|
|
@ -1171,6 +1171,7 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in
|
|||
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.mesh),Files (.tres)"), meshes_out ? 1 : 0));
|
||||
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Enable,Gen Lightmaps", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0));
|
||||
r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "meshes/lightmap_texel_size", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 0.1));
|
||||
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "skins/use_named_skins"), true));
|
||||
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "external_files/store_in_subdir"), false));
|
||||
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true));
|
||||
r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 15));
|
||||
|
|
@ -1313,6 +1314,9 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
|
|||
if (int(p_options["materials/location"]) == 0)
|
||||
import_flags |= EditorSceneImporter::IMPORT_MATERIALS_IN_INSTANCES;
|
||||
|
||||
if (bool(p_options["skins/use_named_skins"]))
|
||||
import_flags |= EditorSceneImporter::IMPORT_USE_NAMED_SKIN_BINDS;
|
||||
|
||||
Error err = OK;
|
||||
List<String> missing_deps; // for now, not much will be done with this
|
||||
Node *scene = importer->import_scene(src_path, import_flags, fps, &missing_deps, &err);
|
||||
|
|
|
|||
|
|
@ -59,7 +59,8 @@ public:
|
|||
IMPORT_GENERATE_TANGENT_ARRAYS = 256,
|
||||
IMPORT_FAIL_ON_MISSING_DEPENDENCIES = 512,
|
||||
IMPORT_MATERIALS_IN_INSTANCES = 1024,
|
||||
IMPORT_USE_COMPRESSION = 2048
|
||||
IMPORT_USE_COMPRESSION = 2048,
|
||||
IMPORT_USE_NAMED_SKIN_BINDS = 4096,
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue