Current section

Files

Jump to
matrix_gleam src matrix@mat4f.erl
Raw

src/matrix@mat4f.erl

-module(matrix@mat4f).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/matrix/mat4f.gleam").
-export([new/16, from_cols/4, from_diagonal/1, transpose/1, diagonal/1, determinant/1, mul_vec4/2, mul_transpose_vec4/2, scale/2, add/2, subtract/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" 4x4 matrices of floats\n").
-file("src/matrix/mat4f.gleam", 31).
?DOC(
" Constructs a `Mat4f` from its components.\n"
" ```text\n"
" | ax bx cx dx |\n"
" | ay by cy dy |\n"
" | az bz cz dz |\n"
" | aw bw cw dw |\n"
" ```\n"
).
-spec new(
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float(),
float()
) -> vec@vec4:vec4(vec@vec4:vec4(float())).
new(Ax, Ay, Az, Aw, Bx, By, Bz, Bw, Cx, Cy, Cz, Cw, Dx, Dy, Dz, Dw) ->
{vec4,
{vec4, Ax, Ay, Az, Aw},
{vec4, Bx, By, Bz, Bw},
{vec4, Cx, Cy, Cz, Cw},
{vec4, Dx, Dy, Dz, Dw}}.
-file("src/matrix/mat4f.gleam", 64).
?DOC(
" Constructs a `Mat4f` from its four columns.\n"
" ```text\n"
" | a.x b.x c.x d.x |\n"
" | a.y b.y c.y d.y |\n"
" | a.z b.z c.z d.z |\n"
" | a.w b.w c.w d.w |\n"
" ```\n"
).
-spec from_cols(
vec@vec4:vec4(float()),
vec@vec4:vec4(float()),
vec@vec4:vec4(float()),
vec@vec4:vec4(float())
) -> vec@vec4:vec4(vec@vec4:vec4(float())).
from_cols(A, B, C, D) ->
{vec4, A, B, C, D}.
-file("src/matrix/mat4f.gleam", 69).
?DOC(" Creates a 4x4 matrix with its diagonal set to `diagonal` and all other entries are 0.\n").
-spec from_diagonal(vec@vec4:vec4(float())) -> vec@vec4:vec4(vec@vec4:vec4(float())).
from_diagonal(Diagonal) ->
from_cols(
{vec4, erlang:element(2, Diagonal), +0.0, +0.0, +0.0},
{vec4, +0.0, erlang:element(3, Diagonal), +0.0, +0.0},
{vec4, +0.0, +0.0, erlang:element(4, Diagonal), +0.0},
{vec4, +0.0, +0.0, +0.0, erlang:element(5, Diagonal)}
).
-file("src/matrix/mat4f.gleam", 79).
?DOC(" Transposes the `Mat4f` along the diagonal.\n").
-spec transpose(vec@vec4:vec4(vec@vec4:vec4(float()))) -> vec@vec4:vec4(vec@vec4:vec4(float())).
transpose(Mat) ->
from_cols(
{vec4,
erlang:element(2, erlang:element(2, Mat)),
erlang:element(2, erlang:element(3, Mat)),
erlang:element(2, erlang:element(4, Mat)),
erlang:element(2, erlang:element(5, Mat))},
{vec4,
erlang:element(3, erlang:element(2, Mat)),
erlang:element(3, erlang:element(3, Mat)),
erlang:element(3, erlang:element(4, Mat)),
erlang:element(3, erlang:element(5, Mat))},
{vec4,
erlang:element(4, erlang:element(2, Mat)),
erlang:element(4, erlang:element(3, Mat)),
erlang:element(4, erlang:element(4, Mat)),
erlang:element(4, erlang:element(5, Mat))},
{vec4,
erlang:element(5, erlang:element(2, Mat)),
erlang:element(5, erlang:element(3, Mat)),
erlang:element(5, erlang:element(4, Mat)),
erlang:element(5, erlang:element(5, Mat))}
).
-file("src/matrix/mat4f.gleam", 89).
?DOC(" Extracts the diagonal of the `Mat4f`.\n").
-spec diagonal(vec@vec4:vec4(vec@vec4:vec4(float()))) -> vec@vec4:vec4(float()).
diagonal(Mat) ->
{vec4,
erlang:element(2, erlang:element(2, Mat)),
erlang:element(3, erlang:element(3, Mat)),
erlang:element(4, erlang:element(4, Mat)),
erlang:element(5, erlang:element(5, Mat))}.
-file("src/matrix/mat4f.gleam", 94).
?DOC(" Returns the determinant of the `Mat4f`.\n").
-spec determinant(vec@vec4:vec4(vec@vec4:vec4(float()))) -> float().
determinant(Mat) ->
{vec4, M00, M01, M02, M03} = erlang:element(2, Mat),
{vec4, M10, M11, M12, M13} = erlang:element(3, Mat),
{vec4, M20, M21, M22, M23} = erlang:element(4, Mat),
{vec4, M30, M31, M32, M33} = erlang:element(5, Mat),
A2323 = (M22 * M33) - (M23 * M32),
A1323 = (M21 * M33) - (M23 * M31),
A1223 = (M21 * M32) - (M22 * M31),
A0323 = (M20 * M33) - (M23 * M30),
A0223 = (M20 * M32) - (M22 * M30),
A0123 = (M20 * M31) - (M21 * M30),
(((M00 * (((M11 * A2323) - (M12 * A1323)) + (M13 * A1223))) - (M01 * (((M10
* A2323)
- (M12 * A0323))
+ (M13 * A0223))))
+ (M02 * (((M10 * A1323) - (M11 * A0323)) + (M13 * A0123))))
- (M03 * (((M10 * A1223) - (M11 * A0223)) + (M12 * A0123))).
-file("src/matrix/mat4f.gleam", 118).
?DOC(" Transforms a 4D vector by this `Mat4f`.\n").
-spec mul_vec4(vec@vec4:vec4(vec@vec4:vec4(float())), vec@vec4:vec4(float())) -> vec@vec4:vec4(float()).
mul_vec4(Mat, Rhs) ->
_pipe = vec@vec4:map2(Mat, Rhs, fun vec@vec4f:scale/2),
_pipe@1 = vec@vec4:to_list(_pipe),
vec@vec4f:sum(_pipe@1).
-file("src/matrix/mat4f.gleam", 127).
?DOC(
" Transforms a 4D vector by the transpose of the `Mat4f`.\n"
"\n"
" Equivalent to matrix multiplication where the vector is on the left.\n"
).
-spec mul_transpose_vec4(
vec@vec4:vec4(vec@vec4:vec4(float())),
vec@vec4:vec4(float())
) -> vec@vec4:vec4(float()).
mul_transpose_vec4(Mat, Rhs) ->
vec@vec4:map(Mat, fun(_capture) -> vec@vec4f:dot(_capture, Rhs) end).
-file("src/matrix/mat4f.gleam", 132).
?DOC(" Scales the `Mat4f` by a `Float`.\n").
-spec scale(vec@vec4:vec4(vec@vec4:vec4(float())), float()) -> vec@vec4:vec4(vec@vec4:vec4(float())).
scale(Mat, Scale) ->
vec@vec4:map(Mat, fun(_capture) -> vec@vec4f:scale(_capture, Scale) end).
-file("src/matrix/mat4f.gleam", 137).
?DOC(" Adds two `Mat4f`s together\n").
-spec add(
vec@vec4:vec4(vec@vec4:vec4(float())),
vec@vec4:vec4(vec@vec4:vec4(float()))
) -> vec@vec4:vec4(vec@vec4:vec4(float())).
add(A, B) ->
vec@vec4:map2(A, B, fun vec@vec4f:add/2).
-file("src/matrix/mat4f.gleam", 142).
?DOC(" Subtracts `Mat4f` `b` from `a`\n").
-spec subtract(
vec@vec4:vec4(vec@vec4:vec4(float())),
vec@vec4:vec4(vec@vec4:vec4(float()))
) -> vec@vec4:vec4(vec@vec4:vec4(float())).
subtract(A, B) ->
vec@vec4:map2(A, B, fun vec@vec4f:subtract/2).