#include "common/oneworldenv.h"
#include "LabEngine/gamebot.h"
#include "LabEngine/base/kaimlogimplementation.h"
#include "LabEngine/base/kaimfileopener.h"
#include "LabEngine/utils/labengineutils.h"
#include "LabEngine/randompoints/randompointsmanager.h"
namespace
{
template<class TraverseLogic>
class PointGridValidator
{
public:
{
m_origin = center -
Kaim::Vec3f(halfWidth, halfWidth, halfWidth);
m_width = 2.f * halfWidth;
m_pointDistance = distanceBetweenPoints;
m_traverseLogicUserData = traverseLogicUserData;
const Kaim::CellPos maxCellPos(cellPos.
x + widthCellSize, cellPos.
y + widthCellSize);
m_cellBox.Set(minCellPos, maxCellPos);
KyInt32 pointCountOnXOrYAxis = 1 +
KyInt32(m_width / m_pointDistance);
m_validGridPoints.Clear();
m_validGridPoints.Reserve(pointCountOnXOrYAxis * pointCountOnXOrYAxis * pointCountOnZAxis);
}
private:
{
if (navhalfEdgeRawPtr.
IsHalfEdgeCrossable<TraverseLogic>(m_traverseLogicUserData, neighborNavHalfEdgeRawPtr) ==
true)
{
m_neighborTrianglePtr[halfEdgeIdx].Set(
);
}
else
{
m_neighborTrianglePtr[halfEdgeIdx].Invalidate();
}
}
public:
{
RetrieveNeighborTriangle(triangleRawPtr, 0);
RetrieveNeighborTriangle(triangleRawPtr, 1);
RetrieveNeighborTriangle(triangleRawPtr, 2);
KyInt32 maxXInGrid = 1 +
KyInt32((maxX - m_origin.x) / m_pointDistance);
KyInt32 maxYInGrid = 1 +
KyInt32((maxY - m_origin.y) / m_pointDistance);
for (
KyInt32 x = minXInGrid; x < maxXInGrid; ++x)
{
for (
KyInt32 y = minYInGrid; y < maxYInGrid; ++y)
{
pointInGrid.
x += x * m_pointDistance;
pointInGrid.
y += y * m_pointDistance;
if (Kaim::Intersections::IsPointInsideTriangle2d(pointInGrid, triangle[0], triangle[1], triangle[2]))
{
pointInGrid.
z = Kaim::Intersections::ComputeAltitudeOfPointInTriangle(pointInGrid, triangle[0], triangle[1], triangle[2]);
m_validGridPoints.PushBack(pointInGrid);
}
}
}
}
bool IsSearchFinished()
{
return false;
}
{
return m_cellBox.IsInside(triangleRawPtr.
GetCellPos())
}
{
return m_neighborTrianglePtr[indexOfNeighborTriangle].IsValid() &&
ShouldVisitTriangle(m_neighborTrianglePtr[indexOfNeighborTriangle]);
}
{
return m_neighborTrianglePtr[indexOfNeighborTriangle];
}
private:
void* m_traverseLogicUserData;
};
#define TEST_ENV_CLASS OneWorldEnv
TEST_ENV {}
TUTORIAL
{
KT_LOG_TITLE_BEGIN("TUTORIAL - BreadthFirstSearchTraversal");
CHECK(env.LoadAndAddNavData(
"GeneratedNavData/opencastle/opencastle.NavData") !=
KY_NULL);
env.StartVisualDebugUsingLocalFile("BreadthFirstSearchTraversal.VisualDebug");
env.Update();
env.Update();
LabEngine::GameBotInitConfig gameBotInitConfig;
gameBotInitConfig.m_botInitConfig.m_database = navDatabase;
gameBotInitConfig.m_botInitConfig.m_startPosition.Set(-3.2222f,36.358f,10.486f);
Kaim::Ptr<LabEngine::GameBot> gameBot = env.AddBotFromConfig(gameBotInitConfig);
env.Update();
LabEngine::ReproducibleRand reproductibleRand;
PointGridValidator<LabEngine::GameTraverseLogic> pointGridValidator;
for (
KyUInt32 loopIdx = 0; loopIdx < 5 ; ++loopIdx)
{
const KyFloat32 distanceAroundPosition = 10.f * (1+loopIdx);
pointGridValidator.Initialize(genMetrics, gameBot->m_navBot->GetPosition(),
distanceAroundPosition, distanceBetweenPoints, gameBot->m_navBot->GetBotTraverseLogicUserData());
Kaim::BreadthFirstSearchTraversal< PointGridValidator<LabEngine::GameTraverseLogic> > traversal(queryUtils, pointGridValidator.GetCellBox(), pointGridValidator);
CHECK(traversal.IsInitialized());
traversal.SetStartTriangle(gameBot->m_navBot->GetNavTrianglePtr().GetRawPtr());
Kaim::TraversalResult traversalResult = traversal.Search();
CHECK(traversalResult == Kaim::TraversalResult_DONE && validPoints.
GetCount() != 0);
displayListIdentifier = displayList.InitUserControlledLifespan("PointGridValidator", "BreadthFirstSearchTraversal", displayListIdentifier);
for (
KyUInt32 i = 0; i < validPoints.GetCount(); ++i)
{
displayList.PushPoint(validPoints[i],
}
displayList.Flush();
env.Update();
const KyUInt32 bufferSize = validPoints.GetCount();
const KyUInt32 factor = 1 + (bufferSize / RAND_MAX);
const KyUInt32 posIndex = (reproductibleRand.GetRandUInt() * factor) % (bufferSize);
gameBot->PushWayPoint(dest);
env.Update();
while (gameBot->m_status != LabEngine::GameBot::Arrived)
env.Update();
gameBot->ClearRoute();
}
env.Update();
env.Update();
}
}