1 // Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _GEOM_H
5 #define _GEOM_H
6 
7 #include "../matrix4x4.h"
8 #include "../vector3.h"
9 
10 struct CollisionContact;
11 class GeomTree;
12 struct isect_t;
13 struct Sphere;
14 struct BVHNode;
15 
16 class Geom {
17 public:
18 	Geom(const GeomTree *geomtree, const matrix4x4d &m, const vector3d &pos, void *data);
19 	void MoveTo(const matrix4x4d &m);
20 	void MoveTo(const matrix4x4d &m, const vector3d &pos);
GetInvTransform()21 	inline const matrix4x4d &GetInvTransform() const { return m_invOrient; }
GetTransform()22 	inline const matrix4x4d &GetTransform() const { return m_orient; }
23 	//matrix4x4d GetRotation() const;
GetPosition()24 	inline const vector3d &GetPosition() const { return m_pos; }
Enable()25 	inline void Enable() { m_active = true; }
Disable()26 	inline void Disable() { m_active = false; }
IsEnabled()27 	inline bool IsEnabled() const { return m_active; }
GetGeomTree()28 	inline const GeomTree *GetGeomTree() const { return m_geomtree; }
29 	void Collide(Geom *b, void (*callback)(CollisionContact *)) const;
30 	void CollideSphere(Sphere &sphere, void (*callback)(CollisionContact *)) const;
GetUserData()31 	inline void *GetUserData() const { return m_data; }
SetMailboxIndex(int idx)32 	inline void SetMailboxIndex(int idx) { m_mailboxIndex = idx; }
GetMailboxIndex()33 	inline int GetMailboxIndex() const { return m_mailboxIndex; }
SetGroup(int g)34 	inline void SetGroup(int g) { m_group = g; }
GetGroup()35 	inline int GetGroup() const { return m_group; }
36 
37 	matrix4x4d m_animTransform;
38 
39 private:
40 	void CollideEdgesWithTrisOf(int &maxContacts, const Geom *b, const matrix4x4d &transTo, void (*callback)(CollisionContact *)) const;
41 	void CollideEdgesTris(int &maxContacts, const BVHNode *edgeNode, const matrix4x4d &transToB,
42 		const Geom *b, const BVHNode *btriNode, void (*callback)(CollisionContact *)) const;
43 
44 	// double-buffer position so we can keep previous position
45 	matrix4x4d m_orient, m_invOrient;
46 	vector3d m_pos;
47 	const GeomTree *m_geomtree;
48 	void *m_data;
49 	int m_group;
50 	int m_mailboxIndex; // used to avoid duplicate collisions
51 	bool m_active;
52 };
53 
54 #endif /* _GEOM_H */
55