{
vec2: { args: %i[any any], returns: :vec2, variadic: true, min_args: 1 },
vec3: { args: %i[any any any], returns: :vec3, variadic: true, min_args: 1 },
vec4: { args: %i[any any any any], returns: :vec4, variadic: true, min_args: 1 },
mat2: { args: %i[any any any any], returns: :mat2, variadic: true, min_args: 1 },
mat3: { args: %i[any any any any any any any any any], returns: :mat3, variadic: true, min_args: 1 },
mat4: { args: %i[any any any any any any any any any any any any any any any any], returns: :mat4, variadic: true, min_args: 1 },
sin: { args: [:float], returns: :float },
cos: { args: [:float], returns: :float },
tan: { args: [:float], returns: :float },
asin: { args: [:float], returns: :float },
acos: { args: [:float], returns: :float },
atan: { args: %i[float float], returns: :float, variadic: true, min_args: 1 },
atan2: { args: %i[float float], returns: :float },
pow: { args: %i[float float], returns: :float },
exp: { args: [:float], returns: :float },
log: { args: [:float], returns: :float },
sqrt: { args: [:any], returns: :same },
abs: { args: [:any], returns: :same },
sign: { args: [:any], returns: :same },
floor: { args: [:any], returns: :same },
ceil: { args: [:any], returns: :same },
fract: { args: [:any], returns: :same },
mod: { args: %i[any float], returns: :first },
min: { args: %i[any any], returns: :first },
max: { args: %i[any any], returns: :first },
clamp: { args: %i[any any any], returns: :first },
mix: { args: %i[any any float], returns: :first },
step: { args: %i[float any], returns: :second },
smoothstep: { args: %i[float float any], returns: :third },
length: { args: [:any], returns: :float },
distance: { args: %i[any any], returns: :float },
dot: { args: %i[any any], returns: :float },
cross: { args: %i[vec3 vec3], returns: :vec3 },
normalize: { args: [:any], returns: :same },
reflect: { args: %i[any any], returns: :first },
refract: { args: %i[any any float], returns: :first },
hash21: { args: [:vec2], returns: :float },
hash22: { args: [:vec2], returns: :vec2 },
lessThan: { args: %i[any any], returns: :bool },
lessThanEqual: { args: %i[any any], returns: :bool },
greaterThan: { args: %i[any any], returns: :bool },
greaterThanEqual: { args: %i[any any], returns: :bool },
equal: { args: %i[any any], returns: :bool },
notEqual: { args: %i[any any], returns: :bool },
inverse: { args: [:any], returns: :same, targets: %i[glsl wgsl msl] },
transpose: { args: [:any], returns: :same, targets: %i[glsl wgsl msl] },
determinant: { args: [:any], returns: :float, targets: %i[glsl wgsl msl] },
texture2D: { args: %i[sampler2D vec2], returns: :vec4 },
texture: { args: %i[sampler2D vec2], returns: :vec4 },
textureLod: { args: %i[sampler2D vec2 float], returns: :vec4 }
}.freeze