mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-03 23:21:15 +00:00 
			
		
		
		
	Merge pull request #105563 from smix8/gridmap_get_quadrupled
Optimize GridMap rendering scenario quadruple-getters
This commit is contained in:
		
						commit
						1c51640a1c
					
				
					 2 changed files with 43 additions and 17 deletions
				
			
		| 
						 | 
					@ -562,6 +562,8 @@ void GridMapEditor::_set_clipboard_data() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Ref<MeshLibrary> meshLibrary = node->get_mesh_library();
 | 
						Ref<MeshLibrary> 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 i = selection.begin.x; i <= selection.end.x; i++) {
 | 
				
			||||||
		for (int j = selection.begin.y; j <= selection.end.y; j++) {
 | 
							for (int j = selection.begin.y; j <= selection.end.y; j++) {
 | 
				
			||||||
			for (int k = selection.begin.z; k <= selection.end.z; k++) {
 | 
								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.cell_item = itm;
 | 
				
			||||||
				item.grid_offset = Vector3(selected) - selection.begin;
 | 
									item.grid_offset = Vector3(selected) - selection.begin;
 | 
				
			||||||
				item.orientation = node->get_cell_item_orientation(selected);
 | 
									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);
 | 
									clipboard_items.push_back(item);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -1181,20 +1183,23 @@ void GridMapEditor::_notification(int p_what) {
 | 
				
			||||||
	switch (p_what) {
 | 
						switch (p_what) {
 | 
				
			||||||
		case NOTIFICATION_ENTER_TREE: {
 | 
							case NOTIFICATION_ENTER_TREE: {
 | 
				
			||||||
			mesh_library_palette->connect(SceneStringName(item_selected), callable_mp(this, &GridMapEditor::_item_selected_cbk));
 | 
								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++) {
 | 
								for (int i = 0; i < 3; i++) {
 | 
				
			||||||
				grid[i] = RS::get_singleton()->mesh_create();
 | 
									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);
 | 
									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);
 | 
									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_layer_mask(cursor_instance, 1 << Node3DEditorViewport::MISC_TOOL_LAYER);
 | 
				
			||||||
			RenderingServer::get_singleton()->instance_set_visible(cursor_instance, false);
 | 
								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);
 | 
								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);
 | 
								RenderingServer::get_singleton()->instance_set_layer_mask(paste_instance, 1 << Node3DEditorViewport::MISC_TOOL_LAYER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			_update_selection_transform();
 | 
								_update_selection_transform();
 | 
				
			||||||
| 
						 | 
					@ -1271,11 +1276,13 @@ void GridMapEditor::_update_cursor_instance() {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cursor_instance = RID();
 | 
						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 (mode_buttons_group->get_pressed_button() == paint_mode_button) {
 | 
				
			||||||
		if (selected_palette >= 0 && node && node->get_mesh_library().is_valid()) {
 | 
							if (selected_palette >= 0 && node && node->get_mesh_library().is_valid()) {
 | 
				
			||||||
			Ref<Mesh> mesh = node->get_mesh_library()->get_item_mesh(selected_palette);
 | 
								Ref<Mesh> mesh = node->get_mesh_library()->get_item_mesh(selected_palette);
 | 
				
			||||||
			if (mesh.is_valid() && mesh->get_rid().is_valid()) {
 | 
								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::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);
 | 
									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) {
 | 
						} else if (mode_buttons_group->get_pressed_button() == select_mode_button) {
 | 
				
			||||||
		cursor_inner_mat->set_albedo(Color(default_color, 0.2));
 | 
							cursor_inner_mat->set_albedo(Color(default_color, 0.2));
 | 
				
			||||||
		cursor_outer_mat->set_albedo(Color(default_color, 0.8));
 | 
							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) {
 | 
						} else if (mode_buttons_group->get_pressed_button() == erase_mode_button) {
 | 
				
			||||||
		cursor_inner_mat->set_albedo(Color(erase_color, 0.2));
 | 
							cursor_inner_mat->set_albedo(Color(erase_color, 0.2));
 | 
				
			||||||
		cursor_outer_mat->set_albedo(Color(erase_color, 0.8));
 | 
							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) {
 | 
						} else if (mode_buttons_group->get_pressed_button() == pick_mode_button) {
 | 
				
			||||||
		cursor_inner_mat->set_albedo(Color(pick_color, 0.2));
 | 
							cursor_inner_mat->set_albedo(Color(pick_color, 0.2));
 | 
				
			||||||
		cursor_outer_mat->set_albedo(Color(pick_color, 0.8));
 | 
							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.
 | 
						// Make the cursor translucent so that it can be distinguished from already-placed tiles.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,6 +82,8 @@ bool GridMap::_set(const StringName &p_name, const Variant &p_value) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Array meshes = p_value;
 | 
							Array meshes = p_value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const RID scenario = get_world_3d()->get_scenario();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (int i = 0; i < meshes.size(); i++) {
 | 
							for (int i = 0; i < meshes.size(); i++) {
 | 
				
			||||||
			BakedMesh bm;
 | 
								BakedMesh bm;
 | 
				
			||||||
			bm.mesh = meshes[i];
 | 
								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_set_base(bm.instance, bm.mesh->get_rid());
 | 
				
			||||||
			RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id());
 | 
								RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id());
 | 
				
			||||||
			if (is_inside_tree()) {
 | 
								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());
 | 
									RS::get_singleton()->instance_set_transform(bm.instance, get_global_transform());
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			baked_meshes.push_back(bm);
 | 
								baked_meshes.push_back(bm);
 | 
				
			||||||
| 
						 | 
					@ -621,6 +623,18 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	HashMap<int, List<Pair<Transform3D, IndexKey>>> multimesh_items;
 | 
						HashMap<int, List<Pair<Transform3D, IndexKey>>> 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) {
 | 
						for (const IndexKey &E : g.cells) {
 | 
				
			||||||
		ERR_CONTINUE(!cell_map.has(E));
 | 
							ERR_CONTINUE(!cell_map.has(E));
 | 
				
			||||||
		const Cell &c = cell_map[E];
 | 
							const Cell &c = cell_map[E];
 | 
				
			||||||
| 
						 | 
					@ -683,7 +697,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
 | 
				
			||||||
					if (map_override.is_valid()) {
 | 
										if (map_override.is_valid()) {
 | 
				
			||||||
						NavigationServer3D::get_singleton()->region_set_map(region, map_override);
 | 
											NavigationServer3D::get_singleton()->region_set_map(region, map_override);
 | 
				
			||||||
					} else {
 | 
										} 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;
 | 
									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);
 | 
											RS::get_singleton()->instance_set_base(nm.navigation_mesh_debug_instance, navigation_mesh_debug_rid);
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					if (is_inside_tree()) {
 | 
										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);
 | 
											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);
 | 
								RS::get_singleton()->instance_set_base(instance, mm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (is_inside_tree()) {
 | 
								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());
 | 
									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) {
 | 
					void GridMap::_octant_enter_world(const OctantKey &p_key) {
 | 
				
			||||||
	ERR_FAIL_COND(!octant_map.has(p_key));
 | 
						ERR_FAIL_COND(!octant_map.has(p_key));
 | 
				
			||||||
	Octant &g = *octant_map[p_key];
 | 
						Octant &g = *octant_map[p_key];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const RID scenario = get_world_3d()->get_scenario();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef PHYSICS_3D_DISABLED
 | 
					#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_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());
 | 
						PhysicsServer3D::get_singleton()->body_set_space(g.static_body, get_world_3d()->get_space());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (g.collision_debug_instance.is_valid()) {
 | 
						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());
 | 
							RS::get_singleton()->instance_set_transform(g.collision_debug_instance, get_global_transform());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif // PHYSICS_3D_DISABLED
 | 
					#endif // PHYSICS_3D_DISABLED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (int i = 0; i < g.multimesh_instances.size(); i++) {
 | 
						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());
 | 
							RS::get_singleton()->instance_set_transform(g.multimesh_instances[i].instance, get_global_transform());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef NAVIGATION_3D_DISABLED
 | 
					#ifndef NAVIGATION_3D_DISABLED
 | 
				
			||||||
 | 
						const RID navigation_map = get_world_3d()->get_navigation_map();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (bake_navigation && mesh_library.is_valid()) {
 | 
						if (bake_navigation && mesh_library.is_valid()) {
 | 
				
			||||||
		for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) {
 | 
							for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) {
 | 
				
			||||||
			if (cell_map.has(F.key) && F.value.region.is_valid() == false) {
 | 
								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()) {
 | 
										if (map_override.is_valid()) {
 | 
				
			||||||
						NavigationServer3D::get_singleton()->region_set_map(region, map_override);
 | 
											NavigationServer3D::get_singleton()->region_set_map(region, map_override);
 | 
				
			||||||
					} else {
 | 
										} 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;
 | 
										F.value.region = region;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue