mirror of
https://github.com/godotengine/godot-demo-projects.git
synced 2026-01-04 15:00:09 +01:00
Update NavigationChunk demos (#1221)
Updates NavigationChunk demos for `NavigationMeshSourceGeometryData2D.get_bounds()` function and new NavigationAgent no post-processing option.
This commit is contained in:
@@ -45,7 +45,7 @@ func _ready() -> void:
|
|||||||
static func create_region_chunks(chunks_root_node: Node, p_source_geometry: NavigationMeshSourceGeometryData2D, p_chunk_size: float, p_agent_radius: float) -> void:
|
static func create_region_chunks(chunks_root_node: Node, p_source_geometry: NavigationMeshSourceGeometryData2D, p_chunk_size: float, p_agent_radius: float) -> void:
|
||||||
# We need to know how many chunks are required for the input geometry.
|
# We need to know how many chunks are required for the input geometry.
|
||||||
# So first get an axis aligned bounding box that covers all vertices.
|
# So first get an axis aligned bounding box that covers all vertices.
|
||||||
var input_geometry_bounds: Rect2 = calculate_source_geometry_bounds(p_source_geometry)
|
var input_geometry_bounds: Rect2 = p_source_geometry.get_bounds()
|
||||||
|
|
||||||
# Rasterize bounding box into chunk grid to know range of required chunks.
|
# Rasterize bounding box into chunk grid to know range of required chunks.
|
||||||
var start_chunk: Vector2 = floor(
|
var start_chunk: Vector2 = floor(
|
||||||
@@ -94,43 +94,6 @@ static func create_region_chunks(chunks_root_node: Node, p_source_geometry: Navi
|
|||||||
chunk_id_to_region[chunk_id] = chunk_region
|
chunk_id_to_region[chunk_id] = chunk_region
|
||||||
|
|
||||||
|
|
||||||
static func calculate_source_geometry_bounds(p_source_geometry: NavigationMeshSourceGeometryData2D) -> Rect2:
|
|
||||||
if p_source_geometry.has_method("get_bounds"):
|
|
||||||
# Godot 4.3 Patch added get_bounds() function that does the same but faster.
|
|
||||||
return p_source_geometry.call("get_bounds")
|
|
||||||
|
|
||||||
var bounds: Rect2 = Rect2()
|
|
||||||
var first_vertex: bool = true
|
|
||||||
|
|
||||||
for traversable_outline: PackedVector2Array in p_source_geometry.get_traversable_outlines():
|
|
||||||
for traversable_point: Vector2 in traversable_outline:
|
|
||||||
if first_vertex:
|
|
||||||
first_vertex = false
|
|
||||||
bounds.position = traversable_point
|
|
||||||
else:
|
|
||||||
bounds = bounds.expand(traversable_point)
|
|
||||||
|
|
||||||
for obstruction_outline: PackedVector2Array in p_source_geometry.get_obstruction_outlines():
|
|
||||||
for obstruction_point: Vector2 in obstruction_outline:
|
|
||||||
if first_vertex:
|
|
||||||
first_vertex = false
|
|
||||||
bounds.position = obstruction_point
|
|
||||||
else:
|
|
||||||
bounds = bounds.expand(obstruction_point)
|
|
||||||
|
|
||||||
for projected_obstruction: Dictionary in p_source_geometry.get_projected_obstructions():
|
|
||||||
var projected_obstruction_vertices: PackedFloat32Array = projected_obstruction["vertices"]
|
|
||||||
for i in projected_obstruction_vertices.size() / 2:
|
|
||||||
var vertex: Vector2 = Vector2(projected_obstruction_vertices[i * 2], projected_obstruction_vertices[i * 2 + 1])
|
|
||||||
if first_vertex:
|
|
||||||
first_vertex = false
|
|
||||||
bounds.position = vertex
|
|
||||||
else:
|
|
||||||
bounds = bounds.expand(vertex)
|
|
||||||
|
|
||||||
return bounds
|
|
||||||
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
var mouse_cursor_position: Vector2 = get_global_mouse_position()
|
var mouse_cursor_position: Vector2 = get_global_mouse_position()
|
||||||
|
|
||||||
@@ -151,6 +114,8 @@ func _process(_delta: float) -> void:
|
|||||||
|
|
||||||
%PathDebugCorridorFunnel.target_position = closest_point_on_navmesh
|
%PathDebugCorridorFunnel.target_position = closest_point_on_navmesh
|
||||||
%PathDebugEdgeCentered.target_position = closest_point_on_navmesh
|
%PathDebugEdgeCentered.target_position = closest_point_on_navmesh
|
||||||
|
%PathDebugNoPostProcessing.target_position = closest_point_on_navmesh
|
||||||
|
|
||||||
%PathDebugCorridorFunnel.get_next_path_position()
|
%PathDebugCorridorFunnel.get_next_path_position()
|
||||||
%PathDebugEdgeCentered.get_next_path_position()
|
%PathDebugEdgeCentered.get_next_path_position()
|
||||||
|
%PathDebugNoPostProcessing.get_next_path_position()
|
||||||
|
|||||||
@@ -43,6 +43,15 @@ debug_path_custom_color = Color(1, 1, 0, 1)
|
|||||||
debug_path_custom_point_size = 10.0
|
debug_path_custom_point_size = 10.0
|
||||||
debug_path_custom_line_width = 4.0
|
debug_path_custom_line_width = 4.0
|
||||||
|
|
||||||
|
[node name="PathDebugNoPostProcessing" type="NavigationAgent2D" parent="DebugPaths"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
path_postprocessing = 2
|
||||||
|
debug_enabled = true
|
||||||
|
debug_use_custom = true
|
||||||
|
debug_path_custom_color = Color(1, 0, 0, 1)
|
||||||
|
debug_path_custom_point_size = 10.0
|
||||||
|
debug_path_custom_line_width = 4.0
|
||||||
|
|
||||||
[node name="ChunksContainer" type="Node2D" parent="."]
|
[node name="ChunksContainer" type="Node2D" parent="."]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
||||||
@@ -97,3 +106,19 @@ layout_mode = 2
|
|||||||
text = "Path edge-centered"
|
text = "Path edge-centered"
|
||||||
horizontal_alignment = 1
|
horizontal_alignment = 1
|
||||||
vertical_alignment = 1
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="HBoxContainer3" type="HBoxContainer" parent="CanvasLayer/PanelContainer/MarginContainer/VBoxContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_constants/separation = 10
|
||||||
|
|
||||||
|
[node name="ColorRect" type="ColorRect" parent="CanvasLayer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3"]
|
||||||
|
custom_minimum_size = Vector2(128, 8)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_vertical = 4
|
||||||
|
color = Color(1, 0, 0, 1)
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="CanvasLayer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3"]
|
||||||
|
layout_mode = 2
|
||||||
|
text = "Path no post-processing"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ func _ready() -> void:
|
|||||||
static func create_region_chunks(chunks_root_node: Node, p_source_geometry: NavigationMeshSourceGeometryData3D, p_chunk_size: float, p_agent_radius: float) -> void:
|
static func create_region_chunks(chunks_root_node: Node, p_source_geometry: NavigationMeshSourceGeometryData3D, p_chunk_size: float, p_agent_radius: float) -> void:
|
||||||
# We need to know how many chunks are required for the input geometry.
|
# We need to know how many chunks are required for the input geometry.
|
||||||
# So first get an axis aligned bounding box that covers all vertices.
|
# So first get an axis aligned bounding box that covers all vertices.
|
||||||
var input_geometry_bounds: AABB = calculate_source_geometry_bounds(p_source_geometry)
|
var input_geometry_bounds: AABB = p_source_geometry.get_bounds()
|
||||||
|
|
||||||
# Rasterize bounding box into chunk grid to know range of required chunks.
|
# Rasterize bounding box into chunk grid to know range of required chunks.
|
||||||
var start_chunk: Vector3 = floor(
|
var start_chunk: Vector3 = floor(
|
||||||
@@ -96,37 +96,6 @@ static func create_region_chunks(chunks_root_node: Node, p_source_geometry: Navi
|
|||||||
chunk_id_to_region[chunk_id] = chunk_region
|
chunk_id_to_region[chunk_id] = chunk_region
|
||||||
|
|
||||||
|
|
||||||
static func calculate_source_geometry_bounds(p_source_geometry: NavigationMeshSourceGeometryData3D) -> AABB:
|
|
||||||
if p_source_geometry.has_method("get_bounds"):
|
|
||||||
# Godot 4.3 Patch added get_bounds() function that does the same but faster.
|
|
||||||
return p_source_geometry.call("get_bounds")
|
|
||||||
|
|
||||||
var bounds: AABB = AABB()
|
|
||||||
var first_vertex: bool = true
|
|
||||||
|
|
||||||
var vertices: PackedFloat32Array = p_source_geometry.get_vertices()
|
|
||||||
var vertices_count: int = vertices.size() / 3
|
|
||||||
for i in vertices_count:
|
|
||||||
var vertex: Vector3 = Vector3(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2])
|
|
||||||
if first_vertex:
|
|
||||||
first_vertex = false
|
|
||||||
bounds.position = vertex
|
|
||||||
else:
|
|
||||||
bounds = bounds.expand(vertex)
|
|
||||||
|
|
||||||
for projected_obstruction: Dictionary in p_source_geometry.get_projected_obstructions():
|
|
||||||
var projected_obstruction_vertices: PackedFloat32Array = projected_obstruction["vertices"]
|
|
||||||
for i in projected_obstruction_vertices.size() / 3:
|
|
||||||
var vertex: Vector3 = Vector3(projected_obstruction.vertices[i * 3], projected_obstruction.vertices[i * 3 + 1], projected_obstruction.vertices[i * 3 + 2]);
|
|
||||||
if first_vertex:
|
|
||||||
first_vertex = false
|
|
||||||
bounds.position = vertex
|
|
||||||
else:
|
|
||||||
bounds = bounds.expand(vertex)
|
|
||||||
|
|
||||||
return bounds
|
|
||||||
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
var mouse_cursor_position: Vector2 = get_viewport().get_mouse_position()
|
var mouse_cursor_position: Vector2 = get_viewport().get_mouse_position()
|
||||||
|
|
||||||
@@ -152,6 +121,8 @@ func _process(_delta: float) -> void:
|
|||||||
|
|
||||||
%PathDebugCorridorFunnel.target_position = closest_point_on_navmesh
|
%PathDebugCorridorFunnel.target_position = closest_point_on_navmesh
|
||||||
%PathDebugEdgeCentered.target_position = closest_point_on_navmesh
|
%PathDebugEdgeCentered.target_position = closest_point_on_navmesh
|
||||||
|
%PathDebugNoPostProcessing.target_position = closest_point_on_navmesh
|
||||||
|
|
||||||
%PathDebugCorridorFunnel.get_next_path_position()
|
%PathDebugCorridorFunnel.get_next_path_position()
|
||||||
%PathDebugEdgeCentered.get_next_path_position()
|
%PathDebugEdgeCentered.get_next_path_position()
|
||||||
|
%PathDebugNoPostProcessing.get_next_path_position()
|
||||||
|
|||||||
@@ -93,6 +93,14 @@ debug_use_custom = true
|
|||||||
debug_path_custom_color = Color(1, 1, 0, 1)
|
debug_path_custom_color = Color(1, 1, 0, 1)
|
||||||
debug_path_custom_point_size = 10.0
|
debug_path_custom_point_size = 10.0
|
||||||
|
|
||||||
|
[node name="PathDebugNoPostProcessing" type="NavigationAgent3D" parent="DebugPaths"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
path_postprocessing = 2
|
||||||
|
debug_enabled = true
|
||||||
|
debug_use_custom = true
|
||||||
|
debug_path_custom_color = Color(1, 0, 0, 1)
|
||||||
|
debug_path_custom_point_size = 10.0
|
||||||
|
|
||||||
[node name="DebugMousePos" type="Node3D" parent="DebugPaths"]
|
[node name="DebugMousePos" type="Node3D" parent="DebugPaths"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
||||||
@@ -150,3 +158,19 @@ layout_mode = 2
|
|||||||
text = "Path edge-centered"
|
text = "Path edge-centered"
|
||||||
horizontal_alignment = 1
|
horizontal_alignment = 1
|
||||||
vertical_alignment = 1
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="HBoxContainer3" type="HBoxContainer" parent="CanvasLayer/PanelContainer/MarginContainer/VBoxContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_constants/separation = 10
|
||||||
|
|
||||||
|
[node name="ColorRect" type="ColorRect" parent="CanvasLayer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3"]
|
||||||
|
custom_minimum_size = Vector2(128, 8)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_vertical = 4
|
||||||
|
color = Color(1, 0, 0, 1)
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="CanvasLayer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3"]
|
||||||
|
layout_mode = 2
|
||||||
|
text = "Path no post-processing"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|||||||
Reference in New Issue
Block a user