Unfinished Work
This commit is contained in:
@@ -29,7 +29,8 @@ file(GLOB_RECURSE J3ML_SRC "src/J3ML/*.c" "src/J3ML/*.cpp")
|
||||
include_directories("include")
|
||||
|
||||
add_library(J3ML SHARED ${J3ML_SRC}
|
||||
include/J3ML/Geometry/Common.h)
|
||||
include/J3ML/Geometry/Common.h
|
||||
src/J3ML/Geometry/Triangle.cpp)
|
||||
set_target_properties(J3ML PROPERTIES LINKER_LANGUAGE CXX)
|
||||
|
||||
install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME})
|
||||
|
@@ -8,6 +8,8 @@
|
||||
|
||||
namespace J3ML::Geometry
|
||||
{
|
||||
|
||||
|
||||
using namespace J3ML::LinearAlgebra;
|
||||
using J3ML::Algorithm::RNG;
|
||||
// A 3D axis-aligned bounding box
|
||||
@@ -99,14 +101,15 @@ namespace J3ML::Geometry
|
||||
AABB TransformAABB(const Matrix4x4& transform);
|
||||
AABB TransformAABB(const Quaternion& transform);
|
||||
OBB Transform(const Matrix3x3& transform) const;
|
||||
OBB Transform(const Matrix4x4& transform);
|
||||
OBB Transform(const Quaternion& transform);
|
||||
OBB Transform(const Matrix4x4& transform) const;
|
||||
OBB Transform(const Quaternion& transform) const;
|
||||
bool Contains(const Vector3& point) const;
|
||||
bool Contains(const Vector3& aabbMinPoint, const Vector3& aabbMaxPoint) const;
|
||||
bool Contains(const LineSegment& lineSegment) const;
|
||||
bool Contains(const AABB& aabb) const;
|
||||
bool Contains(const OBB& obb) const;
|
||||
bool Contains(const Sphere& sphere) const;
|
||||
bool Contains(const Triangle& triange) const;
|
||||
bool Contains(const Triangle& triangle) const;
|
||||
bool Contains(const Polygon& polygon) const;
|
||||
bool Contains(const Frustum& frustum) const;
|
||||
bool Contains(const Polyhedron& polyhedron) const;
|
||||
|
@@ -3,12 +3,14 @@
|
||||
#include "LineSegment.h"
|
||||
#include "Shape.h"
|
||||
#include <J3ML/LinearAlgebra/Vector3.h>
|
||||
#include <J3ML/Geometry/Common.h>
|
||||
|
||||
namespace J3ML::Geometry
|
||||
{
|
||||
using namespace LinearAlgebra;
|
||||
class Capsule : public Shape
|
||||
{
|
||||
public:
|
||||
// Specifies the two inner points of this capsule
|
||||
LineSegment l;
|
||||
// Specifies the radius of this capsule
|
||||
@@ -24,5 +26,6 @@ namespace J3ML::Geometry
|
||||
Vector3 Center() const;
|
||||
Vector3 Centroid() const;
|
||||
Vector3 ExtremePoint(const Vector3& direction);
|
||||
AABB MinimalEnclosingAABB() const;
|
||||
};
|
||||
}
|
@@ -3,9 +3,10 @@
|
||||
//
|
||||
#pragma once
|
||||
|
||||
#include <J3ML/Geometry/Common.h>
|
||||
#include "Plane.h"
|
||||
#include "Shape.h"
|
||||
#include <J3ML/LinearAlgebra/CoordinateFrame.h>
|
||||
#include <J3ML/LinearAlgebra.h>
|
||||
|
||||
namespace J3ML::Geometry
|
||||
{
|
||||
@@ -37,6 +38,7 @@ namespace J3ML::Geometry
|
||||
Plane FarFace;
|
||||
Plane NearFace;
|
||||
static Frustum CreateFrustumFromCamera(const CoordinateFrame& cam, float aspect, float fovY, float zNear, float zFar);
|
||||
AABB MinimalEnclosingAABB() const;
|
||||
};
|
||||
|
||||
|
||||
|
@@ -47,6 +47,7 @@ namespace J3ML::Geometry {
|
||||
Vector3 HalfDiagonal() const;
|
||||
void Transform(const Matrix3x3& transform);
|
||||
void Transform(const Matrix4x4& transform);
|
||||
void Transform(const Quaternion& transform);
|
||||
bool IsFinite() const;
|
||||
bool IsDegenerate() const;
|
||||
Vector3 CenterPoint() const;
|
||||
|
@@ -1,11 +1,27 @@
|
||||
#pragma once
|
||||
|
||||
#include <J3ML/Geometry/Common.h>
|
||||
#include <vector>
|
||||
#include "Shape.h"
|
||||
#include "J3ML/LinearAlgebra.h"
|
||||
|
||||
namespace J3ML::Geometry {
|
||||
|
||||
class Polygon : public Shape
|
||||
{
|
||||
public:
|
||||
std::vector<Vector3> vertices;
|
||||
AABB MinimalEnclosingAABB() const;
|
||||
int NumVertices() const
|
||||
{
|
||||
return (int)vertices.size();
|
||||
}
|
||||
Vector3 Vertex(int vertexIndex) const
|
||||
{
|
||||
assert(vertexIndex >= 0);
|
||||
assert(vertexIndex < (int) vertices.size());
|
||||
return vertices[vertexIndex];
|
||||
}
|
||||
protected:
|
||||
private:
|
||||
};
|
||||
|
@@ -1,9 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include <J3ML/Geometry/Common.h>
|
||||
#include <J3ML/Geometry/Shape.h>
|
||||
#include <vector>
|
||||
#include <J3ML/LinearAlgebra/Vector3.h>
|
||||
|
||||
|
||||
namespace J3ML::Geometry
|
||||
{
|
||||
using namespace J3ML::LinearAlgebra;
|
||||
@@ -30,6 +32,13 @@ namespace J3ML::Geometry
|
||||
|
||||
// Specifies the vertices of this polyhedron.
|
||||
std::vector<Vector3> v;
|
||||
std::vector<Face> f;
|
||||
|
||||
int NumVertices() const {return (int)v.size();}
|
||||
int NumFaces() const { return (int)f.size();}
|
||||
AABB MinimalEnclosingAABB() const;
|
||||
|
||||
Vector3 Vertex(int vertexIndex) const;
|
||||
|
||||
protected:
|
||||
private:
|
||||
|
@@ -1,5 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <J3ML/Geometry/Common.h>
|
||||
#include <J3ML/LinearAlgebra.h>
|
||||
|
||||
namespace J3ML::Geometry
|
||||
{
|
||||
class Triangle
|
||||
@@ -9,9 +12,9 @@ namespace J3ML::Geometry
|
||||
Vector3 V1;
|
||||
Vector3 V2;
|
||||
|
||||
bool Intersects(const AABB& aabb) const
|
||||
{
|
||||
return aabb.Intersects(*this);
|
||||
}
|
||||
bool Intersects(const AABB& aabb) const;
|
||||
AABB BoundingAABB() const;
|
||||
};
|
||||
|
||||
|
||||
}
|
@@ -42,6 +42,7 @@ using namespace J3ML::SizedFloatTypes;
|
||||
namespace J3ML::Math
|
||||
{
|
||||
|
||||
bool EqualAbs(float a, float b, float epsilon = 1e-3f);
|
||||
|
||||
// Coming soon: Units Namespace
|
||||
// For Dimensional Analysis
|
||||
|
@@ -51,6 +51,10 @@ namespace J3ML::LinearAlgebra {
|
||||
Vector3 GetRow(int index) const;
|
||||
Vector3 GetColumn(int index) const;
|
||||
|
||||
Vector3 GetRow3(int index) const;
|
||||
|
||||
Vector3 GetColumn3(int index) const;
|
||||
|
||||
float &At(int row, int col);
|
||||
float At(int x, int y) const;
|
||||
|
||||
@@ -143,6 +147,14 @@ namespace J3ML::LinearAlgebra {
|
||||
// Returns true if the row vectors of this matrix are all perpendicular to each other.
|
||||
bool IsRowOrthogonal(float epsilon = 1e-3f) const;
|
||||
|
||||
|
||||
|
||||
bool HasUniformScale(float epsilon = 1e-3f) const;
|
||||
|
||||
Vector3 ExtractScale() const {
|
||||
return {GetColumn(0).Length(), GetColumn(1).Length(), GetColumn(2).Length()};
|
||||
}
|
||||
|
||||
protected:
|
||||
float elems[3][3];
|
||||
};
|
||||
|
@@ -232,12 +232,16 @@ namespace J3ML::LinearAlgebra {
|
||||
Matrix4x4 operator *(float scalar) const;
|
||||
Matrix4x4 operator /(float scalar) const;
|
||||
|
||||
|
||||
Vector4 operator[](int row) const;
|
||||
|
||||
Vector2 operator * (const Vector2& rhs) const;
|
||||
Vector3 operator * (const Vector3& rhs) const;
|
||||
Vector4 operator * (const Vector4& rhs) const;
|
||||
|
||||
Vector2 Mul(const Vector2& rhs) const;
|
||||
Vector3 Mul(const Vector3& rhs) const;
|
||||
Vector4 Mul(const Vector4& rhs) const;
|
||||
|
||||
Matrix4x4 operator * (const Matrix3x3 &rhs) const;
|
||||
|
||||
Matrix4x4 operator +() const;
|
||||
@@ -248,8 +252,18 @@ namespace J3ML::LinearAlgebra {
|
||||
Matrix4x4 &operator = (const Quaternion& rhs);
|
||||
Matrix4x4 &operator = (const Matrix4x4& rhs) = default;
|
||||
|
||||
void IsColOrthogonal();
|
||||
|
||||
Vector3 ExtractScale() const;
|
||||
|
||||
bool HasUniformScale(float epsilon = 1e-3f) const;
|
||||
bool IsColOrthogonal3(float epsilon = 1e-3f) const;
|
||||
bool IsRowOrthogonal3(float epsilon = 1e-3f) const;
|
||||
|
||||
bool IsColOrthogonal(float epsilon = 1e-3f) const;
|
||||
bool IsRowOrthogonal(float epsilon = 1e-3f) const;
|
||||
/// Returns true if this matrix is seen to contain a "projective" part,
|
||||
/// i.e. whether the last row of this matrix differs from [0 0 0 1]
|
||||
bool ContainsProjection(float epsilon = 1e-3f) const;
|
||||
protected:
|
||||
float elems[4][4];
|
||||
|
||||
|
@@ -71,9 +71,11 @@ public:
|
||||
static float MinElement(const Vector3& of);
|
||||
|
||||
Vector3 Min(const Vector3& min) const;
|
||||
static Vector3 Min(const Vector3& a, const Vector3& b, const Vector3& c);
|
||||
static Vector3 Min(const Vector3& lhs, const Vector3& rhs);
|
||||
|
||||
Vector3 Max(const Vector3& max) const;
|
||||
static Vector3 Max(const Vector3& a, const Vector3& b, const Vector3& c);
|
||||
static Vector3 Max(const Vector3& lhs, const Vector3& rhs);
|
||||
|
||||
Vector3 Clamp(const Vector3& min, const Vector3& max) const;
|
||||
@@ -151,7 +153,6 @@ public:
|
||||
Vector3 Div(float scalar) const;
|
||||
static Vector3 Div(const Vector3& lhs, float rhs);
|
||||
|
||||
|
||||
/// Divides this vector by a vector, element-wise
|
||||
/// @note Mathematically, the multiplication of two vectors is not defined in linear space structures,
|
||||
/// but this function is provided here for syntactical convenience
|
||||
|
@@ -23,12 +23,13 @@ namespace J3ML::Geometry {
|
||||
{
|
||||
const Vector3 centerPoint = (aabb.minPoint + aabb.maxPoint) * 0.5f;
|
||||
const Vector3 halfSize = centerPoint - aabb.minPoint;
|
||||
Vector3 newCenter = m.MulPos(centerPoint);
|
||||
Vector3 newCenter = m.Mul(centerPoint);
|
||||
|
||||
|
||||
// The following is equal to taking the absolute value of the whole matrix m.
|
||||
Vector3 newDir = DIR_VEC(Abs(m[0][0] * halfSize.x) + Abs(m[0][1] * halfSize.y) + Abs(m[0][2] * halfSize.z),
|
||||
Abs(m[1][0] * halfSize.x) + Abs(m[1][1] * halfSize.y) + Abs(m[1][2] * halfSize.z),
|
||||
Abs(m[2][0] * halfSize.x) + Abs(m[2][1] * halfSize.y) + Abs(m[2][2] * halfSize.z));
|
||||
Vector3 newDir = Vector3(std::abs(m[0][0] * halfSize.x) + std::abs(m[0][1] * halfSize.y) + std::abs(m[0][2] * halfSize.z),
|
||||
std::abs(m[1][0] * halfSize.x) + std::abs(m[1][1] * halfSize.y) + std::abs(m[1][2] * halfSize.z),
|
||||
std::abs(m[2][0] * halfSize.x) + std::abs(m[2][1] * halfSize.y) + std::abs(m[2][2] * halfSize.z));
|
||||
aabb.minPoint = newCenter - newDir;
|
||||
aabb.maxPoint = newCenter + newDir;
|
||||
}
|
||||
@@ -357,6 +358,8 @@ namespace J3ML::Geometry {
|
||||
// Therefore the axis is separating and we can exit
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -428,7 +431,7 @@ namespace J3ML::Geometry {
|
||||
return true;
|
||||
|
||||
// Passed testing for all 13 separating axes that exist
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
Vector3 AABB::AnyPointFast() const { return minPoint;}
|
||||
@@ -485,4 +488,135 @@ namespace J3ML::Geometry {
|
||||
return obb;
|
||||
}
|
||||
|
||||
bool AABB::Contains(const Vector3 &aabbMinPoint, const Vector3 &aabbMaxPoint) const {
|
||||
return minPoint.x <= aabbMinPoint.x && maxPoint.x >= aabbMaxPoint.x &&
|
||||
minPoint.y <= aabbMinPoint.y && maxPoint.y >= aabbMaxPoint.y &&
|
||||
minPoint.z <= aabbMinPoint.z && maxPoint.z >= aabbMaxPoint.z;
|
||||
}
|
||||
|
||||
bool AABB::Contains(const LineSegment &lineSegment) const {
|
||||
return Contains(Vector3::Min(lineSegment.A, lineSegment.B), Vector3::Max(lineSegment.A, lineSegment.B));
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool AABB::Contains(const Vector3 &point) const {
|
||||
return minPoint.x <= point.x && point.x <= maxPoint.x &&
|
||||
minPoint.y <= point.y && point.y <= maxPoint.y &&
|
||||
minPoint.z <= point.z && point.z <= maxPoint.z;
|
||||
}
|
||||
|
||||
OBB AABB::Transform(const Matrix4x4 &transform) const {
|
||||
OBB obb;
|
||||
obb.SetFrom(*this, transform);
|
||||
return obb;
|
||||
}
|
||||
|
||||
OBB AABB::Transform(const Quaternion &transform) const {
|
||||
OBB obb;
|
||||
obb.SetFrom(*this, transform);
|
||||
return obb;
|
||||
}
|
||||
|
||||
bool AABB::Contains(const AABB &aabb) const {
|
||||
return Contains(aabb.minPoint, aabb.maxPoint);
|
||||
}
|
||||
|
||||
bool AABB::Contains(const OBB &obb) const {
|
||||
return Contains(obb.MinimalEnclosingAABB());
|
||||
}
|
||||
|
||||
bool AABB::Contains(const Sphere &sphere) const {
|
||||
auto radiusVec = Vector3(sphere.Radius,sphere.Radius, sphere.Radius);
|
||||
return Contains(sphere.Position - radiusVec, sphere.Position + radiusVec);
|
||||
}
|
||||
|
||||
bool AABB::Contains(const Capsule &capsule) const {
|
||||
return Contains(capsule.MinimalEnclosingAABB());
|
||||
}
|
||||
|
||||
bool AABB::Contains(const Triangle &triangle) const {
|
||||
return Contains(triangle.BoundingAABB());
|
||||
}
|
||||
|
||||
bool AABB::Contains(const Polygon &polygon) const {
|
||||
return Contains(polygon.MinimalEnclosingAABB());
|
||||
}
|
||||
|
||||
bool AABB::Contains(const Frustum &frustum) const {
|
||||
return Contains(frustum.MinimalEnclosingAABB());
|
||||
}
|
||||
|
||||
bool AABB::Contains(const Polyhedron &polyhedron) const {
|
||||
return Contains(polyhedron.MinimalEnclosingAABB());
|
||||
}
|
||||
|
||||
bool AABB::IntersectLineAABB(const Vector3 &linePos, const Vector3 &lineDir, float tNear, float tFar) const {
|
||||
//assert(lineDir.IsNormalized() && lineDir && lineDir.LengthSquared());
|
||||
assert(tNear <= tFar && "");
|
||||
// The user should have inputted values for tNear and tFar to specify the desired subrange [tNear, tFar] of the line
|
||||
// for this intersection test.
|
||||
// For a Line-AABB test, pass in
|
||||
// tNear = -FLOAT_INF;
|
||||
// tFar = FLOAT_INF;
|
||||
// For a Ray-AABB test, pass in
|
||||
// tNear = 0.f;
|
||||
// tFar = FLOAT_INF;
|
||||
// For a LineSegment-AABB test, pass in
|
||||
// tNear = 0.f;
|
||||
// tFar = LineSegment.Length();
|
||||
|
||||
// Test each cardinal plane (X, Y, and Z) in turn.
|
||||
if (!Math::EqualAbs(lineDir.x, 0.f)) {
|
||||
float recipDir = 1.f / lineDir.x;
|
||||
float t1 = (minPoint.x - linePos.x) * recipDir;
|
||||
float t2 = (maxPoint.x - linePos.x) * recipDir;
|
||||
|
||||
// tNear tracks distance to intersect (enter) the AABB
|
||||
// tFar tracks the distance to exit the AABB
|
||||
if (t1 < t2)
|
||||
tNear = std::max(t1, tNear), tFar = std::min(t2, tFar);
|
||||
else // swap t1 and t2;
|
||||
tNear = std::max(t2, tNear), tFar = std::min(t1, tFar);
|
||||
|
||||
if (tNear > tFar)
|
||||
return false; // Box is missed since we "exit" before entering it
|
||||
}
|
||||
else if (linePos.x < minPoint.x || linePos.x > maxPoint.x)
|
||||
return false; // the ray can't possibly enter the box
|
||||
|
||||
if (!Math::EqualAbs(lineDir.y, 0.f)) // ray is parallel to plane in question
|
||||
{
|
||||
float recipDir = 1.f / lineDir.y;
|
||||
float t1 = (minPoint.y - linePos.y) * recipDir;
|
||||
float t2 = (maxPoint.y - linePos.y) * recipDir;
|
||||
|
||||
if (t1 < t2)
|
||||
tNear = std::max(t1, tNear), tFar = std::min(t2, tFar);
|
||||
else
|
||||
tNear = std::max(t2, tNear), tFar = std::min(t1, tFar);
|
||||
|
||||
if (tNear > tFar)
|
||||
return false;
|
||||
}
|
||||
else if (linePos.y < minPoint.y || linePos.y > maxPoint.y)
|
||||
return false; // The ray can't possibly enter the box, abort.
|
||||
|
||||
if (!Math::EqualAbs(lineDir.z, 0.f)) // ray is parallel to plane in question
|
||||
{
|
||||
float recipDir = 1.f / lineDir.z;
|
||||
float t1 = (minPoint.z - linePos.z) * recipDir;
|
||||
float t2 = (maxPoint.z - linePos.z) * recipDir;
|
||||
|
||||
if (t1 < t2)
|
||||
tNear = std::max(t1, tNear), tFar = std::min(t2, tFar);
|
||||
else // Swap t1 and t2.
|
||||
tNear = std::max(t2, tNear), tFar = std::min(t1, tFar);
|
||||
} else if (linePos.z < minPoint.z || linePos.z > maxPoint.z)
|
||||
return false;
|
||||
|
||||
return tNear <= tFar;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -1,7 +1,15 @@
|
||||
#include <J3ML/Geometry/Capsule.h>
|
||||
#include <J3ML/Geometry/AABB.h>
|
||||
|
||||
namespace J3ML::Geometry
|
||||
{
|
||||
|
||||
Capsule::Capsule() : l() {}
|
||||
|
||||
AABB Capsule::MinimalEnclosingAABB() const
|
||||
{
|
||||
Vector3 d = Vector3(r, r, r);
|
||||
AABB aabb(Vector3::Min(l.A, l.B) - d, Vector3::Max(l.A, l.B) + d);
|
||||
return aabb;
|
||||
}
|
||||
}
|
@@ -319,9 +319,9 @@ namespace J3ML::Geometry
|
||||
assert(m.HasUniformScale()); // Nonuniform scale will produce shear as well
|
||||
obb.pos = m.Mul(aabb.Centroid());
|
||||
obb.r = aabb.HalfSize();
|
||||
obb.axis[0] = DIR_VEC(m.Col(0));
|
||||
obb.axis[1] = DIR_VEC(m.Col(1));
|
||||
obb.axis[2] = DIR_VEC(m.Col(2));
|
||||
obb.axis[0] = Vector3(m.GetColumn3(0));
|
||||
obb.axis[1] = Vector3(m.GetColumn3(1));
|
||||
obb.axis[2] = Vector3(m.GetColumn3(2));
|
||||
// If te matrix m contains scaling, propagate the scaling from the axis vectors to the half-length vectors,
|
||||
// since we want to keep the axis vectors always normalized in our representations.
|
||||
float matrixScale = obb.axis[0].LengthSquared();
|
||||
@@ -336,6 +336,18 @@ namespace J3ML::Geometry
|
||||
|
||||
}
|
||||
|
||||
template <typename Matrix>
|
||||
void OBBTransform(OBB& o, const Matrix& transform)
|
||||
{
|
||||
o.pos = transform.Mul(o.pos);
|
||||
o.axis[0] = transform.Mul(o.r.x * o.axis[0]);
|
||||
o.axis[1] = transform.Mul(o.r.y * o.axis[1]);
|
||||
o.axis[2] = transform.Mul(o.r.z * o.axis[2]);
|
||||
o.r.x = o.axis[0].Normalize().x;
|
||||
o.r.y = o.axis[1].Normalize().y;
|
||||
o.r.z = o.axis[2].Normalize().z;
|
||||
}
|
||||
|
||||
void OBB::SetFrom(const AABB& aabb, const Matrix3x3 &transform) {
|
||||
assert(transform.IsColOrthogonal());
|
||||
|
||||
@@ -343,7 +355,7 @@ namespace J3ML::Geometry
|
||||
}
|
||||
|
||||
void OBB::SetFrom(const AABB& aabb, const Matrix4x4 &transform) {
|
||||
assert(transform.IsColOrthogonal());
|
||||
assert(transform.IsColOrthogonal3());
|
||||
|
||||
OBBSetFrom(*this, aabb, transform);
|
||||
}
|
||||
@@ -353,5 +365,19 @@ namespace J3ML::Geometry
|
||||
OBBSetFrom(*this, aabb, Matrix3x3(transform));
|
||||
}
|
||||
|
||||
void OBB::Transform(const Matrix3x3 &transform) {
|
||||
assert(transform.IsColOrthogonal());
|
||||
OBBTransform(*this, transform);
|
||||
}
|
||||
|
||||
void OBB::Transform(const Matrix4x4 &transform) {
|
||||
assert(transform.IsColOrthogonal3());
|
||||
OBBTransform(*this, transform);
|
||||
}
|
||||
|
||||
void OBB::Transform(const Quaternion &transform) {
|
||||
OBBTransform(*this, transform.ToMatrix3x3());
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -1,5 +1,14 @@
|
||||
#include <J3ML/Geometry/Polygon.h>
|
||||
#include <J3ML/Geometry/AABB.h>
|
||||
|
||||
namespace J3ML::Geometry {
|
||||
AABB Polygon::MinimalEnclosingAABB() const {
|
||||
AABB aabb;
|
||||
aabb.SetNegativeInfinity();
|
||||
for(int i = 0; i < NumVertices(); ++i)
|
||||
aabb.Enclose(Vertex(i));
|
||||
return aabb;
|
||||
}
|
||||
}
|
||||
|
||||
namespace Geometry {
|
||||
|
||||
}
|
@@ -1,6 +1,19 @@
|
||||
#include <J3ML/Geometry/Polyhedron.h>
|
||||
#include <J3ML/Geometry/AABB.h>
|
||||
|
||||
namespace Geometry
|
||||
namespace J3ML::Geometry
|
||||
{
|
||||
AABB Polyhedron::MinimalEnclosingAABB() const {
|
||||
AABB aabb;
|
||||
aabb.SetNegativeInfinity();
|
||||
for (int i = 0; i < NumVertices(); ++i)
|
||||
aabb.Enclose(Vertex(i));
|
||||
return aabb;
|
||||
}
|
||||
|
||||
Vector3 Polyhedron::Vertex(int vertexIndex) const {
|
||||
return v[vertexIndex];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
17
src/J3ML/Geometry/Triangle.cpp
Normal file
17
src/J3ML/Geometry/Triangle.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
#include <J3ML/Geometry/Triangle.h>
|
||||
#include <J3ML/LinearAlgebra.h>
|
||||
#include <J3ML/Geometry/AABB.h>
|
||||
|
||||
namespace J3ML::Geometry
|
||||
{
|
||||
AABB Triangle::BoundingAABB() const {
|
||||
AABB aabb;
|
||||
aabb.minPoint = Vector3::Min(V0, V1, V2);
|
||||
aabb.maxPoint = Vector3::Max(V0, V1, V2);
|
||||
return aabb;
|
||||
}
|
||||
|
||||
bool Triangle::Intersects(const AABB &aabb) const {
|
||||
return aabb.Intersects(*this);
|
||||
}
|
||||
}
|
@@ -24,6 +24,10 @@ namespace J3ML
|
||||
|
||||
float Math::Degrees(float radians) { return radians * (180.f/Pi); }
|
||||
|
||||
bool Math::EqualAbs(float a, float b, float epsilon) {
|
||||
return std::abs(a - b) < epsilon;
|
||||
}
|
||||
|
||||
Math::Rotation::Rotation() : valueInRadians(0) {}
|
||||
|
||||
Math::Rotation::Rotation(float value) : valueInRadians(value) {}
|
||||
|
@@ -411,5 +411,20 @@ namespace J3ML::LinearAlgebra {
|
||||
&& GetColumn(1).IsPerpendicular(GetColumn(2), epsilon);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool Matrix3x3::HasUniformScale(float epsilon) const {
|
||||
Vector3 scale = ExtractScale();
|
||||
return Math::EqualAbs(scale.x, scale.y, epsilon) && Math::EqualAbs(scale.x, scale.z, epsilon);
|
||||
}
|
||||
|
||||
Vector3 Matrix3x3::GetRow3(int index) const {
|
||||
return GetRow(index);
|
||||
}
|
||||
|
||||
Vector3 Matrix3x3::GetColumn3(int index) const {
|
||||
return GetColumn(index);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@@ -2,6 +2,9 @@
|
||||
#include <J3ML/LinearAlgebra/Vector4.h>
|
||||
|
||||
namespace J3ML::LinearAlgebra {
|
||||
|
||||
|
||||
|
||||
const Matrix4x4 Matrix4x4::Zero = Matrix4x4(0.f);
|
||||
const Matrix4x4 Matrix4x4::Identity = Matrix4x4({1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1});
|
||||
const Matrix4x4 Matrix4x4::NaN = Matrix4x4(NAN);
|
||||
@@ -594,7 +597,41 @@ namespace J3ML::LinearAlgebra {
|
||||
At(3, 3) = data[15];
|
||||
}
|
||||
|
||||
void Matrix4x4::IsColOrthogonal() {
|
||||
|
||||
bool Matrix4x4::ContainsProjection(float epsilon) const {
|
||||
return GetRow(3).Equals(0.f, 0.f, 0.f, 1.f, epsilon) == false;
|
||||
}
|
||||
|
||||
Vector4 Matrix4x4::Mul(const Vector4 &rhs) const {
|
||||
return *this * rhs;
|
||||
}
|
||||
|
||||
Vector3 Matrix4x4::Mul(const Vector3 &rhs) const {
|
||||
return *this * rhs;
|
||||
}
|
||||
|
||||
Vector2 Matrix4x4::Mul(const Vector2 &rhs) const {
|
||||
return *this * rhs;
|
||||
}
|
||||
|
||||
Vector4 Matrix4x4::operator[](int row) const {
|
||||
return GetRow(row);
|
||||
}
|
||||
|
||||
bool Matrix4x4::HasUniformScale(float epsilon) const {
|
||||
Vector3 scale = ExtractScale();
|
||||
return Math::EqualAbs(scale.x, scale.y, epsilon) && Math::EqualAbs(scale.x, scale.z, epsilon);
|
||||
}
|
||||
|
||||
Vector3 Matrix4x4::ExtractScale() const {
|
||||
return {GetColumn3(0).Length(), GetColumn3(1).Length(), GetColumn3(2).Length()};
|
||||
}
|
||||
|
||||
bool Matrix4x4::IsColOrthogonal(float epsilon) const {
|
||||
return IsColOrthogonal3(epsilon);
|
||||
}
|
||||
|
||||
bool Matrix4x4::IsRowOrthogonal(float epsilon) const {
|
||||
return IsRowOrthogonal3(epsilon);
|
||||
}
|
||||
|
||||
}
|
@@ -103,6 +103,8 @@ namespace J3ML::LinearAlgebra {
|
||||
return this->IsWithinMarginOfError(rhs) == false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Vector3 Vector3::Min(const Vector3& min) const
|
||||
{
|
||||
return {
|
||||
@@ -421,5 +423,21 @@ namespace J3ML::LinearAlgebra {
|
||||
std::abs(z - _z) < epsilon;
|
||||
}
|
||||
|
||||
Vector3 Vector3::Min(const Vector3 &a, const Vector3 &b, const Vector3 &c) {
|
||||
return {
|
||||
std::min(a.x, std::min(b.x, c.x)),
|
||||
std::min(a.y, std::min(b.y, c.y)),
|
||||
std::min(a.z, std::min(b.z, c.z))
|
||||
};
|
||||
}
|
||||
|
||||
Vector3 Vector3::Max(const Vector3 &a, const Vector3 &b, const Vector3 &c) {
|
||||
return {
|
||||
std::max(a.x, std::max(b.x, c.x)),
|
||||
std::max(a.y, std::max(b.y, c.y)),
|
||||
std::max(a.z, std::max(b.z, c.z))
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
}
|
Reference in New Issue
Block a user