Pioneer
Loading...
Searching...
No Matches
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
9namespace Serializer {
10 class Reader;
11 class Writer;
12} // namespace Serializer
13
14struct isect_t {
15 // triIdx = -1 if no intersection
16 int triIdx;
17 float dist;
18};
19
20class BVHTree;
21struct BVHNode;
22
23class GeomTree {
24public:
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
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
67private:
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 Edge * GetEdges() const
Definition GeomTree.h:52
BVHTree * GetEdgeTree() const
Definition GeomTree.h:59
const Uint32 * GetIndices() const
Definition GeomTree.h:62
int GetNumTris() const
Definition GeomTree.h:65
~GeomTree()
Definition GeomTree.cpp:12
void Save(Serializer::Writer &wr) const
Definition GeomTree.cpp:316
const Uint32 * GetTriFlags() const
Definition GeomTree.h:63
BVHTree * GetTriTree() const
Definition GeomTree.h:58
int GetNumEdges() const
Definition GeomTree.h:56
void TraceRay(const vector3f &start, const vector3f &dir, isect_t *isect) const
Definition GeomTree.cpp:242
const std::vector< vector3f > & GetVertices() const
Definition GeomTree.h:61
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 Aabb & GetAabb() const
Definition GeomTree.h:31
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