mat3 stuff
This commit is contained in:
parent
fba9ed7699
commit
39e6fce823
1 changed files with 34 additions and 43 deletions
|
@ -507,44 +507,32 @@ type Mat3* = array[9, float32] ## 3x3 Matrix
|
||||||
template `[]`*(a: Mat3, i, j: int): float32 = a[i * 3 + j]
|
template `[]`*(a: Mat3, i, j: int): float32 = a[i * 3 + j]
|
||||||
template `[]=`*(a: Mat3, i, j: int, v: float32) = a[i * 3 + j] = v
|
template `[]=`*(a: Mat3, i, j: int, v: float32) = a[i * 3 + j] = v
|
||||||
|
|
||||||
proc mat3*(a, b, c, d, e, f, g, h, i: float32): Mat3 =
|
proc mat3*(a, b, c, d, e, f, g, h, i: float32): Mat3 {.inline.} =
|
||||||
result[0] = a
|
[
|
||||||
result[1] = b
|
a, b, c,
|
||||||
result[2] = c
|
d, e, f,
|
||||||
result[3] = d
|
g, h, i
|
||||||
result[4] = e
|
]
|
||||||
result[5] = f
|
|
||||||
result[6] = g
|
|
||||||
result[7] = h
|
|
||||||
result[8] = i
|
|
||||||
|
|
||||||
proc mat3*(a: Mat3): Mat3 =
|
proc mat3*(a: Mat3): Mat3 {.inline.} =
|
||||||
a
|
a
|
||||||
|
|
||||||
proc identity*(a: var Mat3) =
|
proc identity*(a: var Mat3) {.inline.} =
|
||||||
a[0] = 1
|
a = [
|
||||||
a[1] = 0
|
1.float32, 0, 0,
|
||||||
a[2] = 0
|
0, 1, 0,
|
||||||
a[3] = 0
|
0, 0, 1
|
||||||
a[4] = 1
|
]
|
||||||
a[5] = 0
|
|
||||||
a[6] = 0
|
|
||||||
a[7] = 0
|
|
||||||
a[8] = 1
|
|
||||||
|
|
||||||
proc mat3*(): Mat3 {.inline.} =
|
proc mat3*(): Mat3 {.inline.} =
|
||||||
result.identity()
|
result.identity()
|
||||||
|
|
||||||
proc transpose*(a: Mat3): Mat3 =
|
proc transpose*(a: Mat3): Mat3 {.inline.} =
|
||||||
result[0] = a[0]
|
[
|
||||||
result[1] = a[3]
|
a[0], a[3], a[6],
|
||||||
result[2] = a[6]
|
a[1], a[4], a[7],
|
||||||
result[3] = a[1]
|
a[2], a[5], a[8]
|
||||||
result[4] = a[4]
|
]
|
||||||
result[5] = a[7]
|
|
||||||
result[6] = a[2]
|
|
||||||
result[7] = a[5]
|
|
||||||
result[8] = a[8]
|
|
||||||
|
|
||||||
proc `$`*(a: Mat3): string =
|
proc `$`*(a: Mat3): string =
|
||||||
&"""[{a[0]:.4f}, {a[1]:.4f}, {a[2]:.4f},
|
&"""[{a[0]:.4f}, {a[1]:.4f}, {a[2]:.4f},
|
||||||
|
@ -601,6 +589,7 @@ proc rotationMat3*(angle: float32): Mat3 =
|
||||||
let
|
let
|
||||||
sin = sin(angle)
|
sin = sin(angle)
|
||||||
cos = cos(angle)
|
cos = cos(angle)
|
||||||
|
|
||||||
result[0, 0] = cos
|
result[0, 0] = cos
|
||||||
result[0, 1] = -sin
|
result[0, 1] = -sin
|
||||||
result[0, 2] = 0
|
result[0, 2] = 0
|
||||||
|
@ -613,26 +602,28 @@ proc rotationMat3*(angle: float32): Mat3 =
|
||||||
result[2, 1] = 0
|
result[2, 1] = 0
|
||||||
result[2, 2] = 1
|
result[2, 2] = 1
|
||||||
|
|
||||||
proc rotate*(a: Mat3, angle: float32): Mat3 =
|
proc rotate*(a: Mat3, angle: float32): Mat3 {.inline.} =
|
||||||
# Rotates a matrix by an angle.
|
# Rotates a matrix by an angle.
|
||||||
a * rotationMat3(angle)
|
a * rotationMat3(angle)
|
||||||
|
|
||||||
proc `*`*(a: Mat3, b: Vec2): Vec2 =
|
proc `*`*(a: Mat3, b: Vec2): Vec2 =
|
||||||
result.x = a[0, 0]*b.x + a[1, 0]*b.y + a[2, 0]
|
result.x = a[0, 0] * b.x + a[1, 0] * b.y + a[2, 0]
|
||||||
result.y = a[0, 1]*b.x + a[1, 1]*b.y + a[2, 1]
|
result.y = a[0, 1] * b.x + a[1, 1] * b.y + a[2, 1]
|
||||||
|
|
||||||
proc `*`*(a: Mat3, b: Vec3): Vec3 =
|
proc `*`*(a: Mat3, b: Vec3): Vec3 =
|
||||||
result.x = a[0, 0]*b.x + a[1, 0]*b.y + a[2, 0]*b.z
|
result.x = a[0, 0] * b.x + a[1, 0] * b.y + a[2, 0] * b.z
|
||||||
result.y = a[0, 1]*b.x + a[1, 1]*b.y + a[2, 1]*b.z
|
result.y = a[0, 1] * b.x + a[1, 1] * b.y + a[2, 1] * b.z
|
||||||
result.z = a[0, 2]*b.x + a[1, 2]*b.y + a[2, 2]*b.z
|
result.z = a[0, 2] * b.x + a[1, 2] * b.y + a[2, 2] * b.z
|
||||||
|
|
||||||
proc inverse*(a: Mat3): Mat3 =
|
proc inverse*(a: Mat3): Mat3 =
|
||||||
let determinant = (
|
let
|
||||||
a[0, 0] * (a[1, 1] * a[2, 2] - a[2, 1] * a[1, 2]) -
|
determinant = (
|
||||||
a[0, 1] * (a[1, 0] * a[2, 2] - a[1, 2] * a[2, 0]) +
|
a[0, 0] * (a[1, 1] * a[2, 2] - a[2, 1] * a[1, 2]) -
|
||||||
a[0, 2] * (a[1, 0] * a[2, 1] - a[1, 1] * a[2, 0])
|
a[0, 1] * (a[1, 0] * a[2, 2] - a[1, 2] * a[2, 0]) +
|
||||||
)
|
a[0, 2] * (a[1, 0] * a[2, 1] - a[1, 1] * a[2, 0])
|
||||||
let invDet = 1 / determinant
|
)
|
||||||
|
invDet = 1 / determinant
|
||||||
|
|
||||||
result[0, 0] = (a[1, 1] * a[2, 2] - a[2, 1] * a[1, 2]) * invDet
|
result[0, 0] = (a[1, 1] * a[2, 2] - a[2, 1] * a[1, 2]) * invDet
|
||||||
result[0, 1] = -(a[0, 1] * a[2, 2] - a[0, 2] * a[2, 1]) * invDet
|
result[0, 1] = -(a[0, 1] * a[2, 2] - a[0, 2] * a[2, 1]) * invDet
|
||||||
result[0, 2] = (a[0, 1] * a[1, 2] - a[0, 2] * a[1, 1]) * invDet
|
result[0, 2] = (a[0, 1] * a[1, 2] - a[0, 2] * a[1, 1]) * invDet
|
||||||
|
|
Loading…
Reference in a new issue