Files
Nuake-custom/Nuake/src/Scene/Components/NavMeshVolumeComponent.h
WiggleWizard ffc79ccdf4 Initial reflection for components using the entt reflection API
Currently the only system using reflection is the drop down box when clicking "Add Component" in the entity inspector. The other systems and architecture is still designed around concrete compile time typing
2024-09-10 15:53:32 +01:00

111 lines
2.6 KiB
C++

#pragma once
#include "src/Core/Object/Object.h"
#include "../Entities/Entity.h"
#include "Engine.h"
#include <src/AI/NavMesh.h>
namespace Nuake
{
struct NavMeshVolumeComponent
{
NUAKECOMPONENT(NavMeshVolumeComponent, "Nav Mesh Volume")
Vector3 VolumeSize = { 1.0f, 1.0f, 1.0f };
bool OnlyIncludeMapGeometry = true;
// Generation config
float CellSize = 0.2f;
float CellHeight = 0.2f;
float TileSize = 10.0f;
float WalkableSlopeAngle = 45.0f;
float MaxEdgeLength = 12.0f;
float MaxVertsPerPoly = 6.0f;
float WalkableHeight = 1.0f;
float WalkableClimb = 1.0f;
float WalkableRadius = 1.0f;
float MaxSimplificationError = 1.3f;
float MinRegionArea = 4.0f;
float MergeRegionArea = 10.0f;
float DetailSampleDistance = 2.0f;
float DetailsampleMaxError = 1.0f;
float AgentHeight = 0.5f;
float AgentRadius = 0.1f;
float AgentMaxClimb = 0.01f;
Ref<NavMesh> NavMeshData;
json Serialize()
{
BEGIN_SERIALIZE();
SERIALIZE_VEC3(VolumeSize);
SERIALIZE_VAL(OnlyIncludeMapGeometry);
SERIALIZE_VAL(CellSize);
SERIALIZE_VAL(CellHeight);
SERIALIZE_VAL(TileSize);
SERIALIZE_VAL(WalkableSlopeAngle);
SERIALIZE_VAL(MaxEdgeLength);
SERIALIZE_VAL(MaxVertsPerPoly);
SERIALIZE_VAL(WalkableHeight);
SERIALIZE_VAL(WalkableClimb);
SERIALIZE_VAL(WalkableRadius);
SERIALIZE_VAL(MaxSimplificationError);
SERIALIZE_VAL(MinRegionArea);
SERIALIZE_VAL(DetailSampleDistance);
SERIALIZE_VAL(DetailsampleMaxError);
SERIALIZE_VAL(AgentHeight);
SERIALIZE_VAL(AgentRadius);
SERIALIZE_VAL(AgentMaxClimb);
if (NavMeshData != nullptr)
{
SERIALIZE_OBJECT(NavMeshData);
}
// Generation config
END_SERIALIZE();
}
bool Deserialize(const json& j)
{
if (j.contains("VolumeSize"))
{
DESERIALIZE_VEC3(j["VolumeSize"], VolumeSize);
}
if (j.contains("OnlyIncludeMapGeometry"))
{
DESERIALIZE_VAL(OnlyIncludeMapGeometry);
}
DESERIALIZE_VAL(CellSize);
DESERIALIZE_VAL(CellHeight);
DESERIALIZE_VAL(TileSize);
DESERIALIZE_VAL(WalkableSlopeAngle);
DESERIALIZE_VAL(MaxEdgeLength);
DESERIALIZE_VAL(MaxVertsPerPoly);
DESERIALIZE_VAL(WalkableHeight);
DESERIALIZE_VAL(WalkableClimb);
DESERIALIZE_VAL(WalkableRadius);
DESERIALIZE_VAL(MaxSimplificationError);
DESERIALIZE_VAL(MinRegionArea);
DESERIALIZE_VAL(DetailSampleDistance);
DESERIALIZE_VAL(DetailsampleMaxError);
DESERIALIZE_VAL(AgentHeight);
DESERIALIZE_VAL(AgentRadius);
DESERIALIZE_VAL(AgentMaxClimb);
if (j.contains("NavMeshData"))
{
NavMeshData = CreateRef<NavMesh>();
NavMeshData->Deserialize(j["NavMeshData"]);
}
return true;
}
};
}