updated project
This commit is contained in:
parent
8535fd1211
commit
0c215df939
14 changed files with 461 additions and 20 deletions
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue