mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-06 00:55:50 +00:00
1a12c453d6
Actors may have different collision shapes. Currently there are axis-aligned bounding boxes and rotating bounding boxes. With AABB it's required to use bounding cylinder for navmesh agent to avoid providing paths where actor can't pass. But for rotating bounding boxes cylinder with diameter equal to the front face width should be used to not reduce of available paths. For example rats have rotating bounding box as collision shape because of the difference between front and side faces width. * Add agent bounds to navmesh tile db cache key. This is required to distinguish tiles for agents with different bounds. * Increase navmesh version because navmesh tile db cache key and data has changed. * Move navmesh version to the code to avoid misconfiguration by users. * Fix all places where wrong half extents were used for pathfinding.
79 lines
2.4 KiB
C++
79 lines
2.4 KiB
C++
#ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_GENERATENAVMESHTILE_H
|
|
#define OPENMW_COMPONENTS_DETOURNAVIGATOR_GENERATENAVMESHTILE_H
|
|
|
|
#include "recastmeshprovider.hpp"
|
|
#include "tileposition.hpp"
|
|
#include "agentbounds.hpp"
|
|
|
|
#include <components/sceneutil/workqueue.hpp>
|
|
|
|
#include <osg/Vec3f>
|
|
|
|
#include <cstdint>
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
namespace DetourNavigator
|
|
{
|
|
class OffMeshConnectionsManager;
|
|
class RecastMesh;
|
|
struct NavMeshTileConsumer;
|
|
struct OffMeshConnection;
|
|
struct PreparedNavMeshData;
|
|
struct Settings;
|
|
|
|
struct NavMeshTileInfo
|
|
{
|
|
std::int64_t mTileId;
|
|
std::int64_t mVersion;
|
|
};
|
|
|
|
struct NavMeshTileConsumer
|
|
{
|
|
virtual ~NavMeshTileConsumer() = default;
|
|
|
|
virtual std::int64_t resolveMeshSource(const MeshSource& source) = 0;
|
|
|
|
virtual std::optional<NavMeshTileInfo> find(std::string_view worldspace, const TilePosition& tilePosition,
|
|
const std::vector<std::byte>& input) = 0;
|
|
|
|
virtual void ignore(std::string_view worldspace, const TilePosition& tilePosition) = 0;
|
|
|
|
virtual void identity(std::string_view worldspace, const TilePosition& tilePosition,
|
|
std::int64_t tileId) = 0;
|
|
|
|
virtual void insert(std::string_view worldspace, const TilePosition& tilePosition,
|
|
std::int64_t version, const std::vector<std::byte>& input, PreparedNavMeshData& data) = 0;
|
|
|
|
virtual void update(std::string_view worldspace, const TilePosition& tilePosition,
|
|
std::int64_t tileId, std::int64_t version, PreparedNavMeshData& data) = 0;
|
|
|
|
virtual void cancel(std::string_view reason) = 0;
|
|
};
|
|
|
|
class GenerateNavMeshTile final : public SceneUtil::WorkItem
|
|
{
|
|
public:
|
|
GenerateNavMeshTile(std::string worldspace, const TilePosition& tilePosition,
|
|
RecastMeshProvider recastMeshProvider, const AgentBounds& agentBounds, const Settings& settings,
|
|
std::weak_ptr<NavMeshTileConsumer> consumer);
|
|
|
|
void doWork() final;
|
|
|
|
private:
|
|
const std::string mWorldspace;
|
|
const TilePosition mTilePosition;
|
|
const RecastMeshProvider mRecastMeshProvider;
|
|
const AgentBounds mAgentBounds;
|
|
const Settings& mSettings;
|
|
std::weak_ptr<NavMeshTileConsumer> mConsumer;
|
|
|
|
inline void impl() noexcept;
|
|
};
|
|
}
|
|
|
|
#endif
|