@ -233,13 +233,14 @@ static String _fixstr(const String &p_what, const String &p_str) {
return what ;
}
static void _pre_gen_shape_list ( const Ref < EditorSceneImporterMesh > & mesh , List < Ref < Shape3D > > & r_shape_list , bool p_convex ) {
static void _pre_gen_shape_list ( Ref < EditorSceneImporterMesh > & mesh , Vector < Ref < Shape3D > > & r_shape_list , bool p_convex ) {
ERR_FAIL_NULL_MSG ( mesh , " Cannot generate shape list with null mesh value " ) ;
if ( ! p_convex ) {
Ref < Shape3D > shape = mesh - > create_trimesh_shape ( ) ;
r_shape_list . push_back ( shape ) ;
} else {
Vector < Ref < Shape3D > > cd = mesh - > convex_decompose ( ) ;
Vector < Ref < Shape3D > > cd ;
cd . push_back ( mesh - > get_mesh ( ) - > create_convex_shape ( true , /*Passing false, otherwise VHACD will be used to simplify (Decompose) the Mesh.*/ false ) ) ;
if ( cd . size ( ) ) {
for ( int i = 0 ; i < cd . size ( ) ; i + + ) {
r_shape_list . push_back ( cd [ i ] ) ;
@ -248,7 +249,7 @@ static void _pre_gen_shape_list(const Ref<EditorSceneImporterMesh> &mesh, List<R
}
}
Node * ResourceImporterScene : : _pre_fix_node ( Node * p_node , Node * p_root , Map < Ref < EditorSceneImporterMesh > , List < Ref < Shape3D > > > & collision_map ) {
Node * ResourceImporterScene : : _pre_fix_node ( Node * p_node , Node * p_root , Map < Ref < EditorSceneImporterMesh > , Vector < Ref < Shape3D > > > & collision_map ) {
// children first
for ( int i = 0 ; i < p_node - > get_child_count ( ) ; i + + ) {
Node * r = _pre_fix_node ( p_node - > get_child ( i ) , p_root , collision_map ) ;
@ -335,7 +336,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<E
Ref < EditorSceneImporterMesh > mesh = mi - > get_mesh ( ) ;
if ( mesh . is_valid ( ) ) {
List < Ref < Shape3D > > shapes ;
Vector < Ref < Shape3D > > shapes ;
String fixed_name ;
if ( collision_map . has ( mesh ) ) {
shapes = collision_map [ mesh ] ;
@ -401,7 +402,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<E
Ref < EditorSceneImporterMesh > mesh = mi - > get_mesh ( ) ;
if ( mesh . is_valid ( ) ) {
List < Ref < Shape3D > > shapes ;
Vector < Ref < Shape3D > > shapes ;
if ( collision_map . has ( mesh ) ) {
shapes = collision_map [ mesh ] ;
} else {
@ -426,7 +427,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<E
Ref < EditorSceneImporterMesh > mesh = mi - > get_mesh ( ) ;
if ( mesh . is_valid ( ) ) {
List < Ref < Shape3D > > shapes ;
Vector < Ref < Shape3D > > shapes ;
String fixed_name ;
if ( collision_map . has ( mesh ) ) {
shapes = collision_map [ mesh ] ;
@ -485,7 +486,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<E
Ref < EditorSceneImporterMesh > mesh = mi - > get_mesh ( ) ;
if ( ! mesh . is_null ( ) ) {
List < Ref < Shape3D > > shapes ;
Vector < Ref < Shape3D > > shapes ;
if ( collision_map . has ( mesh ) ) {
shapes = collision_map [ mesh ] ;
} else if ( _teststr ( mesh - > get_name ( ) , " col " ) ) {
@ -511,7 +512,7 @@ Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<E
return p_node ;
}
Node * ResourceImporterScene : : _post_fix_node ( Node * p_node , Node * p_root , Map < Ref < EditorSceneImporterMesh > , List < Ref < Shape3D > > > & collision_map , Set < Ref < EditorSceneImporterMesh > > & r_scanned_meshes , const Dictionary & p_node_data , const Dictionary & p_material_data , const Dictionary & p_animation_data , float p_animation_fps ) {
Node * ResourceImporterScene : : _post_fix_node ( Node * p_node , Node * p_root , Map < Ref < EditorSceneImporterMesh > , Vector < Ref < Shape3D > > > & collision_map , Set < Ref < EditorSceneImporterMesh > > & r_scanned_meshes , const Dictionary & p_node_data , const Dictionary & p_material_data , const Dictionary & p_animation_data , float p_animation_fps ) {
// children first
for ( int i = 0 ; i < p_node - > get_child_count ( ) ; i + + ) {
Node * r = _post_fix_node ( p_node - > get_child ( i ) , p_root , collision_map , r_scanned_meshes , p_node_data , p_material_data , p_animation_data , p_animation_fps ) ;
@ -574,28 +575,35 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref<
}
if ( node_settings . has ( " generate/physics " ) ) {
int mesh_physics_mode = node_settings [ " generate/physics " ] ;
if ( mesh_physics_mode ! = MESH_PHYSICS_DISABLED ) {
List < Ref < Shape3D > > shapes ;
int mesh_physics_mode = MeshPhysicsMode : : MESH_PHYSICS_DISABLED ;
const bool generate_collider = node_settings [ " generate/physics " ] ;
if ( generate_collider ) {
mesh_physics_mode = MeshPhysicsMode : : MESH_PHYSICS_MESH_AND_STATIC_COLLIDER ;
if ( node_settings . has ( " physics/body_type " ) ) {
const BodyType body_type = ( BodyType ) node_settings [ " physics/body_type " ] . operator int ( ) ;
switch ( body_type ) {
case BODY_TYPE_STATIC :
mesh_physics_mode = MeshPhysicsMode : : MESH_PHYSICS_MESH_AND_STATIC_COLLIDER ;
break ;
case BODY_TYPE_DYNAMIC :
mesh_physics_mode = MeshPhysicsMode : : MESH_PHYSICS_RIGID_BODY_AND_MESH ;
break ;
case BODY_TYPE_AREA :
mesh_physics_mode = MeshPhysicsMode : : MESH_PHYSICS_AREA_ONLY ;
break ;
}
}
}
if ( mesh_physics_mode ! = MeshPhysicsMode : : MESH_PHYSICS_DISABLED ) {
Vector < Ref < Shape3D > > shapes ;
if ( collision_map . has ( m ) ) {
shapes = collision_map [ m ] ;
} else {
switch ( mesh_physics_mode ) {
case MESH_PHYSICS_MESH_AND_STATIC_COLLIDER : {
_pre_gen_shape_list ( m , shapes , false ) ;
} break ;
case MESH_PHYSICS_RIGID_BODY_AND_MESH : {
_pre_gen_shape_list ( m , shapes , true ) ;
} break ;
case MESH_PHYSICS_STATIC_COLLIDER_ONLY : {
_pre_gen_shape_list ( m , shapes , false ) ;
} break ;
case MESH_PHYSICS_AREA_ONLY : {
_pre_gen_shape_list ( m , shapes , true ) ;
} break ;
}
shapes = get_collision_shapes (
m - > get_mesh ( ) ,
node_settings ) ;
}
if ( shapes . size ( ) ) {
@ -604,13 +612,15 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref<
case MESH_PHYSICS_MESH_AND_STATIC_COLLIDER : {
StaticBody3D * col = memnew ( StaticBody3D ) ;
p_node - > add_child ( col ) ;
col - > set_owner ( p_node - > get_owner ( ) ) ;
col - > set_transform ( get_collision_shapes_transform ( node_settings ) ) ;
base = col ;
} break ;
case MESH_PHYSICS_RIGID_BODY_AND_MESH : {
RigidBody3D * rigid_body = memnew ( RigidBody3D ) ;
rigid_body - > set_name ( p_node - > get_name ( ) ) ;
p_node - > replace_by ( rigid_body ) ;
rigid_body - > set_transform ( mi - > get_transform ( ) ) ;
rigid_body - > set_transform ( mi - > get_transform ( ) * get_collision_shapes_transform ( node_settings ) ) ;
p_node = rigid_body ;
mi - > set_transform ( Transform3D ( ) ) ;
rigid_body - > add_child ( mi ) ;
@ -619,7 +629,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref<
} break ;
case MESH_PHYSICS_STATIC_COLLIDER_ONLY : {
StaticBody3D * col = memnew ( StaticBody3D ) ;
col - > set_transform ( mi - > get_transform ( ) ) ;
col - > set_transform ( mi - > get_transform ( ) * get_collision_shapes_transform ( node_settings ) ) ;
col - > set_name ( p_node - > get_name ( ) ) ;
p_node - > replace_by ( col ) ;
memdelete ( p_node ) ;
@ -628,7 +638,7 @@ Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref<
} break ;
case MESH_PHYSICS_AREA_ONLY : {
Area3D * area = memnew ( Area3D ) ;
area - > set_transform ( mi - > get_transform ( ) ) ;
area - > set_transform ( mi - > get_transform ( ) * get_collision_shapes_transform ( node_settings ) ) ;
area - > set_name ( p_node - > get_name ( ) ) ;
p_node - > replace_by ( area ) ;
memdelete ( p_node ) ;
@ -928,8 +938,35 @@ void ResourceImporterScene::get_internal_import_options(InternalImportCategory p
} break ;
case INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE : {
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " import/skip_import " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , false ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT, " generate/physics " , PROPERTY_HINT_ENUM , " Disabled,Mesh + Static Collider,Rigid Body + Mesh,Static Collider Only,Area Only " ) , 0 ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL, " generate/physics " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , false ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " generate/navmesh " , PROPERTY_HINT_ENUM , " Disabled,Mesh + NavMesh,NavMesh Only " ) , 0 ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " physics/body_type " , PROPERTY_HINT_ENUM , " Static,Dynamic,Area " ) , 0 ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " physics/shape_type " , PROPERTY_HINT_ENUM , " Decompose Convex,Simple Convex,Trimesh,Box,Sphere,Cylinder,Capsule " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , 0 ) ) ;
// Decomposition
Mesh : : ConvexDecompositionSettings decomposition_default ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " decomposition/advanced " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , false ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " decomposition/precision " , PROPERTY_HINT_RANGE , " 1,10,1 " ) , 5 ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : FLOAT , " decomposition/max_concavity " , PROPERTY_HINT_RANGE , " 0.0,1.0,0.001 " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . max_concavity ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : FLOAT , " decomposition/symmetry_planes_clipping_bias " , PROPERTY_HINT_RANGE , " 0.0,1.0,0.001 " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . symmetry_planes_clipping_bias ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : FLOAT , " decomposition/revolution_axes_clipping_bias " , PROPERTY_HINT_RANGE , " 0.0,1.0,0.001 " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . revolution_axes_clipping_bias ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : FLOAT , " decomposition/min_volume_per_convex_hull " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . min_volume_per_convex_hull ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " decomposition/resolution " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . resolution ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " decomposition/max_num_vertices_per_convex_hull " , PROPERTY_HINT_RANGE , " 5,512,1 " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . max_num_vertices_per_convex_hull ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " decomposition/plane_downsampling " , PROPERTY_HINT_RANGE , " 1,16,1 " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . plane_downsampling ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " decomposition/convexhull_downsampling " , PROPERTY_HINT_RANGE , " 1,16,1 " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . convexhull_downsampling ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " decomposition/normalize_mesh " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . normalize_mesh ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " decomposition/mode " , PROPERTY_HINT_ENUM , " Voxel,Tetrahedron " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , static_cast < int > ( decomposition_default . mode ) ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " decomposition/convexhull_approximation " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . convexhull_approximation ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : INT , " decomposition/max_convex_hulls " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . max_convex_hulls ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " decomposition/project_hull_vertices " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , decomposition_default . project_hull_vertices ) ) ;
// Primitives: Box, Sphere, Cylinder, Capsule.
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : VECTOR3 , " primitive/size " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , Vector3 ( 2.0 , 2.0 , 2.0 ) ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : FLOAT , " primitive/height " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , 1.0 ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : FLOAT , " primitive/radius " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , 1.0 ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : VECTOR3 , " primitive/position " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , Vector3 ( ) ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : VECTOR3 , " primitive/rotation " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , Vector3 ( ) ) ) ;
} break ;
case INTERNAL_IMPORT_CATEGORY_MESH : {
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : BOOL , " save_to_file/enabled " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED ) , false ) ) ;
@ -980,6 +1017,65 @@ bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategor
case INTERNAL_IMPORT_CATEGORY_NODE : {
} break ;
case INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE : {
const bool generate_physics =
p_options . has ( " generate/physics " ) & &
p_options [ " generate/physics " ] . operator bool ( ) ;
if (
p_option = = " physics/body_type " | |
p_option = = " physics/shape_type " ) {
// Show if need to generate collisions.
return generate_physics ;
}
if ( p_option . find ( " decomposition/ " ) > = 0 ) {
// Show if need to generate collisions.
if ( generate_physics & &
// Show if convex is enabled.
p_options [ " physics/shape_type " ] = = Variant ( SHAPE_TYPE_DECOMPOSE_CONVEX ) ) {
if ( p_option = = " decomposition/advanced " ) {
return true ;
}
const bool decomposition_advanced =
p_options . has ( " decomposition/advanced " ) & &
p_options [ " decomposition/advanced " ] . operator bool ( ) ;
if ( p_option = = " decomposition/precision " ) {
return ! decomposition_advanced ;
} else {
return decomposition_advanced ;
}
}
return false ;
}
if ( p_option = = " primitive/position " | | p_option = = " primitive/rotation " ) {
const ShapeType physics_shape = ( ShapeType ) p_options [ " physics/shape_type " ] . operator int ( ) ;
return generate_physics & &
physics_shape > = SHAPE_TYPE_BOX ;
}
if ( p_option = = " primitive/size " ) {
const ShapeType physics_shape = ( ShapeType ) p_options [ " physics/shape_type " ] . operator int ( ) ;
return generate_physics & &
physics_shape = = SHAPE_TYPE_BOX ;
}
if ( p_option = = " primitive/radius " ) {
const ShapeType physics_shape = ( ShapeType ) p_options [ " physics/shape_type " ] . operator int ( ) ;
return generate_physics & & ( physics_shape = = SHAPE_TYPE_SPHERE | |
physics_shape = = SHAPE_TYPE_CYLINDER | |
physics_shape = = SHAPE_TYPE_CAPSULE ) ;
}
if ( p_option = = " primitive/height " ) {
const ShapeType physics_shape = ( ShapeType ) p_options [ " physics/shape_type " ] . operator int ( ) ;
return generate_physics & &
( physics_shape = = SHAPE_TYPE_CYLINDER | |
physics_shape = = SHAPE_TYPE_CAPSULE ) ;
}
} break ;
case INTERNAL_IMPORT_CATEGORY_MESH : {
if ( p_option = = " save_to_file/path " | | p_option = = " save_to_file/make_streamable " ) {
@ -1016,6 +1112,33 @@ bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategor
return true ;
}
bool ResourceImporterScene : : get_internal_option_update_view_required ( InternalImportCategory p_category , const String & p_option , const Map < StringName , Variant > & p_options ) const {
switch ( p_category ) {
case INTERNAL_IMPORT_CATEGORY_NODE : {
} break ;
case INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE : {
if (
p_option = = " generate/physics " | |
p_option = = " physics/shape_type " | |
p_option . find ( " decomposition/ " ) > = 0 | |
p_option . find ( " primitive/ " ) > = 0 ) {
return true ;
}
} break ;
case INTERNAL_IMPORT_CATEGORY_MESH : {
} break ;
case INTERNAL_IMPORT_CATEGORY_MATERIAL : {
} break ;
case INTERNAL_IMPORT_CATEGORY_ANIMATION : {
} break ;
case INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE : {
} break ;
default : {
}
}
return false ;
}
void ResourceImporterScene : : get_import_options ( List < ImportOption > * r_options , int p_preset ) const {
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : STRING , " nodes/root_type " , PROPERTY_HINT_TYPE_STRING , " Node " ) , " Node3D " ) ) ;
r_options - > push_back ( ImportOption ( PropertyInfo ( Variant : : STRING , " nodes/root_name " ) , " Scene Root " ) ) ;
@ -1270,7 +1393,7 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_m
}
}
void ResourceImporterScene : : _add_shapes ( Node * p_node , const List < Ref < Shape3D > > & p_shapes ) {
void ResourceImporterScene : : _add_shapes ( Node * p_node , const Vector < Ref < Shape3D > > & p_shapes ) {
for ( const Ref < Shape3D > & E : p_shapes ) {
CollisionShape3D * cshape = memnew ( CollisionShape3D ) ;
cshape - > set_shape ( E ) ;
@ -1311,7 +1434,7 @@ Node *ResourceImporterScene::pre_import(const String &p_source_file) {
return nullptr ;
}
Map < Ref < EditorSceneImporterMesh > , List < Ref < Shape3D > > > collision_map ;
Map < Ref < EditorSceneImporterMesh > , Vector < Ref < Shape3D > > > collision_map ;
_pre_fix_node ( scene , scene , collision_map ) ;
@ -1387,7 +1510,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p
}
Set < Ref < EditorSceneImporterMesh > > scanned_meshes ;
Map < Ref < EditorSceneImporterMesh > , List < Ref < Shape3D > > > collision_map ;
Map < Ref < EditorSceneImporterMesh > , Vector < Ref < Shape3D > > > collision_map ;
_pre_fix_node ( scene , scene , collision_map ) ;
_post_fix_node ( scene , scene , collision_map , scanned_meshes , node_data , material_data , animation_data , fps ) ;