#define C_WORLDVIEWPROJ0 0 #define C_WORLDVIEWPROJ1 1 #define C_WORLDVIEWPROJ2 2 #define C_WORLDVIEWPROJ3 3 #define C_WORLDVIEWIT0 4 #define C_WORLDVIEWIT1 5 #define C_WORLDVIEWIT2 6 #define C_WORLDVIEWIT3 7 #define C_WORLDVIEW0 8 #define C_WORLDVIEW1 9 #define C_WORLDVIEW2 10 #define C_WORLDVIEW3 11 #define C_CUBEMAP0 12 #define C_CUBEMAP1 13 #define C_CUBEMAP2 14 #define C_CUBEMAP3 15 #define V_XYZ v0 #define V_NORM v2 #define V_DIFFUSE v4 #define R_EYE_VERTEX r8 #define R_EYE_NORMAL r9 #define R_EYE_VECTOR r3 #define R_DOT2 r6 xvs.1.1 // Transform positions dp4 oPos.x, V_XYZ, c[C_WORLDVIEWPROJ0] dp4 oPos.y, V_XYZ, c[C_WORLDVIEWPROJ1] dp4 oPos.z, V_XYZ, c[C_WORLDVIEWPROJ2] dp4 oPos.w, V_XYZ, c[C_WORLDVIEWPROJ3] // Diffuse mov oD0, V_DIFFUSE // Env map dp4 R_EYE_VERTEX.x, V_XYZ, c[C_WORLDVIEW0] dp4 R_EYE_VERTEX.y, V_XYZ, c[C_WORLDVIEW1] dp4 R_EYE_VERTEX.z, V_XYZ, c[C_WORLDVIEW2] dp4 R_EYE_VERTEX.w, V_XYZ, c[C_WORLDVIEW3] // Create R_EYE_VECTOR, the normalized vector from the eye to the vertex dp3 R_EYE_VECTOR.w, R_EYE_VERTEX, R_EYE_VERTEX rsq R_EYE_VECTOR.w, R_EYE_VECTOR.w mul R_EYE_VECTOR, R_EYE_VERTEX, R_EYE_VECTOR.w // Transform normal to eye-space // We use the inverse transpose of the worldview // matrix to do this dp3 R_EYE_NORMAL.x, V_NORM, c[C_WORLDVIEWIT0] dp3 R_EYE_NORMAL.y, V_NORM, c[C_WORLDVIEWIT1] dp3 R_EYE_NORMAL.z, V_NORM, c[C_WORLDVIEWIT2] // Need to re-normalize normal dp3 R_EYE_NORMAL.w, R_EYE_NORMAL, R_EYE_NORMAL rsq R_EYE_NORMAL.w, R_EYE_NORMAL.w mul R_EYE_NORMAL, R_EYE_NORMAL, R_EYE_NORMAL.w // Calculate E - 2*(E dot N)*N dp3 R_DOT2, R_EYE_VECTOR, R_EYE_NORMAL add R_DOT2, R_DOT2, R_DOT2 mul R_EYE_NORMAL, R_EYE_NORMAL, R_DOT2 add r0, R_EYE_VECTOR, -R_EYE_NORMAL sge r0.w, r8, r8 // Generate a value of 1 dp4 oT0.x, r0, c[C_CUBEMAP0] dp4 oT0.y, r0, c[C_CUBEMAP1] dp4 oT0.z, r0, c[C_CUBEMAP2] dp4 oT0.w, r0, c[C_CUBEMAP3]