start with flow field grid and debug vis
This commit is contained in:
parent
c5814b836a
commit
690940a6c3
11
swarm_engine/flow_field_navigation/flow_field_cell.gd
Normal file
11
swarm_engine/flow_field_navigation/flow_field_cell.gd
Normal 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)
|
||||||
@ -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!")
|
||||||
|
|||||||
7
swarm_engine/swarm_engine_debug_level.gd
Normal file
7
swarm_engine/swarm_engine_debug_level.gd
Normal 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)
|
||||||
@ -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)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user