; constants
.constf const0(0.0, 0.5, 1.0, 2.0)
.constf const1(0.00392156886, 3.05185094e-005, 0.00001, 0.00787401574)

.alias ZERO      const0.x
.alias HALF      const0.y
.alias ONE       const0.z
.alias TWO       const0.w
.alias INV_BYTE  const1.x
.alias INV_SHORT const1.y
.alias EPS       const1.z
.alias INV_127   const1.w

; uniforms
.fvec uViewProj[4]
.fvec uBasis[2]
.fvec uLightPos[4]
.fvec uLightColor[4]

; in
.alias aCoord    v0
.alias aNormal   v1
.alias aTexCoord v2
.alias aColor    v3
.alias aLight    v4

; variables
.alias lv1    r1
.alias lv2    r2
.alias lv3    r3
.alias normal r4
.alias att    r5
.alias light  r6
.alias pos    r7
.alias tmp    r8

; out
.out vPosition position
.out vTexCoord texcoord0
.out vColor    color

.proc main
; pos = mulQuatPos(uBasis, aCoord)
    mul pos.xyz, uBasis[0], aCoord.zxyw
    mad pos.xyz, aCoord, uBasis[0].zxyw, -pos
    mad pos.xyz, aCoord.yzxw, uBasis[0].w, pos
    mul tmp.xyz, uBasis[0].zxyw, pos
    mad pos.xyz, pos.yzxw, uBasis[0].yzxw, -tmp
    mad pos.xyz, pos, TWO, aCoord
    add pos.xyz, uBasis[1], pos
    mov pos.w, ONE

; vPosition = uViewProj * pos
    mul tmp, uViewProj[0], pos.x
    mad tmp, pos.y, uViewProj[1], tmp
    mad tmp, pos.z, uViewProj[2], tmp
    mad vPosition, pos.w, uViewProj[3], tmp

; vColor = aColor/255 * aLight/255
    mul tmp, INV_BYTE, aColor
    mul att, INV_BYTE, aLight
    mul vColor, tmp, att

; vTecCoord = aTexCoord/32767
    mul vTexCoord, INV_SHORT, aTexCoord

    end
.end
