updated project

This commit is contained in:
Jorijn van der Graaf 2025-05-07 19:18:58 +02:00
commit 0c215df939
14 changed files with 461 additions and 20 deletions

View file

@ -1,3 +1,23 @@
/*
Crafter.Math
Copyright (C) 2025 Catcrafts
Catcrafts.net
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3.0 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
module;
#include <type_traits>
@ -133,6 +153,10 @@ namespace Crafter {
);
}
static MatrixRowMajor<T, CollumSize, RowSize, Repeats> Scaling(Vector<float, 3> vector) requires(CollumSize == 4 && RowSize == 4 && Repeats == 1 && std::same_as<T, float>) {
return Scaling(vector.x, vector.y, vector.z);
}
static MatrixRowMajor<T, CollumSize, RowSize, Repeats> Translation(float x, float y, float z) requires(CollumSize == 4 && RowSize == 4 && Repeats == 1 && std::same_as<T, float>) {
return MatrixRowMajor<T, CollumSize, RowSize, Repeats>(
1, 0, 0, 0,
@ -142,6 +166,10 @@ namespace Crafter {
);
}
static MatrixRowMajor<T, CollumSize, RowSize, Repeats> Translation(Vector<float, 3> vector) requires(CollumSize == 4 && RowSize == 4 && Repeats == 1 && std::same_as<T, float>) {
return Translation(vector.x, vector.y, vector.z);
}
static MatrixRowMajor<T, CollumSize, RowSize, Repeats> Rotation(float Pitch, float Yaw, float Roll) requires(CollumSize == 4 && RowSize == 4 && Repeats == 1 && std::same_as<T, float>) {
float cp = cosf(Pitch);
float sp = sinf(Pitch);
@ -175,6 +203,69 @@ namespace Crafter {
return M;
}
static MatrixRowMajor<T, CollumSize, RowSize, Repeats> LookAt(Vector<float, 3> eyePosition, Vector<float, 3> focusPosition, Vector<float, 3> upDirection) requires(CollumSize == 4 && RowSize == 4 && Repeats == 1 && std::same_as<T, float>) {
MatrixRowMajor<T, CollumSize, RowSize, Repeats> M;
Vector<float, 3> negEyeDirection = eyePosition - focusPosition;
return LookTo(eyePosition, negEyeDirection, upDirection);
return M;
}
static MatrixRowMajor<T, CollumSize, RowSize, Repeats> LookTo(Vector<float, 3> eyePosition, Vector<float, 3> eyeDirection, Vector<float, 3> upDirection) requires(CollumSize == 4 && RowSize == 4 && Repeats == 1 && std::same_as<T, float>) {
Vector<float, 3> R2 = eyeDirection.Normalize();
Vector<float, 3> R0 = upDirection.Cross(R2);
R0 = R0.Normalize();
Vector<float, 3> R1 = R2.Cross(R0);
Vector<float, 3> NegEyePosition = -eyePosition;
float D0 = R0.Dot(NegEyePosition);
float D1 = R1.Dot(NegEyePosition);
float D2 = R2.Dot(NegEyePosition);
MatrixRowMajor<T, CollumSize, RowSize, Repeats> M;
M.m[0][0] = R0.v[0];
M.m[1][0] = R0.v[1];
M.m[2][0] = R0.v[2];
M.m[3][0] = D0;
M.m[0][1] = R1.v[0];
M.m[1][1] = R1.v[1];
M.m[2][1] = R1.v[2];
M.m[3][1] = D1;
M.m[0][2] = R2.v[0];
M.m[1][2] = R2.v[1];
M.m[2][2] = R2.v[2];
M.m[3][2] = D2;
M.m[0][3] = 0;
M.m[1][3] = 0;
M.m[2][3] = 0;
M.m[3][3] = 1;
return M;
}
static MatrixRowMajor<T, CollumSize, RowSize, Repeats> Rotation(Vector<float, 3> vector) requires(CollumSize == 4 && RowSize == 4 && Repeats == 1 && std::same_as<T, float>) {
return Rotation(vector.x, vector.y, vector.z);
}
Vector<float, 3> TransformNormal(Vector<float, 3> V) requires(CollumSize == 4 && RowSize == 4 && Repeats == 1 && std::same_as<T, float>) {
Vector<float, 3> Z = Vector<float, 3>(V.z, V.z, V.z);
Vector<float, 3> Y = Vector<float, 3>(V.y, V.y, V.y);
Vector<float, 3> X = Vector<float, 3>(V.x, V.x, V.x);
Vector<float, 3> Result = Z * Vector<float, 3>(m[2][0], m[2][1], m[2][2]);
Result = Y * Vector<float, 3>(m[1][0], m[1][1], m[1][2]) + Result;
Result = X * Vector<float, 3>(m[0][0], m[0][1], m[0][2]) + Result;
return Result;
}
};
}