xvs.1.1 ; Shader for a three bone matrix palette system with up to 60 bones ; lit by a single directional light and ambient color ; Data is in two streams. One for position, normal, and texture. The other for indices and weights ; Uses all 190 constant registers. Matrix indices are tweaked to avoid -37 and -38 ; ; v0 = position ; v1 = normals ; v2 = texture coords ; v3 = matrix indices ; v4 = weights ; ; c92-c96 = world*view*projection matrix ; ; c-96+ = bone matrices ; #define V_POSITION v0 #define V_NORMAL v1 #define V_TEXTURE v2 #define V_BONEINDEX v3 #define V_BONEWEIGHTS v4 #define V_S v5 #define V_T v6 #define V_SxT v7 #define S_WORLD r0 #define T_WORLD r1 #define SxT_WORLD r9 #define LIGHT_LOCAL r3 #define R_EYE_VECTOR r8 #define R_WORLDSPACE_NORMAL r9 #define R_DIFFUSE_COLOR r9 #define R_GOURAUD_SHADE r7 #define R_NDOTE r4 #define R_TEMP r1 #define SHADER_WORLD_LIGHTDIR1_REGISTER 81 #define SHADER_WORLD_EYEPOS 82 #define SHADER_ZERO_REGISTER 83 #define SHADER_LIGHTDIR1_REGISTER 84 #define SHADER_LIGHTCOL1_REGISTER 85 #define SHADER_LIGHTDIR2_REGISTER 86 #define SHADER_LIGHTCOL2_REGISTER 87 #define SHADER_LIGHTDIR3_REGISTER 88 #define SHADER_LIGHTCOL3_REGISTER 89 #define SHADER_AMBIENTLIGHT_REGISTER 90 #define SHADER_MATERIAL_REGISTER 91 #define SHADER_TRANSFORM_REGISTER 92 ; First bone mov a0.x, V_BONEINDEX.x mul r2, V_BONEWEIGHTS.x, c[a0.x+0] mul r3, V_BONEWEIGHTS.x, c[a0.x+1] mul r4, V_BONEWEIGHTS.x, c[a0.x+2] ; Second bone mov a0.x, V_BONEINDEX.y mad r2, V_BONEWEIGHTS.y, c[a0.x+0], r2 mad r3, V_BONEWEIGHTS.y, c[a0.x+1], r3 mad r4, V_BONEWEIGHTS.y, c[a0.x+2], r4 ; Third bone mov a0.x, V_BONEINDEX.z mad r2, V_BONEWEIGHTS.z, c[a0.x+0], r2 mad r3, V_BONEWEIGHTS.z, c[a0.x+1], r3 mad r4, V_BONEWEIGHTS.z, c[a0.x+2], r4 ; Fourth bone mov a0.x, V_BONEINDEX.w mad r2, V_BONEWEIGHTS.w, c[a0.x+0], r2 mad r3, V_BONEWEIGHTS.w, c[a0.x+1], r3 mad r4, V_BONEWEIGHTS.w, c[a0.x+2], r4 ; Transform weighted position dp4 r0.x, V_POSITION, r2 dp4 r0.y, V_POSITION, r3 dp4 r0.z, V_POSITION, r4 ; Rotate weighted normal dp3 R_WORLDSPACE_NORMAL.x, V_NORMAL, r2 dp3 R_WORLDSPACE_NORMAL.y, V_NORMAL, r3 dp3 R_WORLDSPACE_NORMAL.z, V_NORMAL, r4 ; World, view, projection dph oPos.x, r0, c[92] dph oPos.y, r0, c[93] dph oPos.z, r0, c[94] dph oPos.w, r0, c[95] ; SPECULAR COORDINATE GENERATION ; Need to re-normalize normal ;dp3 R_WORLDSPACE_NORMAL.w, R_WORLDSPACE_NORMAL, R_WORLDSPACE_NORMAL ;rsq R_WORLDSPACE_NORMAL.w, R_WORLDSPACE_NORMAL.w ;mul R_WORLDSPACE_NORMAL, R_WORLDSPACE_NORMAL, R_WORLDSPACE_NORMAL.w ;vector from point to eye mov r0.w, c[SHADER_ZERO_REGISTER].y add R_TEMP, -c[SHADER_WORLD_EYEPOS], r0 ;normalize e dp3 R_TEMP.w, R_TEMP, R_TEMP rsq R_TEMP.w, R_TEMP.w mul R_EYE_VECTOR, R_TEMP, R_TEMP.w ;h = Normalize( l + e ) add R_TEMP, R_EYE_VECTOR, c[SHADER_LIGHTDIR1_REGISTER] ;normalize h dp3 R_TEMP.w, R_TEMP, R_TEMP rsq R_TEMP.w, R_TEMP.w mul R_TEMP, R_TEMP, R_TEMP.w ;l dot n ;dp3 r2, R_WORLDSPACE_NORMAL, c[SHADER_LIGHTDIR1_REGISTER] ;max r2, r2, c[SHADER_ZERO_REGISTER].x ;min oT2.y, r2,c[SHADER_ZERO_REGISTER].y ; get the power from the mat register mov oT2.y, c[SHADER_MATERIAL_REGISTER].w ;h dot n dp3 r2.x, R_TEMP, R_WORLDSPACE_NORMAL max r2.x, r2.x, c[SHADER_ZERO_REGISTER].x min oT2.x, r2.x,c[SHADER_ZERO_REGISTER].y ; BUMPMAPPING ; Transform basis vectors to skin space dp3 S_WORLD.x, V_S, r2 dp3 S_WORLD.y, V_S, r3 dp3 S_WORLD.z, V_S, r4 dp3 T_WORLD.x, V_T, r2 dp3 T_WORLD.y, V_T, r3 dp3 T_WORLD.z, V_T, r4 ; Normal is already in worldspace ;dp3 SxT_WORLD.x, V_SxT, r2 ;dp3 SxT_WORLD.y, V_SxT, r3 ;dp3 SxT_WORLD.z, V_SxT, r4 ; transform light by basis vectors to put it ; into texture space dp3 LIGHT_LOCAL.x, S_WORLD.xyz, c[SHADER_LIGHTDIR1_REGISTER] dp3 LIGHT_LOCAL.y, T_WORLD.xyz, c[SHADER_LIGHTDIR1_REGISTER] dp3 LIGHT_LOCAL.z, SxT_WORLD.xyz, c[SHADER_LIGHTDIR1_REGISTER] ; Normalize the light vector ;dp3 LIGHT_LOCAL.w, LIGHT_LOCAL, LIGHT_LOCAL ;rsq LIGHT_LOCAL.w, LIGHT_LOCAL.w ;mul LIGHT_LOCAL, LIGHT_LOCAL, LIGHT_LOCAL.w ; Scale to 0-1 add LIGHT_LOCAL, LIGHT_LOCAL, c[SHADER_ZERO_REGISTER].y mul oD0, LIGHT_LOCAL, c[SHADER_ZERO_REGISTER].w ; OTHER 3 LIGHTS IN SCENE PLUS AMBIENT ; Put the rest of the lights in oD1 dp3 r8, R_WORLDSPACE_NORMAL, c[SHADER_LIGHTDIR2_REGISTER] ; Diffuse Light 2 max r8, r8, c[SHADER_ZERO_REGISTER].x mul r10, r8, c[SHADER_LIGHTCOL2_REGISTER] dp3 r9, R_WORLDSPACE_NORMAL, c[SHADER_LIGHTDIR3_REGISTER] ; Diffuse Light 3 max r9, r9, c[SHADER_ZERO_REGISTER].x mad r10, r9, c[SHADER_LIGHTCOL3_REGISTER], r10 add r8, r10, c[SHADER_AMBIENTLIGHT_REGISTER] ; add ambient term min oD1, r8, c[SHADER_ZERO_REGISTER].y ;mul oD1, r8, c[SHADER_MATERIAL_REGISTER] ; Set alpha to 1 ;mov oD1.w, c[SHADER_ZERO_REGISTER].y mov oD1.w, c[SHADER_AMBIENTLIGHT_REGISTER].w ; output tex coords mul oT0, V_TEXTURE, c[SHADER_ZERO_REGISTER].zzxy mul oT1, V_TEXTURE, c[SHADER_ZERO_REGISTER].zzxy