3#include <zenkit/Mesh.hh>
5#include <Tempest/Matrix4x4>
9class btTriangleIndexVertexArray;
10class btCollisionShape;
11class btCollisionObject;
80 std::swap(owner,it.owner);
81 std::swap(obj,it.obj);
86 const Tempest::Vec3&
position()
const;
104 void implSetPosition(
const Tempest::Vec3& pos);
112 Item(
DynamicWorld* owner, btCollisionObject* obj, btCollisionShape* shp):owner(owner),obj(obj),shp(shp){}
113 Item(
Item&& it):owner(it.owner),obj(it.obj),shp(it.shp){ it.obj=
nullptr; it.shp=
nullptr; }
117 std::swap(owner,it.owner);
118 std::swap(obj, it.obj);
119 std::swap(shp, it.shp);
130 btCollisionObject* obj =
nullptr;
131 btCollisionShape* shp =
nullptr;
137 zenkit::MaterialGroup
mat = zenkit::MaterialGroup::UNDEFINED;
161 virtual void onCollide(zenkit::MaterialGroup matId){(void)matId;}
173 void move(
const Tempest::Vec3& to);
179 float speed()
const {
return dirL; }
183 Tempest::Matrix4x4
matrix()
const;
184 bool isSpell()
const {
return spl!=std::numeric_limits<int>::max(); }
194 Tempest::Vec3 pos={};
195 Tempest::Vec3 lastPos={};
197 Tempest::Vec3 dir={};
200 int spl=std::numeric_limits<int>::max();
227 btCollisionShape* shape =
nullptr;
228 btRigidBody* obj =
nullptr;
238 RayLandResult ray (
const Tempest::Vec3& from,
const Tempest::Vec3& to)
const;
240 float soundOclusion(
const Tempest::Vec3& from,
const Tempest::Vec3& to)
const;
251 void tick(uint64_t dt);
261 enum ItemType : uint8_t {
266 Item createObj(btCollisionShape* shape,
bool ownShape,
const Tempest::Matrix4x4& m,
267 float mass,
float friction, ItemType type);
270 void moveBullet(BulletBody& b,
const Tempest::Vec3& dir, uint64_t dt);
271 RayWaterResult implWaterRay(
const Tempest::Vec3& from,
const Tempest::Vec3& to)
const;
272 bool hasCollision(
const NpcItem &it, CollisionTest& out);
274 std::unique_ptr<CollisionWorld> world;
276 std::vector<std::string> sectors;
278 std::vector<btVector3> landVbo;
279 std::unique_ptr<PhysicVbo> landMesh;
280 std::unique_ptr<btCollisionShape> landShape;
281 std::unique_ptr<btRigidBody> landBody;
283 std::unique_ptr<btCollisionShape> waterShape;
284 std::unique_ptr<btRigidBody> waterBody;
285 std::unique_ptr<PhysicVbo> waterMesh;
287 std::unique_ptr<NpcBodyList> npcList;
288 std::unique_ptr<BulletsList> bulletList;
289 std::unique_ptr<BBoxList> bboxList;
291 static const float ghostHeight;
292 static const float worldHeight;
static constexpr float bulletSpeed
Item movableObj(const PhysicMeshShape *src, const Tempest::Matrix4x4 &m)
RayWaterResult waterRay(const Tempest::Vec3 &from) const
RayCamResult cameraRay(const Tempest::Vec3 &from, const Tempest::Vec3 &to) const
static const float ghostPadding
static constexpr float gravity
static float materialFriction(zenkit::MaterialGroup mat)
static constexpr float spellSpeed
BBoxBody bboxObj(BBoxCallback *cb, const zenkit::AxisAlignedBoundingBox &bbox)
void deleteObj(BulletBody *obj)
float soundOclusion(const Tempest::Vec3 &from, const Tempest::Vec3 &to) const
DynamicWorld(const DynamicWorld &)=delete
RayLandResult landRay(const Tempest::Vec3 &from, float maxDy=0) const
Item dynamicObj(const Tempest::Matrix4x4 &pos, const Bounds &bbox, zenkit::MaterialGroup mat)
RayLandResult ray(const Tempest::Vec3 &from, const Tempest::Vec3 &to) const
std::string_view validateSectorName(std::string_view name) const
static float materialDensity(zenkit::MaterialGroup mat)
Item staticObj(const PhysicMeshShape *src, const Tempest::Matrix4x4 &m)
BulletBody * bulletObj(BulletCallback *cb)
NpcItem ghostObj(std::string_view visual)
RayQueryResult rayNpc(const Tempest::Vec3 &from, const Tempest::Vec3 &to, const Npc *except) const
static constexpr float gravityMS
BBoxBody & operator=(BBoxBody &&other)
virtual void onCollide(BulletBody &other)
virtual ~BBoxCallback()=default
void setPosition(const Tempest::Vec3 &pos)
void setTargetRange(float tgRange)
void move(const Tempest::Vec3 &to)
float targetRange() const
Tempest::Matrix4x4 matrix() const
Tempest::Vec3 direction() const
Tempest::Vec3 position() const
void setDirection(const Tempest::Vec3 &dir)
virtual ~BulletCallback()=default
virtual bool onCollide(Npc &other)
virtual void onCollide(zenkit::MaterialGroup matId)
void setInteractive(Interactive *it)
void setObjMatrix(const Tempest::Matrix4x4 &m)
Item & operator=(Item &&it)
Item(DynamicWorld *owner, btCollisionObject *obj, btCollisionShape *shp)
bool testMove(const Tempest::Vec3 &to, CollisionTest &out)
void setPosition(const Tempest::Vec3 &pos)
bool hasCollision() const
void setUserPointer(void *p)
const Tempest::Vec3 & position() const
auto tryMove(const Tempest::Vec3 &to, CollisionTest &out) -> DynamicWorld::MoveCode
NpcItem & operator=(NpcItem &&it)
NpcItem(DynamicWorld *owner, NpcBody *obj, float r)
zenkit::MaterialGroup mat