Fix exporting MeshInstances without a Skeleton in the GLTF module
This commit is contained in:
parent
2210111eb5
commit
4017524363
1 changed files with 10 additions and 18 deletions
|
@ -6308,29 +6308,21 @@ void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> p_state) {
|
||||||
node->rotation = mi_xform.basis.get_rotation_quaternion();
|
node->rotation = mi_xform.basis.get_rotation_quaternion();
|
||||||
node->position = mi_xform.origin;
|
node->position = mi_xform.origin;
|
||||||
|
|
||||||
Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(mi->get_node(mi->get_skeleton_path()));
|
Node *skel_node = mi->get_node_or_null(mi->get_skeleton_path());
|
||||||
if (!skeleton) {
|
Skeleton3D *godot_skeleton = Object::cast_to<Skeleton3D>(skel_node);
|
||||||
continue;
|
if (!godot_skeleton || godot_skeleton->get_bone_count() == 0) {
|
||||||
}
|
|
||||||
if (!skeleton->get_bone_count()) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// At this point in the code, we know we have a Skeleton3D with at least one bone.
|
||||||
Ref<Skin> skin = mi->get_skin();
|
Ref<Skin> skin = mi->get_skin();
|
||||||
Ref<GLTFSkin> gltf_skin;
|
Ref<GLTFSkin> gltf_skin;
|
||||||
gltf_skin.instantiate();
|
gltf_skin.instantiate();
|
||||||
Array json_joints;
|
Array json_joints;
|
||||||
|
if (p_state->skeleton3d_to_gltf_skeleton.has(godot_skeleton->get_instance_id())) {
|
||||||
NodePath skeleton_path = mi->get_skeleton_path();
|
|
||||||
Node *skel_node = mi->get_node_or_null(skeleton_path);
|
|
||||||
Skeleton3D *godot_skeleton = nullptr;
|
|
||||||
if (skel_node != nullptr) {
|
|
||||||
godot_skeleton = cast_to<Skeleton3D>(skel_node);
|
|
||||||
}
|
|
||||||
if (godot_skeleton != nullptr && p_state->skeleton3d_to_gltf_skeleton.has(godot_skeleton->get_instance_id())) {
|
|
||||||
// This is a skinned mesh. If the mesh has no ARRAY_WEIGHTS or ARRAY_BONES, it will be invisible.
|
// This is a skinned mesh. If the mesh has no ARRAY_WEIGHTS or ARRAY_BONES, it will be invisible.
|
||||||
const GLTFSkeletonIndex skeleton_gltf_i = p_state->skeleton3d_to_gltf_skeleton[godot_skeleton->get_instance_id()];
|
const GLTFSkeletonIndex skeleton_gltf_i = p_state->skeleton3d_to_gltf_skeleton[godot_skeleton->get_instance_id()];
|
||||||
Ref<GLTFSkeleton> gltf_skeleton = p_state->skeletons[skeleton_gltf_i];
|
Ref<GLTFSkeleton> gltf_skeleton = p_state->skeletons[skeleton_gltf_i];
|
||||||
int bone_cnt = skeleton->get_bone_count();
|
int bone_cnt = godot_skeleton->get_bone_count();
|
||||||
ERR_FAIL_COND(bone_cnt != gltf_skeleton->joints.size());
|
ERR_FAIL_COND(bone_cnt != gltf_skeleton->joints.size());
|
||||||
|
|
||||||
ObjectID gltf_skin_key;
|
ObjectID gltf_skin_key;
|
||||||
|
@ -6348,7 +6340,7 @@ void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> p_state) {
|
||||||
} else {
|
} else {
|
||||||
if (skin.is_null()) {
|
if (skin.is_null()) {
|
||||||
// Note that gltf_skin_key should remain null, so these can share a reference.
|
// Note that gltf_skin_key should remain null, so these can share a reference.
|
||||||
skin = skeleton->create_skin_from_rest_transforms();
|
skin = godot_skeleton->create_skin_from_rest_transforms();
|
||||||
}
|
}
|
||||||
gltf_skin.instantiate();
|
gltf_skin.instantiate();
|
||||||
gltf_skin->godot_skin = skin;
|
gltf_skin->godot_skin = skin;
|
||||||
|
@ -6358,7 +6350,7 @@ void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> p_state) {
|
||||||
//gltf_state->godot_to_gltf_node[skel_node]
|
//gltf_state->godot_to_gltf_node[skel_node]
|
||||||
HashMap<StringName, int> bone_name_to_idx;
|
HashMap<StringName, int> bone_name_to_idx;
|
||||||
for (int bone_i = 0; bone_i < bone_cnt; bone_i++) {
|
for (int bone_i = 0; bone_i < bone_cnt; bone_i++) {
|
||||||
bone_name_to_idx[skeleton->get_bone_name(bone_i)] = bone_i;
|
bone_name_to_idx[godot_skeleton->get_bone_name(bone_i)] = bone_i;
|
||||||
}
|
}
|
||||||
for (int bind_i = 0, cnt = skin->get_bind_count(); bind_i < cnt; bind_i++) {
|
for (int bind_i = 0, cnt = skin->get_bind_count(); bind_i < cnt; bind_i++) {
|
||||||
int bone_i = skin->get_bind_bone(bind_i);
|
int bone_i = skin->get_bind_bone(bind_i);
|
||||||
|
@ -6369,13 +6361,13 @@ void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> p_state) {
|
||||||
}
|
}
|
||||||
ERR_CONTINUE(bone_i < 0 || bone_i >= bone_cnt);
|
ERR_CONTINUE(bone_i < 0 || bone_i >= bone_cnt);
|
||||||
if (bind_name == StringName()) {
|
if (bind_name == StringName()) {
|
||||||
bind_name = skeleton->get_bone_name(bone_i);
|
bind_name = godot_skeleton->get_bone_name(bone_i);
|
||||||
}
|
}
|
||||||
GLTFNodeIndex skeleton_bone_i = gltf_skeleton->joints[bone_i];
|
GLTFNodeIndex skeleton_bone_i = gltf_skeleton->joints[bone_i];
|
||||||
gltf_skin->joints_original.push_back(skeleton_bone_i);
|
gltf_skin->joints_original.push_back(skeleton_bone_i);
|
||||||
gltf_skin->joints.push_back(skeleton_bone_i);
|
gltf_skin->joints.push_back(skeleton_bone_i);
|
||||||
gltf_skin->inverse_binds.push_back(bind_pose);
|
gltf_skin->inverse_binds.push_back(bind_pose);
|
||||||
if (skeleton->get_bone_parent(bone_i) == -1) {
|
if (godot_skeleton->get_bone_parent(bone_i) == -1) {
|
||||||
gltf_skin->roots.push_back(skeleton_bone_i);
|
gltf_skin->roots.push_back(skeleton_bone_i);
|
||||||
}
|
}
|
||||||
gltf_skin->joint_i_to_bone_i[bind_i] = bone_i;
|
gltf_skin->joint_i_to_bone_i[bind_i] = bone_i;
|
||||||
|
|
Loading…
Reference in a new issue