1.0.7 - Add $ to everything, add isNaN.
This commit is contained in:
parent
8debf1f6a1
commit
a2c0da6255
3 changed files with 151 additions and 9 deletions
|
@ -4,7 +4,7 @@
|
||||||
## default: ObjArray based
|
## default: ObjArray based
|
||||||
##
|
##
|
||||||
|
|
||||||
import math
|
import math, strutils
|
||||||
export math
|
export math
|
||||||
|
|
||||||
{.push inline.}
|
{.push inline.}
|
||||||
|
@ -394,12 +394,11 @@ proc lerp*[T: SomeFloat](a, b, v: T): T =
|
||||||
|
|
||||||
proc fixAngle*[T: SomeFloat](angle: T): T =
|
proc fixAngle*[T: SomeFloat](angle: T): T =
|
||||||
## Make angle be from -PI to PI radians.
|
## Make angle be from -PI to PI radians.
|
||||||
var angle = angle
|
result = angle
|
||||||
while angle > PI:
|
while result > PI:
|
||||||
angle -= PI * 2
|
result -= PI * 2
|
||||||
while angle < -PI:
|
while result < -PI:
|
||||||
angle += PI * 2
|
result += PI * 2
|
||||||
angle
|
|
||||||
|
|
||||||
proc angleBetween*[T: SomeFloat](a, b: T): T =
|
proc angleBetween*[T: SomeFloat](a, b: T): T =
|
||||||
## Angle between angle a and angle b.
|
## Angle between angle a and angle b.
|
||||||
|
@ -425,6 +424,10 @@ proc toDegrees*[T: SomeFloat](rad: T): T =
|
||||||
## Convert radians to degrees.
|
## Convert radians to degrees.
|
||||||
return fixAngle(180.0 * rad / PI)
|
return fixAngle(180.0 * rad / PI)
|
||||||
|
|
||||||
|
proc isNaN*(n: SomeFloat): bool =
|
||||||
|
## Returns true if number is a Nan.
|
||||||
|
n.classify != fcNan
|
||||||
|
|
||||||
template genConstructor(lower, upper, typ: untyped) =
|
template genConstructor(lower, upper, typ: untyped) =
|
||||||
|
|
||||||
proc `lower 2`*(): `upper 2` = gvec2[typ](typ(0), typ(0))
|
proc `lower 2`*(): `upper 2` = gvec2[typ](typ(0), typ(0))
|
||||||
|
@ -451,6 +454,13 @@ template genConstructor(lower, upper, typ: untyped) =
|
||||||
proc `lower 4`*[T](x: GVec3[T]): `upper 4` =
|
proc `lower 4`*[T](x: GVec3[T]): `upper 4` =
|
||||||
gvec4[typ](typ(x[0]), typ(x[1]), typ(x[2]), 0)
|
gvec4[typ](typ(x[0]), typ(x[1]), typ(x[2]), 0)
|
||||||
|
|
||||||
|
proc `$`*(a: `upper 2`): string =
|
||||||
|
($type(a)).toLowerAscii() & "(" & $a.x & ", " & $a.y & ")"
|
||||||
|
proc `$`*(a: `upper 3`): string =
|
||||||
|
($type(a)).toLowerAscii() & "(" & $a.x & ", " & $a.y & ", " & $a.z & ")"
|
||||||
|
proc `$`*(a: `upper 4`): string =
|
||||||
|
($type(a)).toLowerAscii() & "(" & $a.x & ", " & $a.y & ", " & $a.z & ", " & $a.w & ")"
|
||||||
|
|
||||||
genConstructor(bvec, BVec, bool)
|
genConstructor(bvec, BVec, bool)
|
||||||
genConstructor(ivec, IVec, int32)
|
genConstructor(ivec, IVec, int32)
|
||||||
genConstructor(uvec, UVec, uint32)
|
genConstructor(uvec, UVec, uint32)
|
||||||
|
@ -717,6 +727,17 @@ type
|
||||||
DMat3* = GMat3[float64]
|
DMat3* = GMat3[float64]
|
||||||
DMat4* = GMat4[float64]
|
DMat4* = GMat4[float64]
|
||||||
|
|
||||||
|
proc matToString[T](a: T, n: int): string =
|
||||||
|
result.add ($type(a)).toLowerAscii() & "(\n"
|
||||||
|
for x in 0 ..< n:
|
||||||
|
result.add " "
|
||||||
|
for y in 0 ..< n:
|
||||||
|
result.add $a[x, y] & ", "
|
||||||
|
result.setLen(result.len - 1)
|
||||||
|
result.add "\n"
|
||||||
|
result.setLen(result.len - 2)
|
||||||
|
result.add "\n)"
|
||||||
|
|
||||||
template genMatConstructor(lower, upper, T: untyped) =
|
template genMatConstructor(lower, upper, T: untyped) =
|
||||||
|
|
||||||
proc `lower 2`*(
|
proc `lower 2`*(
|
||||||
|
@ -791,6 +812,10 @@ template genMatConstructor(lower, upper, T: untyped) =
|
||||||
0.T, 0.T, 0.T, 1.T
|
0.T, 0.T, 0.T, 1.T
|
||||||
)
|
)
|
||||||
|
|
||||||
|
proc `$`*(a: `upper 2`): string = matToString(a, 2)
|
||||||
|
proc `$`*(a: `upper 3`): string = matToString(a, 3)
|
||||||
|
proc `$`*(a: `upper 4`): string = matToString(a, 4)
|
||||||
|
|
||||||
genMatConstructor(mat, Mat, float32)
|
genMatConstructor(mat, Mat, float32)
|
||||||
genMatConstructor(dmat, DMat, float64)
|
genMatConstructor(dmat, DMat, float64)
|
||||||
|
|
||||||
|
|
119
tests/test.nim
119
tests/test.nim
|
@ -2,7 +2,6 @@ import random, vmath
|
||||||
|
|
||||||
randomize(1234)
|
randomize(1234)
|
||||||
|
|
||||||
|
|
||||||
block:
|
block:
|
||||||
# Test ~=.
|
# Test ~=.
|
||||||
doAssert 1.0 ~= 1.0
|
doAssert 1.0 ~= 1.0
|
||||||
|
@ -83,6 +82,9 @@ block:
|
||||||
doAssert turnAngle(0.0, PI, 0.5) ~= 0.5
|
doAssert turnAngle(0.0, PI, 0.5) ~= 0.5
|
||||||
doAssert turnAngle(0.5, PI, 3.5) ~= PI
|
doAssert turnAngle(0.5, PI, 3.5) ~= PI
|
||||||
|
|
||||||
|
var anum = 1.0 / 0.0
|
||||||
|
doAssert anum.isNan == true
|
||||||
|
|
||||||
block:
|
block:
|
||||||
# Test vec2 cast.
|
# Test vec2 cast.
|
||||||
var v = vec2(1.0, 2.0)
|
var v = vec2(1.0, 2.0)
|
||||||
|
@ -230,6 +232,32 @@ block:
|
||||||
_ = dvec3()
|
_ = dvec3()
|
||||||
_ = dvec4()
|
_ = dvec4()
|
||||||
|
|
||||||
|
block:
|
||||||
|
# test $ string functions
|
||||||
|
doAssert $bvec2(true, false) == "bvec2(true, false)"
|
||||||
|
doAssert $bvec3(true, false, true) == "bvec3(true, false, true)"
|
||||||
|
doAssert $bvec4(true, false, true, false) == "bvec4(true, false, true, false)"
|
||||||
|
|
||||||
|
doAssert $ivec2(1, 2) == "ivec2(1, 2)"
|
||||||
|
doAssert $ivec3(1, 2, 3) == "ivec3(1, 2, 3)"
|
||||||
|
doAssert $ivec4(1, 2, 3, 4) == "ivec4(1, 2, 3, 4)"
|
||||||
|
|
||||||
|
doAssert $uvec2(1, 2) == "uvec2(1, 2)"
|
||||||
|
doAssert $uvec3(1, 2, 3) == "uvec3(1, 2, 3)"
|
||||||
|
doAssert $uvec4(1, 2, 3, 4) == "uvec4(1, 2, 3, 4)"
|
||||||
|
|
||||||
|
doAssert $vec2(1.0, 2.0) == "vec2(1.0, 2.0)"
|
||||||
|
doAssert $vec3(1.0, 2.0, 3.0) == "vec3(1.0, 2.0, 3.0)"
|
||||||
|
doAssert $vec4(1.0, 2.0, 3.0, 4.0) == "vec4(1.0, 2.0, 3.0, 4.0)"
|
||||||
|
|
||||||
|
doAssert $dvec2(1.0, 2.0) == "dvec2(1.0, 2.0)"
|
||||||
|
doAssert $dvec3(1.0, 2.0, 3.0) == "dvec3(1.0, 2.0, 3.0)"
|
||||||
|
doAssert $dvec4(1.0, 2.0, 3.0, 4.0) == "dvec4(1.0, 2.0, 3.0, 4.0)"
|
||||||
|
|
||||||
|
echo vec2(1.0, 2.0)
|
||||||
|
echo vec3(1.0, 2.0, 3.0)
|
||||||
|
echo vec4(1.0, 2.0, 3.0, 4.0)
|
||||||
|
|
||||||
block:
|
block:
|
||||||
# Test basic mat constructors.
|
# Test basic mat constructors.
|
||||||
block:
|
block:
|
||||||
|
@ -256,6 +284,95 @@ block:
|
||||||
0, 0, 0, 1
|
0, 0, 0, 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
block:
|
||||||
|
# test $ string functions
|
||||||
|
echo mat2(
|
||||||
|
1, 0,
|
||||||
|
0, 1
|
||||||
|
)
|
||||||
|
echo mat3(
|
||||||
|
1, 0, 0,
|
||||||
|
0, 1, 0,
|
||||||
|
0, 0, 1
|
||||||
|
)
|
||||||
|
echo mat4(
|
||||||
|
1, 0, 0, 0,
|
||||||
|
0, 1, 0, 0,
|
||||||
|
0, 0, 1, 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
)
|
||||||
|
|
||||||
|
echo dmat2(
|
||||||
|
1, 0,
|
||||||
|
0, 1
|
||||||
|
)
|
||||||
|
echo dmat3(
|
||||||
|
1, 0, 0,
|
||||||
|
0, 1, 0,
|
||||||
|
0, 0, 1
|
||||||
|
)
|
||||||
|
echo dmat4(
|
||||||
|
1, 0, 0, 0,
|
||||||
|
0, 1, 0, 0,
|
||||||
|
0, 0, 1, 0,
|
||||||
|
0, 0, 0, 1
|
||||||
|
)
|
||||||
|
|
||||||
|
assert $mat2(
|
||||||
|
1, 3,
|
||||||
|
0, 1
|
||||||
|
) == """mat2(
|
||||||
|
1.0, 3.0,
|
||||||
|
0.0, 1.0
|
||||||
|
)"""
|
||||||
|
assert $mat3(
|
||||||
|
1, 3, 0,
|
||||||
|
0, 1, 0,
|
||||||
|
0, 3, 1
|
||||||
|
) == """mat3(
|
||||||
|
1.0, 3.0, 0.0,
|
||||||
|
0.0, 1.0, 0.0,
|
||||||
|
0.0, 3.0, 1.0
|
||||||
|
)"""
|
||||||
|
assert $mat4(
|
||||||
|
1, 3, 0, 0,
|
||||||
|
0, 1, 0, 0,
|
||||||
|
0, 3, 1, 0,
|
||||||
|
0, 3, 0, 1
|
||||||
|
) == """mat4(
|
||||||
|
1.0, 3.0, 0.0, 0.0,
|
||||||
|
0.0, 1.0, 0.0, 0.0,
|
||||||
|
0.0, 3.0, 1.0, 0.0,
|
||||||
|
0.0, 3.0, 0.0, 1.0
|
||||||
|
)"""
|
||||||
|
assert $dmat2(
|
||||||
|
1, 0,
|
||||||
|
4, 1
|
||||||
|
) == """dmat2(
|
||||||
|
1.0, 0.0,
|
||||||
|
4.0, 1.0
|
||||||
|
)"""
|
||||||
|
assert $dmat3(
|
||||||
|
1, 0, 0,
|
||||||
|
4, 1, 0,
|
||||||
|
4, 0, 1
|
||||||
|
) == """dmat3(
|
||||||
|
1.0, 0.0, 0.0,
|
||||||
|
4.0, 1.0, 0.0,
|
||||||
|
4.0, 0.0, 1.0
|
||||||
|
)"""
|
||||||
|
assert $dmat4(
|
||||||
|
1, 0, 0, 0,
|
||||||
|
4, 1, 0, 0,
|
||||||
|
4, 0, 1, 0,
|
||||||
|
4, 0, 0, 1
|
||||||
|
) == """dmat4(
|
||||||
|
1.0, 0.0, 0.0, 0.0,
|
||||||
|
4.0, 1.0, 0.0, 0.0,
|
||||||
|
4.0, 0.0, 1.0, 0.0,
|
||||||
|
4.0, 0.0, 0.0, 1.0
|
||||||
|
)"""
|
||||||
|
|
||||||
block:
|
block:
|
||||||
let
|
let
|
||||||
_ = mat2(
|
_ = mat2(
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
version = "1.0.6"
|
version = "1.0.7"
|
||||||
author = "treeform"
|
author = "treeform"
|
||||||
description = "Your single stop for vector math routines for 2d and 3d graphics."
|
description = "Your single stop for vector math routines for 2d and 3d graphics."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
Loading…
Reference in a new issue