@@ -3528,11 +3528,43 @@ void EditorSceneFormatImporterESCN::get_extensions(List<String> *r_extensions) c
35283528 r_extensions->push_back (" escn" );
35293529}
35303530
3531+ int get_text_format_version (String p_path) {
3532+ Error error;
3533+ Ref<FileAccess> f = FileAccess::open (p_path, FileAccess::READ, &error);
3534+ ERR_FAIL_COND_V_MSG (error != OK || f.is_null (), -1 , " Cannot open file '" + p_path + " '." );
3535+ String line = f->get_line ().strip_edges ();
3536+ // skip empty lines and comments
3537+ while (line.is_empty () || line.begins_with (" ;" )) {
3538+ line = f->get_line ().strip_edges ();
3539+ if (f->eof_reached ()) {
3540+ break ;
3541+ }
3542+ }
3543+ int format_index = line.find (" format" );
3544+ ERR_FAIL_COND_V_MSG (format_index == -1 , -1 , " No format specifier in file '" + p_path + " '." );
3545+ String format_str = line.substr (format_index).get_slicec (' =' , 1 ).strip_edges ();
3546+ ERR_FAIL_COND_V_MSG (!format_str.substr (0 , 1 ).is_numeric (), -1 , " Invalid format in file '" + p_path + " '." );
3547+ int format = format_str.to_int ();
3548+ return format;
3549+ }
3550+
35313551Node *EditorSceneFormatImporterESCN::import_scene (const String &p_path, uint32_t p_flags, const HashMap<StringName, Variant> &p_options, List<String> *r_missing_deps, Error *r_err) {
35323552 Error error;
3553+ int format = get_text_format_version (p_path);
3554+ ERR_FAIL_COND_V (format == -1 , nullptr );
35333555 Ref<PackedScene> ps = ResourceFormatLoaderText::singleton->load (p_path, p_path, &error);
35343556 ERR_FAIL_COND_V_MSG (ps.is_null (), nullptr , " Cannot load scene as text resource from path '" + p_path + " '." );
35353557 Node *scene = ps->instantiate ();
3558+ ERR_FAIL_COND_V (!scene, nullptr );
3559+ if (format == 2 ) {
3560+ TypedArray<Node> skel_nodes = scene->find_children (" *" , " AnimationPlayer" );
3561+ for (int32_t node_i = 0 ; node_i < skel_nodes.size (); node_i++) {
3562+ // Force re-compute animation tracks.
3563+ AnimationPlayer *player = cast_to<AnimationPlayer>(skel_nodes[node_i]);
3564+ ERR_CONTINUE (!player);
3565+ player->advance (0 );
3566+ }
3567+ }
35363568 TypedArray<Node> nodes = scene->find_children (" *" , " MeshInstance3D" );
35373569 for (int32_t node_i = 0 ; node_i < nodes.size (); node_i++) {
35383570 MeshInstance3D *mesh_3d = cast_to<MeshInstance3D>(nodes[node_i]);
@@ -3541,9 +3573,22 @@ Node *EditorSceneFormatImporterESCN::import_scene(const String &p_path, uint32_t
35413573 // Ignore the aabb, it will be recomputed.
35423574 ImporterMeshInstance3D *importer_mesh_3d = memnew (ImporterMeshInstance3D);
35433575 importer_mesh_3d->set_name (mesh_3d->get_name ());
3544- importer_mesh_3d->set_transform (mesh_3d->get_relative_transform (mesh_3d->get_parent ()));
3545- importer_mesh_3d->set_skin (mesh_3d->get_skin ());
3576+ Node *parent = mesh_3d->get_parent ();
3577+ Transform3D rel_transform = mesh_3d->get_relative_transform (parent);
3578+ if (rel_transform == Transform3D () && parent && parent != mesh_3d) {
3579+ // If we're here, we probably got a "data.parent is null" error
3580+ // Node3D.data.parent hasn't been set yet but Node.data.parent has, so we need to get the transform manually
3581+ Node3D *parent_3d = mesh_3d->get_parent_node_3d ();
3582+ if (parent == parent_3d) {
3583+ rel_transform = mesh_3d->get_transform ();
3584+ } else if (parent_3d) {
3585+ rel_transform = parent_3d->get_relative_transform (parent) * mesh_3d->get_transform ();
3586+ } // Otherwise, parent isn't a Node3D.
3587+ }
3588+ importer_mesh_3d->set_transform (rel_transform);
3589+ Ref<Skin> skin = mesh_3d->get_skin ();
35463590 importer_mesh_3d->set_skeleton_path (mesh_3d->get_skeleton_path ());
3591+ importer_mesh_3d->set_skin (skin);
35473592 Ref<ArrayMesh> array_mesh_3d_mesh = mesh_3d->get_mesh ();
35483593 if (array_mesh_3d_mesh.is_valid ()) {
35493594 // For the MeshInstance3D nodes, we need to convert the ArrayMesh to an ImporterMesh specially.
@@ -3584,7 +3629,5 @@ Node *EditorSceneFormatImporterESCN::import_scene(const String &p_path, uint32_t
35843629 }
35853630 }
35863631
3587- ERR_FAIL_NULL_V (scene, nullptr );
3588-
35893632 return scene;
35903633}
0 commit comments