|
1 | 1 | import macros, math, strutils
|
2 | 2 | import private.glsl_codegen
|
3 | 3 |
|
4 |
| -{.pragma: glslinfix, tags: [glslinfix_t].} |
5 |
| - |
6 | 4 | proc getShaderCode(s: NimNode, k: ShaderKind, mainProcName: string): string =
|
7 | 5 | var ctx = newCtx()
|
8 | 6 | ctx.mainProcName = mainProcName
|
@@ -192,26 +190,44 @@ proc `*`*(m: mat4, v: vec4): vec4 =
|
192 | 190 | result[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w
|
193 | 191 | result[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w
|
194 | 192 |
|
195 |
| -proc `.`*[T](v: vecBase[2, T], f: static[string]): vecBase[f.len, T] {.glslinfix.} = |
| 193 | +proc validateAttrs(s: string, a: set[char]) {.compileTime.} = |
| 194 | + for c in s: |
| 195 | + assert(c in a, "Invalid vector component: " & $c) |
| 196 | + |
| 197 | +proc nimsl_deriveVectorWithComponents[T](v: vecBase[2, T], f: static[string]): vecBase[f.len, T] = |
| 198 | + glslinfix() |
| 199 | + static: validateAttrs(f, {'x', 'r', 'y', 'g'}) |
196 | 200 | for i, c in f:
|
197 | 201 | case c
|
198 | 202 | of 'x', 'r': result[i] = v.x
|
199 | 203 | of 'y', 'g': result[i] = v.y
|
200 |
| - else: assert(false, "Unknown field: " & $c) |
| 204 | + else: discard # Should be prevented by validateAttrs |
201 | 205 |
|
202 |
| -proc `.`*[T](v: vecBase[3, T], f: static[string]): vecBase[f.len, T] {.glslinfix.} = |
| 206 | +proc nimsl_deriveVectorWithComponents[T](v: vecBase[3, T], f: static[string]): vecBase[f.len, T] = |
| 207 | + glslinfix() |
| 208 | + static: validateAttrs(f, {'x', 'r', 'y', 'g', 'z', 'b'}) |
203 | 209 | for i, c in f:
|
204 | 210 | case c
|
205 | 211 | of 'x', 'r': result[i] = v.x
|
206 | 212 | of 'y', 'g': result[i] = v.y
|
207 | 213 | of 'z', 'b': result[i] = v.z
|
208 |
| - else: assert(false, "Unknown field: " & $c) |
| 214 | + else: discard # Should be prevented by validateAttrs |
209 | 215 |
|
210 |
| -proc `.`*[T](v: vecBase[4, T], f: static[string]): vecBase[f.len, T] {.glslinfix.} = |
| 216 | +proc nimsl_deriveVectorWithComponents[T](v: vecBase[4, T], f: static[string]): vecBase[f.len, T] = |
| 217 | + glslinfix() |
| 218 | + static: validateAttrs(f, {'x', 'r', 'y', 'g', 'z', 'b', 'w', 'a'}) |
211 | 219 | for i, c in f:
|
212 | 220 | case c
|
213 | 221 | of 'x', 'r': result[i] = v.x
|
214 | 222 | of 'y', 'g': result[i] = v.y
|
215 | 223 | of 'z', 'b': result[i] = v.z
|
216 | 224 | of 'w', 'a': result[i] = v.w
|
217 |
| - else: assert(false, "Unknown field: " & $c) |
| 225 | + else: discard # Should be prevented by validateAttrs |
| 226 | + |
| 227 | +when defined(nimNewDot): |
| 228 | + template `.`*[I, T](v: vecBase[I, T], f: untyped): auto = |
| 229 | + nimsl_deriveVectorWithComponents(v, astToStr(f)) |
| 230 | +else: |
| 231 | + proc `.`*[I, T](v: vecBase[I, T], f: static[string]): vecBase[f.len, T] {.inline.} = |
| 232 | + glslinfix() |
| 233 | + result = nimsl_deriveVectorWithComponents(v, f) |
0 commit comments