55 lines
2.0 KiB
C++
55 lines
2.0 KiB
C++
// Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
|
|
// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
|
|
|
|
#ifndef _GEOM_H
|
|
#define _GEOM_H
|
|
|
|
#include "../matrix4x4.h"
|
|
#include "../vector3.h"
|
|
|
|
struct CollisionContact;
|
|
class GeomTree;
|
|
struct isect_t;
|
|
struct Sphere;
|
|
struct BVHNode;
|
|
|
|
class Geom {
|
|
public:
|
|
Geom(const GeomTree *geomtree, const matrix4x4d &m, const vector3d &pos, void *data);
|
|
void MoveTo(const matrix4x4d &m);
|
|
void MoveTo(const matrix4x4d &m, const vector3d &pos);
|
|
inline const matrix4x4d &GetInvTransform() const { return m_invOrient; }
|
|
inline const matrix4x4d &GetTransform() const { return m_orient; }
|
|
//matrix4x4d GetRotation() const;
|
|
inline const vector3d &GetPosition() const { return m_pos; }
|
|
inline void Enable() { m_active = true; }
|
|
inline void Disable() { m_active = false; }
|
|
inline bool IsEnabled() const { return m_active; }
|
|
inline const GeomTree *GetGeomTree() const { return m_geomtree; }
|
|
void Collide(Geom *b, void (*callback)(CollisionContact *)) const;
|
|
void CollideSphere(Sphere &sphere, void (*callback)(CollisionContact *)) const;
|
|
inline void *GetUserData() const { return m_data; }
|
|
inline void SetMailboxIndex(int idx) { m_mailboxIndex = idx; }
|
|
inline int GetMailboxIndex() const { return m_mailboxIndex; }
|
|
inline void SetGroup(int g) { m_group = g; }
|
|
inline int GetGroup() const { return m_group; }
|
|
|
|
matrix4x4d m_animTransform;
|
|
|
|
private:
|
|
void CollideEdgesWithTrisOf(int &maxContacts, const Geom *b, const matrix4x4d &transTo, void (*callback)(CollisionContact *)) const;
|
|
void CollideEdgesTris(int &maxContacts, const BVHNode *edgeNode, const matrix4x4d &transToB,
|
|
const Geom *b, const BVHNode *btriNode, void (*callback)(CollisionContact *)) const;
|
|
|
|
// double-buffer position so we can keep previous position
|
|
matrix4x4d m_orient, m_invOrient;
|
|
vector3d m_pos;
|
|
const GeomTree *m_geomtree;
|
|
void *m_data;
|
|
int m_group;
|
|
int m_mailboxIndex; // used to avoid duplicate collisions
|
|
bool m_active;
|
|
};
|
|
|
|
#endif /* _GEOM_H */
|