start with flow field grid and debug vis

This commit is contained in:
Henrik Neumann 2025-02-19 20:07:19 +01:00
parent c5814b836a
commit 690940a6c3
4 changed files with 94 additions and 16 deletions

View File

@ -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)

View File

@ -1,21 +1,71 @@
extends Node3D 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: 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: func _process(delta: float) -> void:
var _time = Time.get_ticks_msec() / 1000.0 if debugVisu:
var box_pos = Vector3(0, sin(_time * 4), 0) _debug_draw_grid()
var line_begin = Vector3(-1, sin(_time * 4), 0) for cell in _cells.values():
var line_end = Vector3(1, cos(_time * 4), 0) cell.debug_process()
DebugDraw3D.draw_box(Vector3.ZERO, Quaternion.IDENTITY, Vector3.ONE * 2, Color.CORNFLOWER_BLUE) func _debug_draw_grid() -> void:
DebugDraw3D.draw_arrow(line_begin, line_end, Color(1, 1, 0)) for x in range(grid_size + 1):
DebugDraw2D.set_text("Time", _time) var pos_x = x * cell_size + grid_offset.x - (cell_size * 0.5)
DebugDraw2D.set_text("Frames drawn", Engine.get_frames_drawn()) 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)
DebugDraw2D.set_text("FPS", Engine.get_frames_per_second())
DebugDraw2D.set_text("delta", delta) 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!")

View File

@ -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)

View File

@ -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"] [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"] [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")] [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="."] [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)