/* oPos = Local2World * World2Camera * Position(v0) oD0 = Color0(v1) oD1 = Color1(v2) oT0 = UV(v3) oT1 = UV(v3) */ #pragma screenspace #define IN_XYZ v0 #define IN_NORMAL v1 #define IN_UV v2 #define IN_RGBA0 v3 #define IN_RGBA1 v4 #define IN_SKIN_INDEX v3 #define IN_SKIN_WEIGHT v4 #define C_TM_LOCAL2WORLD c0 #define C_TM_WORLD2SCREEN c4 #define C_V_CAMERA_POSITION c8 #define C_V_LIGHT_DIRECTION c9 // fog #define C_F_FOG_NEAR c10.x #define C_F_FOG_INV_FAR_SUB_NEAR c10.y #define C_F_FOG_MIN c10.z #define C_F_FOG_MAX_SUB_MIN c10.w #define C_F_FOG_FAR c11.x #define C_F_FOG_MAX c11.y // const #define C_F_0 c11.z #define C_F_05 c11.w // UV' scrool #define C_UV_SCROLL_UV c12.xy #define C_UV_SCROLL_U c12.x #define C_UV_SCROLL_V c12.y // opacity #define C_OPACITY c12.z #define C_F_1 c12.w // OFFSET & SCALE #define C_V_PROJECTION_OFFSET c13 #define C_V_PROJECTION_SCALE c14 // MODEL ORIGIN #define C_V_MODEL_ORIGIN c15 #define C_V_SHADOW_SCALE c15.w // DIRECITONAL LIGHT COLORS #define C_V_LIT_AMBIENT c16 #define C_V_LIT_DIFFUSE c17 #define C_V_LIT_DIFFUSE_BACK c18 // VERTEX DECOMPRESSION #define C_V_POS_SCALE c19 #define C_V_POS_ADD c20 #define C_V_UV_SCALE c21 #define C_V_UV_ADD c22 xvs.1.1 // decompress mul r2, IN_XYZ, C_V_POS_SCALE add r2, r2, C_V_POS_ADD // (R0) position m4x4 r0, r2, C_TM_LOCAL2WORLD // (R1) normal m3x3 r1, IN_NORMAL, C_TM_LOCAL2WORLD // renormalize dp3 r1.w, r1, r1 rsq r1.w, r1.w mul r1.xyz, r1.xyz, r1.w // oPos m4x4 oPos, r0, C_TM_WORLD2SCREEN // (R2) camera to vertex direction, normalized add r2, r0, -C_V_CAMERA_POSITION // Dir = Pos - CamPos dp3 r2.w, r2, r2 // Length2 = Dir.Length rsq r2.w, r2.w // iLength = 1 / sqrt(Length2) mul r2.xyz, r2.xyz, r2.w // Dir.xyz *= iLength rcp r2.w, r2.w // Length = 1 / iLength // (R3) camera reflection of the vertex dp3 r3.w, r1, -r2 // C.N add r3.w, r3.w, r3.w // 2*(C.N) mad r3.xyz, r3.w, r1, r2 // 2*(C.N)*N + C // (R11) specular // Clamp(L dot R) ^ 16 dp3 r11.x, r3, -C_V_LIGHT_DIRECTION max r11.x, r11.x, C_F_0 mul r11.x, r11.x, r11.x mul r11.x, r11.x, r11.x mul r11.x, r11.x, r11.x mul oD1.w, r11.x, r11.x // diffuse lighting dp3 r5.x, r1, -C_V_LIGHT_DIRECTION mov r5.y, -r5.x max r5.xy, r5.xy, C_F_0 mul r6.xyz, r5.x, C_V_LIT_DIFFUSE mad r6.xyz, r5.y, C_V_LIT_DIFFUSE_BACK, r6 add oD0.xyz, r6, C_V_LIT_AMBIENT // opacity and channel 2 mov oD0.w, C_OPACITY mov oD1.xyz, C_F_0 // decompress uv's mul r4, IN_UV, C_V_UV_SCALE add r4, r4, C_V_UV_ADD // uv's add oT0.xy, r4, C_UV_SCROLL_UV add oT1.xy, r4, C_UV_SCROLL_UV // reflection*0.5 + 0.5 mov oT2.xyz, r3.xyz // (R10) factor = ( length - minLength ) / (maxLength - minLength ), clamped // fog = min + ( max - min ) * factor sub r10.x, r2.w, C_F_FOG_NEAR mul r10.x, r10.x, C_F_FOG_INV_FAR_SUB_NEAR max r10.x, r10.x, C_F_FOG_MIN min r10.x, r10.x, C_F_FOG_MAX mad oFog.x, C_F_FOG_MAX_SUB_MIN, r10.x, C_F_FOG_MIN // offset and scale mul oPos.xyz, r12, C_V_PROJECTION_SCALE // scale rcc r1.x, r12.w // compute 1/w mad oPos.xyz, r12, r1.x, C_V_PROJECTION_OFFSET // scale by 1/w, add offset