Pioneer
GeomTree.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 _GEOMTREE_H
5 #define _GEOMTREE_H
6 
7 #include "libs.h"
8 
9 namespace Serializer {
10  class Reader;
11  class Writer;
12 } // namespace Serializer
13 
14 struct isect_t {
15  // triIdx = -1 if no intersection
16  int triIdx;
17  float dist;
18 };
19 
20 class BVHTree;
21 struct BVHNode;
22 
23 class GeomTree {
24 public:
25  GeomTree(const int numVerts, const int numTris, const std::vector<vector3f> &vertices, const std::vector<Uint32> indices, const std::vector<Uint32> triFlags);
27  void Save(Serializer::Writer &wr) const;
28 
29  ~GeomTree();
30 
31  const Aabb &GetAabb() const { return m_aabb; }
32  // dir should be unit length,
33  // isect.dist should be ray length
34  // isect.triIdx should be -1 unless repeat calls with same isect_t
35  void TraceRay(const vector3f &start, const vector3f &dir, isect_t *isect) const;
36  void TraceRay(const BVHNode *startNode, const vector3f &a_origin, const vector3f &a_dir, isect_t *isect) const;
37  vector3f GetTriNormal(int triIdx) const;
38  Uint32 GetTriFlag(int triIdx) const { return m_triFlags[triIdx]; }
39  double GetRadius() const { return m_radius; }
40 
41 #pragma pack(4)
42  struct Edge {
43  int v1i, v2i;
44  float len;
46  // edge triFlag can be weird since edges may get merged and
47  // intended flag lost
48  int triFlag;
49  };
50 #pragma pack()
51 
52  const Edge *GetEdges() const
53  {
54  return &m_edges[0];
55  }
56  int GetNumEdges() const { return m_numEdges; }
57 
58  BVHTree *GetTriTree() const { return m_triTree.get(); }
59  BVHTree *GetEdgeTree() const { return m_edgeTree.get(); }
60 
61  const std::vector<vector3f> &GetVertices() const { return m_vertices; }
62  const Uint32 *GetIndices() const { return &m_indices[0]; }
63  const Uint32 *GetTriFlags() const { return &m_triFlags[0]; }
64  int GetNumVertices() const { return m_numVertices; }
65  int GetNumTris() const { return m_numTris; }
66 
67 private:
68  void RayTriIntersect(int numRays, const vector3f &origin, const vector3f *dirs, int triIdx, isect_t *isects) const;
69 
70  int m_numVertices;
71  int m_numEdges;
72  int m_numTris;
73 
74  double m_radius;
75  Aabb m_aabb;
76  std::vector<Aabb> m_aabbs;
77 
78  std::unique_ptr<BVHTree> m_triTree;
79  std::unique_ptr<BVHTree> m_edgeTree;
80 
81  std::vector<Edge> m_edges;
82 
83  std::vector<vector3f> m_vertices;
84  std::vector<Uint32> m_indices;
85  std::vector<Uint32> m_triFlags;
86 };
87 
88 #endif /* _GEOMTREE_H */
Definition: BVHTree.h:36
Definition: GeomTree.h:23
const std::vector< vector3f > & GetVertices() const
Definition: GeomTree.h:61
BVHTree * GetEdgeTree() const
Definition: GeomTree.h:59
BVHTree * GetTriTree() const
Definition: GeomTree.h:58
int GetNumTris() const
Definition: GeomTree.h:65
~GeomTree()
Definition: GeomTree.cpp:12
void Save(Serializer::Writer &wr) const
Definition: GeomTree.cpp:316
const Uint32 * GetIndices() const
Definition: GeomTree.h:62
int GetNumEdges() const
Definition: GeomTree.h:56
void TraceRay(const vector3f &start, const vector3f &dir, isect_t *isect) const
Definition: GeomTree.cpp:242
double GetRadius() const
Definition: GeomTree.h:39
Uint32 GetTriFlag(int triIdx) const
Definition: GeomTree.h:38
vector3f GetTriNormal(int triIdx) const
Definition: GeomTree.cpp:306
const Uint32 * GetTriFlags() const
Definition: GeomTree.h:63
const Edge * GetEdges() const
Definition: GeomTree.h:52
const Aabb & GetAabb() const
Definition: GeomTree.h:31
GeomTree(const int numVerts, const int numTris, const std::vector< vector3f > &vertices, const std::vector< Uint32 > indices, const std::vector< Uint32 > triFlags)
Definition: GeomTree.cpp:16
int GetNumVertices() const
Definition: GeomTree.h:64
Definition: Serializer.h:110
Definition: Serializer.h:35
Definition: GeomTree.h:9
Definition: Aabb.h:9
Definition: BVHTree.h:13
Definition: GeomTree.h:42
int v1i
Definition: GeomTree.h:43
int v2i
Definition: GeomTree.h:43
int triFlag
Definition: GeomTree.h:48
float len
Definition: GeomTree.h:44
vector3f dir
Definition: GeomTree.h:45
Definition: GeomTree.h:14
float dist
Definition: GeomTree.h:17
int triIdx
Definition: GeomTree.h:16