From dfa3e2199f94e7003b9fdefcc5a7805c5cafe405 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg <guzba8@gmail.com> Date: Sun, 29 Nov 2020 18:55:54 -0600 Subject: [PATCH 1/6] vec2 --- src/vmath.nim | 72 ++++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/src/vmath.nim b/src/vmath.nim index ed57e32..dafa4b6 100644 --- a/src/vmath.nim +++ b/src/vmath.nim @@ -21,6 +21,31 @@ proc lerp*(a: float32, b: float32, v: float32): float32 = ## * 0.5 -> between a and b a * (1.0 - v) + b * v +proc fixAngle*(angle: float32): float32 = + ## Make angle be from -PI to PI radians. + var angle = angle + while angle > PI: + angle -= PI * 2 + while angle < -PI: + angle += PI * 2 + angle + +proc angleBetween*(a, b: float32): float32 = + ## Angle between angle a and angle b. + fixAngle(b - a) + +proc turnAngle*(a, b, speed: float32): float32 = + ## Move from angle a to angle b with step of v. + var + turn = fixAngle(b - a) + if abs(turn) < speed: + return b + elif turn > speed: + turn = speed + elif turn < -speed: + turn = -speed + a + turn + type Vec2* = object ## 2D vector x*: float32 @@ -81,7 +106,7 @@ proc `-`*(a: Vec2): Vec2 {.inline.} = result.x = -a.x result.y = -a.y -proc hash*(a: Vec2): Hash = +proc hash*(a: Vec2): Hash {.inline.} = hash((a.x, a.y)) proc lengthSq*(a: Vec2): float32 {.inline.} = @@ -97,7 +122,7 @@ proc normalize*(a: Vec2): Vec2 {.inline.} = a / a.length proc dot*(a: Vec2, b: Vec2): float32 {.inline.} = - a.x*b.x + a.y*b.y + a.x * b.x + a.y * b.y proc dir*(at: Vec2, to: Vec2): Vec2 {.inline.} = (at - to).normalize() @@ -127,36 +152,29 @@ proc inRect*(v: Vec2, a: Vec2, b: Vec2): bool {.inline.} = v.x > min.x and v.x < max.x and v.y > min.y and v.y < max.y proc `[]`*(a: Vec2, i: int): float32 = - assert(i == 0 or i == 1) + if i > 1: + raise newException(IndexDefect, "Vec2 index out of bounds") if i == 0: - return a.x - elif i == 1: - return a.y + a.x + else: + a.y proc `[]=`*(a: var Vec2, i: int, b: float32) = - assert(i == 0 or i == 1) + if i > 1: + raise newException(IndexDefect, "Vec2 index out of bounds") if i == 0: a.x = b - elif i == 1: + else: a.y = b proc randVec2*(): Vec2 = - let a = rand(PI*2) + let a = rand(PI * 2) let v = rand(1.0) - vec2(cos(a)*v, sin(a)*v) + vec2(cos(a) * v, sin(a) * v) proc `$`*(a: Vec2): string = &"({a.x:.4f}, {a.y:.4f})" -proc fixAngle*(angle: float32): float32 = - ## Make angle be from -PI to PI radians. - var angle = angle - while angle > PI: - angle -= PI*2 - while angle < -PI: - angle += PI*2 - angle - proc angle*(a: Vec2): float32 = ## Angle of a Vec2. arctan2(a.y, a.x) @@ -165,22 +183,6 @@ proc angleBetween*(a: Vec2, b: Vec2): float32 = ## Angle between 2 Vec2. fixAngle(arctan2(a.y - b.y, a.x - b.x)) -proc angleBetween*(a, b: float32): float32 = - ## Angle between angle a and angle b. - (b - a).fixAngle - -proc turnAngle*(a, b, speed: float32): float32 = - ## Move from angle a to angle b with step of v. - var - turn = fixAngle(b - a) - if abs(turn) < speed: - return b - elif turn > speed: - turn = speed - elif turn < -speed: - turn = -speed - a + turn - type Vec3* = object ## 3D vector x*: float32 From 80a2b4dadeb7d77635926402ce3ea8c8a4cecbf6 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg <guzba8@gmail.com> Date: Sun, 29 Nov 2020 18:58:47 -0600 Subject: [PATCH 2/6] rand param --- src/vmath.nim | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vmath.nim b/src/vmath.nim index dafa4b6..9b2cf28 100644 --- a/src/vmath.nim +++ b/src/vmath.nim @@ -167,9 +167,9 @@ proc `[]=`*(a: var Vec2, i: int, b: float32) = else: a.y = b -proc randVec2*(): Vec2 = - let a = rand(PI * 2) - let v = rand(1.0) +proc randVec2*(r: var Rand): Vec2 = + let a = r.rand(PI * 2) + let v = r.rand(1.0) vec2(cos(a) * v, sin(a) * v) proc `$`*(a: Vec2): string = @@ -368,12 +368,12 @@ proc almostEquals*(a, b: Vec3, precision = 1e-6): bool = let c = a - b abs(c.x) < precision and abs(c.y) < precision and abs(c.z) < precision -proc randVec3*(): Vec3 = +proc randVec3*(r: var Rand): Vec3 = ## Generates a random unit vector based on ## http://mathworld.wolfram.com/SpherePointPicking.html let - u = rand(0.0 .. 1.0) - v = rand(0.0 .. 1.0) + u = r.rand(0.0 .. 1.0) + v = r.rand(0.0 .. 1.0) th = 2 * PI * u ph = arccos(2 * v - 1) vec3( From 1a5fbe202a0eea57b1f143132696115a8962bf3a Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg <guzba8@gmail.com> Date: Sun, 29 Nov 2020 19:21:58 -0600 Subject: [PATCH 3/6] mostly inlines + rand --- src/vmath.nim | 157 +++++++++++++++++++++++++------------------------- 1 file changed, 80 insertions(+), 77 deletions(-) diff --git a/src/vmath.nim b/src/vmath.nim index 9b2cf28..dbb8a1c 100644 --- a/src/vmath.nim +++ b/src/vmath.nim @@ -2,19 +2,19 @@ import hashes, math, random, strformat, strutils export math -proc between*(value, min, max: float32): bool = +proc between*(value, min, max: float32): bool {.inline.} = ## Returns true if value is between min and max or equal to them. (value >= min) and (value <= max) -proc sign*(v: float32): float32 = +proc sign*(v: float32): float32 {.inline.} = ## Returns the sign of a number, -1 or 1. if v >= 0: 1.0 else: -1.0 -proc quantize*(v: float32, n: float32): float32 = +proc quantize*(v: float32, n: float32): float32 {.inline.} = ## Makes v be multipe of n. Rounding to integer quantize by 1.0. sign(v) * floor(abs(v) / n) * n -proc lerp*(a: float32, b: float32, v: float32): float32 = +proc lerp*(a: float32, b: float32, v: float32): float32 {.inline.} = ## Interpolates value between a and b. ## * 0 -> a ## * 1 -> b @@ -189,17 +189,17 @@ type Vec3* = object y*: float32 z*: float32 -proc vec3*(x, y, z: float32): Vec3 = +proc vec3*(x, y, z: float32): Vec3 {.inline.} = result.x = x result.y = y result.z = z -proc vec3*(v: float32): Vec3 = +proc vec3*(v: float32): Vec3 {.inline.} = result.x = v result.y = v result.z = v -proc vec3*(a: Vec3): Vec3 = +proc vec3*(a: Vec3): Vec3 {.inline.} = result.x = a.x result.y = a.y result.z = a.z @@ -208,103 +208,103 @@ const X_DIR* = vec3(1.0, 0.0, 0.0) const Y_DIR* = vec3(0.0, 1.0, 0.0) const Z_DIR* = vec3(0.0, 0.0, 1.0) -proc `+`*(a: Vec3, b: Vec3): Vec3 = +proc `+`*(a: Vec3, b: Vec3): Vec3 {.inline.} = result.x = a.x + b.x result.y = a.y + b.y result.z = a.z + b.z -proc `-`*(a: Vec3, b: Vec3): Vec3 = +proc `-`*(a: Vec3, b: Vec3): Vec3 {.inline.} = result.x = a.x - b.x result.y = a.y - b.y result.z = a.z - b.z -proc `-`*(a: Vec3): Vec3 = +proc `-`*(a: Vec3): Vec3 {.inline.} = result.x = -a.x result.y = -a.y result.z = -a.z -proc `*`*(a: Vec3, b: float32): Vec3 = +proc `*`*(a: Vec3, b: float32): Vec3 {.inline.} = result.x = a.x * b result.y = a.y * b result.z = a.z * b -proc `*`*(a: float32, b: Vec3): Vec3 = +proc `*`*(a: float32, b: Vec3): Vec3 {.inline.} = b * a -proc `/`*(a: Vec3, b: float32): Vec3 = +proc `/`*(a: Vec3, b: float32): Vec3 {.inline.} = result.x = a.x / b result.y = a.y / b result.z = a.z / b -proc `/`*(a: float32, b: Vec3): Vec3 = +proc `/`*(a: float32, b: Vec3): Vec3 {.inline.} = result.x = a / b.x result.y = a / b.y result.z = a / b.z -proc `+=`*(a: var Vec3, b: Vec3) = +proc `+=`*(a: var Vec3, b: Vec3) {.inline.} = a.x += b.x a.y += b.y a.z += b.z -proc `-=`*(a: var Vec3, b: Vec3) = +proc `-=`*(a: var Vec3, b: Vec3) {.inline.} = a.x -= b.x a.y -= b.y a.z -= b.z -proc `*=`*(a: var Vec3, b: float32) = +proc `*=`*(a: var Vec3, b: float32) {.inline.} = a.x *= b a.y *= b a.z *= b -proc `/=`*(a: var Vec3, b: float32) = +proc `/=`*(a: var Vec3, b: float32) {.inline.} = a.x /= b a.y /= b a.z /= b -proc zero*(a: var Vec3) = +proc zero*(a: var Vec3) {.inline.} = a.x = 0 a.y = 0 a.z = 0 -proc `-`*(a: var Vec3): Vec3 = +proc `-`*(a: var Vec3): Vec3 {.inline.} = result.x = -a.x result.y = -a.y result.z = -a.z -proc hash*(a: Vec3): Hash = +proc hash*(a: Vec3): Hash {.inline.} = hash((a.x, a.y, a.z)) -proc lengthSq*(a: Vec3): float32 = +proc lengthSq*(a: Vec3): float32 {.inline.} = a.x * a.x + a.y * a.y + a.z * a.z -proc length*(a: Vec3): float32 = +proc length*(a: Vec3): float32 {.inline.} = sqrt(a.lengthSq) -proc `length=`*(a: var Vec3, b: float32) = +proc `length=`*(a: var Vec3, b: float32) {.inline.} = a *= b / a.length -proc floor*(a: Vec3): Vec3 = +proc floor*(a: Vec3): Vec3 {.inline.} = vec3(floor(a.x), floor(a.y), floor(a.z)) -proc round*(a: Vec3): Vec3 = +proc round*(a: Vec3): Vec3 {.inline.} = vec3(round(a.x), round(a.y), round(a.z)) -proc ceil*(a: Vec3): Vec3 = +proc ceil*(a: Vec3): Vec3 {.inline.} = vec3(ceil(a.x), ceil(a.y), ceil(a.z)) -proc normalize*(a: Vec3): Vec3 = - a / sqrt(a.x*a.x + a.y*a.y + a.z*a.z) +proc normalize*(a: Vec3): Vec3 {.inline.} = + a / sqrt(a.x * a.x + a.y * a.y + a.z * a.z) -proc cross*(a: Vec3, b: Vec3): Vec3 = - result.x = a.y*b.z - a.z*b.y - result.y = a.z*b.x - a.x*b.z - result.z = a.x*b.y - a.y*b.x +proc cross*(a: Vec3, b: Vec3): Vec3 {.inline.} = + result.x = a.y * b.z - a.z * b.y + result.y = a.z * b.x - a.x * b.z + result.z = a.x * b.y - a.y * b.x proc computeNormal*(a, b, c: Vec3): Vec3 = cross(c - b, b - a).normalize() -proc dot*(a: Vec3, b: Vec3): float32 = - a.x*b.x + a.y*b.y + a.z*b.z +proc dot*(a: Vec3, b: Vec3): float32 {.inline.} = + a.x * b.x + a.y * b.y + a.z * b.z proc dir*(at: Vec3, to: Vec3): Vec3 = (at - to).normalize() @@ -329,42 +329,44 @@ proc angleBetween*(a, b: Vec3): float32 = arccos(dot) proc `[]`*(a: Vec3, i: int): float32 = - assert(i == 0 or i == 1 or i == 2) + if i > 2: + raise newException(IndexDefect, "Vec3 index out of bounds") if i == 0: - return a.x + a.x elif i == 1: - return a.y - elif i == 2: - return a.z + a.y + else: + a.z proc `[]=`*(a: var Vec3, i: int, b: float32) = - assert(i == 0 or i == 1 or i == 2) + if i > 2: + raise newException(IndexDefect, "Vec3 index out of bounds") if i == 0: a.x = b elif i == 1: a.y = b - elif i == 2: + else: a.z = b -proc xy*(a: Vec3): Vec2 = +proc xy*(a: Vec3): Vec2 {.inline.} = vec2(a.x, a.y) -proc xz*(a: Vec3): Vec2 = +proc xz*(a: Vec3): Vec2 {.inline.} = vec2(a.x, a.z) -proc yx*(a: Vec3): Vec2 = +proc yx*(a: Vec3): Vec2 {.inline.} = vec2(a.y, a.x) -proc yz*(a: Vec3): Vec2 = +proc yz*(a: Vec3): Vec2 {.inline.} = vec2(a.y, a.z) -proc zx*(a: Vec3): Vec2 = +proc zx*(a: Vec3): Vec2 {.inline.} = vec2(a.y, a.x) -proc zy*(a: Vec3): Vec2 = +proc zy*(a: Vec3): Vec2 {.inline.} = vec2(a.z, a.y) -proc almostEquals*(a, b: Vec3, precision = 1e-6): bool = +proc almostEquals*(a, b: Vec3, precision = 1e-6): bool {.inline.} = let c = a - b abs(c.x) < precision and abs(c.y) < precision and abs(c.z) < precision @@ -392,129 +394,130 @@ type Vec4* = object z*: float32 w*: float32 -proc vec4*(x, y, z, w: float32): Vec4 = +proc vec4*(x, y, z, w: float32): Vec4 {.inline.} = result.x = x result.y = y result.z = z result.w = w -proc vec4*(v: float32): Vec4 = +proc vec4*(v: float32): Vec4 {.inline.} = result.x = v result.y = v result.z = v result.w = v -proc `+`*(a: Vec4, b: Vec4): Vec4 = +proc `+`*(a: Vec4, b: Vec4): Vec4 {.inline.} = result.x = a.x + b.x result.y = a.y + b.y result.z = a.z + b.z result.w = a.w + b.w -proc `-`*(a: Vec4, b: Vec4): Vec4 = +proc `-`*(a: Vec4, b: Vec4): Vec4 {.inline.} = result.x = a.x - b.x result.y = a.y - b.y result.z = a.z - b.z result.w = a.w - b.w -proc `-`*(a: Vec4): Vec4 = +proc `-`*(a: Vec4): Vec4 {.inline.} = result.x = -a.x result.y = -a.y result.z = -a.z result.w = -a.w -proc `*`*(a: Vec4, b: float32): Vec4 = +proc `*`*(a: Vec4, b: float32): Vec4 {.inline.} = result.x = a.x * b result.y = a.y * b result.z = a.z * b result.w = a.w * b -proc `*`*(a: float32, b: Vec4): Vec4 = +proc `*`*(a: float32, b: Vec4): Vec4 {.inline.} = b * a -proc `/`*(a: Vec4, b: float32): Vec4 = +proc `/`*(a: Vec4, b: float32): Vec4 {.inline.} = result.x = a.x / b result.y = a.y / b - result.z = a.z / b result.w = a.w / b -proc `/`*(a: float32, b: Vec4): Vec4 = +proc `/`*(a: float32, b: Vec4): Vec4 {.inline.}= result.x = a / b.x result.y = a / b.y result.z = a / b.z result.w = a / b.w -proc `+=`*(a: var Vec4, b: Vec4) = +proc `+=`*(a: var Vec4, b: Vec4) {.inline.} = a.x += b.x a.y += b.y a.z += b.z a.w += b.w -proc `-=`*(a: var Vec4, b: Vec4) = +proc `-=`*(a: var Vec4, b: Vec4) {.inline.} = a.x -= b.x a.y -= b.y a.z -= b.z a.w -= b.w -proc `*=`*(a: var Vec4, b: float32) = +proc `*=`*(a: var Vec4, b: float32) {.inline.} = a.x *= b a.y *= b a.z *= b a.w *= b -proc `/=`*(a: var Vec4, b: float32) = +proc `/=`*(a: var Vec4, b: float32) {.inline.} = a.x /= b a.y /= b a.z /= b a.w /= b -proc zero*(a: var Vec4) = +proc zero*(a: var Vec4) {.inline.} = a.x = 0 a.y = 0 a.z = 0 a.w = 0 -proc hash*(a: Vec4): Hash = +proc hash*(a: Vec4): Hash {.inline.} = hash((a.x, a.y, a.z, a.w)) proc `[]`*(a: Vec4, i: int): float32 = - assert(i == 0 or i == 1 or i == 2) + if i > 3: + raise newException(IndexDefect, "Vec4 index out of bounds") if i == 0: - return a.x + a.x elif i == 1: - return a.y + a.y elif i == 2: - return a.z - elif i == 3: - return a.w + a.z + else: + a.w proc `[]=`*(a: var Vec4, i: int, b: float32) = - assert(i == 0 or i == 1 or i == 2) + if i > 3: + raise newException(IndexDefect, "Vec4 index out of bounds") if i == 0: a.x = b elif i == 1: a.y = b elif i == 2: a.z = b - elif i == 3: + else: a.w = b proc lerp*(a: Vec4, b: Vec4, v: float32): Vec4 = a * (1.0 - v) + b * v -proc xyz*(a: Vec4): Vec3 = +proc xyz*(a: Vec4): Vec3 {.inline.} = vec3(a.x, a.y, a.z) proc `$`*(a: Vec4): string = &"({a.x:.8f}, {a.y:.8f}, {a.z:.8f}, {a.w:.8f})" -proc vec3*(a: Vec2, z = 0.0): Vec3 = +proc vec3*(a: Vec2, z = 0.0): Vec3 {.inline.} = vec3(a.x, a.y, z) -proc vec4*(a: Vec3, w = 0.0): Vec4 = +proc vec4*(a: Vec3, w = 0.0): Vec4 {.inline.} = vec4(a.x, a.y, a.z, w) -proc vec4*(a: Vec2, z = 0.0, w = 0.0): Vec4 = +proc vec4*(a: Vec2, z = 0.0, w = 0.0): Vec4 {.inline.} = vec4(a.x, a.y, z, w) type Mat3* = array[9, float32] ## 3x3 Matrix From 35c99e641f0b9b5c66a5bc838c30637cc4fd50e5 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg <guzba8@gmail.com> Date: Sun, 29 Nov 2020 22:10:43 -0600 Subject: [PATCH 4/6] fix --- src/vmath.nim | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/vmath.nim b/src/vmath.nim index dbb8a1c..8890069 100644 --- a/src/vmath.nim +++ b/src/vmath.nim @@ -152,7 +152,7 @@ proc inRect*(v: Vec2, a: Vec2, b: Vec2): bool {.inline.} = v.x > min.x and v.x < max.x and v.y > min.y and v.y < max.y proc `[]`*(a: Vec2, i: int): float32 = - if i > 1: + if i < 0 or i > 1: raise newException(IndexDefect, "Vec2 index out of bounds") if i == 0: a.x @@ -160,7 +160,7 @@ proc `[]`*(a: Vec2, i: int): float32 = a.y proc `[]=`*(a: var Vec2, i: int, b: float32) = - if i > 1: + if i < 0 or i > 1: raise newException(IndexDefect, "Vec2 index out of bounds") if i == 0: a.x = b @@ -329,7 +329,7 @@ proc angleBetween*(a, b: Vec3): float32 = arccos(dot) proc `[]`*(a: Vec3, i: int): float32 = - if i > 2: + if i < 0 or i > 2: raise newException(IndexDefect, "Vec3 index out of bounds") if i == 0: a.x @@ -339,7 +339,7 @@ proc `[]`*(a: Vec3, i: int): float32 = a.z proc `[]=`*(a: var Vec3, i: int, b: float32) = - if i > 2: + if i < 0 or i > 2: raise newException(IndexDefect, "Vec3 index out of bounds") if i == 0: a.x = b @@ -479,7 +479,7 @@ proc hash*(a: Vec4): Hash {.inline.} = hash((a.x, a.y, a.z, a.w)) proc `[]`*(a: Vec4, i: int): float32 = - if i > 3: + if i < 0 or i > 3: raise newException(IndexDefect, "Vec4 index out of bounds") if i == 0: a.x @@ -491,7 +491,7 @@ proc `[]`*(a: Vec4, i: int): float32 = a.w proc `[]=`*(a: var Vec4, i: int, b: float32) = - if i > 3: + if i < 0 or i > 3: raise newException(IndexDefect, "Vec4 index out of bounds") if i == 0: a.x = b @@ -520,6 +520,23 @@ proc vec4*(a: Vec3, w = 0.0): Vec4 {.inline.} = proc vec4*(a: Vec2, z = 0.0, w = 0.0): Vec4 {.inline.} = vec4(a.x, a.y, z, w) + + + + + + + + + + + + + + + + + type Mat3* = array[9, float32] ## 3x3 Matrix template `[]`*(a: Mat3, i, j: int): float32 = a[i * 3 + j] @@ -550,7 +567,7 @@ proc identity*(a: var Mat3) = a[7] = 0 a[8] = 1 -proc mat3*(): Mat3 = +proc mat3*(): Mat3 {.inline.} = result.identity() proc transpose*(a: Mat3): Mat3 = From 2ddcdc4dc60f3e0341cee41d2c9b6365d7298e2b Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg <guzba8@gmail.com> Date: Sun, 29 Nov 2020 22:23:00 -0600 Subject: [PATCH 5/6] better --- src/vmath.nim | 78 ++++++++++++++++++++------------------------------- 1 file changed, 30 insertions(+), 48 deletions(-) diff --git a/src/vmath.nim b/src/vmath.nim index 8890069..2969b9c 100644 --- a/src/vmath.nim +++ b/src/vmath.nim @@ -152,20 +152,16 @@ proc inRect*(v: Vec2, a: Vec2, b: Vec2): bool {.inline.} = v.x > min.x and v.x < max.x and v.y > min.y and v.y < max.y proc `[]`*(a: Vec2, i: int): float32 = - if i < 0 or i > 1: - raise newException(IndexDefect, "Vec2 index out of bounds") - if i == 0: - a.x - else: - a.y + case i + of 0: a.x + of 1: a.y + else: raise newException(IndexDefect, "Index not in 0 .. 1") proc `[]=`*(a: var Vec2, i: int, b: float32) = - if i < 0 or i > 1: - raise newException(IndexDefect, "Vec2 index out of bounds") - if i == 0: - a.x = b - else: - a.y = b + case i + of 0: a.x = b + of 1: a.y = b + else: raise newException(IndexDefect, "Index not in 0 .. 1") proc randVec2*(r: var Rand): Vec2 = let a = r.rand(PI * 2) @@ -329,24 +325,18 @@ proc angleBetween*(a, b: Vec3): float32 = arccos(dot) proc `[]`*(a: Vec3, i: int): float32 = - if i < 0 or i > 2: - raise newException(IndexDefect, "Vec3 index out of bounds") - if i == 0: - a.x - elif i == 1: - a.y - else: - a.z + case i + of 0: a.x + of 1: a.y + of 2: a.z + else: raise newException(IndexDefect, "Index not in 0 .. 2") proc `[]=`*(a: var Vec3, i: int, b: float32) = - if i < 0 or i > 2: - raise newException(IndexDefect, "Vec3 index out of bounds") - if i == 0: - a.x = b - elif i == 1: - a.y = b - else: - a.z = b + case i + of 0: a.x = b + of 1: a.y = b + of 2: a.z = b + else: raise newException(IndexDefect, "Index not in 0 .. 2") proc xy*(a: Vec3): Vec2 {.inline.} = vec2(a.x, a.y) @@ -479,28 +469,20 @@ proc hash*(a: Vec4): Hash {.inline.} = hash((a.x, a.y, a.z, a.w)) proc `[]`*(a: Vec4, i: int): float32 = - if i < 0 or i > 3: - raise newException(IndexDefect, "Vec4 index out of bounds") - if i == 0: - a.x - elif i == 1: - a.y - elif i == 2: - a.z - else: - a.w + 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 Vec4, i: int, b: float32) = - if i < 0 or i > 3: - raise newException(IndexDefect, "Vec4 index out of bounds") - if i == 0: - a.x = b - elif i == 1: - a.y = b - elif i == 2: - a.z = b - else: - 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 lerp*(a: Vec4, b: Vec4, v: float32): Vec4 = a * (1.0 - v) + b * v From 21a4ac8ebfbf1c64dd2ce18438529198e0cc88e2 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg <guzba8@gmail.com> Date: Sun, 29 Nov 2020 22:29:21 -0600 Subject: [PATCH 6/6] inline more --- src/vmath.nim | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/vmath.nim b/src/vmath.nim index 2969b9c..9a11ee6 100644 --- a/src/vmath.nim +++ b/src/vmath.nim @@ -30,7 +30,7 @@ proc fixAngle*(angle: float32): float32 = angle += PI * 2 angle -proc angleBetween*(a, b: float32): float32 = +proc angleBetween*(a, b: float32): float32 {.inline.} = ## Angle between angle a and angle b. fixAngle(b - a) @@ -171,11 +171,11 @@ proc randVec2*(r: var Rand): Vec2 = proc `$`*(a: Vec2): string = &"({a.x:.4f}, {a.y:.4f})" -proc angle*(a: Vec2): float32 = +proc angle*(a: Vec2): float32 {.inline.} = ## Angle of a Vec2. arctan2(a.y, a.x) -proc angleBetween*(a: Vec2, b: Vec2): float32 = +proc angleBetween*(a: Vec2, b: Vec2): float32 {.inline.} = ## Angle between 2 Vec2. fixAngle(arctan2(a.y - b.y, a.x - b.x)) @@ -302,16 +302,16 @@ proc computeNormal*(a, b, c: Vec3): Vec3 = proc dot*(a: Vec3, b: Vec3): float32 {.inline.} = a.x * b.x + a.y * b.y + a.z * b.z -proc dir*(at: Vec3, to: Vec3): Vec3 = +proc dir*(at: Vec3, to: Vec3): Vec3 {.inline.} = (at - to).normalize() -proc dist*(at: Vec3, to: Vec3): float32 = +proc dist*(at: Vec3, to: Vec3): float32 {.inline.} = (at - to).length -proc distSq*(at: Vec3, to: Vec3): float32 = +proc distSq*(at: Vec3, to: Vec3): float32 {.inline.} = (at - to).lengthSq -proc lerp*(a: Vec3, b: Vec3, v: float32): Vec3 = +proc lerp*(a: Vec3, b: Vec3, v: float32): Vec3 {.inline.} = a * (1.0 - v) + b * v proc quantize*(v: Vec3, n: float32): Vec3 = @@ -484,7 +484,7 @@ proc `[]=`*(a: var Vec4, i: int, b: float32) = of 3: a.w = b else: raise newException(IndexDefect, "Index not in 0 .. 3") -proc lerp*(a: Vec4, b: Vec4, v: float32): Vec4 = +proc lerp*(a: Vec4, b: Vec4, v: float32): Vec4 {.inline.} = a * (1.0 - v) + b * v proc xyz*(a: Vec4): Vec3 {.inline.} = @@ -502,23 +502,6 @@ proc vec4*(a: Vec3, w = 0.0): Vec4 {.inline.} = proc vec4*(a: Vec2, z = 0.0, w = 0.0): Vec4 {.inline.} = vec4(a.x, a.y, z, w) - - - - - - - - - - - - - - - - - type Mat3* = array[9, float32] ## 3x3 Matrix template `[]`*(a: Mat3, i, j: int): float32 = a[i * 3 + j]