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