comparison src/vector.nim @ 16:617c6dcddbe2

add: matrix multiplications, tests
author Sam <sam@basx.dev>
date Fri, 30 Dec 2022 15:56:17 +0700
parents a571db114152
children
comparison
equal deleted inserted replaced
15:dde536a70483 16:617c6dcddbe2
1 import std/random
1 import std/math 2 import std/math
2 import std/strutils 3 import std/strutils
3 import std/macros 4 import std/macros
4 import std/typetraits 5 import std/typetraits
5 import std/tables 6 import std/tables
10 Vec3*[T: SomeNumber] = array[3, T] 11 Vec3*[T: SomeNumber] = array[3, T]
11 Vec4*[T: SomeNumber] = array[4, T] 12 Vec4*[T: SomeNumber] = array[4, T]
12 Vec* = Vec2|Vec3|Vec4 13 Vec* = Vec2|Vec3|Vec4
13 14
14 # define some often used constants 15 # define some often used constants
16 func ConstOne2[T: SomeNumber](): auto {.compiletime.} = Vec2[T]([T(1), T(1)])
17 func ConstOne3[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(1), T(1), T(1)])
18 func ConstOne4[T: SomeNumber](): auto {.compiletime.} = Vec4[T]([T(1), T(1), T(1), T(1)])
15 func ConstX[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(1), T(0), T(0)]) 19 func ConstX[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(1), T(0), T(0)])
16 func ConstY[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(0), T(1), T(0)]) 20 func ConstY[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(0), T(1), T(0)])
17 func ConstZ[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(0), T(0), T(1)]) 21 func ConstZ[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(0), T(0), T(1)])
18 func ConstR[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(1), T(0), T(0)]) 22 func ConstR[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(1), T(0), T(0)])
19 func ConstG[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(0), T(1), T(0)]) 23 func ConstG[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(0), T(1), T(0)])
20 func ConstB[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(0), T(0), T(1)]) 24 func ConstB[T: SomeNumber](): auto {.compiletime.} = Vec3[T]([T(0), T(0), T(1)])
21 25
22 # generates constants: Xf, Xf32, Xf64, Xi, Xi8, Xi16, Xi32, Xi64 26 # generates constants: Xf, Xf32, Xf64, Xi, Xi8, Xi16, Xi32, Xi64
23 # Also for Y, Z, R, G, B 27 # Also for Y, Z, R, G, B and One
24 # not sure if this is necessary or even a good idea... 28 # not sure if this is necessary or even a good idea...
25 macro generateAllConsts() = 29 macro generateAllConsts() =
26 result = newStmtList() 30 result = newStmtList()
27 for component in ["X", "Y", "Z", "R", "G", "B"]: 31 for component in ["X", "Y", "Z", "R", "G", "B", "One2", "One3", "One4"]:
28 for theType in ["int", "int8", "int16", "int32", "int64", "float", "float32", "float64"]: 32 for theType in ["int", "int8", "int16", "int32", "int64", "float", "float32", "float64"]:
29 var typename = theType[0 .. 0] 33 var typename = theType[0 .. 0]
30 if theType[^2].isDigit: 34 if theType[^2].isDigit:
31 typename = typename & theType[^2] 35 typename = typename & theType[^2]
32 if theType[^1].isDigit: 36 if theType[^1].isDigit:
41 generateAllConsts() 45 generateAllConsts()
42 46
43 const X* = ConstX[float]() 47 const X* = ConstX[float]()
44 const Y* = ConstY[float]() 48 const Y* = ConstY[float]()
45 const Z* = ConstZ[float]() 49 const Z* = ConstZ[float]()
50 const One2* = ConstOne2[float]()
51 const One3* = ConstOne3[float]()
52 const One4* = ConstOne4[float]()
46 53
47 func newVec2*[T](x, y: T): auto = Vec2([x, y]) 54 func newVec2*[T](x, y: T): auto = Vec2([x, y])
48 func newVec3*[T](x, y, z: T): auto = Vec3([x, y, z]) 55 func newVec3*[T](x, y, z: T): auto = Vec3([x, y, z])
49 func newVec4*[T](x, y, z, w: T): auto = Vec4([x, y, z, w]) 56 func newVec4*[T](x, y, z, w: T): auto = Vec4([x, y, z, w])
50 57
199 result.add(vectorAttributeAccessor(i & j & k)) 206 result.add(vectorAttributeAccessor(i & j & k))
200 for l in attlist: 207 for l in attlist:
201 result.add(vectorAttributeAccessor(i & j & k & l)) 208 result.add(vectorAttributeAccessor(i & j & k & l))
202 209
203 createVectorAttribAccessorFuncs() 210 createVectorAttribAccessorFuncs()
211
212 # call e.g. Vec2[int]().randomized() to get a random matrix
213 template makeRandomInit(mattype: typedesc) =
214 proc randomized*[T: SomeInteger](m: mattype[T]): mattype[T] =
215 for i in 0 ..< result.len:
216 result[i] = rand(low(typeof(m[0])) .. high(typeof(m[0])))
217 proc randomized*[T: SomeFloat](m: mattype[T]): mattype[T] =
218 for i in 0 ..< result.len:
219 result[i] = rand(1.0)
220
221 makeRandomInit(Vec2)
222 makeRandomInit(Vec3)
223 makeRandomInit(Vec4)