OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
collisionworld.h
Go to the documentation of this file.
1#pragma once
2
3#include <Tempest/Matrix4x4>
4#include <Tempest/Vec>
5
6#include <zenkit/Material.hh>
7
8#include <memory>
9#include <vector>
10#include <functional>
11
12#include "physics/physics.h"
13
14class btCollisionConfiguration;
15class btConstraintSolver;
16
17class Item;
18class Interactive;
19
20class CollisionWorld : public btDiscreteDynamicsWorld {
21 public:
23
24 static float toMeters (const float v);
25 static btVector3 toMeters (const Tempest::Vec3& v);
26 static const Tempest::Vec3 toCentimeters(const btVector3& v);
27
28 using btDiscreteDynamicsWorld::operator new;
29 using btDiscreteDynamicsWorld::operator delete;
30
31 class CollisionBody;
32 class DynamicBody;
33 class RayCallback;
34
35 void tick(uint64_t dt);
36 void setBBox(const btVector3& min, const btVector3& max);
37 void setItemHitCallback(std::function<void(Item& itm, zenkit::MaterialGroup mat, float impulse, float mass)> f);
38
39 void updateAabbs() override;
40 void touchAabbs();
41
42 bool hasCollision(const btCollisionObject &it, Tempest::Vec3& normal);
43 bool hasCollision(btRigidBody& it, Tempest::Vec3& normal, Interactive*& vob);
44
45 std::unique_ptr<CollisionBody> addCollisionBody(btCollisionShape& shape, const Tempest::Matrix4x4& tr, float friction);
46 std::unique_ptr<DynamicBody> addDynamicBody (btCollisionShape& shape, const Tempest::Matrix4x4& tr, float friction, float mass);
47
48 void rayCast(const Tempest::Vec3& b, const Tempest::Vec3& e, RayResultCallback& cb);
49
50 class CollisionBody : public btRigidBody {
51 public:
53 private:
54 CollisionBody(btRigidBody::btRigidBodyConstructionInfo& inf, CollisionWorld* owner);
55 CollisionWorld* owner = nullptr;
56 friend class CollisionWorld;
58 };
59
60 class DynamicBody : public CollisionBody {
61 DynamicBody(btRigidBody::btRigidBodyConstructionInfo& inf, CollisionWorld* owner)
62 :CollisionBody(inf,owner), mass(inf.m_mass){}
63 friend class CollisionWorld;
64 const float mass = 0;
65 };
66
67 private:
68 struct Broadphase;
69 struct ContructInfo;
70
71 CollisionWorld(std::unique_ptr<btCollisionConfiguration>&& conf);
73
74 bool tick(float step, btRigidBody& body);
75
76 void saveKinematicState(btScalar timeStep) override;
77
78 std::unique_ptr<btCollisionConfiguration> conf;
79 std::unique_ptr<btCollisionDispatcher> disp;
80 std::unique_ptr<btBroadphaseInterface> broad;
81 std::unique_ptr<btSequentialImpulseConstraintSolver> solver;
82
83 std::function<void(Item& itm, zenkit::MaterialGroup mat, float impulse, float mass)> hitItem;
84
85 std::vector<btRigidBody*> rigid;
86 btVector3 gravity = btVector3(0,0,0);
87 btVector3 bbox[2] = {btVector3(0,0,0), btVector3(0,0,0)};
88
89 mutable uint32_t aabbChanged = 0;
90 };
91
friend class CollisionWorld::DynamicBody
std::unique_ptr< CollisionBody > addCollisionBody(btCollisionShape &shape, const Tempest::Matrix4x4 &tr, float friction)
void tick(uint64_t dt)
static const Tempest::Vec3 toCentimeters(const btVector3 &v)
void setItemHitCallback(std::function< void(Item &itm, zenkit::MaterialGroup mat, float impulse, float mass)> f)
void rayCast(const Tempest::Vec3 &b, const Tempest::Vec3 &e, RayResultCallback &cb)
bool hasCollision(const btCollisionObject &it, Tempest::Vec3 &normal)
static float toMeters(const float v)
void setBBox(const btVector3 &min, const btVector3 &max)
std::unique_ptr< DynamicBody > addDynamicBody(btCollisionShape &shape, const Tempest::Matrix4x4 &tr, float friction, float mass)
void updateAabbs() override
Definition item.h:14