mirror of
https://github.com/Ed94/Cog.git
synced 2026-08-05 15:18:47 +00:00
CogEngine: move CollisionTester logic inside an actor
This commit is contained in:
@@ -1,17 +1,12 @@
|
|||||||
#include "CogDebugGizmo.h"
|
#include "CogDebugGizmo.h"
|
||||||
|
|
||||||
#include "CogDebug.h"
|
#include "CogDebug.h"
|
||||||
#include "CogDebugDraw.h"
|
|
||||||
#include "CogDebugDrawHelper.h"
|
#include "CogDebugDrawHelper.h"
|
||||||
#include "CogDebugDrawImGui.h"
|
|
||||||
#include "CogImGuiHelper.h"
|
#include "CogImGuiHelper.h"
|
||||||
#include "CogWindowWidgets.h"
|
|
||||||
#include "CogWindowWidgets.h"
|
|
||||||
#include "Components/PrimitiveComponent.h"
|
#include "Components/PrimitiveComponent.h"
|
||||||
#include "Components/SceneComponent.h"
|
#include "Components/SceneComponent.h"
|
||||||
#include "GameFramework/PlayerController.h"
|
#include "GameFramework/PlayerController.h"
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#include "../../ThirdParty/ImGui/imgui.h"
|
|
||||||
#include "Kismet/GameplayStatics.h"
|
#include "Kismet/GameplayStatics.h"
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -163,7 +158,7 @@ void DrawGizmoText(const ImVec2& Position, ImU32 Color, const char* Text)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
bool AddTransformComponent(const char* Label, double* Value, double Reset)
|
bool RenderComponent(const char* Label, double* Value, double Reset)
|
||||||
{
|
{
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::PushItemWidth(-1);
|
ImGui::PushItemWidth(-1);
|
||||||
@@ -178,7 +173,7 @@ bool AddTransformComponent(const char* Label, double* Value, double Reset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void AddTransformSnap(bool* SnapEnable, float* Snap)
|
void RenderSnap(bool* SnapEnable, float* Snap)
|
||||||
{
|
{
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::PushItemWidth(-1);
|
ImGui::PushItemWidth(-1);
|
||||||
@@ -192,14 +187,14 @@ void AddTransformSnap(bool* SnapEnable, float* Snap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerController, FTransform& InOutTransform, ECogDebug_GizmoFlags Flags)
|
bool FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerController, FTransform& InOutTransform, ECogDebug_GizmoFlags Flags)
|
||||||
{
|
{
|
||||||
UWorld* World = InPlayerController.GetWorld();
|
UWorld* World = InPlayerController.GetWorld();
|
||||||
|
|
||||||
const ImGuiViewport* Viewport = ImGui::GetMainViewport();
|
const ImGuiViewport* Viewport = ImGui::GetMainViewport();
|
||||||
if (Viewport == nullptr)
|
if (Viewport == nullptr)
|
||||||
{
|
{
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const FVector GizmoCenter = InOutTransform.GetTranslation();
|
const FVector GizmoCenter = InOutTransform.GetTranslation();
|
||||||
@@ -210,11 +205,14 @@ void FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerCont
|
|||||||
if (DraggedElementType != ECogDebug_GizmoElementType::MAX)
|
if (DraggedElementType != ECogDebug_GizmoElementType::MAX)
|
||||||
{
|
{
|
||||||
InOutTransform = InitialTransform;
|
InOutTransform = InitialTransform;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Result = false;
|
||||||
|
|
||||||
const ImGuiIO& IO = ImGui::GetIO();
|
const ImGuiIO& IO = ImGui::GetIO();
|
||||||
FCogDebugSettings& Settings = FCogDebug::Settings;
|
FCogDebugSettings& Settings = FCogDebug::Settings;
|
||||||
|
|
||||||
@@ -420,9 +418,10 @@ void FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerCont
|
|||||||
{
|
{
|
||||||
const FVector CursorOnLine = GetMouseCursorOnLine(InPlayerController, InitialTransform.GetTranslation(), DraggedElement.Direction, MousePos - CursorOffset);
|
const FVector CursorOnLine = GetMouseCursorOnLine(InPlayerController, InitialTransform.GetTranslation(), DraggedElement.Direction, MousePos - CursorOffset);
|
||||||
const float Delta = FVector::DotProduct(DraggedElement.Direction, CursorOnLine - InitialTransform.GetTranslation());
|
const float Delta = FVector::DotProduct(DraggedElement.Direction, CursorOnLine - InitialTransform.GetTranslation());
|
||||||
const float SnappedDelta = FMath::GridSnap(Delta, Settings.GizmoTranslationSnapEnable ? Settings.GizmoTranslationSnap : 0.0f);
|
const float SnappedDelta = FMath::GridSnap(Delta, Settings.GizmoTranslationSnapEnable ? Settings.GizmoTranslationSnapValue : 0.0f);
|
||||||
const FVector NewLocation = InitialTransform.GetTranslation() + DraggedElement.Direction * SnappedDelta;
|
const FVector NewLocation = InitialTransform.GetTranslation() + DraggedElement.Direction * SnappedDelta;
|
||||||
InOutTransform.SetLocation(NewLocation);
|
InOutTransform.SetLocation(NewLocation);
|
||||||
|
Result = true;
|
||||||
|
|
||||||
const FString Text = FString::Printf(TEXT("%0.1f"), SnappedDelta);
|
const FString Text = FString::Printf(TEXT("%0.1f"), SnappedDelta);
|
||||||
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
||||||
@@ -446,12 +445,13 @@ void FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerCont
|
|||||||
const FVector V = DraggedElement.Rotation.GetAxisY();
|
const FVector V = DraggedElement.Rotation.GetAxisY();
|
||||||
const float DeltaU = FVector::DotProduct(U, CursorOnPlane - InitialTransform.GetTranslation());
|
const float DeltaU = FVector::DotProduct(U, CursorOnPlane - InitialTransform.GetTranslation());
|
||||||
const float DeltaV = FVector::DotProduct(V, CursorOnPlane - InitialTransform.GetTranslation());
|
const float DeltaV = FVector::DotProduct(V, CursorOnPlane - InitialTransform.GetTranslation());
|
||||||
const float SnappedDeltaU = FMath::GridSnap(DeltaU, Settings.GizmoTranslationSnapEnable ? Settings.GizmoTranslationSnap : 0.0f);
|
const float SnappedDeltaU = FMath::GridSnap(DeltaU, Settings.GizmoTranslationSnapEnable ? Settings.GizmoTranslationSnapValue : 0.0f);
|
||||||
const float SnappedDeltaV = FMath::GridSnap(DeltaV, Settings.GizmoTranslationSnapEnable ? Settings.GizmoTranslationSnap : 0.0f);
|
const float SnappedDeltaV = FMath::GridSnap(DeltaV, Settings.GizmoTranslationSnapEnable ? Settings.GizmoTranslationSnapValue : 0.0f);
|
||||||
const FVector WorldDeltaU = U * SnappedDeltaU;
|
const FVector WorldDeltaU = U * SnappedDeltaU;
|
||||||
const FVector WorldDeltaV = V * SnappedDeltaV;
|
const FVector WorldDeltaV = V * SnappedDeltaV;
|
||||||
const FVector NewLocation = InitialTransform.GetTranslation() + WorldDeltaU + WorldDeltaV;
|
const FVector NewLocation = InitialTransform.GetTranslation() + WorldDeltaU + WorldDeltaV;
|
||||||
InOutTransform.SetLocation(NewLocation);
|
InOutTransform.SetLocation(NewLocation);
|
||||||
|
Result = true;
|
||||||
|
|
||||||
const FString Text = FString::Printf(TEXT("%0.1f %0.1f"), SnappedDeltaU, SnappedDeltaV);
|
const FString Text = FString::Printf(TEXT("%0.1f %0.1f"), SnappedDeltaU, SnappedDeltaV);
|
||||||
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
||||||
@@ -468,10 +468,11 @@ void FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerCont
|
|||||||
const FVector2D DragDelta = FCogImguiHelper::ToFVector2D(ImGui::GetMouseDragDelta(ImGuiMouseButton_Left));
|
const FVector2D DragDelta = FCogImguiHelper::ToFVector2D(ImGui::GetMouseDragDelta(ImGuiMouseButton_Left));
|
||||||
const float DragAmount = DragDelta.X - DragDelta.Y;
|
const float DragAmount = DragDelta.X - DragDelta.Y;
|
||||||
const float NormalizedAngle = FRotator::NormalizeAxis(DragAmount * Settings.GizmoRotationSpeed);
|
const float NormalizedAngle = FRotator::NormalizeAxis(DragAmount * Settings.GizmoRotationSpeed);
|
||||||
const float SnappedAngle = FMath::GridSnap(NormalizedAngle, Settings.GizmoRotationSnapEnable ? Settings.GizmoRotationSnap : 0.0f);
|
const float SnappedAngle = FMath::GridSnap(NormalizedAngle, Settings.GizmoRotationSnapEnable ? Settings.GizmoRotationSnapValue : 0.0f);
|
||||||
const FQuat RotDelta(-DraggedElement.Axis, FMath::DegreesToRadians(SnappedAngle));
|
const FQuat RotDelta(-DraggedElement.Axis, FMath::DegreesToRadians(SnappedAngle));
|
||||||
const FQuat NewRot = (Settings.GizmoUseLocalSpace) ? InitialTransform.GetRotation() * RotDelta : RotDelta * InitialTransform.GetRotation();
|
const FQuat NewRot = (Settings.GizmoUseLocalSpace) ? InitialTransform.GetRotation() * RotDelta : RotDelta * InitialTransform.GetRotation();
|
||||||
InOutTransform.SetRotation(NewRot);
|
InOutTransform.SetRotation(NewRot);
|
||||||
|
Result = true;
|
||||||
|
|
||||||
const FString Text = FString::Printf(TEXT("%0.1f"), SnappedAngle);
|
const FString Text = FString::Printf(TEXT("%0.1f"), SnappedAngle);
|
||||||
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
||||||
@@ -484,9 +485,10 @@ void FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerCont
|
|||||||
const FVector Point = GetMouseCursorOnLine(InPlayerController, GizmoCenter, DraggedElement.Direction, MousePos - CursorOffset);
|
const FVector Point = GetMouseCursorOnLine(InPlayerController, GizmoCenter, DraggedElement.Direction, MousePos - CursorOffset);
|
||||||
const float Sign = FMath::Sign(FVector::DotProduct(DraggedElement.Direction, Point - GizmoCenter));
|
const float Sign = FMath::Sign(FVector::DotProduct(DraggedElement.Direction, Point - GizmoCenter));
|
||||||
const float Delta = (Point - GizmoCenter).Length() * Sign;
|
const float Delta = (Point - GizmoCenter).Length() * Sign;
|
||||||
const float SnappedDelta = FMath::GridSnap(Delta, Settings.GizmoScaleSnapEnable ? Settings.GizmoScaleSnap : 0.0f);
|
const float SnappedDelta = FMath::GridSnap(Delta, Settings.GizmoScaleSnapEnable ? Settings.GizmoScaleSnapValue : 0.0f);
|
||||||
const FVector NewScale = VectorMax(InitialTransform.GetScale3D() + (DraggedElement.Axis * SnappedDelta * Settings.GizmoScaleSpeed), Settings.GizmoScaleMin);
|
const FVector NewScale = VectorMax(InitialTransform.GetScale3D() + (DraggedElement.Axis * SnappedDelta * Settings.GizmoScaleSpeed), Settings.GizmoScaleMin);
|
||||||
InOutTransform.SetScale3D(NewScale);
|
InOutTransform.SetScale3D(NewScale);
|
||||||
|
Result = true;
|
||||||
|
|
||||||
const FString Text = FString::Printf(TEXT("%0.1f"), SnappedDelta);
|
const FString Text = FString::Printf(TEXT("%0.1f"), SnappedDelta);
|
||||||
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
||||||
@@ -498,9 +500,10 @@ void FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerCont
|
|||||||
{
|
{
|
||||||
const FVector2D DragDelta = FCogImguiHelper::ToFVector2D(ImGui::GetMouseDragDelta(ImGuiMouseButton_Left));
|
const FVector2D DragDelta = FCogImguiHelper::ToFVector2D(ImGui::GetMouseDragDelta(ImGuiMouseButton_Left));
|
||||||
const float Delta = DragDelta.X - DragDelta.Y;
|
const float Delta = DragDelta.X - DragDelta.Y;
|
||||||
const float SnappedDelta = FMath::GridSnap(Delta, Settings.GizmoScaleSnapEnable ? Settings.GizmoScaleSnap : 0.0f);
|
const float SnappedDelta = FMath::GridSnap(Delta, Settings.GizmoScaleSnapEnable ? Settings.GizmoScaleSnapValue : 0.0f);
|
||||||
const FVector NewScale = VectorMax(InitialTransform.GetScale3D() + (DraggedElement.Axis * SnappedDelta * Settings.GizmoScaleSpeed), Settings.GizmoScaleMin);
|
const FVector NewScale = VectorMax(InitialTransform.GetScale3D() + (DraggedElement.Axis * SnappedDelta * Settings.GizmoScaleSpeed), Settings.GizmoScaleMin);
|
||||||
InOutTransform.SetScale3D(NewScale);
|
InOutTransform.SetScale3D(NewScale);
|
||||||
|
Result = true;
|
||||||
|
|
||||||
const FString Text = FString::Printf(TEXT("%0.1f"), SnappedDelta);
|
const FString Text = FString::Printf(TEXT("%0.1f"), SnappedDelta);
|
||||||
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
DrawGizmoText(FCogImguiHelper::ToImVec2(Center2D), FCogImguiHelper::ToImU32(Settings.GizmoTextColor), StringCast<ANSICHAR>(*Text).Get());
|
||||||
@@ -522,69 +525,70 @@ void FCogDebug_Gizmo::Draw(const char* Id, const APlayerController& InPlayerCont
|
|||||||
CursorOffset = MousePos - Center2D;
|
CursorOffset = MousePos - Center2D;
|
||||||
InitialTransform = InOutTransform;
|
InitialTransform = InOutTransform;
|
||||||
}
|
}
|
||||||
else if (ImGui::IsMouseClicked(ImGuiMouseButton_Right))
|
//else if (ImGui::IsMouseClicked(ImGuiMouseButton_Right))
|
||||||
{
|
//{
|
||||||
ImGui::OpenPopup(Id);
|
// ImGui::OpenPopup(Id);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::BeginPopup(Id))
|
//if (ImGui::BeginPopup(Id))
|
||||||
{
|
//{
|
||||||
FVector Translation = InOutTransform.GetTranslation();
|
// FVector Translation = InOutTransform.GetTranslation();
|
||||||
FRotator Rotation = InOutTransform.GetRotation().Rotator();
|
// FRotator Rotation = InOutTransform.GetRotation().Rotator();
|
||||||
FVector Scale = InOutTransform.GetScale3D();
|
// FVector Scale = InOutTransform.GetScale3D();
|
||||||
|
|
||||||
ImGui::Checkbox("Local Space", &Settings.GizmoUseLocalSpace);
|
// ImGui::Checkbox("Local Space", &Settings.GizmoUseLocalSpace);
|
||||||
|
|
||||||
ImGui::Separator();
|
// ImGui::Separator();
|
||||||
|
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(1.0f, 1.0f));
|
// ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(1.0f, 1.0f));
|
||||||
|
|
||||||
if (ImGui::BeginTable("Pools", 6, ImGuiTableFlags_SizingFixedFit))
|
// if (ImGui::BeginTable("Pools", 6, ImGuiTableFlags_SizingFixedFit))
|
||||||
{
|
// {
|
||||||
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 5);
|
// ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 5);
|
||||||
ImGui::TableSetupColumn("X", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 4);
|
// ImGui::TableSetupColumn("X", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 4);
|
||||||
ImGui::TableSetupColumn("Y", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 4);
|
// ImGui::TableSetupColumn("Y", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 4);
|
||||||
ImGui::TableSetupColumn("Z", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 4);
|
// ImGui::TableSetupColumn("Z", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 4);
|
||||||
ImGui::TableSetupColumn("SnapEnable", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 4);
|
// ImGui::TableSetupColumn("SnapEnable", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 4);
|
||||||
ImGui::TableSetupColumn("Snap", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 3);
|
// ImGui::TableSetupColumn("Snap", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 3);
|
||||||
|
|
||||||
ImGui::PushID("Location");
|
// ImGui::PushID("Location");
|
||||||
ImGui::TableNextRow();
|
// ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
// ImGui::TableNextColumn();
|
||||||
ImGui::Text("Location");
|
// ImGui::Text("Location");
|
||||||
if (AddTransformComponent("##X", &Translation.X, 0.0)) { InOutTransform.SetTranslation(Translation); }
|
// if (RenderComponent("##X", &Translation.X, 0.0)) { InOutTransform.SetTranslation(Translation); }
|
||||||
if (AddTransformComponent("##Y", &Translation.Y, 0.0)) { InOutTransform.SetTranslation(Translation); }
|
// if (RenderComponent("##Y", &Translation.Y, 0.0)) { InOutTransform.SetTranslation(Translation); }
|
||||||
if (AddTransformComponent("##Z", &Translation.Z, 0.0)) { InOutTransform.SetTranslation(Translation); }
|
// if (RenderComponent("##Z", &Translation.Z, 0.0)) { InOutTransform.SetTranslation(Translation); }
|
||||||
AddTransformSnap(&Settings.GizmoTranslationSnapEnable, &Settings.GizmoTranslationSnap);
|
// RenderSnap(&Settings.GizmoTranslationSnapEnable, &Settings.GizmoTranslationSnapValue);
|
||||||
ImGui::PopID();
|
// ImGui::PopID();
|
||||||
|
|
||||||
ImGui::PushID("Rotation");
|
// ImGui::PushID("Rotation");
|
||||||
ImGui::TableNextRow();
|
// ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
// ImGui::TableNextColumn();
|
||||||
ImGui::Text("Rotation");
|
// ImGui::Text("Rotation");
|
||||||
if (AddTransformComponent("##X", &Rotation.Yaw, 0.0)) { InOutTransform.SetRotation(Rotation.Quaternion()); }
|
// if (RenderComponent("##X", &Rotation.Yaw, 0.0)) { InOutTransform.SetRotation(Rotation.Quaternion()); }
|
||||||
if (AddTransformComponent("##Y", &Rotation.Pitch, 0.0)) { InOutTransform.SetRotation(Rotation.Quaternion()); }
|
// if (RenderComponent("##Y", &Rotation.Pitch, 0.0)) { InOutTransform.SetRotation(Rotation.Quaternion()); }
|
||||||
if (AddTransformComponent("##Z", &Rotation.Roll, 0.0)) { InOutTransform.SetRotation(Rotation.Quaternion()); }
|
// if (RenderComponent("##Z", &Rotation.Roll, 0.0)) { InOutTransform.SetRotation(Rotation.Quaternion()); }
|
||||||
AddTransformSnap(&Settings.GizmoRotationSnapEnable, &Settings.GizmoRotationSnap);
|
// RenderSnap(&Settings.GizmoRotationSnapEnable, &Settings.GizmoRotationSnapValue);
|
||||||
ImGui::PopID();
|
// ImGui::PopID();
|
||||||
|
|
||||||
ImGui::PushID("Scale");
|
// ImGui::PushID("Scale");
|
||||||
ImGui::TableNextRow();
|
// ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
// ImGui::TableNextColumn();
|
||||||
ImGui::Text("Scale");
|
// ImGui::Text("Scale");
|
||||||
if (AddTransformComponent("##X", &Scale.X, 0.0)) { InOutTransform.SetScale3D(Scale); }
|
// if (RenderComponent("##X", &Scale.X, 0.0)) { InOutTransform.SetScale3D(Scale); }
|
||||||
if (AddTransformComponent("##Y", &Scale.Y, 0.0)) { InOutTransform.SetScale3D(Scale); }
|
// if (RenderComponent("##Y", &Scale.Y, 0.0)) { InOutTransform.SetScale3D(Scale); }
|
||||||
if (AddTransformComponent("##Z", &Scale.Z, 0.0)) { InOutTransform.SetScale3D(Scale); }
|
// if (RenderComponent("##Z", &Scale.Z, 0.0)) { InOutTransform.SetScale3D(Scale); }
|
||||||
AddTransformSnap(&Settings.GizmoScaleSnapEnable, &Settings.GizmoScaleSnap);
|
// RenderSnap(&Settings.GizmoScaleSnapEnable, &Settings.GizmoScaleSnapValue);
|
||||||
ImGui::PopID();
|
// ImGui::PopID();
|
||||||
|
|
||||||
ImGui::EndTable();
|
// ImGui::EndTable();
|
||||||
}
|
// }
|
||||||
|
|
||||||
ImGui::PopStyleVar();
|
// ImGui::PopStyleVar();
|
||||||
|
|
||||||
ImGui::EndPopup();
|
// ImGui::EndPopup();
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
return Result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ struct FCogDebugSettings
|
|||||||
bool GizmoTranslationSnapEnable = true;
|
bool GizmoTranslationSnapEnable = true;
|
||||||
|
|
||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
float GizmoTranslationSnap = 10.0f;
|
float GizmoTranslationSnapValue = 10.0f;
|
||||||
|
|
||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
float GizmoTranslationPlaneOffset = 25.0f;
|
float GizmoTranslationPlaneOffset = 25.0f;
|
||||||
@@ -101,7 +101,7 @@ struct FCogDebugSettings
|
|||||||
bool GizmoRotationSnapEnable = true;
|
bool GizmoRotationSnapEnable = true;
|
||||||
|
|
||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
float GizmoRotationSnap = 10.0f;
|
float GizmoRotationSnapValue = 10.0f;
|
||||||
|
|
||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
float GizmoRotationSpeed = 0.01f;
|
float GizmoRotationSpeed = 0.01f;
|
||||||
@@ -116,7 +116,7 @@ struct FCogDebugSettings
|
|||||||
bool GizmoScaleSnapEnable = true;
|
bool GizmoScaleSnapEnable = true;
|
||||||
|
|
||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
float GizmoScaleSnap = 1.0f;
|
float GizmoScaleSnapValue = 1.0f;
|
||||||
|
|
||||||
UPROPERTY(Config)
|
UPROPERTY(Config)
|
||||||
float GizmoScaleBoxOffset = 50.0f;
|
float GizmoScaleBoxOffset = 50.0f;
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ struct FCogDebug_GizmoElement
|
|||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
struct COGDEBUG_API FCogDebug_Gizmo
|
struct COGDEBUG_API FCogDebug_Gizmo
|
||||||
{
|
{
|
||||||
void Draw(const char* Id, const APlayerController& InPlayerController, FTransform& InOutTransform, ECogDebug_GizmoFlags Flags = ECogDebug_GizmoFlags::None);
|
bool Draw(const char* Id, const APlayerController& InPlayerController, FTransform& InOutTransform, ECogDebug_GizmoFlags Flags = ECogDebug_GizmoFlags::None);
|
||||||
|
|
||||||
ECogDebug_GizmoElementType DraggedElementType = ECogDebug_GizmoElementType::MAX;
|
ECogDebug_GizmoElementType DraggedElementType = ECogDebug_GizmoElementType::MAX;
|
||||||
FVector2D CursorOffset = FVector2D::ZeroVector;
|
FVector2D CursorOffset = FVector2D::ZeroVector;
|
||||||
|
|||||||
@@ -23,15 +23,15 @@ public class CogEngine : ModuleRules
|
|||||||
PublicDependencyModuleNames.AddRange(
|
PublicDependencyModuleNames.AddRange(
|
||||||
new string[]
|
new string[]
|
||||||
{
|
{
|
||||||
|
"CogDebug",
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
PrivateDependencyModuleNames.AddRange(
|
PrivateDependencyModuleNames.AddRange(
|
||||||
new string[]
|
new string[]
|
||||||
{
|
{
|
||||||
"CogCommon",
|
"CogCommon",
|
||||||
"CogDebug",
|
|
||||||
"CogImgui",
|
"CogImgui",
|
||||||
"CogWindow",
|
"CogWindow",
|
||||||
"Core",
|
"Core",
|
||||||
|
|||||||
@@ -0,0 +1,509 @@
|
|||||||
|
#include "CogEngineCollisionTester.h"
|
||||||
|
|
||||||
|
#include "CogDebugDrawHelper.h"
|
||||||
|
#include "CogDebug.h"
|
||||||
|
#include "Components/PrimitiveComponent.h"
|
||||||
|
#include "Components/SceneComponent.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
ACogEngineCollisionTester::ACogEngineCollisionTester(const FObjectInitializer& ObjectInitializer)
|
||||||
|
: Super(ObjectInitializer)
|
||||||
|
{
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
PrimaryActorTick.bStartWithTickEnabled = true;
|
||||||
|
|
||||||
|
StartComponent = CreateDefaultSubobject<USceneComponent>(TEXT("Start"));
|
||||||
|
RootComponent = StartComponent;
|
||||||
|
|
||||||
|
EndComponent = CreateDefaultSubobject<USceneComponent>(TEXT("End"));
|
||||||
|
EndComponent->SetupAttachment(RootComponent);
|
||||||
|
EndComponent->SetRelativeLocation(FVector(1000, 0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool ACogEngineCollisionTester::ShouldTickIfViewportsOnly() const
|
||||||
|
{
|
||||||
|
if (GetWorld() != nullptr && GetWorld()->WorldType == EWorldType::Editor && TickInEditor)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void ACogEngineCollisionTester::Tick(float DeltaSeconds)
|
||||||
|
{
|
||||||
|
Query();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void ACogEngineCollisionTester::Query()
|
||||||
|
{
|
||||||
|
AlreadyDrawnActors.Empty();
|
||||||
|
AlreadyDrawnComponents.Empty();
|
||||||
|
|
||||||
|
FVector QueryStart = StartComponent->GetComponentLocation();
|
||||||
|
FVector QueryEnd = EndComponent->GetComponentLocation();
|
||||||
|
FQuat QueryRotation = StartComponent->GetComponentQuat();
|
||||||
|
TArray<FHitResult> Hits;
|
||||||
|
TArray<FOverlapResult> Overlaps;
|
||||||
|
bool HasHits = false;
|
||||||
|
|
||||||
|
static const FName TraceTag(TEXT("FCogWindow_Collision"));
|
||||||
|
const FCollisionQueryParams QueryParams(TraceTag, SCENE_QUERY_STAT_ONLY(CogHitDetection), TraceComplex);
|
||||||
|
|
||||||
|
const FCollisionResponseTemplate* Profile = UCollisionProfile::Get()->GetProfileByIndex(ProfileIndex);
|
||||||
|
const FName ProfileName = Profile != nullptr ? Profile->Name : FName();
|
||||||
|
|
||||||
|
FCollisionShape QueryShape;
|
||||||
|
|
||||||
|
const bool bIsUsingShape = Type == ECogEngine_CollisionQueryType::Overlap || Type == ECogEngine_CollisionQueryType::Sweep;
|
||||||
|
if (bIsUsingShape)
|
||||||
|
{
|
||||||
|
switch (Shape)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryShape::Sphere: QueryShape.SetSphere(ShapeExtent.X); break;
|
||||||
|
case ECogEngine_CollisionQueryShape::Capsule: QueryShape.SetCapsule(ShapeExtent.X, ShapeExtent.Z); break;
|
||||||
|
case ECogEngine_CollisionQueryShape::Box: QueryShape.SetBox(FVector3f(ShapeExtent)); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Type)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryType::Overlap:
|
||||||
|
{
|
||||||
|
switch (By)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryBy::Channel:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->OverlapMultiByChannel(Overlaps, QueryStart, QueryRotation, Channel, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECogEngine_CollisionQueryBy::ObjectType:
|
||||||
|
{
|
||||||
|
FCollisionObjectQueryParams QueryObjectParams;
|
||||||
|
QueryObjectParams.ObjectTypesToQuery = ObjectTypesToQuery;
|
||||||
|
HasHits = GetWorld()->OverlapMultiByObjectType(Overlaps, QueryStart, QueryRotation, QueryObjectParams, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECogEngine_CollisionQueryBy::Profile:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->OverlapMultiByProfile(Overlaps, QueryStart, QueryRotation, ProfileName, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECogEngine_CollisionQueryType::LineTrace:
|
||||||
|
{
|
||||||
|
switch (By)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryBy::Channel:
|
||||||
|
{
|
||||||
|
switch (Mode)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryMode::Single:
|
||||||
|
{
|
||||||
|
FHitResult Hit;
|
||||||
|
HasHits = GetWorld()->LineTraceSingleByChannel(Hit, QueryStart, QueryEnd, Channel, QueryParams);
|
||||||
|
if (HasHits)
|
||||||
|
{
|
||||||
|
Hits.Add(Hit);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Multi:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->LineTraceMultiByChannel(Hits, QueryStart, QueryEnd, Channel, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Test:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->LineTraceTestByChannel(QueryStart, QueryEnd, Channel, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECogEngine_CollisionQueryBy::ObjectType:
|
||||||
|
{
|
||||||
|
FCollisionObjectQueryParams QueryObjectParams;
|
||||||
|
QueryObjectParams.ObjectTypesToQuery = ObjectTypesToQuery;
|
||||||
|
|
||||||
|
switch (Mode)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryMode::Single:
|
||||||
|
{
|
||||||
|
FHitResult Hit;
|
||||||
|
HasHits = GetWorld()->LineTraceSingleByObjectType(Hit, QueryStart, QueryEnd, QueryObjectParams, QueryParams);
|
||||||
|
if (HasHits)
|
||||||
|
{
|
||||||
|
Hits.Add(Hit);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Multi:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->LineTraceMultiByObjectType(Hits, QueryStart, QueryEnd, QueryObjectParams, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Test:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->LineTraceTestByObjectType(QueryStart, QueryEnd, QueryObjectParams, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECogEngine_CollisionQueryBy::Profile:
|
||||||
|
{
|
||||||
|
switch (Mode)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryMode::Single:
|
||||||
|
{
|
||||||
|
FHitResult Hit;
|
||||||
|
HasHits = GetWorld()->LineTraceSingleByProfile(Hit, QueryStart, QueryEnd, ProfileName, QueryParams);
|
||||||
|
if (HasHits)
|
||||||
|
{
|
||||||
|
Hits.Add(Hit);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Multi:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->LineTraceMultiByProfile(Hits, QueryStart, QueryEnd, ProfileName, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Test:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->LineTraceTestByProfile(QueryStart, QueryEnd, ProfileName, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECogEngine_CollisionQueryType::Sweep:
|
||||||
|
{
|
||||||
|
switch (By)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryBy::Channel:
|
||||||
|
{
|
||||||
|
switch (Mode)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryMode::Single:
|
||||||
|
{
|
||||||
|
FHitResult Hit;
|
||||||
|
HasHits = GetWorld()->SweepSingleByChannel(Hit, QueryStart, QueryEnd, QueryRotation, Channel, QueryShape, QueryParams);
|
||||||
|
if (HasHits)
|
||||||
|
{
|
||||||
|
Hits.Add(Hit);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Multi:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->SweepMultiByChannel(Hits, QueryStart, QueryEnd, QueryRotation, Channel, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Test:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->SweepTestByChannel(QueryStart, QueryEnd, QueryRotation, Channel, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECogEngine_CollisionQueryBy::ObjectType:
|
||||||
|
{
|
||||||
|
FCollisionObjectQueryParams QueryObjectParams;
|
||||||
|
QueryObjectParams.ObjectTypesToQuery = ObjectTypesToQuery;
|
||||||
|
|
||||||
|
switch (Mode)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryMode::Single:
|
||||||
|
{
|
||||||
|
FHitResult Hit;
|
||||||
|
HasHits = GetWorld()->SweepSingleByObjectType(Hit, QueryStart, QueryEnd, QueryRotation, QueryObjectParams, QueryShape, QueryParams);
|
||||||
|
if (HasHits)
|
||||||
|
{
|
||||||
|
Hits.Add(Hit);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Multi:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->SweepMultiByObjectType(Hits, QueryStart, QueryEnd, QueryRotation, QueryObjectParams, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Test:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->SweepTestByObjectType(QueryStart, QueryEnd, QueryRotation, QueryObjectParams, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECogEngine_CollisionQueryBy::Profile:
|
||||||
|
{
|
||||||
|
switch (Mode)
|
||||||
|
{
|
||||||
|
case ECogEngine_CollisionQueryMode::Single:
|
||||||
|
{
|
||||||
|
FHitResult Hit;
|
||||||
|
HasHits = GetWorld()->SweepSingleByProfile(Hit, QueryStart, QueryEnd, QueryRotation, ProfileName, QueryShape, QueryParams);
|
||||||
|
if (HasHits)
|
||||||
|
{
|
||||||
|
Hits.Add(Hit);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Multi:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->SweepMultiByProfile(Hits, QueryStart, QueryEnd, QueryRotation, ProfileName, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECogEngine_CollisionQueryMode::Test:
|
||||||
|
{
|
||||||
|
HasHits = GetWorld()->SweepTestByProfile(QueryStart, QueryEnd, QueryRotation, ProfileName, QueryShape, QueryParams);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const FColor Color = HasHits ? FLinearColor(HitColor).ToFColor(true) : FLinearColor(NoHitColor).ToFColor(true);
|
||||||
|
const bool bUseTrace = Type == ECogEngine_CollisionQueryType::LineTrace || Type == ECogEngine_CollisionQueryType::Sweep;
|
||||||
|
if (bUseTrace)
|
||||||
|
{
|
||||||
|
DrawDebugDirectionalArrow(
|
||||||
|
GetWorld(),
|
||||||
|
QueryStart,
|
||||||
|
QueryEnd,
|
||||||
|
FCogDebug::Settings.ArrowSize,
|
||||||
|
Color,
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0),
|
||||||
|
FCogDebug::GetDebugThickness(0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bIsUsingShape)
|
||||||
|
{
|
||||||
|
DrawShape(QueryShape, QueryStart, QueryRotation, FVector::OneVector, Color, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const FOverlapResult& Overlap : Overlaps)
|
||||||
|
{
|
||||||
|
if (DrawHitPrimitives)
|
||||||
|
{
|
||||||
|
DrawPrimitive(Overlap.GetComponent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const FHitResult& Hit : Hits)
|
||||||
|
{
|
||||||
|
if (DrawHitLocations)
|
||||||
|
{
|
||||||
|
DrawDebugPoint(
|
||||||
|
GetWorld(),
|
||||||
|
Hit.Location,
|
||||||
|
HitPointSize,
|
||||||
|
Color,
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DrawHitImpactPoints)
|
||||||
|
{
|
||||||
|
DrawDebugPoint(
|
||||||
|
GetWorld(),
|
||||||
|
Hit.ImpactPoint,
|
||||||
|
HitPointSize,
|
||||||
|
Color,
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bIsUsingShape && DrawHitShapes)
|
||||||
|
{
|
||||||
|
DrawShape(QueryShape, Hit.Location, QueryRotation, FVector::OneVector, Color, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DrawHitNormals)
|
||||||
|
{
|
||||||
|
DrawDebugDirectionalArrow(
|
||||||
|
GetWorld(),
|
||||||
|
Hit.Location,
|
||||||
|
Hit.Location + Hit.Normal * 20.0f,
|
||||||
|
FCogDebug::Settings.ArrowSize,
|
||||||
|
FLinearColor(NormalColor).ToFColor(true),
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0),
|
||||||
|
FCogDebug::GetDebugThickness(0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DrawHitImpactNormals)
|
||||||
|
{
|
||||||
|
DrawDebugDirectionalArrow(
|
||||||
|
GetWorld(),
|
||||||
|
Hit.ImpactPoint,
|
||||||
|
Hit.ImpactPoint + Hit.ImpactNormal * 20.0f,
|
||||||
|
FCogDebug::Settings.ArrowSize,
|
||||||
|
FLinearColor(ImpactNormalColor).ToFColor(true),
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0),
|
||||||
|
FCogDebug::GetDebugThickness(0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DrawHitPrimitives)
|
||||||
|
{
|
||||||
|
DrawPrimitive(Hit.GetComponent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void ACogEngineCollisionTester::DrawPrimitive(const UPrimitiveComponent* PrimitiveComponent)
|
||||||
|
{
|
||||||
|
//-------------------------------------------------------
|
||||||
|
// Don't draw same primitives multiple times (for bones)
|
||||||
|
//-------------------------------------------------------
|
||||||
|
if (AlreadyDrawnComponents.Contains(PrimitiveComponent))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AlreadyDrawnComponents.Add(PrimitiveComponent);
|
||||||
|
|
||||||
|
ECollisionChannel CollisionObjectType = PrimitiveComponent->GetCollisionObjectType();
|
||||||
|
FColor Color = FColor::Green; // Channels[CollisionObjectType].Color;
|
||||||
|
|
||||||
|
//-------------------------------------------------------
|
||||||
|
// Draw Name
|
||||||
|
//-------------------------------------------------------
|
||||||
|
if (DrawHitActorsNames)
|
||||||
|
{
|
||||||
|
const AActor* Actor = PrimitiveComponent->GetOwner();
|
||||||
|
if (Actor != nullptr)
|
||||||
|
{
|
||||||
|
if (AlreadyDrawnActors.Contains(Actor) == false)
|
||||||
|
{
|
||||||
|
FColor TextColor = Color.WithAlpha(255);
|
||||||
|
DrawDebugString(GetWorld(), Actor->GetActorLocation(), GetNameSafe(Actor->GetClass()), nullptr, FColor::White, 0.0f, FCogDebug::Settings.TextShadow, FCogDebug::Settings.TextSize);
|
||||||
|
AlreadyDrawnActors.Add(Actor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const FVector Location = PrimitiveComponent->GetComponentLocation();
|
||||||
|
const FQuat Rotation = PrimitiveComponent->GetComponentQuat();
|
||||||
|
const FVector Scale = PrimitiveComponent->GetComponentScale();
|
||||||
|
const FCollisionShape PrimitiveShape = PrimitiveComponent->GetCollisionShape();
|
||||||
|
DrawShape(PrimitiveShape, Location, Rotation, Scale, Color, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void ACogEngineCollisionTester::DrawShape(const FCollisionShape& InShape, const FVector& InLocation, const FQuat& InRotation, const FVector& InScale, const FColor& InColor, bool InDrawSolid) const
|
||||||
|
{
|
||||||
|
switch (InShape.ShapeType)
|
||||||
|
{
|
||||||
|
case ECollisionShape::Box:
|
||||||
|
{
|
||||||
|
//--------------------------------------------------
|
||||||
|
// see UBoxComponent::GetScaledBoxExtent()
|
||||||
|
//--------------------------------------------------
|
||||||
|
const FVector HalfExtent(InShape.Box.HalfExtentX * InScale.X, InShape.Box.HalfExtentY * InScale.Y, InShape.Box.HalfExtentZ * InScale.Z);
|
||||||
|
|
||||||
|
if (InDrawSolid)
|
||||||
|
{
|
||||||
|
DrawDebugSolidBox(
|
||||||
|
GetWorld(),
|
||||||
|
InLocation,
|
||||||
|
HalfExtent,
|
||||||
|
InRotation,
|
||||||
|
InColor,
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawDebugBox(
|
||||||
|
GetWorld(),
|
||||||
|
InLocation,
|
||||||
|
HalfExtent,
|
||||||
|
InRotation,
|
||||||
|
InColor,
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0),
|
||||||
|
FCogDebug::GetDebugThickness(0.0f));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECollisionShape::Sphere:
|
||||||
|
{
|
||||||
|
//--------------------------------------------------
|
||||||
|
// see USphereComponent::GetScaledSphereRadius()
|
||||||
|
//--------------------------------------------------
|
||||||
|
const float RadiusScale = FMath::Min(InScale.X, FMath::Min(InScale.Y, InScale.Z));
|
||||||
|
const float Radius = InShape.Sphere.Radius * RadiusScale;
|
||||||
|
|
||||||
|
FCogDebugDrawHelper::DrawSphere(
|
||||||
|
GetWorld(),
|
||||||
|
InLocation,
|
||||||
|
Radius,
|
||||||
|
FCogDebug::GetCircleSegments(),
|
||||||
|
InColor,
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0),
|
||||||
|
FCogDebug::GetDebugThickness(0.0f));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ECollisionShape::Capsule:
|
||||||
|
{
|
||||||
|
//--------------------------------------------------
|
||||||
|
// see UCapsuleComponent::GetScaledCapsuleRadius()
|
||||||
|
//--------------------------------------------------
|
||||||
|
const float Radius = InShape.Capsule.Radius * FMath::Min(InScale.X, InScale.Y);
|
||||||
|
const float HalfHeight = InShape.Capsule.HalfHeight * UE_REAL_TO_FLOAT(InScale.Z);
|
||||||
|
|
||||||
|
DrawDebugCapsule(
|
||||||
|
GetWorld(),
|
||||||
|
InLocation,
|
||||||
|
HalfHeight,
|
||||||
|
Radius,
|
||||||
|
InRotation,
|
||||||
|
InColor,
|
||||||
|
false,
|
||||||
|
0.0f,
|
||||||
|
FCogDebug::GetDebugDepthPriority(0),
|
||||||
|
FCogDebug::GetDebugThickness(0.0f));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "CogEngineWindow_CollisionTester.h"
|
#include "CogEngineWindow_CollisionTester.h"
|
||||||
|
|
||||||
#include "CogDebugDrawHelper.h"
|
|
||||||
#include "CogDebug.h"
|
#include "CogDebug.h"
|
||||||
#include "CogEngineDataAsset.h"
|
#include "CogEngineDataAsset.h"
|
||||||
#include "CogImGuiHelper.h"
|
#include "CogImGuiHelper.h"
|
||||||
@@ -109,16 +108,6 @@ void FCogEngineWindow_CollisionTester::RenderContent()
|
|||||||
{
|
{
|
||||||
Super::RenderContent();
|
Super::RenderContent();
|
||||||
|
|
||||||
//-------------------------------------------------
|
|
||||||
// Query Profile
|
|
||||||
//-------------------------------------------------
|
|
||||||
|
|
||||||
const UCollisionProfile* CollisionProfile = UCollisionProfile::Get();
|
|
||||||
if (CollisionProfile == nullptr)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// Menu
|
// Menu
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@@ -148,33 +137,63 @@ void FCogEngineWindow_CollisionTester::RenderContent()
|
|||||||
ImGui::EndMenuBar();
|
ImGui::EndMenuBar();
|
||||||
}
|
}
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
if (ImGui::Button("Spawn Collision Tester", ImVec2(-1, 0)))
|
||||||
FCogWindowWidgets::ComboboxEnum("Type", Config->Type);
|
{
|
||||||
|
const FActorSpawnParameters SpawnInfo;
|
||||||
|
ACogEngineCollisionTester* Actor = GetWorld()->SpawnActor<ACogEngineCollisionTester>(SpawnInfo);
|
||||||
|
FCogDebug::SetSelection(GetWorld(), Actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
ACogEngineCollisionTester* CollisionTester = Cast<ACogEngineCollisionTester>(GetSelection());
|
||||||
|
if (CollisionTester == nullptr)
|
||||||
|
{
|
||||||
|
ImGui::TextDisabled("Spawn or select a Collision Tester actor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const UCollisionProfile* CollisionProfile = UCollisionProfile::Get();
|
||||||
|
if (CollisionProfile == nullptr)
|
||||||
|
{
|
||||||
|
ImGui::TextDisabled("No CollisionProfile");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (const APlayerController* LocalPlayerController = GetLocalPlayerController())
|
||||||
|
{
|
||||||
|
FTransform Transform = CollisionTester->EndComponent->GetComponentTransform();
|
||||||
|
if (EndGizmo.Draw("CollisionTesterEndGizmo", *LocalPlayerController, Transform, ECogDebug_GizmoFlags::NoRotation | ECogDebug_GizmoFlags::NoScale))
|
||||||
|
{
|
||||||
|
CollisionTester->EndComponent->SetWorldTransform(Transform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
FCogWindowWidgets::ComboboxEnum("Mode", Config->Mode);
|
FCogWindowWidgets::ComboboxEnum("Type", CollisionTester->Type);
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
FCogWindowWidgets::ComboboxEnum("By", Config->By);
|
FCogWindowWidgets::ComboboxEnum("Mode", CollisionTester->Mode);
|
||||||
|
|
||||||
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
|
FCogWindowWidgets::ComboboxEnum("By", CollisionTester->By);
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// Channel
|
// Channel
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
if (Config->By == ECogEngine_CollisionQueryBy::Channel)
|
if (CollisionTester->By == ECogEngine_CollisionQueryBy::Channel)
|
||||||
{
|
{
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
ECollisionChannel Channel = Config->Channel.GetValue();
|
ECollisionChannel Channel = CollisionTester->Channel.GetValue();
|
||||||
if (RenderComboCollisionChannel("Channel", *CollisionProfile, Channel, Asset->Channels))
|
if (RenderComboCollisionChannel("Channel", *CollisionProfile, Channel, Asset->Channels))
|
||||||
{
|
{
|
||||||
Config->Channel = Channel;
|
CollisionTester->Channel = Channel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// Profile
|
// Profile
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
else if (Config->By == ECogEngine_CollisionQueryBy::Profile)
|
else if (CollisionTester->By == ECogEngine_CollisionQueryBy::Profile)
|
||||||
{
|
{
|
||||||
const FCollisionResponseTemplate* SelectedProfile = CollisionProfile->GetProfileByIndex(Config->ProfileIndex);
|
const FCollisionResponseTemplate* SelectedProfile = CollisionProfile->GetProfileByIndex(CollisionTester->ProfileIndex);
|
||||||
const FName SelectedProfileName = SelectedProfile != nullptr ? SelectedProfile->Name : FName("Custom");
|
const FName SelectedProfileName = SelectedProfile != nullptr ? SelectedProfile->Name : FName("Custom");
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
@@ -185,9 +204,9 @@ void FCogEngineWindow_CollisionTester::RenderContent()
|
|||||||
const FCollisionResponseTemplate* Profile = CollisionProfile->GetProfileByIndex(i);
|
const FCollisionResponseTemplate* Profile = CollisionProfile->GetProfileByIndex(i);
|
||||||
if (ImGui::Selectable(TCHAR_TO_ANSI(*Profile->Name.ToString()), false))
|
if (ImGui::Selectable(TCHAR_TO_ANSI(*Profile->Name.ToString()), false))
|
||||||
{
|
{
|
||||||
Config->ProfileIndex = i;
|
CollisionTester->ProfileIndex = i;
|
||||||
Config->ObjectTypesToQuery = 0;
|
CollisionTester->ObjectTypesToQuery = 0;
|
||||||
SelectedProfile = CollisionProfile->GetProfileByIndex(Config->ProfileIndex);
|
SelectedProfile = CollisionProfile->GetProfileByIndex(CollisionTester->ProfileIndex);
|
||||||
|
|
||||||
if (Profile->CollisionEnabled != ECollisionEnabled::NoCollision)
|
if (Profile->CollisionEnabled != ECollisionEnabled::NoCollision)
|
||||||
{
|
{
|
||||||
@@ -196,7 +215,7 @@ void FCogEngineWindow_CollisionTester::RenderContent()
|
|||||||
const ECollisionResponse Response = Profile->ResponseToChannels.GetResponse((ECollisionChannel)j);
|
const ECollisionResponse Response = Profile->ResponseToChannels.GetResponse((ECollisionChannel)j);
|
||||||
if (Response != ECR_Ignore)
|
if (Response != ECR_Ignore)
|
||||||
{
|
{
|
||||||
Config->ObjectTypesToQuery |= ECC_TO_BITFIELD(j);
|
CollisionTester->ObjectTypesToQuery |= ECC_TO_BITFIELD(j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -206,40 +225,40 @@ void FCogEngineWindow_CollisionTester::RenderContent()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Checkbox("Complex", &Config->TraceComplex);
|
ImGui::Checkbox("Complex", &CollisionTester->TraceComplex);
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// Shape
|
// Shape
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
if (Config->Type != ECogEngine_CollisionQueryType::LineTrace)
|
if (CollisionTester->Type != ECogEngine_CollisionQueryType::LineTrace)
|
||||||
{
|
{
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
FCogWindowWidgets::ComboboxEnum("Shape", Config->Shape);
|
FCogWindowWidgets::ComboboxEnum("Shape", CollisionTester->Shape);
|
||||||
|
|
||||||
switch (Config->Shape)
|
switch (CollisionTester->Shape)
|
||||||
{
|
{
|
||||||
case ECogEngine_CollisionQueryShape::Sphere:
|
case ECogEngine_CollisionQueryShape::Sphere:
|
||||||
{
|
{
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
FCogImguiHelper::DragDouble("Sphere Radius", &Config->ShapeExtent.X, 0.1f, 0, FLT_MAX, "%.1f");
|
FCogImguiHelper::DragDouble("Sphere Radius", &CollisionTester->ShapeExtent.X, 0.1f, 0, FLT_MAX, "%.1f");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryShape::Box:
|
case ECogEngine_CollisionQueryShape::Box:
|
||||||
{
|
{
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
FCogImguiHelper::DragFVector("Box Extent", Config->ShapeExtent, 0.1f, 0, FLT_MAX, "%.1f");
|
FCogImguiHelper::DragFVector("Box Extent", CollisionTester->ShapeExtent, 0.1f, 0, FLT_MAX, "%.1f");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryShape::Capsule:
|
case ECogEngine_CollisionQueryShape::Capsule:
|
||||||
{
|
{
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
FCogImguiHelper::DragDouble("Capsule Radius", &Config->ShapeExtent.X, 0.1f, 0, FLT_MAX, "%.1f");
|
FCogImguiHelper::DragDouble("Capsule Radius", &CollisionTester->ShapeExtent.X, 0.1f, 0, FLT_MAX, "%.1f");
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
FCogImguiHelper::DragDouble("Capsule Half Height", &Config->ShapeExtent.Z, 0.1f, 0, FLT_MAX, "%.1f");
|
FCogImguiHelper::DragDouble("Capsule Half Height", &CollisionTester->ShapeExtent.Z, 0.1f, 0, FLT_MAX, "%.1f");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -250,517 +269,18 @@ void FCogEngineWindow_CollisionTester::RenderContent()
|
|||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// Channels
|
// Channels
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
if (Config->By == ECogEngine_CollisionQueryBy::Profile)
|
if (CollisionTester->By == ECogEngine_CollisionQueryBy::Profile)
|
||||||
{
|
{
|
||||||
ImGui::BeginDisabled();
|
ImGui::BeginDisabled();
|
||||||
RenderCollisionProfileChannels(*CollisionProfile, Config->ObjectTypesToQuery, Asset->Channels);
|
RenderCollisionProfileChannels(*CollisionProfile, CollisionTester->ObjectTypesToQuery, Asset->Channels);
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
}
|
}
|
||||||
else if (Config->By == ECogEngine_CollisionQueryBy::ObjectType)
|
else if (CollisionTester->By == ECogEngine_CollisionQueryBy::ObjectType)
|
||||||
{
|
{
|
||||||
RenderCollisionProfileChannels(*CollisionProfile, Config->ObjectTypesToQuery, Asset->Channels);
|
RenderCollisionProfileChannels(*CollisionProfile, CollisionTester->ObjectTypesToQuery, Asset->Channels);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Query();
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
|
||||||
void FCogEngineWindow_CollisionTester::Query()
|
|
||||||
{
|
|
||||||
AlreadyDrawnActors.Empty();
|
|
||||||
AlreadyDrawnComponents.Empty();
|
|
||||||
|
|
||||||
const APlayerController* PlayerController = GetLocalPlayerController();
|
|
||||||
if (PlayerController == nullptr)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FVector QueryStart = Config->LocationStart;
|
|
||||||
FVector QueryEnd = Config->LocationEnd;
|
|
||||||
FQuat QueryRotation = FQuat(Config->Rotation);
|
|
||||||
TArray<FHitResult> Hits;
|
|
||||||
TArray<FOverlapResult> Overlaps;
|
|
||||||
bool HasHits = false;
|
|
||||||
|
|
||||||
|
|
||||||
static const FName TraceTag(TEXT("FCogWindow_Collision"));
|
|
||||||
const FCollisionQueryParams QueryParams(TraceTag, SCENE_QUERY_STAT_ONLY(CogHitDetection), Config->TraceComplex);
|
|
||||||
|
|
||||||
const FCollisionResponseTemplate* Profile = UCollisionProfile::Get()->GetProfileByIndex(Config->ProfileIndex);
|
|
||||||
const FName ProfileName = Profile != nullptr ? Profile->Name : FName();
|
|
||||||
|
|
||||||
FCollisionShape QueryShape;
|
|
||||||
|
|
||||||
const bool bIsUsingShape = Config->Type == ECogEngine_CollisionQueryType::Overlap || Config->Type == ECogEngine_CollisionQueryType::Sweep;
|
|
||||||
if (bIsUsingShape)
|
|
||||||
{
|
|
||||||
switch (Config->Shape)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryShape::Sphere: QueryShape.SetSphere(Config->ShapeExtent.X); break;
|
|
||||||
case ECogEngine_CollisionQueryShape::Capsule: QueryShape.SetCapsule(Config->ShapeExtent.X, Config->ShapeExtent.Z); break;
|
|
||||||
case ECogEngine_CollisionQueryShape::Box: QueryShape.SetBox(FVector3f(Config->ShapeExtent)); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (Config->Type)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryType::Overlap:
|
|
||||||
{
|
|
||||||
switch (Config->By)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryBy::Channel:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->OverlapMultiByChannel(Overlaps, QueryStart, QueryRotation, Config->Channel, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryBy::ObjectType:
|
|
||||||
{
|
|
||||||
FCollisionObjectQueryParams QueryObjectParams;
|
|
||||||
QueryObjectParams.ObjectTypesToQuery = Config->ObjectTypesToQuery;
|
|
||||||
HasHits = GetWorld()->OverlapMultiByObjectType(Overlaps, QueryStart, QueryRotation, QueryObjectParams, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryBy::Profile:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->OverlapMultiByProfile(Overlaps, QueryStart, QueryRotation, ProfileName, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryType::LineTrace:
|
|
||||||
{
|
|
||||||
switch (Config->By)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryBy::Channel:
|
|
||||||
{
|
|
||||||
switch (Config->Mode)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryMode::Single:
|
|
||||||
{
|
|
||||||
FHitResult Hit;
|
|
||||||
HasHits = GetWorld()->LineTraceSingleByChannel(Hit, QueryStart, QueryEnd, Config->Channel, QueryParams);
|
|
||||||
if (HasHits)
|
|
||||||
{
|
|
||||||
Hits.Add(Hit);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Multi:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->LineTraceMultiByChannel(Hits, QueryStart, QueryEnd, Config->Channel, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Test:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->LineTraceTestByChannel(QueryStart, QueryEnd, Config->Channel, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryBy::ObjectType:
|
|
||||||
{
|
|
||||||
FCollisionObjectQueryParams QueryObjectParams;
|
|
||||||
QueryObjectParams.ObjectTypesToQuery = Config->ObjectTypesToQuery;
|
|
||||||
|
|
||||||
switch (Config->Mode)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryMode::Single:
|
|
||||||
{
|
|
||||||
FHitResult Hit;
|
|
||||||
HasHits = GetWorld()->LineTraceSingleByObjectType(Hit, QueryStart, QueryEnd, QueryObjectParams, QueryParams);
|
|
||||||
if (HasHits)
|
|
||||||
{
|
|
||||||
Hits.Add(Hit);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Multi:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->LineTraceMultiByObjectType(Hits, QueryStart, QueryEnd, QueryObjectParams, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Test:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->LineTraceTestByObjectType(QueryStart, QueryEnd, QueryObjectParams, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryBy::Profile:
|
|
||||||
{
|
|
||||||
switch (Config->Mode)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryMode::Single:
|
|
||||||
{
|
|
||||||
FHitResult Hit;
|
|
||||||
HasHits = GetWorld()->LineTraceSingleByProfile(Hit, QueryStart, QueryEnd, ProfileName, QueryParams);
|
|
||||||
if (HasHits)
|
|
||||||
{
|
|
||||||
Hits.Add(Hit);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Multi:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->LineTraceMultiByProfile(Hits, QueryStart, QueryEnd, ProfileName, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Test:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->LineTraceTestByProfile(QueryStart, QueryEnd, ProfileName, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryType::Sweep:
|
|
||||||
{
|
|
||||||
switch (Config->By)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryBy::Channel:
|
|
||||||
{
|
|
||||||
switch (Config->Mode)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryMode::Single:
|
|
||||||
{
|
|
||||||
FHitResult Hit;
|
|
||||||
HasHits = GetWorld()->SweepSingleByChannel(Hit, QueryStart, QueryEnd, QueryRotation, Config->Channel, QueryShape, QueryParams);
|
|
||||||
if (HasHits)
|
|
||||||
{
|
|
||||||
Hits.Add(Hit);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Multi:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->SweepMultiByChannel(Hits, QueryStart, QueryEnd, QueryRotation, Config->Channel, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Test:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->SweepTestByChannel(QueryStart, QueryEnd, QueryRotation, Config->Channel, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryBy::ObjectType:
|
|
||||||
{
|
|
||||||
FCollisionObjectQueryParams QueryObjectParams;
|
|
||||||
QueryObjectParams.ObjectTypesToQuery = Config->ObjectTypesToQuery;
|
|
||||||
|
|
||||||
switch (Config->Mode)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryMode::Single:
|
|
||||||
{
|
|
||||||
FHitResult Hit;
|
|
||||||
HasHits = GetWorld()->SweepSingleByObjectType(Hit, QueryStart, QueryEnd, QueryRotation, QueryObjectParams, QueryShape, QueryParams);
|
|
||||||
if (HasHits)
|
|
||||||
{
|
|
||||||
Hits.Add(Hit);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Multi:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->SweepMultiByObjectType(Hits, QueryStart, QueryEnd, QueryRotation, QueryObjectParams, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Test:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->SweepTestByObjectType(QueryStart, QueryEnd, QueryRotation, QueryObjectParams, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECogEngine_CollisionQueryBy::Profile:
|
|
||||||
{
|
|
||||||
switch (Config->Mode)
|
|
||||||
{
|
|
||||||
case ECogEngine_CollisionQueryMode::Single:
|
|
||||||
{
|
|
||||||
FHitResult Hit;
|
|
||||||
HasHits = GetWorld()->SweepSingleByProfile(Hit, QueryStart, QueryEnd, QueryRotation, ProfileName, QueryShape, QueryParams);
|
|
||||||
if (HasHits)
|
|
||||||
{
|
|
||||||
Hits.Add(Hit);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Multi:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->SweepMultiByProfile(Hits, QueryStart, QueryEnd, QueryRotation, ProfileName, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ECogEngine_CollisionQueryMode::Test:
|
|
||||||
{
|
|
||||||
HasHits = GetWorld()->SweepTestByProfile(QueryStart, QueryEnd, QueryRotation, ProfileName, QueryShape, QueryParams);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const FColor Color = HasHits ? FLinearColor(Config->HitColor).ToFColor(true) : FLinearColor(Config->NoHitColor).ToFColor(true);
|
|
||||||
const bool bUseTrace = Config->Type == ECogEngine_CollisionQueryType::LineTrace || Config->Type == ECogEngine_CollisionQueryType::Sweep;
|
|
||||||
if (bUseTrace)
|
|
||||||
{
|
|
||||||
DrawDebugDirectionalArrow(
|
|
||||||
GetWorld(),
|
|
||||||
QueryStart,
|
|
||||||
QueryEnd,
|
|
||||||
FCogDebug::Settings.ArrowSize,
|
|
||||||
Color,
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0),
|
|
||||||
FCogDebug::GetDebugThickness(0.0f));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bIsUsingShape)
|
|
||||||
{
|
|
||||||
DrawShape(QueryShape, QueryStart, QueryRotation, FVector::OneVector, Color, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const FOverlapResult& Overlap : Overlaps)
|
|
||||||
{
|
|
||||||
if (Config->DrawHitPrimitives)
|
|
||||||
{
|
|
||||||
DrawPrimitive(Overlap.GetComponent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const FHitResult& Hit : Hits)
|
|
||||||
{
|
|
||||||
if (Config->DrawHitLocations)
|
|
||||||
{
|
|
||||||
DrawDebugPoint(
|
|
||||||
GetWorld(),
|
|
||||||
Hit.Location,
|
|
||||||
Config->HitPointSize,
|
|
||||||
Color,
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Config->DrawHitImpactPoints)
|
|
||||||
{
|
|
||||||
DrawDebugPoint(
|
|
||||||
GetWorld(),
|
|
||||||
Hit.ImpactPoint,
|
|
||||||
Config->HitPointSize,
|
|
||||||
Color,
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bIsUsingShape && Config->DrawHitShapes)
|
|
||||||
{
|
|
||||||
DrawShape(QueryShape, Hit.Location, QueryRotation, FVector::OneVector, Color, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Config->DrawHitNormals)
|
|
||||||
{
|
|
||||||
DrawDebugDirectionalArrow(
|
|
||||||
GetWorld(),
|
|
||||||
Hit.Location,
|
|
||||||
Hit.Location + Hit.Normal * 20.0f,
|
|
||||||
FCogDebug::Settings.ArrowSize,
|
|
||||||
FLinearColor(Config->NormalColor).ToFColor(true),
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0),
|
|
||||||
FCogDebug::GetDebugThickness(0.0f));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Config->DrawHitImpactNormals)
|
|
||||||
{
|
|
||||||
DrawDebugDirectionalArrow(
|
|
||||||
GetWorld(),
|
|
||||||
Hit.ImpactPoint,
|
|
||||||
Hit.ImpactPoint + Hit.ImpactNormal * 20.0f,
|
|
||||||
FCogDebug::Settings.ArrowSize,
|
|
||||||
FLinearColor(Config->ImpactNormalColor).ToFColor(true),
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0),
|
|
||||||
FCogDebug::GetDebugThickness(0.0f));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Config->DrawHitPrimitives)
|
|
||||||
{
|
|
||||||
DrawPrimitive(Hit.GetComponent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (const APlayerController* LocalPlayerController = GetLocalPlayerController())
|
|
||||||
{
|
|
||||||
FVector ScaleStart(Config->ShapeExtent);
|
|
||||||
FTransform TransformStart(QueryRotation, QueryStart, ScaleStart);
|
|
||||||
GizmoStart.Draw("Query Start", *LocalPlayerController, TransformStart);
|
|
||||||
Config->LocationStart = TransformStart.GetLocation();
|
|
||||||
Config->Rotation = FRotator(TransformStart.GetRotation());
|
|
||||||
Config->ShapeExtent = TransformStart.GetScale3D();
|
|
||||||
|
|
||||||
if (Config->Type != ECogEngine_CollisionQueryType::Overlap)
|
|
||||||
{
|
|
||||||
FTransform TransformEnd(FRotator::ZeroRotator, QueryEnd, FVector::OneVector);
|
|
||||||
GizmoEnd.Draw("Query End", *LocalPlayerController, TransformEnd, ECogDebug_GizmoFlags::NoRotation | ECogDebug_GizmoFlags::NoScale);
|
|
||||||
Config->LocationEnd = TransformEnd.GetLocation();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
|
||||||
void FCogEngineWindow_CollisionTester::DrawPrimitive(const UPrimitiveComponent* PrimitiveComponent)
|
|
||||||
{
|
|
||||||
//-------------------------------------------------------
|
|
||||||
// Don't draw same primitives multiple times (for bones)
|
|
||||||
//-------------------------------------------------------
|
|
||||||
if (AlreadyDrawnComponents.Contains(PrimitiveComponent))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
AlreadyDrawnComponents.Add(PrimitiveComponent);
|
|
||||||
|
|
||||||
ECollisionChannel CollisionObjectType = PrimitiveComponent->GetCollisionObjectType();
|
|
||||||
FColor Color = Channels[CollisionObjectType].Color;
|
|
||||||
|
|
||||||
//-------------------------------------------------------
|
|
||||||
// Draw Name
|
|
||||||
//-------------------------------------------------------
|
|
||||||
if (Config->DrawHitActorsNames)
|
|
||||||
{
|
|
||||||
const AActor* Actor = PrimitiveComponent->GetOwner();
|
|
||||||
if (Actor != nullptr)
|
|
||||||
{
|
|
||||||
if (AlreadyDrawnActors.Contains(Actor) == false)
|
|
||||||
{
|
|
||||||
FColor TextColor = Color.WithAlpha(255);
|
|
||||||
DrawDebugString(GetWorld(), Actor->GetActorLocation(), GetNameSafe(Actor->GetClass()), nullptr, FColor::White, 0.0f, FCogDebug::Settings.TextShadow, FCogDebug::Settings.TextSize);
|
|
||||||
AlreadyDrawnActors.Add(Actor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const FVector Location = PrimitiveComponent->GetComponentLocation();
|
|
||||||
const FQuat Rotation = PrimitiveComponent->GetComponentQuat();
|
|
||||||
const FVector Scale = PrimitiveComponent->GetComponentScale();
|
|
||||||
const FCollisionShape Shape = PrimitiveComponent->GetCollisionShape();
|
|
||||||
DrawShape(Shape, Location, Rotation, Scale, Color, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
|
||||||
void FCogEngineWindow_CollisionTester::DrawShape(const FCollisionShape& Shape, const FVector& Location, const FQuat& Rotation, const FVector& Scale, const FColor& Color, bool DrawSolid) const
|
|
||||||
{
|
|
||||||
switch (Shape.ShapeType)
|
|
||||||
{
|
|
||||||
case ECollisionShape::Box:
|
|
||||||
{
|
|
||||||
//--------------------------------------------------
|
|
||||||
// see UBoxComponent::GetScaledBoxExtent()
|
|
||||||
//--------------------------------------------------
|
|
||||||
const FVector HalfExtent(Shape.Box.HalfExtentX * Scale.X, Shape.Box.HalfExtentY * Scale.Y, Shape.Box.HalfExtentZ * Scale.Z);
|
|
||||||
|
|
||||||
if (DrawSolid)
|
|
||||||
{
|
|
||||||
DrawDebugSolidBox(
|
|
||||||
GetWorld(),
|
|
||||||
Location,
|
|
||||||
HalfExtent,
|
|
||||||
Rotation,
|
|
||||||
Color,
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
DrawDebugBox(
|
|
||||||
GetWorld(),
|
|
||||||
Location,
|
|
||||||
HalfExtent,
|
|
||||||
Rotation,
|
|
||||||
Color,
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0),
|
|
||||||
FCogDebug::GetDebugThickness(0.0f));
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECollisionShape::Sphere:
|
|
||||||
{
|
|
||||||
//--------------------------------------------------
|
|
||||||
// see USphereComponent::GetScaledSphereRadius()
|
|
||||||
//--------------------------------------------------
|
|
||||||
const float RadiusScale = FMath::Min(Scale.X, FMath::Min(Scale.Y, Scale.Z));
|
|
||||||
const float Radius = Shape.Sphere.Radius * RadiusScale;
|
|
||||||
|
|
||||||
FCogDebugDrawHelper::DrawSphere(
|
|
||||||
GetWorld(),
|
|
||||||
Location,
|
|
||||||
Radius,
|
|
||||||
FCogDebug::GetCircleSegments(),
|
|
||||||
Color,
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0),
|
|
||||||
FCogDebug::GetDebugThickness(0.0f));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ECollisionShape::Capsule:
|
|
||||||
{
|
|
||||||
//--------------------------------------------------
|
|
||||||
// see UCapsuleComponent::GetScaledCapsuleRadius()
|
|
||||||
//--------------------------------------------------
|
|
||||||
const float Radius = Shape.Capsule.Radius * FMath::Min(Scale.X, Scale.Y);
|
|
||||||
const float HalfHeight = Shape.Capsule.HalfHeight * UE_REAL_TO_FLOAT(Scale.Z);
|
|
||||||
|
|
||||||
DrawDebugCapsule(
|
|
||||||
GetWorld(),
|
|
||||||
Location,
|
|
||||||
HalfHeight,
|
|
||||||
Radius,
|
|
||||||
Rotation,
|
|
||||||
Color,
|
|
||||||
false,
|
|
||||||
0.0f,
|
|
||||||
FCogDebug::GetDebugDepthPriority(0),
|
|
||||||
FCogDebug::GetDebugThickness(0.0f));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
void FCogEngineWindow_CollisionTester::SetAsset(const UCogEngineDataAsset* Value)
|
void FCogEngineWindow_CollisionTester::SetAsset(const UCogEngineDataAsset* Value)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ void FCogEngineWindow_DebugSettings::RenderContent()
|
|||||||
ImGui::Checkbox("Gizmo Translation Snap Enable", &Settings.GizmoTranslationSnapEnable);
|
ImGui::Checkbox("Gizmo Translation Snap Enable", &Settings.GizmoTranslationSnapEnable);
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
ImGui::DragFloat("Gizmo Translation Snap", &Settings.GizmoTranslationSnap, 0.1f, 0.0f, 1000.0f, "%.1f");
|
ImGui::DragFloat("Gizmo Translation Snap", &Settings.GizmoTranslationSnapValue, 0.1f, 0.0f, 1000.0f, "%.1f");
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
ImGui::DragFloat("Gizmo Translation Axis Length", &Settings.GizmoTranslationAxisLength, 0.1f, 0.1f, 500.0f, "%.1f");
|
ImGui::DragFloat("Gizmo Translation Axis Length", &Settings.GizmoTranslationAxisLength, 0.1f, 0.1f, 500.0f, "%.1f");
|
||||||
@@ -220,7 +220,7 @@ void FCogEngineWindow_DebugSettings::RenderContent()
|
|||||||
ImGui::Checkbox("Gizmo Rotation Snap Enable", &Settings.GizmoRotationSnapEnable);
|
ImGui::Checkbox("Gizmo Rotation Snap Enable", &Settings.GizmoRotationSnapEnable);
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
ImGui::DragFloat("Gizmo Rotation Snap", &Settings.GizmoRotationSnap, 0.1f, 0.0f, 360.0f, "%.1f");
|
ImGui::DragFloat("Gizmo Rotation Snap", &Settings.GizmoRotationSnapValue, 0.1f, 0.0f, 360.0f, "%.1f");
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
ImGui::DragFloat("Gizmo Rotation Speed", &Settings.GizmoRotationSpeed, 0.01f, 0.01f, 100.0f, "%.2f");
|
ImGui::DragFloat("Gizmo Rotation Speed", &Settings.GizmoRotationSpeed, 0.01f, 0.01f, 100.0f, "%.2f");
|
||||||
@@ -235,7 +235,7 @@ void FCogEngineWindow_DebugSettings::RenderContent()
|
|||||||
ImGui::Checkbox("Gizmo Scale Snap Enable", &Settings.GizmoScaleSnapEnable);
|
ImGui::Checkbox("Gizmo Scale Snap Enable", &Settings.GizmoScaleSnapEnable);
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
ImGui::DragFloat("Gizmo Scale Snap", &Settings.GizmoScaleSnap, 0.1f, 0.0f, 10.0f, "%.1f");
|
ImGui::DragFloat("Gizmo Scale Snap", &Settings.GizmoScaleSnapValue, 0.1f, 0.0f, 10.0f, "%.1f");
|
||||||
|
|
||||||
FCogWindowWidgets::SetNextItemToShortWidth();
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
ImGui::DragFloat("Gizmo Scale Box Offset", &Settings.GizmoScaleBoxOffset, 0.0f, 0.0f, 500.0f, "%.1f");
|
ImGui::DragFloat("Gizmo Scale Box Offset", &Settings.GizmoScaleBoxOffset, 0.0f, 0.0f, 500.0f, "%.1f");
|
||||||
|
|||||||
@@ -0,0 +1,256 @@
|
|||||||
|
#include "CogEngineWindow_Transform.h"
|
||||||
|
|
||||||
|
#include "CogDebug.h"
|
||||||
|
#include "CogImGuiHelper.h"
|
||||||
|
#include "CogWindowWidgets.h"
|
||||||
|
#include "imgui.h"
|
||||||
|
#include "imgui_internal.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FCogEngineWindow_Transform::Initialize()
|
||||||
|
{
|
||||||
|
Super::Initialize();
|
||||||
|
Config = GetConfig<UCogEngineConfig_Transform>();
|
||||||
|
bHasMenu = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FCogEngineWindow_Transform::RenderHelp()
|
||||||
|
{
|
||||||
|
ImGui::Text(
|
||||||
|
"This window can be used to modify the transform of the selected actor."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FCogEngineWindow_Transform::RenderContent()
|
||||||
|
{
|
||||||
|
Super::RenderContent();
|
||||||
|
|
||||||
|
AActor* Selection = GetSelection();
|
||||||
|
if (Selection == nullptr)
|
||||||
|
{
|
||||||
|
ImGui::TextDisabled("No Selection");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginMenuBar())
|
||||||
|
{
|
||||||
|
if (ImGui::BeginMenu("Options"))
|
||||||
|
{
|
||||||
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
|
ImGui::DragFloat("Drag Speed Location", &Config->LocationSpeed, 0.1f, 0.1f, 100.0f);
|
||||||
|
|
||||||
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
|
ImGui::DragFloat("Drag Speed Rotation", &Config->RotationSpeed, 0.1f, 0.1f, 100.0f);
|
||||||
|
|
||||||
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
|
ImGui::DragFloat("Drag Speed Scale", &Config->ScaleSpeed, 0.1f, 0.1f, 100.0f);
|
||||||
|
|
||||||
|
ImGui::SeparatorText("Gizmo");
|
||||||
|
FCogDebugSettings& Settings = FCogDebug::Settings;
|
||||||
|
ImGui::Checkbox("Local Space Gizmo", &Settings.GizmoUseLocalSpace);
|
||||||
|
RenderSnap("##Location", "Snap Location", &Settings.GizmoTranslationSnapEnable, &Settings.GizmoTranslationSnapValue);
|
||||||
|
RenderSnap("##Rotation", "Snap Rotation", &Settings.GizmoRotationSnapEnable, &Settings.GizmoRotationSnapValue);
|
||||||
|
RenderSnap("##Scale", "Snap Scale", &Settings.GizmoScaleSnapEnable, &Settings.GizmoScaleSnapValue);
|
||||||
|
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndMenuBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
FTransform Transform = Selection->GetActorTransform();
|
||||||
|
if (RenderTransform(Transform))
|
||||||
|
{
|
||||||
|
Selection->SetActorTransform(Transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (const APlayerController* LocalPlayerController = GetLocalPlayerController())
|
||||||
|
{
|
||||||
|
if (Gizmo.Draw("Transform", *LocalPlayerController, Transform))
|
||||||
|
{
|
||||||
|
Selection->SetActorTransform(Transform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopStyleVar();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool FCogEngineWindow_Transform::RenderComponent(const char* Label, double* Value, float Speed, double Min, double Max, double Reset)
|
||||||
|
{
|
||||||
|
ImGui::PushItemWidth(-1);
|
||||||
|
bool Result = FCogImguiHelper::DragDouble(Label, Value, Speed, Min, Max, "%.2f");
|
||||||
|
|
||||||
|
if (ImGui::IsItemActive() && ImGui::TempInputIsActive(ImGui::GetActiveID()))
|
||||||
|
{
|
||||||
|
Result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginItemTooltip())
|
||||||
|
{
|
||||||
|
ImGui::Text("%.2f", *Value);
|
||||||
|
ImGui::TextDisabled("Reset [RMB]");
|
||||||
|
ImGui::EndTooltip();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Right))
|
||||||
|
{
|
||||||
|
*Value = Reset;
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FCogEngineWindow_Transform::RenderSnap(const char* CheckboxLabel, const char* InputLabel, bool* SnapEnable, float* Snap)
|
||||||
|
{
|
||||||
|
ImGui::Checkbox(CheckboxLabel, SnapEnable);
|
||||||
|
|
||||||
|
ImGui::SameLine();
|
||||||
|
FCogWindowWidgets::SetNextItemToShortWidth();
|
||||||
|
ImGui::DragFloat(InputLabel, Snap, 0.1f, 0.1f, 1000.0f, "%.1f");
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool FCogEngineWindow_Transform::RenderLocation(FTransform& InOutTransform)
|
||||||
|
{
|
||||||
|
ImGui::PushID("Location");
|
||||||
|
ImGui::TableNextRow();
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::Text("Location");
|
||||||
|
|
||||||
|
FVector Location = InOutTransform.GetTranslation();
|
||||||
|
bool Result = false;
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##X", &Location.X, Config->LocationSpeed, 0.0, 0.0, 0.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetTranslation(Location);
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##Y", &Location.Y, Config->LocationSpeed, 0.0, 0.0, 0.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetTranslation(Location);
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##Z", &Location.Z, Config->LocationSpeed, 0.0, 0.0, 0.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetTranslation(Location);
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopID();
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool FCogEngineWindow_Transform::RenderRotation(FTransform& InOutTransform)
|
||||||
|
{
|
||||||
|
ImGui::PushID("Rotation");
|
||||||
|
ImGui::TableNextRow();
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::Text("Rotation");
|
||||||
|
|
||||||
|
FRotator Rotation = InOutTransform.GetRotation().Rotator();
|
||||||
|
bool Result = false;
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##X", &Rotation.Yaw, Config->RotationSpeed, 0.0, 0.0, 0.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetRotation(Rotation.Quaternion());
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##Y", &Rotation.Pitch, Config->RotationSpeed, 0.0, 0.0, 0.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetRotation(Rotation.Quaternion());
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##Z", &Rotation.Roll, Config->RotationSpeed, 0.0, 0.0, 0.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetRotation(Rotation.Quaternion());
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::PopID();
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool FCogEngineWindow_Transform::RenderScale(FTransform& InOutTransform)
|
||||||
|
{
|
||||||
|
ImGui::PushID("Scale");
|
||||||
|
ImGui::TableNextRow();
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::Text("Scale");
|
||||||
|
|
||||||
|
FVector Scale = InOutTransform.GetScale3D();
|
||||||
|
bool Result = false;
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##X", &Scale.X, Config->ScaleSpeed, 0.01, 1000.0, 1.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetScale3D(Scale);
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##Y", &Scale.Y, Config->ScaleSpeed, 0.01, 1000.0, 1.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetScale3D(Scale);
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
if (RenderComponent("##Z", &Scale.Z, Config->ScaleSpeed, 0.01, 1000.0, 1.0))
|
||||||
|
{
|
||||||
|
InOutTransform.SetScale3D(Scale);
|
||||||
|
Result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopID();
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool FCogEngineWindow_Transform::RenderTransform(FTransform& InOutTransform)
|
||||||
|
{
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(1.0f, 1.0f));
|
||||||
|
|
||||||
|
bool Result = false;
|
||||||
|
|
||||||
|
if (ImGui::BeginTable("Pools", 4, ImGuiTableFlags_SizingFixedFit))
|
||||||
|
{
|
||||||
|
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, ImGui::GetFontSize() * 5);
|
||||||
|
ImGui::TableSetupColumn("X", ImGuiTableColumnFlags_WidthStretch);
|
||||||
|
ImGui::TableSetupColumn("Y", ImGuiTableColumnFlags_WidthStretch);
|
||||||
|
ImGui::TableSetupColumn("Z", ImGuiTableColumnFlags_WidthStretch);
|
||||||
|
|
||||||
|
Result |= RenderLocation(InOutTransform);
|
||||||
|
Result |= RenderRotation(InOutTransform);
|
||||||
|
Result |= RenderScale(InOutTransform);
|
||||||
|
|
||||||
|
ImGui::EndTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/HitResult.h"
|
||||||
|
#include "CogEngineCollisionTester.generated.h"
|
||||||
|
|
||||||
|
class UCogEngineEditAnywhere_CollisionViewer;
|
||||||
|
class UCogEngineDataAsset;
|
||||||
|
class UPrimitiveComponent;
|
||||||
|
struct FCollisionShape;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
UENUM()
|
||||||
|
enum class ECogEngine_CollisionQueryType : uint8
|
||||||
|
{
|
||||||
|
Overlap,
|
||||||
|
LineTrace,
|
||||||
|
Sweep,
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
UENUM()
|
||||||
|
enum class ECogEngine_CollisionQueryMode : uint8
|
||||||
|
{
|
||||||
|
Single,
|
||||||
|
Multi,
|
||||||
|
Test,
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
UENUM()
|
||||||
|
enum class ECogEngine_CollisionQueryBy : uint8
|
||||||
|
{
|
||||||
|
Channel,
|
||||||
|
ObjectType,
|
||||||
|
Profile,
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
UENUM()
|
||||||
|
enum class ECogEngine_CollisionQueryShape : uint8
|
||||||
|
{
|
||||||
|
Sphere,
|
||||||
|
Box,
|
||||||
|
Capsule,
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
UCLASS()
|
||||||
|
class COGENGINE_API ACogEngineCollisionTester : public AActor
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
ACogEngineCollisionTester(const FObjectInitializer& ObjectInitializer);
|
||||||
|
|
||||||
|
virtual void Tick(float DeltaSeconds) override;
|
||||||
|
virtual bool ShouldTickIfViewportsOnly() const override;
|
||||||
|
|
||||||
|
void Query();
|
||||||
|
void DrawPrimitive(const UPrimitiveComponent* PrimitiveComponent);
|
||||||
|
void DrawShape(const FCollisionShape& Shape, const FVector& InLocation, const FQuat& InRotation, const FVector& InScale,
|
||||||
|
const FColor& InColor, bool InDrawSolid) const;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool TickInEditor = false;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
ECogEngine_CollisionQueryType Type = ECogEngine_CollisionQueryType::LineTrace;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
ECogEngine_CollisionQueryMode Mode = ECogEngine_CollisionQueryMode::Multi;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
ECogEngine_CollisionQueryBy By = ECogEngine_CollisionQueryBy::Channel;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
ECogEngine_CollisionQueryShape Shape = ECogEngine_CollisionQueryShape::Sphere;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool TraceComplex = false;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
int32 ObjectTypesToQuery = 0;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
TEnumAsByte<ECollisionChannel> Channel = ECC_WorldStatic;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
int32 ProfileIndex = 0;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
FVector ShapeExtent = FVector::One();
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool DrawHitLocations = true;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool DrawHitImpactPoints = true;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool DrawHitShapes = true;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool DrawHitNormals = true;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool DrawHitImpactNormals = true;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool DrawHitPrimitives = true;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
bool DrawHitActorsNames = false;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float HitPointSize = 5.0f;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
FColor NoHitColor = FColor::Red;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
FColor HitColor = FColor::Green;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
FColor NormalColor = FColor::Yellow;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
FColor ImpactNormalColor = FColor::Cyan;
|
||||||
|
|
||||||
|
TSet<const AActor*> AlreadyDrawnActors;
|
||||||
|
|
||||||
|
TSet<const UPrimitiveComponent*> AlreadyDrawnComponents;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
USceneComponent* StartComponent = nullptr;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
USceneComponent* EndComponent = nullptr;
|
||||||
|
};
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "CogWindow.h"
|
#include "CogWindow.h"
|
||||||
#include "CogWindowConfig.h"
|
#include "CogWindowConfig.h"
|
||||||
#include "Engine/HitResult.h"
|
#include "Engine/HitResult.h"
|
||||||
|
#include "CogEngineCollisionTester.h"
|
||||||
#include "CogEngineWindow_CollisionTester.generated.h"
|
#include "CogEngineWindow_CollisionTester.generated.h"
|
||||||
|
|
||||||
class UCogEngineConfig_CollisionViewer;
|
class UCogEngineConfig_CollisionViewer;
|
||||||
@@ -12,43 +13,6 @@ class UCogEngineDataAsset;
|
|||||||
class UPrimitiveComponent;
|
class UPrimitiveComponent;
|
||||||
struct FCollisionShape;
|
struct FCollisionShape;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
|
||||||
UENUM()
|
|
||||||
enum class ECogEngine_CollisionQueryType : uint8
|
|
||||||
{
|
|
||||||
Overlap,
|
|
||||||
LineTrace,
|
|
||||||
Sweep,
|
|
||||||
};
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
|
||||||
UENUM()
|
|
||||||
enum class ECogEngine_CollisionQueryMode : uint8
|
|
||||||
{
|
|
||||||
Single,
|
|
||||||
Multi,
|
|
||||||
Test,
|
|
||||||
};
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
|
||||||
UENUM()
|
|
||||||
enum class ECogEngine_CollisionQueryBy : uint8
|
|
||||||
{
|
|
||||||
Channel,
|
|
||||||
ObjectType,
|
|
||||||
Profile,
|
|
||||||
};
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
|
||||||
UENUM()
|
|
||||||
enum class ECogEngine_CollisionQueryShape : uint8
|
|
||||||
{
|
|
||||||
Sphere,
|
|
||||||
Box,
|
|
||||||
Capsule,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
enum class ECogDebug_GizmoTransformSpace : uint8;
|
enum class ECogDebug_GizmoTransformSpace : uint8;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -70,13 +34,6 @@ protected:
|
|||||||
|
|
||||||
virtual void SetAsset(const UCogEngineDataAsset* Value);
|
virtual void SetAsset(const UCogEngineDataAsset* Value);
|
||||||
|
|
||||||
void Query();
|
|
||||||
|
|
||||||
void DrawPrimitive(const UPrimitiveComponent* PrimitiveComponent);
|
|
||||||
|
|
||||||
void DrawShape(const FCollisionShape& Shape, const FVector& Location, const FQuat& Rotation, const FVector& Scale, const FColor& Color, bool DrawSolid) const;
|
|
||||||
|
|
||||||
|
|
||||||
struct FChannel
|
struct FChannel
|
||||||
{
|
{
|
||||||
bool IsValid = false;
|
bool IsValid = false;
|
||||||
@@ -89,17 +46,7 @@ protected:
|
|||||||
|
|
||||||
TObjectPtr<UCogEngineConfig_CollisionTester> Config = nullptr;
|
TObjectPtr<UCogEngineConfig_CollisionTester> Config = nullptr;
|
||||||
|
|
||||||
TSet<const AActor*> AlreadyDrawnActors;
|
FCogDebug_Gizmo EndGizmo;
|
||||||
|
|
||||||
TSet<const UPrimitiveComponent*> AlreadyDrawnComponents;
|
|
||||||
|
|
||||||
bool IsDragging = false;
|
|
||||||
|
|
||||||
FCogDebug_Gizmo GizmoStart;
|
|
||||||
FCogDebug_Gizmo GizmoEnd;
|
|
||||||
|
|
||||||
FTransform StartTransform;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "CogDebugGizmo.h"
|
||||||
|
#include "CogWindow.h"
|
||||||
|
#include "CogWindowConfig.h"
|
||||||
|
#include "CogEngineWindow_Transform.generated.h"
|
||||||
|
|
||||||
|
class UCogEngineConfig_Transform;
|
||||||
|
|
||||||
|
class COGENGINE_API FCogEngineWindow_Transform : public FCogWindow
|
||||||
|
{
|
||||||
|
typedef FCogWindow Super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void Initialize() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual void RenderHelp() override;
|
||||||
|
|
||||||
|
virtual void RenderContent() override;
|
||||||
|
|
||||||
|
bool RenderComponent(const char* Label, double* Value, float Speed, double Min, double Max, double Reset);
|
||||||
|
|
||||||
|
void RenderSnap(const char* CheckboxLabel, const char* InputLabel, bool* SnapEnable, float* Snap);
|
||||||
|
|
||||||
|
bool RenderLocation(FTransform& InOutTransform);
|
||||||
|
|
||||||
|
bool RenderRotation(FTransform& InOutTransform);
|
||||||
|
|
||||||
|
bool RenderScale(FTransform& InOutTransform);
|
||||||
|
|
||||||
|
bool RenderTransform(FTransform& InOutTransform);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
FCogDebug_Gizmo Gizmo;
|
||||||
|
|
||||||
|
TWeakObjectPtr<UCogEngineConfig_Transform> Config = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
UCLASS(Config = Cog)
|
||||||
|
class UCogEngineConfig_Transform : public UCogWindowConfig
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
bool ShowGizmo = true;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
float LocationSpeed = 10.0f;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
float RotationSpeed = 1.0f;
|
||||||
|
|
||||||
|
UPROPERTY(Config)
|
||||||
|
float ScaleSpeed = 0.1f;
|
||||||
|
|
||||||
|
virtual void Reset() override
|
||||||
|
{
|
||||||
|
Super::Reset();
|
||||||
|
ShowGizmo = true;
|
||||||
|
LocationSpeed = 10.0f;
|
||||||
|
RotationSpeed = 1.0f;
|
||||||
|
ScaleSpeed = 0.1f;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
#include "CogEngineWindow_Spawns.h"
|
#include "CogEngineWindow_Spawns.h"
|
||||||
#include "CogEngineWindow_Stats.h"
|
#include "CogEngineWindow_Stats.h"
|
||||||
#include "CogEngineWindow_TimeScale.h"
|
#include "CogEngineWindow_TimeScale.h"
|
||||||
|
#include "CogEngineWindow_Transform.h"
|
||||||
#include "CogImguiModule.h"
|
#include "CogImguiModule.h"
|
||||||
#include "CogInputDataAsset.h"
|
#include "CogInputDataAsset.h"
|
||||||
#include "CogInputWindow_Actions.h"
|
#include "CogInputWindow_Actions.h"
|
||||||
@@ -174,6 +175,8 @@ void ACogSampleGameState::InitializeCog()
|
|||||||
|
|
||||||
CogWindowManager->AddWindow<FCogEngineWindow_TimeScale>("Engine.Time Scale");
|
CogWindowManager->AddWindow<FCogEngineWindow_TimeScale>("Engine.Time Scale");
|
||||||
|
|
||||||
|
CogWindowManager->AddWindow<FCogEngineWindow_Transform>("Engine.Transform");
|
||||||
|
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
// Abilities
|
// Abilities
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user