From 39e6fce823f174c4f5e38f7c26ef864ea95d6a22 Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <guzba8@gmail.com>
Date: Sun, 29 Nov 2020 23:26:37 -0600
Subject: [PATCH 1/7] mat3 stuff

---
 src/vmath.nim | 77 +++++++++++++++++++++++----------------------------
 1 file changed, 34 insertions(+), 43 deletions(-)

diff --git a/src/vmath.nim b/src/vmath.nim
index 9a11ee6..fb07140 100644
--- a/src/vmath.nim
+++ b/src/vmath.nim
@@ -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, v: float32) = a[i * 3 + j] = v
 
-proc mat3*(a, b, c, d, e, f, g, h, i: float32): Mat3 =
-  result[0] = a
-  result[1] = b
-  result[2] = c
-  result[3] = d
-  result[4] = e
-  result[5] = f
-  result[6] = g
-  result[7] = h
-  result[8] = i
+proc mat3*(a, b, c, d, e, f, g, h, i: float32): Mat3 {.inline.} =
+  [
+    a, b, c,
+    d, e, f,
+    g, h, i
+  ]
 
-proc mat3*(a: Mat3): Mat3 =
+proc mat3*(a: Mat3): Mat3 {.inline.} =
   a
 
-proc identity*(a: var Mat3) =
-  a[0] = 1
-  a[1] = 0
-  a[2] = 0
-  a[3] = 0
-  a[4] = 1
-  a[5] = 0
-  a[6] = 0
-  a[7] = 0
-  a[8] = 1
+proc identity*(a: var Mat3) {.inline.} =
+  a = [
+    1.float32, 0, 0,
+    0,         1, 0,
+    0,         0, 1
+  ]
 
 proc mat3*(): Mat3 {.inline.} =
   result.identity()
 
-proc transpose*(a: Mat3): Mat3 =
-  result[0] = a[0]
-  result[1] = a[3]
-  result[2] = a[6]
-  result[3] = a[1]
-  result[4] = a[4]
-  result[5] = a[7]
-  result[6] = a[2]
-  result[7] = a[5]
-  result[8] = a[8]
+proc transpose*(a: Mat3): Mat3 {.inline.} =
+  [
+    a[0], a[3], a[6],
+    a[1], a[4], a[7],
+    a[2], a[5], a[8]
+  ]
 
 proc `$`*(a: Mat3): string =
   &"""[{a[0]:.4f}, {a[1]:.4f}, {a[2]:.4f},
@@ -601,6 +589,7 @@ proc rotationMat3*(angle: float32): Mat3 =
   let
     sin = sin(angle)
     cos = cos(angle)
+
   result[0, 0] = cos
   result[0, 1] = -sin
   result[0, 2] = 0
@@ -613,26 +602,28 @@ proc rotationMat3*(angle: float32): Mat3 =
   result[2, 1] = 0
   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.
   a * rotationMat3(angle)
 
 proc `*`*(a: Mat3, b: Vec2): Vec2 =
-  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.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]
 
 proc `*`*(a: Mat3, b: Vec3): Vec3 =
-  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.z = a[0, 2]*b.x + a[1, 2]*b.y + a[2, 2]*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.z = a[0, 2] * b.x + a[1, 2] * b.y + a[2, 2] * b.z
 
 proc inverse*(a: Mat3): Mat3 =
-  let determinant = (
-    a[0, 0] * (a[1, 1] * a[2, 2] - a[2, 1] * a[1, 2]) -
-    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
+  let
+    determinant = (
+      a[0, 0] * (a[1, 1] * a[2, 2] - a[2, 1] * a[1, 2]) -
+      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])
+    )
+    invDet = 1 / determinant
+
   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, 2] =  (a[0, 1] * a[1, 2] - a[0, 2] * a[1, 1]) * invDet

From 1fe7cc09de12d622d74401b6ee4e42ebb32a59df Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <guzba8@gmail.com>
Date: Sun, 29 Nov 2020 23:37:25 -0600
Subject: [PATCH 2/7] some mat4

---
 src/vmath.nim | 82 ++++++++++++++++-----------------------------------
 1 file changed, 25 insertions(+), 57 deletions(-)

diff --git a/src/vmath.nim b/src/vmath.nim
index fb07140..097ecb1 100644
--- a/src/vmath.nim
+++ b/src/vmath.nim
@@ -641,69 +641,37 @@ type Mat4* = array[16, float32] ## 4x4 Matrix - OpenGL row order
 template `[]`*(a: Mat4, i, j: int): float32 = a[i * 4 + j]
 template `[]=`*(a: Mat4, i, j: int, v: float32) = a[i * 4 + j] = v
 
-proc mat4*(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
-    v14, v15: float32): Mat4 =
-  result[0] = v0
-  result[1] = v1
-  result[2] = v2
-  result[3] = v3
-  result[4] = v4
-  result[5] = v5
-  result[6] = v6
-  result[7] = v7
-  result[8] = v8
-  result[9] = v9
-  result[10] = v10
-  result[11] = v11
-  result[12] = v12
-  result[13] = v13
-  result[14] = v14
-  result[15] = v15
+proc mat4*(
+  v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15: float32
+): Mat4 {.inline.} =
+  [
+    v0,  v1,  v2,  v3,
+    v4,  v5,  v6,  v7,
+    v8,  v9,  v10, v11,
+    v12, v13, v14, v15
+  ]
 
-proc mat4*(a: Mat4): Mat4 =
+proc mat4*(a: Mat4): Mat4 {.inline.} =
   a
 
-proc identity*(): Mat4 =
-  result[0] = 1
-  result[1] = 0
-  result[2] = 0
-  result[3] = 0
-  result[4] = 0
-  result[5] = 1
-  result[6] = 0
-  result[7] = 0
-  result[8] = 0
-  result[9] = 0
-  result[10] = 1
-  result[11] = 0
-  result[12] = 0
-  result[13] = 0
-  result[14] = 0
-  result[15] = 1
+proc identity*(): Mat4 {.inline.} =
+  [
+    1.float32, 0, 0, 0,
+    0,         1, 0, 0,
+    0,         0, 1, 0,
+    0,         0, 0, 1
+  ]
 
-proc mat4*(): Mat4 =
+proc mat4*(): Mat4 {.inline.} =
   identity()
 
-proc transpose*(a: Mat4): Mat4 =
-  result[0] = a[0]
-  result[1] = a[4]
-  result[2] = a[8]
-  result[3] = a[12]
-
-  result[4] = a[1]
-  result[5] = a[5]
-  result[6] = a[9]
-  result[7] = a[13]
-
-  result[8] = a[2]
-  result[9] = a[6]
-  result[10] = a[10]
-  result[11] = a[14]
-
-  result[12] = a[3]
-  result[13] = a[7]
-  result[14] = a[11]
-  result[15] = a[15]
+proc transpose*(a: Mat4): Mat4 {.inline.} =
+  [
+    a[0], a[4], a[8], a[12],
+    a[1], a[5], a[9], a[13],
+    a[2], a[6], a[10], a[14],
+    a[3], a[7], a[11], a[15]
+  ]
 
 proc determinant*(a: Mat4): float32 =
   var

From d8582e6bdd8668125d87e368fd350289bdbfe6d1 Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <guzba8@gmail.com>
Date: Sun, 29 Nov 2020 23:45:57 -0600
Subject: [PATCH 3/7] more mat3

---
 src/vmath.nim | 41 ++++++++++++++++++-----------------------
 1 file changed, 18 insertions(+), 23 deletions(-)

diff --git a/src/vmath.nim b/src/vmath.nim
index 097ecb1..f1c9fbb 100644
--- a/src/vmath.nim
+++ b/src/vmath.nim
@@ -572,35 +572,30 @@ proc scale*(a: Mat3, v: Vec3): Mat3 =
   result[7] = v.z * a[7]
   result[8] = v.z * a[8]
 
-proc translate*(v: Vec2): Mat3 =
-  result[0, 0] = 1
-  result[1, 1] = 1
-  result[2, 0] = v.x
-  result[2, 1] = v.y
-  result[2, 2] = 1
+proc translate*(v: Vec2): Mat3 {.inline.} =
+  [
+    1.float32, 0,   0,
+    0,         1,   0,
+    v.x,       v.y, 1
+  ]
 
-proc scale*(v: Vec2): Mat3 =
-  result[0, 0] = v.x
-  result[1, 1] = v.y
-  result[2, 2] = 1
+proc scale*(v: Vec2): Mat3 {.inline.} =
+  [
+    v.x, 0,   0,
+    0,   v.y, 0,
+    0,   0,   1
+  ]
 
-proc rotationMat3*(angle: float32): Mat3 =
+proc rotationMat3*(angle: float32): Mat3 {.inline.} =
   # Create a matrix from an angle.
   let
     sin = sin(angle)
     cos = cos(angle)
-
-  result[0, 0] = cos
-  result[0, 1] = -sin
-  result[0, 2] = 0
-
-  result[1, 0] = sin
-  result[1, 1] = cos
-  result[1, 2] = 0
-
-  result[2, 0] = 0
-  result[2, 1] = 0
-  result[2, 2] = 1
+  result = [
+    cos, -sin, 0,
+    sin,  cos, 0,
+    0,    0,   1
+  ]
 
 proc rotate*(a: Mat3, angle: float32): Mat3 {.inline.} =
   # Rotates a matrix by an angle.

From 7a9bca4236be4aada18ea88b43097f680fe56165 Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <guzba8@gmail.com>
Date: Sun, 29 Nov 2020 23:52:10 -0600
Subject: [PATCH 4/7] more

---
 src/vmath.nim | 32 ++++++++++++--------------------
 1 file changed, 12 insertions(+), 20 deletions(-)

diff --git a/src/vmath.nim b/src/vmath.nim
index f1c9fbb..7609136 100644
--- a/src/vmath.nim
+++ b/src/vmath.nim
@@ -550,27 +550,19 @@ proc `*`*(a: Mat3, b: Mat3): Mat3 =
   result[2, 1] += b[2, 0] * a[0, 1] + b[2, 1] * a[1, 1] + b[2, 2] * a[2, 1]
   result[2, 2] += b[2, 0] * a[0, 2] + b[2, 1] * a[1, 2] + b[2, 2] * a[2, 2]
 
-proc scale*(a: Mat3, v: Vec2): Mat3 =
-  result[0] = v.x * a[0]
-  result[1] = v.x * a[1]
-  result[2] = v.x * a[2]
-  result[3] = v.y * a[3]
-  result[4] = v.y * a[4]
-  result[5] = v.y * a[5]
-  result[6] = a[6]
-  result[7] = a[7]
-  result[8] = a[8]
+proc scale*(a: Mat3, v: Vec2): Mat3 {.inline.} =
+  [
+    v.x * a[0], v.x * a[1], v.x * a[2],
+    v.y * a[3], v.y * a[4], v.y * a[5],
+    a[6],       a[7],       a[8]
+  ]
 
-proc scale*(a: Mat3, v: Vec3): Mat3 =
-  result[0] = v.x * a[0]
-  result[1] = v.x * a[1]
-  result[2] = v.x * a[2]
-  result[3] = v.y * a[3]
-  result[4] = v.y * a[4]
-  result[5] = v.y * a[5]
-  result[6] = v.z * a[6]
-  result[7] = v.z * a[7]
-  result[8] = v.z * a[8]
+proc scale*(a: Mat3, v: Vec3): Mat3 {.inline.} =
+  [
+    v.x * a[0], v.x * a[1], v.x * a[2],
+    v.y * a[3], v.y * a[4], v.y * a[5],
+    v.z * a[6], v.z * a[7], v.z * a[8]
+  ]
 
 proc translate*(v: Vec2): Mat3 {.inline.} =
   [

From a307f89589e438e5e3f7945409701d80c91d30db Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <guzba8@gmail.com>
Date: Mon, 30 Nov 2020 00:22:10 -0600
Subject: [PATCH 5/7] quat

---
 src/vmath.nim | 204 ++++++++++++++++++++++++++------------------------
 1 file changed, 107 insertions(+), 97 deletions(-)

diff --git a/src/vmath.nim b/src/vmath.nim
index 7609136..597c052 100644
--- a/src/vmath.nim
+++ b/src/vmath.nim
@@ -796,66 +796,66 @@ proc `*`*(a, b: Mat4): Mat4 =
   result[15] = b30*a03 + b31*a13 + b32*a23 + b33*a33
 
 proc `*`*(a: Mat4, b: Vec3): Vec3 =
-  result.x = a[0]*b.x + a[4]*b.y + a[8]*b.z + a[12]
-  result.y = a[1]*b.x + a[5]*b.y + a[9]*b.z + a[13]
-  result.z = a[2]*b.x + a[6]*b.y + a[10]*b.z + a[14]
+  result.x = a[0] * b.x + a[4] * b.y + a[8] * b.z + a[12]
+  result.y = a[1] * b.x + a[5] * b.y + a[9] * b.z + a[13]
+  result.z = a[2] * b.x + a[6] * b.y + a[10] * b.z + a[14]
 
 proc `*`*(a: Mat4, b: Vec4): Vec4 =
-  result.x = a[0]*b.x + a[4]*b.y + a[8]*b.z + a[12]*b.w
-  result.y = a[1]*b.x + a[5]*b.y + a[9]*b.z + a[13]*b.w
-  result.z = a[2]*b.x + a[6]*b.y + a[10]*b.z + a[14]*b.w
-  result.w = a[3]*b.x + a[7]*b.y + a[11]*b.z + a[15]*b.w
+  result.x = a[0] * b.x + a[4] * b.y + a[8] * b.z + a[12] * b.w
+  result.y = a[1] * b.x + a[5] * b.y + a[9] * b.z + a[13] * b.w
+  result.z = a[2] * b.x + a[6] * b.y + a[10] * b.z + a[14] * b.w
+  result.w = a[3] * b.x + a[7] * b.y + a[11] * b.z + a[15] * b.w
 
-proc right*(a: Mat4): Vec3 =
+proc right*(a: Mat4): Vec3 {.inline.} =
   result.x = a[0]
   result.y = a[1]
   result.z = a[2]
 
-proc `right=`*(a: var Mat4, b: Vec3) =
+proc `right=`*(a: var Mat4, b: Vec3) {.inline.} =
   a[0] = b.x
   a[1] = b.y
   a[2] = b.z
 
-proc up*(a: Mat4): Vec3 =
+proc up*(a: Mat4): Vec3 {.inline.} =
   result.x = a[4]
   result.y = a[5]
   result.z = a[6]
 
-proc `up=`*(a: var Mat4, b: Vec3) =
+proc `up=`*(a: var Mat4, b: Vec3) {.inline.} =
   a[4] = b.x
   a[5] = b.y
   a[6] = b.z
 
-proc forward*(a: Mat4): Vec3 =
+proc forward*(a: Mat4): Vec3 {.inline.} =
   result.x = a[8]
   result.y = a[9]
   result.z = a[10]
 
-proc `forward=`*(a: var Mat4, b: Vec3) =
+proc `forward=`*(a: var Mat4, b: Vec3) {.inline.} =
   a[8] = b.x
   a[9] = b.y
   a[10] = b.z
 
-proc pos*(a: Mat4): Vec3 =
+proc pos*(a: Mat4): Vec3 {.inline.} =
   result.x = a[12]
   result.y = a[13]
   result.z = a[14]
 
-proc `pos=`*(a: var Mat4, b: Vec3) =
+proc `pos=`*(a: var Mat4, b: Vec3) {.inline.} =
   a[12] = b.x
   a[13] = b.y
   a[14] = b.z
 
-proc rotationOnly*(a: Mat4): Mat4 =
+proc rotationOnly*(a: Mat4): Mat4 {.inline.} =
   result = a
   result.pos = vec3(0, 0, 0)
 
 proc dist*(a, b: Mat4): float32 =
-  var
+  let
     x = a[12] - b[12]
     y = a[13] - b[13]
     z = a[14] - b[14]
-  sqrt(x*x + y*y + z*z)
+  sqrt(x * x + y * y + z * z)
 
 #[
 proc translate*(a: Mat4, v: Vec3): Mat4 =
@@ -932,16 +932,16 @@ proc hrp*(m: Mat4): Vec3 =
   result.z = roll
 
 proc frustum*(left, right, bottom, top, near, far: float32): Mat4 =
-  var
+  let
     rl = (right - left)
     tb = (top - bottom)
     fn = (far - near)
-  result[0] = (near*2) / rl
+  result[0] = (near * 2) / rl
   result[1] = 0
   result[2] = 0
   result[3] = 0
   result[4] = 0
-  result[5] = (near*2) / tb
+  result[5] = (near * 2) / tb
   result[6] = 0
   result[7] = 0
   result[8] = (right + left) / rl
@@ -950,17 +950,17 @@ proc frustum*(left, right, bottom, top, near, far: float32): Mat4 =
   result[11] = -1
   result[12] = 0
   result[13] = 0
-  result[14] = -(far*near*2) / fn
+  result[14] = -(far * near * 2) / fn
   result[15] = 0
 
 proc perspective*(fovy, aspect, near, far: float32): Mat4 =
-  var
-    top = near * tan(fovy*PI / 360.0)
+  let
+    top = near * tan(fovy * PI / 360.0)
     right = top * aspect
   frustum(-right, right, -top, top, near, far)
 
 proc ortho*(left, right, bottom, top, near, far: float32): Mat4 =
-  var
+  let
     rl = (right - left)
     tb = (top - bottom)
     fn = (far - near)
@@ -982,7 +982,7 @@ proc ortho*(left, right, bottom, top, near, far: float32): Mat4 =
   result[15] = 1
 
 proc lookAt*(eye, center, up: Vec3): Mat4 =
-  var
+  let
     eyex = eye[0]
     eyey = eye[1]
     eyez = eye[2]
@@ -1003,34 +1003,34 @@ proc lookAt*(eye, center, up: Vec3): Mat4 =
     z2 = eyez - center[2]
 
   # normalize (no check needed for 0 because of early return)
-  var len = 1/sqrt(z0*z0 + z1*z1 + z2*z2)
+  var len = 1 / sqrt(z0 * z0 + z1 * z1 + z2 * z2)
   z0 *= len
   z1 *= len
   z2 *= len
 
   var
     # vec3.normalize(vec3.cross(up, z, x))
-    x0 = upy*z2 - upz*z1
-    x1 = upz*z0 - upx*z2
-    x2 = upx*z1 - upy*z0
-  len = sqrt(x0*x0 + x1*x1 + x2*x2)
+    x0 = upy * z2 - upz * z1
+    x1 = upz * z0 - upx * z2
+    x2 = upx * z1 - upy * z0
+  len = sqrt(x0 * x0 + x1 * x1 + x2 * x2)
   if len == 0:
     x0 = 0
     x1 = 0
     x2 = 0
   else:
-    len = 1/len
+    len = 1 / len
     x0 *= len
     x1 *= len
     x2 *= len
 
   var
     # vec3.normalize(vec3.cross(z, x, y))
-    y0 = z1*x2 - z2*x1
-    y1 = z2*x0 - z0*x2
-    y2 = z0*x1 - z1*x0
+    y0 = z1 * x2 - z2 * x1
+    y1 = z2 * x0 - z0 * x2
+    y2 = z0 * x1 - z1 * x0
 
-  len = sqrt(y0*y0 + y1*y1 + y2*y2)
+  len = sqrt(y0 * y0 + y1 * y1 + y2 * y2)
   if len == 0:
     y0 = 0
     y1 = 0
@@ -1053,9 +1053,9 @@ proc lookAt*(eye, center, up: Vec3): Mat4 =
   result[9] = y2
   result[10] = z2
   result[11] = 0
-  result[12] = -(x0*eyex + x1*eyey + x2*eyez)
-  result[13] = -(y0*eyex + y1*eyey + y2*eyez)
-  result[14] = -(z0*eyex + z1*eyey + z2*eyez)
+  result[12] = -(x0 * eyex + x1 * eyey + x2 * eyez)
+  result[13] = -(y0 * eyex + y1 * eyey + y2 * eyez)
+  result[14] = -(z0 * eyex + z1 * eyey + z2 * eyez)
   result[15] = 1
 
 proc mat3*(m: Mat4): Mat3 =
@@ -1128,19 +1128,19 @@ type Quat* = object
   z*: float32
   w*: float32
 
-proc quat*(x, y, z, w: float32): Quat =
+proc quat*(x, y, z, w: float32): Quat {.inline.} =
   result.x = x
   result.y = y
   result.z = z
   result.w = w
 
-proc conjugate*(q: Quat): Quat =
+proc conjugate*(q: Quat): Quat {.inline.} =
   result.w = +q.w
   result.x = -q.x
   result.y = -q.y
   result.z = -q.z
 
-proc length*(q: Quat): float32 =
+proc length*(q: Quat): float32 {.inline.} =
   sqrt(
     q.w * q.w +
     q.x * q.x +
@@ -1155,23 +1155,23 @@ proc normalize*(q: Quat): Quat =
   result.z = q.z / m
   result.w = q.w / m
 
-proc xyz*(q: Quat): Vec3 =
+proc xyz*(q: Quat): Vec3 {.inline.} =
   result.x = q.x
   result.y = q.y
   result.z = q.z
 
-proc `xyz=`*(q: var Quat, v: Vec3) =
+proc `xyz=`*(q: var Quat, v: Vec3) {.inline.} =
   q.x = v.x
   q.y = v.y
   q.z = v.z
 
-proc `-`*(a: var Quat): Quat =
+proc `-`*(a: var Quat): Quat {.inline.} =
   result.x = -a.x
   result.y = -a.y
   result.z = -a.z
   result.w = -a.w
 
-proc `+`*(a: Quat, b: Quat): Quat =
+proc `+`*(a: Quat, b: Quat): Quat {.inline.} =
   result.x = a.x + b.x
   result.y = a.y + b.y
   result.z = a.z + b.z
@@ -1195,7 +1195,7 @@ proc `*`*(a, b: Quat): Quat =
   result.z = a.z * b.w + a.w * b.z + a.x * b.y - a.y * b.x
   result.w = a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z
 
-proc `*`*(q: Quat, v: float32): Quat =
+proc `*`*(q: Quat, v: float32): Quat {.inline.} =
   ## Multiply the quaternion by a float32.
   result.x = q.x * v
   result.y = q.y * v
@@ -1204,7 +1204,7 @@ proc `*`*(q: Quat, v: float32): Quat =
 
 proc `*`*(q: Quat, v: Vec3): Vec3 =
   ## Multiply the quaternion by a vector.
-  var
+  let
     x = v.x
     y = v.y
     z = v.z
@@ -1223,29 +1223,35 @@ proc `*`*(q: Quat, v: Vec3): Vec3 =
   result.y = iy * qw + iw * -qy + iz * -qx - ix * -qz
   result.z = iz * qw + iw * -qz + ix * -qy - iy * -qx
 
+proc `[]`*(a: var Quat, i: int, b: float32) =
+  case i
+  of 0: a.x
+  of 1: a.y
+  of 2: a.z
+  of 3: a.w
+  else: raise newException(IndexDefect, "Index not in 0 .. 3")
+
 proc `[]=`*(a: var Quat, i: int, b: float32) =
-  assert(i == 0 or i == 1 or i == 2 or i == 3)
-  if i == 0:
-    a.x = b
-  elif i == 1:
-    a.y = b
-  elif i == 2:
-    a.z = b
-  elif i == 3:
-    a.w = b
+  case i
+  of 0: a.x = b
+  of 1: a.y = b
+  of 2: a.z = b
+  of 3: a.w = b
+  else: raise newException(IndexDefect, "Index not in 0 .. 3")
 
 proc mat3*(q: Quat): Mat3 =
-  var xx = q.x * q.x
-  var xy = q.x * q.y
-  var xz = q.x * q.z
-  var xw = q.x * q.w
+  let
+    xx = q.x * q.x
+    xy = q.x * q.y
+    xz = q.x * q.z
+    xw = q.x * q.w
 
-  var yy = q.y * q.y
-  var yz = q.y * q.z
-  var yw = q.y * q.w
+    yy = q.y * q.y
+    yz = q.y * q.z
+    yw = q.y * q.w
 
-  var zz = q.z * q.z
-  var zw = q.z * q.w
+    zz = q.z * q.z
+    zw = q.z * q.w
 
   result[0] = 1 - 2 * (yy + zz)
   result[1] = 0 + 2 * (xy - zw)
@@ -1258,17 +1264,18 @@ proc mat3*(q: Quat): Mat3 =
   result[8] = 1 - 2 * (xx + yy)
 
 proc mat4*(q: Quat): Mat4 =
-  var xx = q.x * q.x
-  var xy = q.x * q.y
-  var xz = q.x * q.z
-  var xw = q.x * q.w
+  let
+    xx = q.x * q.x
+    xy = q.x * q.y
+    xz = q.x * q.z
+    xw = q.x * q.w
 
-  var yy = q.y * q.y
-  var yz = q.y * q.z
-  var yw = q.y * q.w
+    yy = q.y * q.y
+    yz = q.y * q.z
+    yw = q.y * q.w
 
-  var zz = q.z * q.z
-  var zw = q.z * q.w
+    zz = q.z * q.z
+    zw = q.z * q.w
 
   result[00] = 1 - 2 * (yy + zz)
   result[01] = 0 + 2 * (xy - zw)
@@ -1288,11 +1295,11 @@ proc mat4*(q: Quat): Mat4 =
   result[14] = 0
   result[15] = 1.0
 
-proc recifuncalSqrt*(x: float32): float32 =
-  1.0/sqrt(x)
+proc recifuncalSqrt*(x: float32): float32 {.inline.} =
+  1.0 / sqrt(x)
 
 proc quat*(m: Mat4): Quat =
-  var
+  let
     m00 = m[0]
     m01 = m[4]
     m02 = m[8]
@@ -1305,8 +1312,9 @@ proc quat*(m: Mat4): Quat =
     m21 = m[6]
     m22 = m[10]
 
-  var q: Quat
-  var t: float32
+  var
+    q: Quat
+    t: float32
 
   if m22 < 0:
     if m00 > m11:
@@ -1328,8 +1336,9 @@ proc quat*(m: Mat4): Quat =
   q
 
 proc fromAxisAngle*(axis: Vec3, angle: float32): Quat =
-  var a = axis.normalize()
-  var s = sin(angle / 2)
+  let
+    a = axis.normalize()
+    s = sin(angle / 2)
   result.x = a.x * s
   result.y = a.y * s
   result.z = a.z * s
@@ -1348,18 +1357,19 @@ proc toAxisAngle*(q: Quat, axis: var Vec3, angle: var float32) =
   axis.z = q.z / sinAngle
 
 proc quat*(heading, pitch, roll: float32): Quat =
-  var t0 = cos(heading * 0.5)
-  var t1 = sin(heading * 0.5)
-  var t2 = cos(roll * 0.5)
-  var t3 = sin(roll * 0.5)
-  var t4 = cos(pitch * 0.5)
-  var t5 = sin(pitch * 0.5)
+  let
+    t0 = cos(heading * 0.5)
+    t1 = sin(heading * 0.5)
+    t2 = cos(roll * 0.5)
+    t3 = sin(roll * 0.5)
+    t4 = cos(pitch * 0.5)
+    t5 = sin(pitch * 0.5)
   result.w = t0 * t2 * t4 + t1 * t3 * t5
   result.x = t0 * t3 * t4 - t1 * t2 * t5
   result.y = t0 * t2 * t5 + t1 * t3 * t4
   result.z = t1 * t2 * t4 - t0 * t3 * t5
 
-proc quat*(hpr: Vec3): Quat =
+proc quat*(hpr: Vec3): Quat {.inline.} =
   quat(hpr.x, hpr.y, hpr.z)
 
 proc hrp*(q: Quat): Vec3 =
@@ -1380,8 +1390,8 @@ proc hrp*(q: Quat): Vec3 =
   var t4 = +1.0 - 2.0 * (ysqr + q.z * q.z)
   result.x = arctan2(t3, t4)
 
-proc dot*(a: Quat, b: Quat): float32 =
-  a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w
+proc dot*(a: Quat, b: Quat): float32 {.inline.} =
+  a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w
 
 proc nlerp*(a: Quat, b: Quat, v: float32): Quat =
   if dot(a, b) < 0:
@@ -1393,25 +1403,25 @@ proc nlerp*(a: Quat, b: Quat, v: float32): Quat =
 proc `$`*(a: Quat): string =
   &"q({a.x:.8f}, {a.y:.8f}, {a.z:.8f}, {a.w:.8f})"
 
-proc rotate*(angle: float32, axis: Vec3): Mat4 =
+proc rotate*(angle: float32, axis: Vec3): Mat4 {.inline.} =
   fromAxisAngle(axis, angle).mat4()
 
-proc rotateX*(angle: float32): Mat4 =
+proc rotateX*(angle: float32): Mat4 {.inline.} =
   rotate(angle, vec3(1, 0, 0))
 
-proc rotateY*(angle: float32): Mat4 =
+proc rotateY*(angle: float32): Mat4 {.inline.} =
   rotate(angle, vec3(0, 1, 0))
 
-proc rotateZ*(angle: float32): Mat4 =
+proc rotateZ*(angle: float32): Mat4 {.inline.} =
   rotate(angle, vec3(0, 0, 1))
 
-proc scaleMat*(scale: Vec3): Mat4 =
+proc scaleMat*(scale: Vec3): Mat4 {.inline.} =
   result[0] = scale.x
   result[5] = scale.y
   result[10] = scale.z
   result[15] = 1.0
 
-proc scaleMat*(scale: float32): Mat4 =
+proc scaleMat*(scale: float32): Mat4 {.inline.} =
   scaleMat(vec3(scale, scale, scale))
 
 type Rect* = object

From 19c9ef1b0b5dcbcc993d97fa7c3a3dc80ea21b4a Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <guzba8@gmail.com>
Date: Mon, 30 Nov 2020 00:50:07 -0600
Subject: [PATCH 6/7] add missing

---
 src/vmath.nim  | 13 +++++++++++++
 tests/test.nim | 16 ++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/src/vmath.nim b/src/vmath.nim
index 597c052..aeb892b 100644
--- a/src/vmath.nim
+++ b/src/vmath.nim
@@ -1202,6 +1202,19 @@ proc `*`*(q: Quat, v: float32): Quat {.inline.} =
   result.z = q.z * v
   result.w = q.w * v
 
+proc `/`*(q: Quat, v: float32): Quat {.inline.} =
+  ## Divide the quaternion by a float32.
+  result.x = q.x / v
+  result.y = q.y / v
+  result.z = q.z / v
+  result.w = q.w / v
+
+proc `*=`*(a: var Quat, b: float32) {.inline.} =
+  a = a * b
+
+proc `/=`*(a: var Quat, b: float32) {.inline.} =
+  a = a / b
+
 proc `*`*(q: Quat, v: Vec3): Vec3 =
   ## Multiply the quaternion by a vector.
   let
diff --git a/tests/test.nim b/tests/test.nim
index 2a87526..9134b8d 100644
--- a/tests/test.nim
+++ b/tests/test.nim
@@ -1,5 +1,21 @@
 import vmath, osproc, random, streams
 
+var v2 = vec2(0, 0)
+v2 *= 1
+v2 /= 1
+
+var v3 = vec3(0, 0, 0)
+v3 *= 1
+v3 /= 1
+
+var v4 = vec4(0, 0, 0, 0)
+v4 *= 1
+v4 /= 1
+
+var q = quat(0, 0, 0, 0)
+q *= 1
+q /= 1
+
 var s = newFileStream("tests/test-output.txt", fmWrite)
 
 randomize(1234)

From f83eb0b7b260e60d0e791cd00a337abce797f269 Mon Sep 17 00:00:00 2001
From: Ryan Oldenburg <guzba8@gmail.com>
Date: Mon, 30 Nov 2020 01:07:08 -0600
Subject: [PATCH 7/7] more clear

---
 src/vmath.nim | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/vmath.nim b/src/vmath.nim
index aeb892b..4126493 100644
--- a/src/vmath.nim
+++ b/src/vmath.nim
@@ -529,9 +529,9 @@ proc mat3*(): Mat3 {.inline.} =
 
 proc transpose*(a: Mat3): Mat3 {.inline.} =
   [
-    a[0], a[3], a[6],
-    a[1], a[4], a[7],
-    a[2], a[5], a[8]
+    a[0, 0], a[1, 0], a[2, 0],
+    a[0, 1], a[1, 1], a[2, 1],
+    a[0, 2], a[1, 2], a[2, 2]
   ]
 
 proc `$`*(a: Mat3): string =
@@ -654,10 +654,10 @@ proc mat4*(): Mat4 {.inline.} =
 
 proc transpose*(a: Mat4): Mat4 {.inline.} =
   [
-    a[0], a[4], a[8], a[12],
-    a[1], a[5], a[9], a[13],
-    a[2], a[6], a[10], a[14],
-    a[3], a[7], a[11], a[15]
+    a[0, 0], a[1, 0], a[2, 0], a[3, 0],
+    a[0, 1], a[1, 1], a[2, 1], a[3, 1],
+    a[0, 2], a[1, 2], a[2, 2], a[3, 2],
+    a[0, 3], a[1, 3], a[2, 3], a[3, 3]
   ]
 
 proc determinant*(a: Mat4): float32 =
@@ -850,7 +850,7 @@ proc rotationOnly*(a: Mat4): Mat4 {.inline.} =
   result = a
   result.pos = vec3(0, 0, 0)
 
-proc dist*(a, b: Mat4): float32 =
+proc dist*(a, b: Mat4): float32 {.inline.} =
   let
     x = a[12] - b[12]
     y = a[13] - b[13]