Pioneer
Loading...
Searching...
No Matches
CollisionSpace.h
Go to the documentation of this file.
1// Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3
4#ifndef _COLLISION_SPACE
5#define _COLLISION_SPACE
6
7#include "../vector3.h"
8#include <list>
9
10class Geom;
11struct isect_t;
12struct CollisionContact;
13
14struct Sphere {
16 double radius;
17 void *userData;
18};
19
20class BvhTree;
21
22/*
23 * Collision spaces have a bunch of geoms and at most one sphere (for a planet).
24 */
25// FIXME: CollisionSpace is NOT MOVE/COPY CONSTRUCTIBLE once RebuildObjectTrees
26// has been called. It will cause a double-free due to owning pointers being moved-by-copy.
28public:
31 void AddGeom(Geom *);
32 void RemoveGeom(Geom *);
33 void AddStaticGeom(Geom *);
34 void RemoveStaticGeom(Geom *);
35 void TraceRay(const vector3d &start, const vector3d &dir, double len, CollisionContact *c, const Geom *ignore = nullptr);
36 void Collide(void (*callback)(CollisionContact *));
37 void SetSphere(const vector3d &pos, double radius, void *user_data)
38 {
39 sphere.pos = pos;
40 sphere.radius = radius;
41 sphere.userData = user_data;
42 }
43 void FlagRebuildObjectTrees() { m_needStaticGeomRebuild = true; }
44 void RebuildObjectTrees();
45
46 // Geoms with the same handle will not be collision tested against each other
47 // should be used for geoms that are part of the same body
48 // could also be used for autopiloted groups and LRCs near stations
49 // zero means ungrouped. assumes that wraparound => no old crap left
50 static int GetGroupHandle()
51 {
52 if (!s_nextHandle) s_nextHandle++;
53 return s_nextHandle++;
54 }
55
56private:
57 void CollideGeoms(Geom *a, int minMailboxValue, void (*callback)(CollisionContact *));
58 void CollideRaySphere(const vector3d &start, const vector3d &dir, isect_t *isect);
59 std::list<Geom *> m_geoms;
60 std::list<Geom *> m_staticGeoms;
61 bool m_needStaticGeomRebuild;
62 BvhTree *m_staticObjectTree;
63 BvhTree *m_dynamicObjectTree;
64 Sphere sphere;
65
66 uint32_t m_oldGeomsNumber;
67
68 static int s_nextHandle;
69};
70
71#endif /* _COLLISION_SPACE */
Definition CollisionSpace.cpp:55
Definition CollisionSpace.h:27
void RebuildObjectTrees()
Definition CollisionSpace.cpp:443
void RemoveStaticGeom(Geom *)
Definition CollisionSpace.cpp:275
CollisionSpace()
Definition CollisionSpace.cpp:239
void FlagRebuildObjectTrees()
Definition CollisionSpace.h:43
void AddStaticGeom(Geom *)
Definition CollisionSpace.cpp:268
void TraceRay(const vector3d &start, const vector3d &dir, double len, CollisionContact *c, const Geom *ignore=nullptr)
Definition CollisionSpace.cpp:313
void SetSphere(const vector3d &pos, double radius, void *user_data)
Definition CollisionSpace.h:37
~CollisionSpace()
Definition CollisionSpace.cpp:249
void AddGeom(Geom *)
Definition CollisionSpace.cpp:256
void Collide(void(*callback)(CollisionContact *))
Definition CollisionSpace.cpp:467
static int GetGroupHandle()
Definition CollisionSpace.h:50
void RemoveGeom(Geom *)
Definition CollisionSpace.cpp:262
Definition Geom.h:16
Definition CollisionContact.h:9
Definition CollisionSpace.h:14
double radius
Definition CollisionSpace.h:16
void * userData
Definition CollisionSpace.h:17
vector3d pos
Definition CollisionSpace.h:15
Definition GeomTree.h:14