From 6fecc5632c5bea018d6e7186fc8edc8e6dd767b6 Mon Sep 17 00:00:00 2001 From: Henne Date: Mon, 24 Feb 2025 19:01:33 +0100 Subject: [PATCH] add arrow debuging --- .../flow_field_navigation.gd | 61 +++++++++++++------ swarm_engine/swarm_engine_debug_level.tscn | 7 ++- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/swarm_engine/flow_field_navigation/flow_field_navigation.gd b/swarm_engine/flow_field_navigation/flow_field_navigation.gd index 7cea631..ae1a2c9 100644 --- a/swarm_engine/flow_field_navigation/flow_field_navigation.gd +++ b/swarm_engine/flow_field_navigation/flow_field_navigation.gd @@ -18,6 +18,7 @@ class_name FlowFieldNav @export_color_no_alpha var z_lines_color: Color = Color(1, 1, 1) @export_group("Arrows") @export var show_arrows: bool = false +@export var arrows_size: float = 0.1 @export_color_no_alpha var cell_center_color: Color = Color(1, 1, 1) @export var cell_center_size: float = 0.2 @@ -27,17 +28,33 @@ class_name FlowFieldNav @export var grid_size_x: int = 2 @export var grid_size_z: int = 5 + +@export var target: Node3D = null var flow_direction_list: Array[Vector2] = [] +var half_size_x: float +var half_size_z: float + func _ready() -> void: for x in range(grid_size_x): for z in range(grid_size_z): flow_direction_list.append(Vector2(0.0, 0.0)) + half_size_x = (grid_size_x * cell_size) * 0.5 + half_size_z = (grid_size_z * cell_size) * 0.5 func _process(delta: float) -> void: + + + _update_flow_field() _draw_debug() - +func _update_flow_field(): + if target != null: + for x in range(grid_size_x): + for z in range(grid_size_z): + var index = z * grid_size_x + x + var flow_direction = (target.position - _get_cell_center_with_coordinates(x,z)).normalized() * (cell_size/2) + flow_direction_list[index] = Vector2(flow_direction.x, flow_direction.z) func _draw_debug(): if show_grid_center: @@ -55,9 +72,6 @@ func _draw_debug(): _draw_arrows() func _draw_border(): - var half_size_x = (grid_size_x * cell_size) * 0.5 - var half_size_z = (grid_size_z * cell_size) * 0.5 - var top_left = position - Vector3(half_size_x, 0 , half_size_z) var top_right = position + Vector3(half_size_x, 0, -half_size_z) var bottom_left = position - Vector3(half_size_x, 0, -half_size_z) @@ -71,8 +85,6 @@ func _draw_border(): DebugDraw3D.draw_lines(lines, border_color) func _draw_x_lines(): - var half_size_x = (grid_size_x * cell_size) * 0.5 - var half_size_z = (grid_size_z * cell_size) * 0.5 var lines: PackedVector3Array for x in range(grid_size_x - 1): var start = position - Vector3(half_size_x - ((x + 1) * cell_size), 0, half_size_z) @@ -81,8 +93,6 @@ func _draw_x_lines(): DebugDraw3D.draw_lines(lines, x_lines_color) func _draw_z_lines(): - var half_size_x = (grid_size_x * cell_size) * 0.5 - var half_size_z = (grid_size_z * cell_size) * 0.5 var lines: PackedVector3Array for z in range(grid_size_z - 1): var start = position - Vector3(half_size_x, 0, half_size_z - ((z + 1) * cell_size)) @@ -91,26 +101,37 @@ func _draw_z_lines(): DebugDraw3D.draw_lines(lines, z_lines_color) func _draw_arrows(): - var half_size_x = (grid_size_x * cell_size) * 0.5 - var half_size_z = (grid_size_z * cell_size) * 0.5 var points: PackedVector3Array for x in range(grid_size_x): for z in range(grid_size_z): - var cell_center = position + Vector3( + var cell_center = _get_cell_center_with_coordinates(x,z) + var index = z * grid_size_x + x + if flow_direction_list[index].length() > 0.0: + var direction = Vector3(flow_direction_list[index].x, 0, flow_direction_list[index].y).normalized() + var arrow_end = cell_center + direction * (cell_size * 0.4) + DebugDraw3D.draw_arrow(cell_center, arrow_end, get_direction_color(direction), arrows_size) + else: + points.append(cell_center) + DebugDraw3D.draw_points(points, DebugDraw3D.POINT_TYPE_SQUARE, cell_center_size, cell_center_color) + +func get_direction_color(direction: Vector3) -> Color: + var angle = atan2(direction.z, direction.x) + var hue = (angle / (2.0 * PI)) + 0.5 + return Color.from_hsv(hue, 1.0, 1.0) + +func _get_cell_center_with_coordinates(x:int, z:int) -> Vector3: + return position + Vector3( (-half_size_x + (x * cell_size) + (cell_size * 0.5)), 0, (-half_size_z + (z * cell_size) + (cell_size * 0.5)) ) - points.append(cell_center) - #var index = z * grid_size_x + x - #if flow_direction_list[index].length() > 0.0: - #pass #zeichne pfeil - #else: - #DebugDraw3D.draw_sphere(cell_center, cell_center_size, cell_center_color) - DebugDraw3D.draw_points(points, DebugDraw3D.POINT_TYPE_SQUARE, cell_center_size, cell_center_color) -func _get_index_from_position(position: Vector3) -> int: - return 0 +func _get_index_from_position(pos: Vector3) -> int: + var x = int((pos.x - position.x + half_size_x) / cell_size) + var z = int((pos.z - position.z + half_size_z) / cell_size) + if x < 0 or x >= grid_size_x or z < 0 or z >= grid_size_z: + return -1 + return z * grid_size_x + x func get_direction_from_position(position: Vector3) -> Vector3: var index = _get_index_from_position(position) diff --git a/swarm_engine/swarm_engine_debug_level.tscn b/swarm_engine/swarm_engine_debug_level.tscn index 97824ed..3cdfe11 100644 --- a/swarm_engine/swarm_engine_debug_level.tscn +++ b/swarm_engine/swarm_engine_debug_level.tscn @@ -17,7 +17,7 @@ script = ExtResource("1_f0ttr") transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0) shadow_enabled = true -[node name="FlowFieldNavigation" parent="." instance=ExtResource("1_xwcpn")] +[node name="FlowFieldNavigation" parent="." node_paths=PackedStringArray("target") instance=ExtResource("1_xwcpn")] unique_name_in_owner = true show_grid_center = true grid_center_color = Color(0, 0.0833333, 1, 1) @@ -29,8 +29,9 @@ z_lines_color = Color(1, 0, 0.0166664, 1) show_arrows = true cell_center_color = Color(0.702375, 0.0507974, 0.96251, 1) cell_size = 4.0 -grid_size_x = 100 -grid_size_z = 100 +grid_size_x = 50 +grid_size_z = 50 +target = NodePath("../player") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] mesh = SubResource("PlaneMesh_3dwe5")