diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2023-02-01 07:56:42 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-02-01 07:56:42 +0100 |
commit | 7fb1b1181876e7da970a6fc7aab0a9c2cac44871 (patch) | |
tree | 0fd2317fb9d5711c3d9c49612837a95551cc2b93 | |
parent | d9ade633b3d486737b6fd805d380b8c70ae3266a (diff) | |
parent | 132e95212f21e3552f6a0717b778662307369fc4 (diff) |
Merge pull request #71409 from fire/escn-fixes
Fixes to ESCN mesh import
-rw-r--r-- | editor/import/resource_importer_scene.cpp | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 5b05120a76..9560f4bed2 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -2620,8 +2620,58 @@ Node *EditorSceneFormatImporterESCN::import_scene(const String &p_path, uint32_t Error error; Ref<PackedScene> ps = ResourceFormatLoaderText::singleton->load(p_path, p_path, &error); ERR_FAIL_COND_V_MSG(!ps.is_valid(), nullptr, "Cannot load scene as text resource from path '" + p_path + "'."); - Node *scene = ps->instantiate(); + TypedArray<Node> nodes = scene->find_children("*", "MeshInstance3D"); + for (int32_t node_i = 0; node_i < nodes.size(); node_i++) { + MeshInstance3D *mesh_3d = cast_to<MeshInstance3D>(nodes[node_i]); + Ref<ImporterMesh> mesh; + mesh.instantiate(); + // Ignore the aabb, it will be recomputed. + ImporterMeshInstance3D *importer_mesh_3d = memnew(ImporterMeshInstance3D); + importer_mesh_3d->set_name(mesh_3d->get_name()); + importer_mesh_3d->set_transform(mesh_3d->get_relative_transform(mesh_3d->get_parent())); + importer_mesh_3d->set_skin(mesh_3d->get_skin()); + importer_mesh_3d->set_skeleton_path(mesh_3d->get_skeleton_path()); + Ref<ArrayMesh> array_mesh_3d_mesh = mesh_3d->get_mesh(); + if (array_mesh_3d_mesh.is_valid()) { + // For the MeshInstance3D nodes, we need to convert the ArrayMesh to an ImporterMesh specially. + mesh->set_name(array_mesh_3d_mesh->get_name()); + for (int32_t blend_i = 0; blend_i < array_mesh_3d_mesh->get_blend_shape_count(); blend_i++) { + mesh->add_blend_shape(array_mesh_3d_mesh->get_blend_shape_name(blend_i)); + } + for (int32_t surface_i = 0; surface_i < array_mesh_3d_mesh->get_surface_count(); surface_i++) { + mesh->add_surface(array_mesh_3d_mesh->surface_get_primitive_type(surface_i), + array_mesh_3d_mesh->surface_get_arrays(surface_i), + array_mesh_3d_mesh->surface_get_blend_shape_arrays(surface_i), + array_mesh_3d_mesh->surface_get_lods(surface_i), + array_mesh_3d_mesh->surface_get_material(surface_i), + array_mesh_3d_mesh->surface_get_name(surface_i), + array_mesh_3d_mesh->surface_get_format(surface_i)); + } + mesh->set_blend_shape_mode(array_mesh_3d_mesh->get_blend_shape_mode()); + importer_mesh_3d->set_mesh(mesh); + mesh_3d->replace_by(importer_mesh_3d); + continue; + } + Ref<Mesh> mesh_3d_mesh = mesh_3d->get_mesh(); + if (mesh_3d_mesh.is_valid()) { + // For the MeshInstance3D nodes, we need to convert the Mesh to an ImporterMesh specially. + mesh->set_name(mesh_3d_mesh->get_name()); + for (int32_t surface_i = 0; surface_i < mesh_3d_mesh->get_surface_count(); surface_i++) { + mesh->add_surface(mesh_3d_mesh->surface_get_primitive_type(surface_i), + mesh_3d_mesh->surface_get_arrays(surface_i), + Array(), + mesh_3d_mesh->surface_get_lods(surface_i), + mesh_3d_mesh->surface_get_material(surface_i), + mesh_3d_mesh->surface_get_material(surface_i).is_valid() ? mesh_3d_mesh->surface_get_material(surface_i)->get_name() : String(), + mesh_3d_mesh->surface_get_format(surface_i)); + } + importer_mesh_3d->set_mesh(mesh); + mesh_3d->replace_by(importer_mesh_3d); + continue; + } + } + ERR_FAIL_COND_V(!scene, nullptr); return scene; |