mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Improve Matrix identity functions and add Quaternion to matrix function (#765)
* Edit matrix identity fn and add quaternion to matrix fn * Change matrix identity macros to constants --------- Co-authored-by: Tonis <tanton@paysure.solutions>
This commit is contained in:
@@ -105,9 +105,13 @@ define matrix4_ortho = matrix::ortho<double>;
|
||||
define matrix4_perspective = matrix::perspective<double>;
|
||||
define matrix4f_ortho = matrix::ortho<float>;
|
||||
define matrix4f_perspective = matrix::perspective<float>;
|
||||
macro Matrix4 matrix4_indentity() => { .m = { [0] = 1, [5] = 1, [10] = 1, [15] = 1 } };
|
||||
macro Matrix3 matrix3_indentity() => { .m = { [0] = 1, [4] = 1, [8] = 1 } };
|
||||
macro Matrix2 matrix2_indentity() => { .m = { [0] = 1, [3] = 1 } };
|
||||
|
||||
define MATRIX2_IDENTITY = matrix::IDENTITY2<double>;
|
||||
define MATRIX2F_IDENTITY = matrix::IDENTITY2<float>;
|
||||
define MATRIX3_IDENTITY = matrix::IDENTITY3<double>;
|
||||
define MATRIX3F_IDENTITY = matrix::IDENTITY3<float>;
|
||||
define MATRIX4_IDENTITY = matrix::IDENTITY4<double>;
|
||||
define MATRIX4F_IDENTITY = matrix::IDENTITY4<float>;
|
||||
|
||||
/**
|
||||
* @require types::is_numerical($typeof(x)) `The input must be a numerical value or numerical vector`
|
||||
|
||||
@@ -411,6 +411,9 @@ fn Matrix4x4 perspective(Real fov, Real aspect_ratio, Real near, Real far)
|
||||
};
|
||||
}
|
||||
|
||||
const Matrix2x2 IDENTITY2 = { .m = { [0] = 1, [3] = 1 } };
|
||||
const Matrix3x3 IDENTITY3 = { .m = { [0] = 1, [4] = 1, [8] = 1 } };
|
||||
const Matrix4x4 IDENTITY4 = { .m = { [0] = 1, [5] = 1, [10] = 1, [15] = 1 } };
|
||||
|
||||
macro matrix_component_mul(mat, val) @private
|
||||
{
|
||||
|
||||
@@ -18,6 +18,8 @@ macro Quaternion Quaternion.scale(Quaternion a, Real s) => Quaternion { .v = a.v
|
||||
macro Quaternion Quaternion.normalize(Quaternion q) => { .v = q.v.normalize() };
|
||||
macro Real Quaternion.length(Quaternion q) => q.v.length();
|
||||
macro Quaternion Quaternion.lerp(Quaternion q1, Quaternion q2, Real amount) => { .v = q1.v.lerp(q2.v, amount) };
|
||||
macro Matrix4f Quaternion.to_matrixf(Quaternion* q) => into_matrix(q, Matrix4f);
|
||||
macro Matrix4 Quaternion.to_matrix(Quaternion* q) => into_matrix(q, Matrix4);
|
||||
fn Quaternion Quaternion.nlerp(Quaternion q1, Quaternion q2, Real amount) => { .v = q1.v.lerp(q2.v, amount).normalize() };
|
||||
|
||||
fn Quaternion Quaternion.invert(Quaternion q)
|
||||
@@ -65,4 +67,32 @@ fn Quaternion Quaternion.mul(Quaternion a, Quaternion b)
|
||||
a.l * b.l - a.i * b.i - a.j * a.j - a.k * a.k };
|
||||
}
|
||||
|
||||
macro into_matrix(Quaternion* q, $Type) @private
|
||||
{
|
||||
$Type result = { .m = { [0] = 1, [5] = 1, [10] = 1, [15] = 1 } };
|
||||
Quaternion norm = q.normalize();
|
||||
|
||||
var ii = norm.i*norm.i;
|
||||
var jj = norm.j*norm.j;
|
||||
var kk = norm.k*norm.k;
|
||||
var ik = norm.i*norm.k;
|
||||
var ij = norm.i*q.j;
|
||||
var jk = norm.j*norm.k;
|
||||
var li = norm.l*norm.i;
|
||||
var lj = norm.l*norm.j;
|
||||
var lk = norm.l*norm.k;
|
||||
|
||||
result.m00 = 1 - 2*(jj + kk);
|
||||
result.m01 = 2*(ik + lk);
|
||||
result.m02 = 2*(ij - lj);
|
||||
|
||||
result.m10 = 2*(ij - lk);
|
||||
result.m11 = 1 - 2*(ii + kk);
|
||||
result.m12 = 2*(jk + li);
|
||||
|
||||
result.m20 = 2*(ik + lj);
|
||||
result.m21 = 2*(jk - li);
|
||||
result.m22 = 1 - 2*(ii + jj);
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user