Tutorial_VisualGeometry.cpp

Tutorial_VisualGeometry.cpp
/*
* Copyright 2016 Autodesk, Inc. All rights reserved.
* Use of this software is subject to the terms of the Autodesk license agreement and any attachments or Appendices thereto provided at the time of installation or download,
* or which otherwise accompanies this software in either electronic or hard copy form, or which is signed by you and accepted by Autodesk.
*/
#include "common/basesystemenv.h"
#include "labengine/base/kaimlogimplementation.h"
#include "labengine/base/kaimfileopener.h"
#include "labengine/utils/labengineutils.h"
// This tutorial shows how to recover triangles that represent the NavData loaded in a Database.
namespace
{
// Use BaseSystemEnv to initialize Kaim::BaseSystem in this tutorial.
// For more information on initializing the BaseSystem, see Tutorial_BaseSystem.cpp.
#define KT_TEST_ENV_CLASS BaseSystemEnv
KT_TEST_ENV {}
// Simple class that shows how to collect an array of Triangles representing a the NavData loaded in a Database.
class TutorialVisualGeometry : public Kaim::IVisualGeometry
{
public:
virtual void DoBegin(const Kaim::VisualGeometryPrimitiveCounts& /*primitiveCounts*/) { m_triangles.Clear(); }
virtual void DoPushTriangle(const Kaim::VisualTriangle& triangle) { m_triangles.PushBack(triangle); }
virtual void DoPushLine(const Kaim::VisualLine& /*visualLine*/) {}
virtual void DoPushText(const Kaim::VisualText& /*visualText*/) {}
virtual void DoEnd() {}
KyUInt32 GetTriangleCount() const { return m_triangles.GetCount(); }
private:
};
KT_TUTORIAL // Add NavData with immediate mode (might be slow but convenient).
{
// Create a world and a database.
Kaim::Ptr<Kaim::World> world = *KY_NEW Kaim::World;
Kaim::Database* database = world->GetDatabase(0);
Kaim::Ptr<Kaim::NavData> navData = *KY_NEW Kaim::NavData(database);
Kaim::Ptr<TutorialVisualGeometry> geometry = *KY_NEW TutorialVisualGeometry;
database->SetVisualGeometry(geometry);
LabEngine::KaimFileOpener fileOpener; // NOTE: the SDK comes with a default file opener: Kaim::DefaultFileOpener.
if (navData->Load(KT_ENV.GetAbsoluteInputFileName("generated/plane200x200_80ktri/plane200x200_80ktri.NavData").c_str(), &fileOpener) == KY_ERROR)
return;
navData->Init(database);
navData->AddToDatabaseImmediate(); // To be certain the NavData is added.
// After calling this function (provided the NavData was successfully added),
// geometry should contain all the triangles of the NavData.
database->BuildVisualGeometry();
TestLog() << "There are " << geometry->GetTriangleCount() << " triangles\n";
}
KT_TUTORIAL // Add NavData with async mode, call BuildVisualGeometry() when change detected using GetChangesSinceLastReset
{
// Create a world and a database.
Kaim::Ptr<Kaim::World> world = *KY_NEW Kaim::World;
Kaim::Database* database = world->GetDatabase(0);
Kaim::Ptr<Kaim::NavData> navData = *KY_NEW Kaim::NavData(database);
Kaim::Ptr<TutorialVisualGeometry> geometry = *KY_NEW TutorialVisualGeometry;
database->SetVisualGeometry(geometry);
LabEngine::KaimFileOpener fileOpener; // NOTE: the SDK comes with a default file opener: Kaim::DefaultFileOpener.
if (navData->Load(KT_ENV.GetAbsoluteInputFileName("generated/plane200x200_80ktri/plane200x200_80ktri.NavData").c_str(), &fileOpener) == KY_ERROR)
return;
navData->Init(database);
navData->AddToDatabaseAsync();
while (navData->IsAliveInDatabase() == false)
{
world->Update();
bool hasChanged = database->GetChangesSinceLastReset().IsAnyChanged();
if (hasChanged)
{
database->ResetLastChanges(); // note that after this call, database->GetChangesSinceLastReset().IsAnyChanged() will now return false until a change occur again in the database }
// After calling this function (provided the NavData was successfully added),
// geometry should contain all the triangles of the NavData.
database->BuildVisualGeometry();
TestLog() << "Change since last reset: There are " << geometry->GetTriangleCount() << " triangles\n";
}
}
}
KT_TUTORIAL // Add NavData with async mode, automatically call BuildVisualGeometry() when change occurs using IDatabaseChangeListener
{
class DatabaseVisualGeometryUpdater : public Kaim::IDatabaseChangeListener {
Kaim::Database* m_database;
Kaim::Ptr<TutorialVisualGeometry> m_geometry;
public:
DatabaseVisualGeometryUpdater(Kaim::Database* database)
: m_database(database)
, m_geometry(*KY_NEW TutorialVisualGeometry)
{
database->SetVisualGeometry(m_geometry);
}
virtual void OnDatabaseChange(const Kaim::DatabaseChange& databaseChange)
{
if (databaseChange.IsNavMeshChanged())
{
m_database->BuildVisualGeometry();
TestLog() << "Change listener: There are " << m_geometry->GetTriangleCount() << " triangles\n";
}
}
};
// Create a world and a database.
Kaim::Ptr<Kaim::World> world = *KY_NEW Kaim::World;
Kaim::Database* database = world->GetDatabase(0);
Kaim::Ptr<Kaim::NavData> navData = *KY_NEW Kaim::NavData(database);
Kaim::Ptr<Kaim::IDatabaseChangeListener> updater = *KY_NEW DatabaseVisualGeometryUpdater(database);
database->AddChangeListener(updater);
LabEngine::KaimFileOpener fileOpener; // NOTE: the SDK comes with a default file opener: Kaim::DefaultFileOpener.
if (navData->Load(KT_ENV.GetAbsoluteInputFileName("generated/plane200x200_80ktri/plane200x200_80ktri.NavData").c_str(), &fileOpener) == KY_ERROR)
return;
navData->Init(database);
navData->AddToDatabaseAsync();
while (navData->IsAliveInDatabase() == false)
world->Update();
database->RemoveChangeListener(updater);
}
KT_TUTORIAL // Add NavData with async mode, track change indices manually.
{
// Create a world and a database.
Kaim::Ptr<Kaim::World> world = *KY_NEW Kaim::World;
Kaim::Database* database = world->GetDatabase(0);
Kaim::Ptr<Kaim::NavData> navData = *KY_NEW Kaim::NavData(database);
Kaim::Ptr<TutorialVisualGeometry> geometry = *KY_NEW TutorialVisualGeometry;
database->SetVisualGeometry(geometry);
LabEngine::KaimFileOpener fileOpener; // NOTE: the SDK comes with a default file opener: Kaim::DefaultFileOpener.
if (navData->Load(KT_ENV.GetAbsoluteInputFileName("generated/plane200x200_80ktri/plane200x200_80ktri.NavData").c_str(), &fileOpener) == KY_ERROR)
return;
navData->Init(database);
navData->AddToDatabaseAsync();
KyUInt32 lastNavMeshChangeIdx = database->GetActiveNavMeshChangeIdx();
while (navData->IsAliveInDatabase() == false)
{
world->Update();
if (database->GetActiveNavMeshChangeIdx() != lastNavMeshChangeIdx)
{
lastNavMeshChangeIdx = database->GetActiveNavMeshChangeIdx();
database->BuildVisualGeometry();
TestLog() << "ActiveNavMeshChangeIdx changed: There are " << geometry->GetTriangleCount() << " triangles\n";
}
}
}
}