1
0
forked from josh/j3ml

Adding more Mat4x4 functionality

This commit is contained in:
2024-01-30 13:13:09 -05:00
parent 32577f79b8
commit 21ceca62dc
7 changed files with 100 additions and 36 deletions

View File

@@ -4,6 +4,7 @@
#pragma once #pragma once
#include "Plane.h" #include "Plane.h"
#include <J3ML/LinearAlgebra/CoordinateFrame.h>
namespace Geometry namespace Geometry
{ {
@@ -32,11 +33,10 @@ namespace Geometry
Plane LeftFace; Plane LeftFace;
Plane FarFace; Plane FarFace;
Plane NearFace; Plane NearFace;
static Frustum CreateFrustumFromCamera(const Camera& cam, float aspect, float fovY, float zNear, float zFar); static Frustum CreateFrustumFromCamera(const CoordinateFrame& cam, float aspect, float fovY, float zNear, float zFar);
}; };
Frustum Frustum::CreateFrustumFromCamera(const Camera &cam, float aspect, float fovY, float zNear, float zFar) { Frustum Frustum::CreateFrustumFromCamera(const CoordinateFrame &cam, float aspect, float fovY, float zNear, float zFar) {
Frustum frustum; Frustum frustum;
const float halfVSide = zFar * tanf(fovY * 0.5f); const float halfVSide = zFar * tanf(fovY * 0.5f);
const float halfHSide = halfVSide * aspect; const float halfHSide = halfVSide * aspect;
@@ -51,5 +51,4 @@ namespace Geometry
frustum.BottomFace = Plane{cam.Position, Vector3::Cross(frontMultFar + cam.Up * halfVSide, cam.Right)}; frustum.BottomFace = Plane{cam.Position, Vector3::Cross(frontMultFar + cam.Up * halfVSide, cam.Right)};
return frustum; return frustum;
} }
} }

View File

@@ -4,6 +4,7 @@
namespace Geometry namespace Geometry
{ {
using LinearAlgebra::Vector3;
class LineSegment class LineSegment
{ {
Vector3 A; Vector3 A;

View File

@@ -1,9 +1,8 @@
#pragma once #pragma once
#include <J3ML/Geometry/AABB.h> #include <J3ML/Geometry/AABB.h>
#include "Polyhedron.h" #include <J3ML/Geometry/LineSegment.h>
#include <J3ML/Geometry/Polyhedron.h>
namespace Geometry { namespace Geometry {
class OBB class OBB
@@ -18,14 +17,14 @@ namespace Geometry {
OBB() {} OBB() {}
OBB(const Vector3& pos, const Vector3& radii, const Vector3& axis0, const Vector3& axis1, const Vector3& axis2); OBB(const Vector3& pos, const Vector3& radii, const Vector3& axis0, const Vector3& axis1, const Vector3& axis2);
OBB(const AABB& aabb); OBB(const Geometry::AABB& aabb);
inline static int NumFaces() { return 6; } inline static int NumFaces() { return 6; }
inline static int NumEdges() { return 12; } inline static int NumEdges() { return 12; }
inline static int NumVertices() { return 8; } inline static int NumVertices() { return 8; }
Polyhedron ToPolyhedron() const; Polyhedron ToPolyhedron() const;
AABB MinimalEnclosingAABB() const; Geometry::AABB MinimalEnclosingAABB() const;
Sphere MinimalEnclosingSphere() const; Sphere MinimalEnclosingSphere() const;
Sphere MaximalContainedSphere() const; Sphere MaximalContainedSphere() const;
@@ -42,7 +41,7 @@ namespace Geometry {
float Volume(); float Volume();
float SurfaceArea(); float SurfaceArea();
LineSegment Edge(int edgeIndex) const; Geometry::LineSegment Edge(int edgeIndex) const;
Vector3 CornerPoint(int cornerIndex) const; Vector3 CornerPoint(int cornerIndex) const;
}; };
} }

View File

@@ -1,20 +1,16 @@
#pragma once #pragma once
#include <J3ML/LinearAlgebra.h> #include <J3ML/LinearAlgebra.h>
#include <J3ML/LinearAlgebra/Vector3.h>
namespace LinearAlgebra namespace LinearAlgebra
{ {
/// The CFrame is fundamentally 4 vectors (position, forward, right, up vector) /// The CFrame is fundamentally 4 vectors (position, forward, right, up vector)
class CoordinateFrame class CoordinateFrame
{ {
Vector3 getPosition(); Vector3 Position;
Vector3 getLookVector(); Vector3 Front;
Vector3 getRightVector(); Vector3 Right;
Vector3 getUpVector(); Vector3 Up;
AxisAngle GetAxisAngle();
EulerAngle GetEulerAngleXYZ();
EulerAngle GetWorldAngleYZX();
}; };
} }

View File

@@ -23,24 +23,38 @@ namespace LinearAlgebra {
enum { Rows = 4 }; enum { Rows = 4 };
enum { Cols = 4 }; enum { Cols = 4 };
// A constant matrix that has zeroes in all its entries /// A constant matrix that has zeroes in all its entries
static const Matrix4x4 Zero; static const Matrix4x4 Zero;
// A constant matrix that is the identity. /// A constant matrix that is the identity.
static const Matrix4x4 Identity; static const Matrix4x4 Identity;
// A compile-time constant float4x4 which has NaN in each element. /// A compile-time constant float4x4 which has NaN in each element.
// For this constant, each element has the value of quet NaN, or Not-A-Number. /// For this constant, each element has the value of quet NaN, or Not-A-Number.
// Never compare a matrix to this value. Due to how IEEE floats work, "nan == nan" returns false! /// Never compare a matrix to this value. Due to how IEEE floats work, "nan == nan" returns false!
static const Matrix4x4 NaN; static const Matrix4x4 NaN;
/// Creates a new float4x4 with uninitialized member values.
Matrix4x4() {} Matrix4x4() {}
Matrix4x4(float val); Matrix4x4(float val);
/// Constructs this float4x4 to represent the same transformation as the given float3x3.
/** This function expands the last row and column of this matrix with the elements from the identity matrix. */
Matrix4x4(const Matrix3x3&); Matrix4x4(const Matrix3x3&);
/// Constructs a new float4x4 by explicitly specifying all the matrix elements.
/// The elements are specified in row-major format, i.e. the first row first followed by the second and third row.
/// E.g. The element _10 denotes the scalar at second (index 1) row, first (index 0) column.
Matrix4x4(float m00, float m01, float m02, float m03, Matrix4x4(float m00, float m01, float m02, float m03,
float m10, float m11, float m12, float m13, float m10, float m11, float m12, float m13,
float m20, float m21, float m22, float m23, float m20, float m21, float m22, float m23,
float m30, float m31, float m32, float m33); float m30, float m31, float m32, float m33);
/// Constructs the matrix by explicitly specifying the four column vectors.
/** @param col0 The first column. If this matrix represents a change-of-basis transformation, this parameter is the world-space
direction of the local X axis.
@param col1 The second column. If this matrix represents a change-of-basis transformation, this parameter is the world-space
direction of the local Y axis.
@param col2 The third column. If this matrix represents a change-of-basis transformation, this parameter is the world-space
direction of the local Z axis.
@param col3 The fourth column. If this matrix represents a change-of-basis transformation, this parameter is the world-space
position of the local space pivot. */
Matrix4x4(const Vector4& r1, const Vector4& r2, const Vector4& r3, const Vector4& r4); Matrix4x4(const Vector4& r1, const Vector4& r2, const Vector4& r3, const Vector4& r4);
@@ -70,10 +84,15 @@ namespace LinearAlgebra {
Vector4 GetRow(int index) const; Vector4 GetRow(int index) const;
Vector4 GetColumn(int index) const; Vector4 GetColumn(int index) const;
float At(int x, int y) const float At(int x, int y) const;
{
return elems[x][y]; /// Tests if this matrix does not contain any NaNs or infs.
} /** @return Returns true if the entries of this float4x4 are all finite, and do not contain NaN or infs. */
bool IsFinite() const;
/// Tests if this matrix has an inverse.
/** @return Returns true if this matrix can be inverted, up to the given epsilon. */
bool IsInvertible(float epsilon = 1e-3f) const;
Vector4 Diagonal() const; Vector4 Diagonal() const;
Vector4 WorldX() const; Vector4 WorldX() const;
@@ -84,10 +103,7 @@ namespace LinearAlgebra {
// If the determinant is nonzero, this matrix is invertible. // If the determinant is nonzero, this matrix is invertible.
float Determinant() const; float Determinant() const;
Matrix4x4 Inverse() const Matrix4x4 Inverse() const;
{
}
Matrix4x4 Transpose() const; Matrix4x4 Transpose() const;
@@ -117,6 +133,53 @@ namespace LinearAlgebra {
return Vector4{elems[row][0], elems[row][1], elems[row][2], elems[row][3]}; return Vector4{elems[row][0], elems[row][1], elems[row][2], elems[row][3]};
} }
Matrix4x4 operator-() const;
Matrix4x4 operator +(const Matrix4x4& rhs) const;
Matrix4x4 operator - (const Matrix4x4& rhs) const;
Matrix4x4 operator *(float scalar) const
{
}
Vector2 operator * (const Vector2& rhs) const;
Vector3 operator * (const Vector3& rhs) const;
Vector4 operator * (const Vector4& rhs) const;
Matrix4x4 operator * (const Matrix3x3 &rhs) const
{
}
Matrix4x4 operator +() const { return *this; }
Matrix4x4 operator * (const Matrix4x4& rhs) const
{
float r00 = At(0, 0) * rhs.At(0, 0) + At(0, 1) * rhs.At(1, 0) + At(0, 2) * rhs.At(2, 0) + At(0, 3) * rhs.At(3, 0);
float r01 = At(0, 0) * rhs.At(0, 1) + At(0, 1) * rhs.At(1, 1) + At(0, 2) * rhs.At(2, 1) + At(0, 3) * rhs.At(3, 1);
float r02 = At(0, 0) * rhs.At(0, 2) + At(0, 1) * rhs.At(1, 2) + At(0, 2) * rhs.At(2, 2) + At(0, 3) * rhs.At(3, 2);
float r03 = At(0, 0) * rhs.At(0, 3) + At(0, 1) * rhs.At(1, 3) + At(0, 2) * rhs.At(2, 3) + At(0, 3) * rhs.At(3, 3);
float r10 = At(1, 0) * rhs.At(0, 0) + At(1, 1) * rhs.At(1, 0) + At(1, 2) * rhs.At(2, 0) + At(1, 3) * rhs.At(3, 0);
float r11 = At(1, 0) * rhs.At(0, 1) + At(1, 1) * rhs.At(1, 1) + At(1, 2) * rhs.At(2, 1) + At(1, 3) * rhs.At(3, 1);
float r12 = At(1, 0) * rhs.At(0, 2) + At(1, 1) * rhs.At(1, 2) + At(1, 2) * rhs.At(2, 2) + At(1, 3) * rhs.At(3, 2);
float r13 = At(1, 0) * rhs.At(0, 3) + At(1, 1) * rhs.At(1, 3) + At(1, 2) * rhs.At(2, 3) + At(1, 3) * rhs.At(3, 3);
float r20 = At(2, 0) * rhs.At(0, 0) + At(2, 1) * rhs.At(1, 0) + At(2, 2) * rhs.At(2, 0) + At(2, 3) * rhs.At(3, 0);
float r21 = At(2, 0) * rhs.At(0, 1) + At(2, 1) * rhs.At(1, 1) + At(2, 2) * rhs.At(2, 1) + At(2, 3) * rhs.At(3, 1);
float r22 = At(2, 0) * rhs.At(0, 2) + At(2, 1) * rhs.At(1, 2) + At(2, 2) * rhs.At(2, 2) + At(2, 3) * rhs.At(3, 2);
float r23 = At(2, 0) * rhs.At(0, 3) + At(2, 1) * rhs.At(1, 3) + At(2, 2) * rhs.At(2, 3) + At(2, 3) * rhs.At(3, 3);
float r30 = At(3, 0) * rhs.At(0, 0) + At(3, 1) * rhs.At(1, 0) + At(3, 2) * rhs.At(2, 0) + At(3, 3) * rhs.At(3, 0);
float r31 = At(3, 0) * rhs.At(0, 1) + At(3, 1) * rhs.At(1, 1) + At(3, 2) * rhs.At(2, 1) + At(3, 3) * rhs.At(3, 1);
float r32 = At(3, 0) * rhs.At(0, 2) + At(3, 1) * rhs.At(1, 2) + At(3, 2) * rhs.At(2, 2) + At(3, 3) * rhs.At(3, 2);
float r33 = At(3, 0) * rhs.At(0, 3) + At(3, 1) * rhs.At(1, 3) + At(3, 2) * rhs.At(2, 3) + At(3, 3) * rhs.At(3, 3);
return {r00,r01,r02,r03, r10, r11, r12, r13, r20,r21,r22,r23, r30,r31,r32,r33};
}
protected: protected:
float elems[4][4]; float elems[4][4];

View File

@@ -1,3 +1,5 @@
// #include <J3ML/Geometry/LineSegment.h>
// Created by dawsh on 1/25/24.
// namespace Geometry {
}

View File

@@ -167,5 +167,9 @@ namespace LinearAlgebra {
float p30 = 0; float p31 = 0; float p32 = 0.f; float p33 = 1.f; float p30 = 0; float p31 = 0; float p32 = 0.f; float p33 = 1.f;
} }
float Matrix4x4::At(int x, int y) const {
return elems[x][y];
}
} }