mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.0 KiB
C++
97 lines
3.0 KiB
C++
#ifndef OPENMW_NAVMESHTOOL_WORLDSPACEDATA_H
|
|
#define OPENMW_NAVMESHTOOL_WORLDSPACEDATA_H
|
|
|
|
#include <components/bullethelpers/collisionobject.hpp>
|
|
#include <components/detournavigator/tilecachedrecastmeshmanager.hpp>
|
|
#include <components/esm3/loadland.hpp>
|
|
#include <components/misc/convert.hpp>
|
|
#include <components/resource/bulletshape.hpp>
|
|
|
|
#include <BulletCollision/CollisionDispatch/btCollisionObject.h>
|
|
#include <BulletCollision/Gimpact/btBoxCollision.h>
|
|
#include <LinearMath/btVector3.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace ESM
|
|
{
|
|
class ESMReader;
|
|
class ReadersCache;
|
|
}
|
|
|
|
namespace VFS
|
|
{
|
|
class Manager;
|
|
}
|
|
|
|
namespace Resource
|
|
{
|
|
class BulletShapeManager;
|
|
}
|
|
|
|
namespace EsmLoader
|
|
{
|
|
struct EsmData;
|
|
}
|
|
|
|
namespace DetourNavigator
|
|
{
|
|
struct Settings;
|
|
}
|
|
|
|
namespace NavMeshTool
|
|
{
|
|
using DetourNavigator::ObjectTransform;
|
|
using DetourNavigator::TileCachedRecastMeshManager;
|
|
|
|
struct WorldspaceNavMeshInput
|
|
{
|
|
ESM::RefId mWorldspace;
|
|
TileCachedRecastMeshManager mTileCachedRecastMeshManager;
|
|
btAABB mAabb;
|
|
bool mAabbInitialized = false;
|
|
|
|
explicit WorldspaceNavMeshInput(ESM::RefId worldspace, const DetourNavigator::RecastSettings& settings);
|
|
};
|
|
|
|
class BulletObject
|
|
{
|
|
public:
|
|
BulletObject(osg::ref_ptr<Resource::BulletShapeInstance>&& shapeInstance, const ESM::Position& position,
|
|
float localScaling)
|
|
: mShapeInstance(std::move(shapeInstance))
|
|
, mObjectTransform{ position, localScaling }
|
|
, mCollisionObject(BulletHelpers::makeCollisionObject(mShapeInstance->mCollisionShape.get(),
|
|
Misc::Convert::toBullet(position.asVec3()),
|
|
Misc::Convert::toBullet(Misc::Convert::makeOsgQuat(position))))
|
|
{
|
|
mShapeInstance->setLocalScaling(btVector3(localScaling, localScaling, localScaling));
|
|
}
|
|
|
|
const osg::ref_ptr<Resource::BulletShapeInstance>& getShapeInstance() const noexcept { return mShapeInstance; }
|
|
const DetourNavigator::ObjectTransform& getObjectTransform() const noexcept { return mObjectTransform; }
|
|
btCollisionObject& getCollisionObject() const noexcept { return *mCollisionObject; }
|
|
|
|
private:
|
|
osg::ref_ptr<Resource::BulletShapeInstance> mShapeInstance;
|
|
DetourNavigator::ObjectTransform mObjectTransform;
|
|
std::unique_ptr<btCollisionObject> mCollisionObject;
|
|
};
|
|
|
|
struct WorldspaceData
|
|
{
|
|
std::vector<std::unique_ptr<WorldspaceNavMeshInput>> mNavMeshInputs;
|
|
std::vector<BulletObject> mObjects;
|
|
std::vector<std::unique_ptr<ESM::Land::LandData>> mLandData;
|
|
std::vector<std::vector<float>> mHeightfields;
|
|
};
|
|
|
|
WorldspaceData gatherWorldspaceData(const DetourNavigator::Settings& settings, ESM::ReadersCache& readers,
|
|
const VFS::Manager& vfs, Resource::BulletShapeManager& bulletShapeManager, const EsmLoader::EsmData& esmData,
|
|
bool processInteriorCells, bool writeBinaryLog);
|
|
}
|
|
|
|
#endif
|