Skip to content

Commit 6600c4d

Browse files
committed
math modules ready
1 parent f67925c commit 6600c4d

File tree

18 files changed

+337
-254
lines changed

18 files changed

+337
-254
lines changed

main.sharpmake.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public virtual void ConfigureAll(Configuration conf, CustomTarget target)
9696
conf.Defines.Add("_SILENCE_CXX17_RESULT_OF_DEPRECATION_WARNING");
9797

9898

99-
99+
conf.Options.Add(new Sharpmake.Options.Vc.Compiler.DisableSpecificWarnings("4005", "5104", "5105", "5106")); //module reference issues
100100

101101
if (target.Mode == Mode.Dev)
102102
{

sources/Core/Math/Math.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
21
import Constants;
32
import Vectors;
43
import Quaternion;
54
import Matrices;
65

6+
import AABB;
7+
import Frustum;
8+
import Sphere;
9+
import Ray;
710

8-
#include "Primitives/Intersections.h"
11+
import Intersections;

sources/Core/Math/Primitives/AABB.h

Lines changed: 0 additions & 31 deletions
This file was deleted.

sources/Core/Math/Primitives/AABB.cpp renamed to sources/Core/Math/Primitives/AABB.ixx

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,50 @@
1-
#include "pch.h"
2-
#include "AABB.h"
1+
module;
2+
#include "Serialization/serialization_defines.h"
3+
export module AABB;
4+
5+
export import Constants;
6+
export import Vectors;
7+
export import Quaternion;
8+
export import Matrices;
9+
export import Primitive;
10+
11+
import stl.memory;
12+
import stl.core;
13+
import serialization;
14+
15+
export
16+
class AABB : public Primitive
17+
{
18+
public:
19+
vec3 min, max;
20+
21+
AABB() = default;
22+
AABB(Primitive* other);
23+
AABB(std::function<vec3(uint)> functor, unsigned int size);
24+
25+
void set(Primitive* other);
26+
27+
std::shared_ptr<Primitive> clone() override;
28+
const primitive_types get_type() const override;
29+
float get_volume() const override;
30+
void set(Primitive* other, mat4x4& m) override;
31+
32+
vec3 get_min() override;
33+
vec3 get_max() override;
34+
void combine(Primitive* other) override;
35+
void combine(Primitive* other, mat4x4& m) override;
36+
void apply_transform(ptr r, mat4x4& mi) override;
37+
private:
38+
SERIALIZE()
39+
{
40+
ar& SAVE_PARENT(Primitive);
41+
ar& NVP(min)& NVP(max);
42+
}
43+
};
44+
45+
46+
module: private;
47+
348

449
BOOST_CLASS_EXPORT(AABB)
550

@@ -8,9 +53,9 @@ AABB::AABB(Primitive* other) :min(other->get_min()), max(other->get_max())
853
{
954
}
1055

11-
AABB::AABB(std::function<vec3(UINT)> functor, unsigned size) : min(functor(0)), max(min)
56+
AABB::AABB(std::function<vec3(uint)> functor, uint size) : min(functor(0)), max(min)
1257
{
13-
for (unsigned int i = 1; i < size; i++)
58+
for (uint i = 1; i < size; i++)
1459
{
1560
vec3 pos = functor(i);
1661
min = vec3::min(min, pos);

sources/Core/Math/Primitives/Frustum.h

Lines changed: 0 additions & 41 deletions
This file was deleted.

sources/Core/Math/Primitives/Frustum.cpp renamed to sources/Core/Math/Primitives/Frustum.ixx

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,60 @@
1-
#include "pch.h"
2-
#include "Frustum.h"
1+
module;
2+
#include "Serialization/serialization_defines.h"
3+
export module Frustum;
4+
5+
export import Constants;
6+
export import Vectors;
7+
export import Quaternion;
8+
export import Matrices;
9+
export import Primitive;
10+
import Plane;
11+
12+
import stl.memory;
13+
import serialization;
14+
15+
export class Frustum : public Primitive
16+
{
17+
vec3 global_points[8];
18+
mat4x4 inverse_mat;
19+
public:
20+
std::shared_ptr<Primitive>clone() override;
21+
mat4x4 get_transform() const;
22+
23+
vec3 get_max() override;
24+
vec3 get_min() override;
25+
const primitive_types get_type() const override;
26+
void normalize();
27+
void calculate(const mat4x4& inverse_mat);
28+
29+
enum planes
30+
{
31+
plane_near,
32+
plane_far,
33+
plane_left,
34+
plane_right,
35+
plane_top,
36+
plane_bottom,
37+
38+
COUNT
39+
};
40+
41+
Plane& GetFrustumPlane(planes plane);
42+
const Plane& GetFrustumPlane(planes plane) const;
43+
protected:
44+
Plane p[planes::COUNT];
45+
46+
private:
47+
SERIALIZE()
48+
{
49+
ar& SAVE_PARENT(Primitive);
50+
ar& NVP(global_points)& NVP(inverse_mat)& NVP(p);
51+
}
52+
};
53+
54+
55+
56+
module: private;
57+
358

459
vec3 Frustum::get_min()
560
{

sources/Core/Math/Primitives/Intersections.h

Lines changed: 0 additions & 30 deletions
This file was deleted.

sources/Core/Math/Primitives/Intersections.cpp renamed to sources/Core/Math/Primitives/Intersections.ixx

Lines changed: 63 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,50 @@
1-
#include "pch.h"
2-
#include "Intersections.h"
1+
module;
2+
#include "Serialization/serialization_defines.h"
3+
export module Intersections;
34

4-
INTERSECT_TYPE intersect(const Frustum& f, const Sphere& s, const mat4x4* )
5+
export import Constants;
6+
export import Vectors;
7+
export import Quaternion;
8+
export import Matrices;
9+
export import Primitive;
10+
11+
import stl.memory;
12+
import serialization;
13+
14+
import AABB;
15+
import Frustum;
16+
import Sphere;
17+
18+
19+
export {
20+
enum INTERSECT_TYPE
21+
{
22+
FULL_OUT = 0,
23+
FULL_IN = 1,
24+
IN_NEAR = 2
25+
};
26+
27+
INTERSECT_TYPE intersect(const Frustum& f, const Sphere& s, const mat4x4* mat = nullptr);
28+
INTERSECT_TYPE intersect(const Frustum& f, const AABB& aabb, const mat4x4* mat = nullptr);
29+
INTERSECT_TYPE intersect(const AABB* aabb1, const AABB& aabb2, const mat4x4* mat = nullptr);
30+
INTERSECT_TYPE intersect(const Frustum& f, const Primitive* primitive, const mat4x4* mat = nullptr);
31+
32+
33+
template<class T>
34+
std::shared_ptr<Primitive> get_best_primitive(T& functor, unsigned int size)
35+
{
36+
std::shared_ptr<AABB> aabb(new AABB(functor, size));
37+
// std::shared_ptr<Sphere> sphere(new Sphere(functor, size));
38+
return aabb;
39+
}
40+
41+
}
42+
43+
44+
module: private;
45+
46+
47+
INTERSECT_TYPE intersect(const Frustum& f, const Sphere& s, const mat4x4*)
548
{
649
for (int i = 0; i < Frustum::planes::COUNT; ++i)
750
{
@@ -16,23 +59,23 @@ INTERSECT_TYPE intersect(const Frustum& f, const Sphere& s, const mat4x4* )
1659
INTERSECT_TYPE intersect(const Frustum& f, const AABB& aabb, const mat4x4* mat)
1760
{
1861
vec3 p[8];
19-
p[0] = vec3(aabb.max.x, aabb.max.y, aabb.max.z) ;
20-
p[1] = vec3(aabb.max.x, aabb.max.y, aabb.min.z) ;
21-
p[2] = vec3(aabb.max.x, aabb.min.y, aabb.max.z) ;
22-
p[3] = vec3(aabb.max.x, aabb.min.y, aabb.min.z) ;
62+
p[0] = vec3(aabb.max.x, aabb.max.y, aabb.max.z);
63+
p[1] = vec3(aabb.max.x, aabb.max.y, aabb.min.z);
64+
p[2] = vec3(aabb.max.x, aabb.min.y, aabb.max.z);
65+
p[3] = vec3(aabb.max.x, aabb.min.y, aabb.min.z);
2366
p[4] = vec3(aabb.min.x, aabb.max.y, aabb.max.z);
24-
p[5] = vec3(aabb.min.x, aabb.max.y, aabb.min.z);
67+
p[5] = vec3(aabb.min.x, aabb.max.y, aabb.min.z);
2568
p[6] = vec3(aabb.min.x, aabb.min.y, aabb.max.z);
2669
p[7] = vec3(aabb.min.x, aabb.min.y, aabb.min.z);
2770

2871

29-
if (mat) for (auto& el : p)
30-
el = el **mat;
72+
if (mat) for (auto& el : p)
73+
el = el * *mat;
3174
bool out_near = false;
3275

3376
for (int i = 0; i < Frustum::planes::COUNT; ++i)
3477
{
35-
78+
3679
bool bFullyOut = true;
3780

3881
for (int j = 0; j < 8; ++j)
@@ -52,7 +95,7 @@ INTERSECT_TYPE intersect(const Frustum& f, const AABB& aabb, const mat4x4* mat)
5295
return out_near ? INTERSECT_TYPE::IN_NEAR : INTERSECT_TYPE::FULL_IN;
5396
}
5497

55-
INTERSECT_TYPE intersect(const AABB& aabb1, const AABB& aabb2, const mat4x4* , float threshold)
98+
INTERSECT_TYPE intersect(const AABB& aabb1, const AABB& aabb2, const mat4x4*, float threshold)
5699
{
57100
if (aabb1.max.x < aabb2.min.x - threshold || aabb2.max.x < aabb1.min.x - threshold) return INTERSECT_TYPE::FULL_OUT;
58101

@@ -66,15 +109,15 @@ INTERSECT_TYPE intersect(const Frustum& f, const Primitive* primitive, const mat
66109
{
67110
switch (primitive->get_type())
68111
{
69-
case primitive_types::sphere:
70-
{
71-
return intersect(f, *static_cast<const Sphere*>(primitive), mat);
72-
}
112+
case primitive_types::sphere:
113+
{
114+
return intersect(f, *static_cast<const Sphere*>(primitive), mat);
115+
}
73116

74-
case primitive_types::aabb:
75-
{
76-
return intersect(f, *static_cast<const AABB*>(primitive), mat);
77-
}
117+
case primitive_types::aabb:
118+
{
119+
return intersect(f, *static_cast<const AABB*>(primitive), mat);
120+
}
78121
}
79122

80123
return INTERSECT_TYPE::FULL_OUT;

0 commit comments

Comments
 (0)