diff --git a/modules/gridmap/editor/grid_map_editor_plugin.cpp b/modules/gridmap/editor/grid_map_editor_plugin.cpp index ee526302ccd..8b934d6e942 100644 --- a/modules/gridmap/editor/grid_map_editor_plugin.cpp +++ b/modules/gridmap/editor/grid_map_editor_plugin.cpp @@ -562,6 +562,8 @@ void GridMapEditor::_set_clipboard_data() { Ref meshLibrary = node->get_mesh_library(); + const RID scenario = get_tree()->get_root()->get_world_3d()->get_scenario(); + for (int i = selection.begin.x; i <= selection.end.x; i++) { for (int j = selection.begin.y; j <= selection.end.y; j++) { for (int k = selection.begin.z; k <= selection.end.z; k++) { @@ -577,7 +579,7 @@ void GridMapEditor::_set_clipboard_data() { item.cell_item = itm; item.grid_offset = Vector3(selected) - selection.begin; item.orientation = node->get_cell_item_orientation(selected); - item.instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world_3d()->get_scenario()); + item.instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), scenario); clipboard_items.push_back(item); } @@ -1181,20 +1183,23 @@ void GridMapEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { mesh_library_palette->connect(SceneStringName(item_selected), callable_mp(this, &GridMapEditor::_item_selected_cbk)); + + const RID scenario = get_tree()->get_root()->get_world_3d()->get_scenario(); + for (int i = 0; i < 3; i++) { grid[i] = RS::get_singleton()->mesh_create(); - grid_instance[i] = RS::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world_3d()->get_scenario()); + grid_instance[i] = RS::get_singleton()->instance_create2(grid[i], scenario); RenderingServer::get_singleton()->instance_set_layer_mask(grid_instance[i], 1 << Node3DEditorViewport::MISC_TOOL_LAYER); - selection_level_instance[i] = RenderingServer::get_singleton()->instance_create2(selection_level_mesh[i], get_tree()->get_root()->get_world_3d()->get_scenario()); + selection_level_instance[i] = RenderingServer::get_singleton()->instance_create2(selection_level_mesh[i], scenario); RenderingServer::get_singleton()->instance_set_layer_mask(selection_level_instance[i], 1 << Node3DEditorViewport::MISC_TOOL_LAYER); } - cursor_instance = RenderingServer::get_singleton()->instance_create2(cursor_mesh, get_tree()->get_root()->get_world_3d()->get_scenario()); + cursor_instance = RenderingServer::get_singleton()->instance_create2(cursor_mesh, scenario); RenderingServer::get_singleton()->instance_set_layer_mask(cursor_instance, 1 << Node3DEditorViewport::MISC_TOOL_LAYER); RenderingServer::get_singleton()->instance_set_visible(cursor_instance, false); - selection_instance = RenderingServer::get_singleton()->instance_create2(selection_mesh, get_tree()->get_root()->get_world_3d()->get_scenario()); + selection_instance = RenderingServer::get_singleton()->instance_create2(selection_mesh, scenario); RenderingServer::get_singleton()->instance_set_layer_mask(selection_instance, 1 << Node3DEditorViewport::MISC_TOOL_LAYER); - paste_instance = RenderingServer::get_singleton()->instance_create2(paste_mesh, get_tree()->get_root()->get_world_3d()->get_scenario()); + paste_instance = RenderingServer::get_singleton()->instance_create2(paste_mesh, scenario); RenderingServer::get_singleton()->instance_set_layer_mask(paste_instance, 1 << Node3DEditorViewport::MISC_TOOL_LAYER); _update_selection_transform(); @@ -1271,11 +1276,13 @@ void GridMapEditor::_update_cursor_instance() { } cursor_instance = RID(); + const RID scenario = get_tree()->get_root()->get_world_3d()->get_scenario(); + if (mode_buttons_group->get_pressed_button() == paint_mode_button) { if (selected_palette >= 0 && node && node->get_mesh_library().is_valid()) { Ref mesh = node->get_mesh_library()->get_item_mesh(selected_palette); if (mesh.is_valid() && mesh->get_rid().is_valid()) { - cursor_instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world_3d()->get_scenario()); + cursor_instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), scenario); RS::ShadowCastingSetting cast_shadows = (RS::ShadowCastingSetting)node->get_mesh_library()->get_item_mesh_cast_shadow(selected_palette); RS::get_singleton()->instance_geometry_set_cast_shadows_setting(cursor_instance, cast_shadows); } @@ -1283,15 +1290,15 @@ void GridMapEditor::_update_cursor_instance() { } else if (mode_buttons_group->get_pressed_button() == select_mode_button) { cursor_inner_mat->set_albedo(Color(default_color, 0.2)); cursor_outer_mat->set_albedo(Color(default_color, 0.8)); - cursor_instance = RenderingServer::get_singleton()->instance_create2(cursor_mesh, get_tree()->get_root()->get_world_3d()->get_scenario()); + cursor_instance = RenderingServer::get_singleton()->instance_create2(cursor_mesh, scenario); } else if (mode_buttons_group->get_pressed_button() == erase_mode_button) { cursor_inner_mat->set_albedo(Color(erase_color, 0.2)); cursor_outer_mat->set_albedo(Color(erase_color, 0.8)); - cursor_instance = RenderingServer::get_singleton()->instance_create2(cursor_mesh, get_tree()->get_root()->get_world_3d()->get_scenario()); + cursor_instance = RenderingServer::get_singleton()->instance_create2(cursor_mesh, scenario); } else if (mode_buttons_group->get_pressed_button() == pick_mode_button) { cursor_inner_mat->set_albedo(Color(pick_color, 0.2)); cursor_outer_mat->set_albedo(Color(pick_color, 0.8)); - cursor_instance = RenderingServer::get_singleton()->instance_create2(cursor_mesh, get_tree()->get_root()->get_world_3d()->get_scenario()); + cursor_instance = RenderingServer::get_singleton()->instance_create2(cursor_mesh, scenario); } // Make the cursor translucent so that it can be distinguished from already-placed tiles. diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index ff52a67dbc7..7d318e167c7 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -82,6 +82,8 @@ bool GridMap::_set(const StringName &p_name, const Variant &p_value) { Array meshes = p_value; + const RID scenario = get_world_3d()->get_scenario(); + for (int i = 0; i < meshes.size(); i++) { BakedMesh bm; bm.mesh = meshes[i]; @@ -90,7 +92,7 @@ bool GridMap::_set(const StringName &p_name, const Variant &p_value) { RS::get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid()); RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id()); if (is_inside_tree()) { - RS::get_singleton()->instance_set_scenario(bm.instance, get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_scenario(bm.instance, scenario); RS::get_singleton()->instance_set_transform(bm.instance, get_global_transform()); } baked_meshes.push_back(bm); @@ -621,6 +623,18 @@ bool GridMap::_octant_update(const OctantKey &p_key) { HashMap>> multimesh_items; + RID scenario; +#ifndef NAVIGATION_3D_DISABLED + RID navigation_map; +#endif + + if (is_inside_tree()) { + scenario = get_world_3d()->get_scenario(); +#ifndef NAVIGATION_3D_DISABLED + navigation_map = get_world_3d()->get_navigation_map(); +#endif + } + for (const IndexKey &E : g.cells) { ERR_CONTINUE(!cell_map.has(E)); const Cell &c = cell_map[E]; @@ -683,7 +697,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) { if (map_override.is_valid()) { NavigationServer3D::get_singleton()->region_set_map(region, map_override); } else { - NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); + NavigationServer3D::get_singleton()->region_set_map(region, navigation_map); } } nm.region = region; @@ -698,7 +712,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) { RS::get_singleton()->instance_set_base(nm.navigation_mesh_debug_instance, navigation_mesh_debug_rid); } if (is_inside_tree()) { - RS::get_singleton()->instance_set_scenario(nm.navigation_mesh_debug_instance, get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_scenario(nm.navigation_mesh_debug_instance, scenario); RS::get_singleton()->instance_set_transform(nm.navigation_mesh_debug_instance, get_global_transform() * nm.xform); } } @@ -743,7 +757,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) { RS::get_singleton()->instance_set_base(instance, mm); if (is_inside_tree()) { - RS::get_singleton()->instance_set_scenario(instance, get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_scenario(instance, scenario); RS::get_singleton()->instance_set_transform(instance, get_global_transform()); } @@ -802,22 +816,27 @@ void GridMap::_update_physics_bodies_characteristics() { void GridMap::_octant_enter_world(const OctantKey &p_key) { ERR_FAIL_COND(!octant_map.has(p_key)); Octant &g = *octant_map[p_key]; + + const RID scenario = get_world_3d()->get_scenario(); + #ifndef PHYSICS_3D_DISABLED PhysicsServer3D::get_singleton()->body_set_state(g.static_body, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform()); PhysicsServer3D::get_singleton()->body_set_space(g.static_body, get_world_3d()->get_space()); if (g.collision_debug_instance.is_valid()) { - RS::get_singleton()->instance_set_scenario(g.collision_debug_instance, get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_scenario(g.collision_debug_instance, scenario); RS::get_singleton()->instance_set_transform(g.collision_debug_instance, get_global_transform()); } #endif // PHYSICS_3D_DISABLED for (int i = 0; i < g.multimesh_instances.size(); i++) { - RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, scenario); RS::get_singleton()->instance_set_transform(g.multimesh_instances[i].instance, get_global_transform()); } #ifndef NAVIGATION_3D_DISABLED + const RID navigation_map = get_world_3d()->get_navigation_map(); + if (bake_navigation && mesh_library.is_valid()) { for (KeyValue &F : g.navigation_cell_ids) { if (cell_map.has(F.key) && F.value.region.is_valid() == false) { @@ -831,7 +850,7 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) { if (map_override.is_valid()) { NavigationServer3D::get_singleton()->region_set_map(region, map_override); } else { - NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); + NavigationServer3D::get_singleton()->region_set_map(region, navigation_map); } F.value.region = region;