Merge pull request #71409 from fire/escn-fixes
Fixes to ESCN mesh import
This commit is contained in:
commit
7fb1b11818
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue