@@ -24,30 +24,58 @@ class Mesh;
2424/*
2525Bounding volume base struct
2626*/
27- struct Volume {
28- Mesh* mesh;
29- Vec3 center{0 .0f , 0 .0f , 0 .0f };
27+ struct BoundingVolume {
28+ const VolumeType TYPE;
29+ Object3D* obj = nullptr ;
30+ Vec3 center = {0 .0f , 0 .0f , 0 .0f };
31+ Vec3 maxCoords = {0 .0f , 0 .0f , 0 .0f };
32+ Vec3 minCoords = {INFINITY, INFINITY, INFINITY};
33+
34+ BoundingVolume (VolumeType t, Object3D* o)
35+ : TYPE(t)
36+ , obj(o) {
37+ }
3038
3139 virtual void setup (Mesh* const mesh) = 0;
3240
3341 virtual bool is_on_frustrum (const Frustum& frustum) const = 0;
3442};
35- struct Sphere : public Volume {
43+ typedef BoundingVolume BVolume;
44+ typedef BoundingVolume BV;
45+
46+ struct BoundingSphere : public BVolume {
3647 float radius{0 .0f };
3748
38- Sphere () = default ;
49+ BoundingSphere (Object3D* o)
50+ : BVolume(VolumeType::SPHERE_VOLUME, o) {
51+ }
3952
40- Sphere (const Vec3 c, const float r)
41- : radius(r) {
53+ BoundingSphere (const Vec3 c, const float r, Object3D* o)
54+ : radius(r)
55+ , BVolume(VolumeType::SPHERE_VOLUME, o) {
4256 center = c;
4357 }
4458
4559 virtual void setup (Mesh* const mesh);
4660
4761 virtual bool is_on_frustrum (const Frustum& frustum) const ;
4862};
49- struct AABB : public Volume {
50- // TO DO
63+ struct AABB : public BVolume {
64+
65+ AABB (Object3D* o)
66+ : BVolume(VolumeType::AABB_VOLUME, o) {
67+ }
68+
69+ AABB (const Vec3 min, const Vec3 max, Object3D* o)
70+ : BoundingVolume(VolumeType::AABB_VOLUME, o) {
71+ minCoords = min;
72+ maxCoords = max;
73+ center = (maxCoords + minCoords) * 0 .5f ;
74+ }
75+
76+ virtual void setup (Mesh* const mesh);
77+
78+ virtual bool is_on_frustrum (const Frustum& frustum) const ;
5179};
5280
5381/*
@@ -59,8 +87,7 @@ class Mesh : public Object3D
5987 std::vector<Geometry*> m_geometry;
6088 std::vector<IMaterial*> m_material;
6189
62- VolumeType m_volumeType = SPHERE_VOLUME;
63- Volume* m_volume = nullptr ;
90+ BV* m_volume = nullptr ;
6491 bool m_affectedByFog = true ;
6592 bool m_castShadows = true ;
6693 bool m_receiveShadows = true ;
@@ -77,12 +104,12 @@ class Mesh : public Object3D
77104 public:
78105 Mesh ()
79106 : Object3D(" Mesh #" + std::to_string(Mesh::m_instanceCount), ObjectType::MESH)
80- , m_volume(new Sphere() ) {
107+ , m_volume(nullptr ) {
81108 Mesh::m_instanceCount++;
82109 }
83110 Mesh (Geometry* geom, IMaterial* mat)
84111 : Object3D(" Mesh #" + std::to_string(Mesh::m_instanceCount), ObjectType::MESH)
85- , m_volume(new Sphere() ) {
112+ , m_volume(nullptr ) {
86113 Mesh::m_instanceCount++;
87114 m_geometry.push_back (geom);
88115 m_material.push_back (mat);
@@ -173,17 +200,8 @@ class Mesh : public Object3D
173200 inline bool ray_hittable () const {
174201 return m_rayHittable;
175202 }
176- inline VolumeType get_volume_type () const {
177- return m_volumeType;
178- }
179- void set_volume_type (VolumeType t);
180-
181- inline void setup_volume () {
182- if (m_volume)
183- m_volume->setup (this );
184- }
185203
186- inline const Volume * const get_bounding_volume () const {
204+ inline const BV * const get_bounding_volume () const {
187205 return m_volume;
188206 }
189207
@@ -202,6 +220,7 @@ class Mesh : public Object3D
202220 m_geometry[geometrySlot]->set_material_ID (materialSlot);
203221 }
204222
223+ void setup_volume (VolumeType type = VolumeType::SPHERE_VOLUME);
205224 Mesh* clone () const ;
206225};
207226} // namespace Core
0 commit comments