Pioneer
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 
10 class Geom;
11 struct isect_t;
12 struct CollisionContact;
13 
14 struct Sphere {
16  double radius;
17  void *userData;
18 };
19 
20 class 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.
28 public:
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 
56 private:
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