davepagurek / glsl-autodiff

Tired of doing math to get normals in your vertex shader? Same.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Find a better way of defining swizzles + types

davepagurek opened this issue · comments

Maybe this means splitting up defining the methods + defining the types, e.g.:

// Types
type VecElement = 'x' | 'y' | 'z' | 'w' | 'r' | 'g' | 'b' | 'a' | 'u' | 'v'
type Vec2Swizzle = `${VecElement}${VecElement}`
type Vec3Swizzle = `${Vec2Swizzle}${VecElement}`
type Vec4Swizzle = `${Vec3Swizzle}${VecElement}`
type Swizzled =
  & { [vec2Key in Vec2Swizzle]: () => VectorOp }
  & { [vec3Key in Vec3Swizzle]: () => VectorOp }
  & { [vec4Key in Vec4Swizzle]: () => VectorOp }
interface VectorOp extends Swizzled {}

// Methods
const elements = ['x', 'y', 'z', 'w', 'r', 'g', 'b', 'a', 'u', 'v']
const swizzles = [
  ...combinations(elements, elements), // vec2 swizzles
  ...combinations(elements, elements, elements), // vec3 swizzles
  ...combinations(elements, elements, elements, elements), // vec4 swizzles
]
for (const swizzle of swizzles) {
  this[swizzle.join('')] = function() {
    // TODO
  }
}