From 690940a6c363ba0eaecb5453896dfaa16344b614 Mon Sep 17 00:00:00 2001 From: Henne Date: Wed, 19 Feb 2025 20:07:19 +0100 Subject: [PATCH] start with flow field grid and debug vis --- .../flow_field_navigation/flow_field_cell.gd | 11 +++ .../flow_field_navigation.gd | 78 +++++++++++++++---- swarm_engine/swarm_engine_debug_level.gd | 7 ++ swarm_engine/swarm_engine_debug_level.tscn | 14 +++- 4 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 swarm_engine/flow_field_navigation/flow_field_cell.gd create mode 100644 swarm_engine/swarm_engine_debug_level.gd diff --git a/swarm_engine/flow_field_navigation/flow_field_cell.gd b/swarm_engine/flow_field_navigation/flow_field_cell.gd new file mode 100644 index 0000000..413145b --- /dev/null +++ b/swarm_engine/flow_field_navigation/flow_field_cell.gd @@ -0,0 +1,11 @@ +extends Resource +class_name FlowFieldCell + +var position:Vector3 = Vector3(0.0, 0.0, 0.0) +var flow_direction:Vector3 = Vector3(randf(), 0.0, randf()) + +func debug_process() -> void: + if flow_direction.length() > 0.0: + DebugDraw3D.draw_arrow(position, position + flow_direction, Color(1,1,1,1), 0.1) + else: + DebugDraw3D.draw_sphere(position, .05) diff --git a/swarm_engine/flow_field_navigation/flow_field_navigation.gd b/swarm_engine/flow_field_navigation/flow_field_navigation.gd index e069af2..acb4e14 100644 --- a/swarm_engine/flow_field_navigation/flow_field_navigation.gd +++ b/swarm_engine/flow_field_navigation/flow_field_navigation.gd @@ -1,21 +1,71 @@ extends Node3D +@export_group("Debug") +@export var debugVisu: bool = true +@export var line_color: Color = Color(1, 1, 1, 1) + +@export_group("Grid") +@export var grid_size: int = 10 +@export var cell_size: float = 1.0 + +var _cells: Dictionary +var grid_offset: Vector3 -# Called when the node enters the scene tree for the first time. func _ready() -> void: - pass # Replace with function body. + var half_size = (grid_size * cell_size) * 0.5 + grid_offset = Vector3(-half_size + (cell_size * 0.5), 0, -half_size + (cell_size * 0.5)) + create_grid() + +func create_grid() -> void: + _cells.clear() + for x in range(grid_size): + for z in range(grid_size): + var cell = FlowFieldCell.new() + var world_x = x * cell_size + grid_offset.x + var world_z = z * cell_size + grid_offset.z + cell.position = Vector3(world_x, 0, world_z) + _cells[Vector3(x, 0, z)] = cell # Dictionary mit Grid-Koordinaten als Key -# Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: - var _time = Time.get_ticks_msec() / 1000.0 - var box_pos = Vector3(0, sin(_time * 4), 0) - var line_begin = Vector3(-1, sin(_time * 4), 0) - var line_end = Vector3(1, cos(_time * 4), 0) - - DebugDraw3D.draw_box(Vector3.ZERO, Quaternion.IDENTITY, Vector3.ONE * 2, Color.CORNFLOWER_BLUE) - DebugDraw3D.draw_arrow(line_begin, line_end, Color(1, 1, 0)) - DebugDraw2D.set_text("Time", _time) - DebugDraw2D.set_text("Frames drawn", Engine.get_frames_drawn()) - DebugDraw2D.set_text("FPS", Engine.get_frames_per_second()) - DebugDraw2D.set_text("delta", delta) + if debugVisu: + _debug_draw_grid() + for cell in _cells.values(): + cell.debug_process() + +func _debug_draw_grid() -> void: + for x in range(grid_size + 1): + var pos_x = x * cell_size + grid_offset.x - (cell_size * 0.5) + DebugDraw3D.draw_line(Vector3(pos_x, 0, grid_offset.z - (cell_size * 0.5)), Vector3(pos_x, 0, grid_offset.z + grid_size * cell_size - (cell_size * 0.5)), line_color) + + for z in range(grid_size + 1): + var pos_z = z * cell_size + grid_offset.z - (cell_size * 0.5) + DebugDraw3D.draw_line(Vector3(grid_offset.x - (cell_size * 0.5), 0, pos_z), Vector3(grid_offset.x + grid_size * cell_size - (cell_size * 0.5), 0, pos_z), line_color) + + +# Gibt die Zelle basierend auf einer Weltposition zurück +func get_cell_from_pos(world_pos: Vector3) -> FlowFieldCell: + var grid_x = int((world_pos.x - grid_offset.x) / cell_size) + var grid_z = int((world_pos.z - grid_offset.z) / cell_size) + var cell_pos = Vector3(grid_x, 0, grid_z) + + return _cells.get(cell_pos, null) + + +# Raycast zur Bestimmung der Zelle unter dem Mauszeiger +func _input(event): + if event is InputEventMouseButton and event.pressed: + var camera = get_viewport().get_camera_3d() + var from = camera.project_ray_origin(get_viewport().get_mouse_position()) + var to = from + camera.project_ray_normal(get_viewport().get_mouse_position()) * 1000 + + var space_state = get_world_3d().direct_space_state + var query = PhysicsRayQueryParameters3D.create(from, to) + var result = space_state.intersect_ray(query) + + if result.has("position"): + var cell = get_cell_from_pos(result["position"]) + if cell: + print("Zelle an", cell.position, ":", cell.flow_direction) + else: + print("Keine Zelle gefunden!") diff --git a/swarm_engine/swarm_engine_debug_level.gd b/swarm_engine/swarm_engine_debug_level.gd new file mode 100644 index 0000000..c6f0751 --- /dev/null +++ b/swarm_engine/swarm_engine_debug_level.gd @@ -0,0 +1,7 @@ +extends Node3D + + +func _process(delta: float) -> void: + DebugDraw2D.set_text("Frames drawn", Engine.get_frames_drawn()) + DebugDraw2D.set_text("FPS", Engine.get_frames_per_second()) + DebugDraw2D.set_text("delta", delta) diff --git a/swarm_engine/swarm_engine_debug_level.tscn b/swarm_engine/swarm_engine_debug_level.tscn index 51176e8..0d768b2 100644 --- a/swarm_engine/swarm_engine_debug_level.tscn +++ b/swarm_engine/swarm_engine_debug_level.tscn @@ -1,10 +1,20 @@ -[gd_scene load_steps=2 format=3 uid="uid://bwo12me8h21q5"] +[gd_scene load_steps=3 format=3 uid="uid://bwo12me8h21q5"] +[ext_resource type="Script" path="res://swarm_engine/swarm_engine_debug_level.gd" id="1_f0ttr"] [ext_resource type="PackedScene" uid="uid://cn2xvs2g7box5" path="res://swarm_engine/flow_field_navigation/flow_field_navigation.tscn" id="1_xwcpn"] [node name="World" type="Node3D"] +script = ExtResource("1_f0ttr") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +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")] +grid_size = 100 +cell_size = 2.0 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="FlowFieldNavigation"] [node name="Camera3D" type="Camera3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 0.774006, 0.633178, 0, -0.633178, 0.774006, 0.503356, 3.49548, 5.34749) +transform = Transform3D(1, 0, 0, 0, 0.331371, 0.943501, 0, -0.943501, 0.331371, 0, 13.203, 5.65752)