Added debug drawing helper class, navigation planning is only done once instead of every frame.
parent
30ef0a3d3e
commit
5f3600e0e9
|
@ -4,6 +4,7 @@ using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Godot;
|
using Godot;
|
||||||
|
using GodotComponentTest.utils;
|
||||||
using Vector2 = Godot.Vector2;
|
using Vector2 = Godot.Vector2;
|
||||||
using Vector3 = Godot.Vector3;
|
using Vector3 = Godot.Vector3;
|
||||||
using GoDotLog;
|
using GoDotLog;
|
||||||
|
@ -307,4 +308,33 @@ public class NavigationComponent : Node
|
||||||
_currentGoalPositionWorld = currentTransformWorld.origin;
|
_currentGoalPositionWorld = currentTransformWorld.origin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DebugDraw(Spatial parentNode, DebugGeometry debugGeometry)
|
||||||
|
{
|
||||||
|
|
||||||
|
Vector3 yOffset = Vector3.Up * 0.1f;
|
||||||
|
|
||||||
|
debugGeometry.GlobalTransform = Transform.Identity;
|
||||||
|
debugGeometry.Begin(Mesh.PrimitiveType.Lines);
|
||||||
|
debugGeometry.SetColor(Colors.Pink);
|
||||||
|
debugGeometry.AddVertex(parentNode.GlobalTranslation + yOffset);
|
||||||
|
debugGeometry.SetColor(Colors.Pink);
|
||||||
|
debugGeometry.AddVertex(CurrentGoalPositionWorld + yOffset);
|
||||||
|
debugGeometry.SetColor(Colors.Pink);
|
||||||
|
|
||||||
|
debugGeometry.PushTranslated(CurrentGoalPositionWorld);
|
||||||
|
debugGeometry.AddBox(Vector3.One * 1);
|
||||||
|
debugGeometry.PopTransform();
|
||||||
|
|
||||||
|
Vector3 previousPoint = parentNode.GlobalTranslation;
|
||||||
|
foreach (NavigationPoint point in _pathWorldNavigationPoints)
|
||||||
|
{
|
||||||
|
debugGeometry.AddVertex(previousPoint + yOffset);
|
||||||
|
debugGeometry.AddVertex(point.WorldPosition + yOffset);
|
||||||
|
|
||||||
|
previousPoint = point.WorldPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
debugGeometry.End();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -22,6 +22,7 @@ public class TaskQueueComponent : Component
|
||||||
public class NavigationTask : Task
|
public class NavigationTask : Task
|
||||||
{
|
{
|
||||||
public NavigationComponent.NavigationPoint NavigationPoint;
|
public NavigationComponent.NavigationPoint NavigationPoint;
|
||||||
|
public bool PlanningComplete = false;
|
||||||
|
|
||||||
public NavigationTask(NavigationComponent.NavigationPoint navigationPoint)
|
public NavigationTask(NavigationComponent.NavigationPoint navigationPoint)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using GodotComponentTest.components;
|
using GodotComponentTest.components;
|
||||||
using GodotComponentTest.entities;
|
using GodotComponentTest.entities;
|
||||||
|
using GodotComponentTest.utils;
|
||||||
|
|
||||||
public class Player : Entity, IInteractionInterface
|
public class Player : Entity, IInteractionInterface
|
||||||
{
|
{
|
||||||
|
@ -32,6 +33,7 @@ public class Player : Entity, IInteractionInterface
|
||||||
private BoneAttachment _toolAttachement;
|
private BoneAttachment _toolAttachement;
|
||||||
private AnimationPlayer _playerAnimationPlayer;
|
private AnimationPlayer _playerAnimationPlayer;
|
||||||
private AnimationTree _animationTree;
|
private AnimationTree _animationTree;
|
||||||
|
private DebugGeometry _debugGeometry;
|
||||||
private InteractionComponent _interactionComponent;
|
private InteractionComponent _interactionComponent;
|
||||||
public InteractionComponent InteractionComponent
|
public InteractionComponent InteractionComponent
|
||||||
{
|
{
|
||||||
|
@ -81,6 +83,8 @@ public class Player : Entity, IInteractionInterface
|
||||||
{
|
{
|
||||||
GD.PushWarning("No ToolAttachement found!");
|
GD.PushWarning("No ToolAttachement found!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_debugGeometry = (DebugGeometry)FindNode("DebugGeometry");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -100,10 +104,11 @@ public class Player : Entity, IInteractionInterface
|
||||||
if (TaskQueueComponent.Queue.Count > 0)
|
if (TaskQueueComponent.Queue.Count > 0)
|
||||||
{
|
{
|
||||||
var currentTask = TaskQueueComponent.Queue.Peek();
|
var currentTask = TaskQueueComponent.Queue.Peek();
|
||||||
if (currentTask is TaskQueueComponent.NavigationTask)
|
TaskQueueComponent.NavigationTask navigationTask = currentTask as TaskQueueComponent.NavigationTask;
|
||||||
|
if (navigationTask != null && navigationTask.PlanningComplete == false)
|
||||||
{
|
{
|
||||||
TaskQueueComponent.NavigationTask navigationTask = (TaskQueueComponent.NavigationTask)currentTask;
|
|
||||||
_navigationComponent.PlanGridPath(GlobalTransform, navigationTask.NavigationPoint);
|
_navigationComponent.PlanGridPath(GlobalTransform, navigationTask.NavigationPoint);
|
||||||
|
navigationTask.PlanningComplete = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,6 +133,26 @@ public class Player : Entity, IInteractionInterface
|
||||||
bar.SetTarget(GlobalTransform.origin);
|
bar.SetTarget(GlobalTransform.origin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UpdateDebugGeometry();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateDebugGeometry()
|
||||||
|
{
|
||||||
|
if (_debugGeometry == null || _debugGeometry.Visible == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_debugGeometry.Clear();
|
||||||
|
_debugGeometry.GlobalTransform = Transform.Identity;
|
||||||
|
|
||||||
|
if (_navigationComponent != null)
|
||||||
|
{
|
||||||
|
_navigationComponent.DebugDraw(this, _debugGeometry);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnItemAttractorBodyEntered(Node node)
|
public void OnItemAttractorBodyEntered(Node node)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=22 format=2]
|
[gd_scene load_steps=23 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://scenes/StreamContainer.cs" type="Script" id=1]
|
[ext_resource path="res://scenes/StreamContainer.cs" type="Script" id=1]
|
||||||
[ext_resource path="res://components/NavigationComponent.cs" type="Script" id=2]
|
[ext_resource path="res://components/NavigationComponent.cs" type="Script" id=2]
|
||||||
|
@ -12,6 +12,7 @@
|
||||||
[ext_resource path="res://scenes/DebugCamera.gd" type="Script" id=10]
|
[ext_resource path="res://scenes/DebugCamera.gd" type="Script" id=10]
|
||||||
[ext_resource path="res://assets/Characters/Pirate.tscn" type="PackedScene" id=11]
|
[ext_resource path="res://assets/Characters/Pirate.tscn" type="PackedScene" id=11]
|
||||||
[ext_resource path="res://ui/WorldGeneratorUI.gd" type="Script" id=12]
|
[ext_resource path="res://ui/WorldGeneratorUI.gd" type="Script" id=12]
|
||||||
|
[ext_resource path="res://utils/DebugGeometry.cs" type="Script" id=13]
|
||||||
[ext_resource path="res://entities/Axe.tscn" type="PackedScene" id=14]
|
[ext_resource path="res://entities/Axe.tscn" type="PackedScene" id=14]
|
||||||
[ext_resource path="res://systems/InteractionSystem.cs" type="Script" id=15]
|
[ext_resource path="res://systems/InteractionSystem.cs" type="Script" id=15]
|
||||||
|
|
||||||
|
@ -243,8 +244,8 @@ mouse_filter = 2
|
||||||
[node name="WorldGeneratorContainer" type="VBoxContainer" parent="Generator Container"]
|
[node name="WorldGeneratorContainer" type="VBoxContainer" parent="Generator Container"]
|
||||||
margin_left = 10.0
|
margin_left = 10.0
|
||||||
margin_top = 10.0
|
margin_top = 10.0
|
||||||
margin_right = 110.0
|
margin_right = 145.0
|
||||||
margin_bottom = 258.0
|
margin_bottom = 94.0
|
||||||
script = ExtResource( 12 )
|
script = ExtResource( 12 )
|
||||||
|
|
||||||
[node name="HBoxContainer" type="HBoxContainer" parent="Generator Container/WorldGeneratorContainer"]
|
[node name="HBoxContainer" type="HBoxContainer" parent="Generator Container/WorldGeneratorContainer"]
|
||||||
|
@ -268,7 +269,7 @@ text = "4"
|
||||||
|
|
||||||
[node name="WorldGenerateButton" type="Button" parent="Generator Container/WorldGeneratorContainer"]
|
[node name="WorldGenerateButton" type="Button" parent="Generator Container/WorldGeneratorContainer"]
|
||||||
margin_top = 20.0
|
margin_top = 20.0
|
||||||
margin_right = 100.0
|
margin_right = 135.0
|
||||||
margin_bottom = 40.0
|
margin_bottom = 40.0
|
||||||
text = "Generate"
|
text = "Generate"
|
||||||
|
|
||||||
|
@ -364,6 +365,11 @@ shape = SubResource( 23 )
|
||||||
|
|
||||||
[node name="Geometry" parent="Player" instance=ExtResource( 11 )]
|
[node name="Geometry" parent="Player" instance=ExtResource( 11 )]
|
||||||
|
|
||||||
|
[node name="DebugGeometry" type="Spatial" parent="Player"]
|
||||||
|
script = ExtResource( 13 )
|
||||||
|
|
||||||
|
[node name="ImmediateGeometry" type="ImmediateGeometry" parent="Player/DebugGeometry"]
|
||||||
|
|
||||||
[node name="Entities" type="Spatial" parent="."]
|
[node name="Entities" type="Spatial" parent="."]
|
||||||
|
|
||||||
[node name="Chest" parent="Entities" instance=ExtResource( 7 )]
|
[node name="Chest" parent="Entities" instance=ExtResource( 7 )]
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace GodotComponentTest.utils;
|
||||||
|
|
||||||
|
public class DebugGeometry : Spatial
|
||||||
|
{
|
||||||
|
private ImmediateGeometry _immediateGeometry;
|
||||||
|
|
||||||
|
private List<Transform> _transformStack;
|
||||||
|
private Transform _currentTransform = Transform.Identity;
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
base._Ready();
|
||||||
|
|
||||||
|
_immediateGeometry = (ImmediateGeometry)FindNode("ImmediateGeometry");
|
||||||
|
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
_immediateGeometry.Clear();
|
||||||
|
_transformStack = new List<Transform>();
|
||||||
|
_transformStack.Add(Transform.Identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PushTransform(Transform transform)
|
||||||
|
{
|
||||||
|
_transformStack.Add(transform);
|
||||||
|
_currentTransform = transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PushTranslated(Vector3 offset)
|
||||||
|
{
|
||||||
|
PushTransform(_currentTransform.Translated(offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PopTransform()
|
||||||
|
{
|
||||||
|
_transformStack.RemoveAt(_transformStack.Count - 1);
|
||||||
|
_currentTransform = PeekTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Transform PeekTransform()
|
||||||
|
{
|
||||||
|
return _transformStack[_transformStack.Count - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Begin(Mesh.PrimitiveType primitive, Texture texture = null)
|
||||||
|
{
|
||||||
|
_immediateGeometry.Begin(primitive, texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void End()
|
||||||
|
{
|
||||||
|
_immediateGeometry.End();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddVertex(Vector3 vertex)
|
||||||
|
{
|
||||||
|
_immediateGeometry.AddVertex(_currentTransform.Xform(vertex));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetColor(Color color)
|
||||||
|
{
|
||||||
|
_immediateGeometry.SetColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddBox(Vector3 extents)
|
||||||
|
{
|
||||||
|
Transform currentTransform = PeekTransform();
|
||||||
|
// bottom square
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * -0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * -0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * -0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * -0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * -0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * -0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * -0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * -0.5f, extents.z * -0.5f));
|
||||||
|
|
||||||
|
// top square
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * 0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * 0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * 0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * 0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * 0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * 0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * 0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * 0.5f, extents.z * -0.5f));
|
||||||
|
|
||||||
|
// side
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * 0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * -0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * 0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * -0.5f, extents.y * -0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * 0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * -0.5f, extents.z * 0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * 0.5f, extents.z * -0.5f));
|
||||||
|
AddVertex(new Vector3(extents.x * 0.5f, extents.y * -0.5f, extents.z * -0.5f));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue