// //------------------------------------------------------------ // Copyright(c) 2009-2010 by Digital Media Professionals Inc. // All rights reserved. //------------------------------------------------------------ // This source code is the confidential and proprietary // of Digital Media Professionals Inc. //------------------------------------------------------------ // Input registers map #define aPosition v0 #define aNormal v1 #define aColor v2 // Output registers map #define vPosition o0 #define vQuaternion o1 #define vView o2 #define vColor o3 // Constant registers map #define MATRIX_Proj c0 #define MATRIX_Proj0 c0 #define MATRIX_Proj1 c1 #define MATRIX_Proj2 c2 #define MATRIX_Proj3 c3 #define MATRIX_ModelView c4 #define MATRIX_ModelView0 c4 #define MATRIX_ModelView00 c4 #define MATRIX_ModelView01 c5 #define MATRIX_ModelView02 c6 #define MATRIX_ModelView03 c7 //------------------------------------------ // related cmp //------------------------------------------ #define CMP_MODE_EQ 0 #define CMP_MODE_NE 1 #define CMP_MODE_LT 2 #define CMP_MODE_LE 3 #define CMP_MODE_GT 4 #define CMP_MODE_GE 5 //------------------------------------------ // related condition //------------------------------------------ #define COND_MODE_OR 0 #define COND_MODE_AND 1 #define COND_MODE_STA0 2 #define COND_MODE_STA1 3 #define EQ 0 // Temporary registers map #define TEMP_VIEW r15 #define TEMP_NORM r14 #define TEMP_POS r12 // Constant registers #define CONSTANT c93 def CONSTANT[0], 0.0, 1.0, 2.0, 3.0 def CONSTANT[1], 0.125, 0.00390625, 0.5, 0.25 #define CONST_0 CONSTANT[0].x #define CONST_1 CONSTANT[0].y #define CONST_HALF CONSTANT[1].z #define CONST_1_0 CONSTANT[0].yx #pragma bind_symbol(aPosition.xyz,v0,v0) #pragma bind_symbol(aNormal.xyz,v1,v1) #pragma bind_symbol(aColor.xyzw,v2,v2) #pragma bind_symbol(uProjection,c0,c3) #pragma bind_symbol(uModelView,c4,c7) #pragma output_map ( position, o0 ) #pragma output_map ( quaternion, o1 ) #pragma output_map ( view, o2 ) #pragma output_map ( color, o3 ) l_position_view_quaternion: m4x4 TEMP_VIEW, aPosition, MATRIX_ModelView // m3x3 is not done on purpuse to prevent stalls in the following cmp instructions. dp3 TEMP_NORM.z, aNormal, MATRIX_ModelView02 dp3 TEMP_NORM.x, aNormal, MATRIX_ModelView00 dp3 TEMP_NORM.y, aNormal, MATRIX_ModelView01 mov vView, -TEMP_VIEW dp4 vPosition.x, TEMP_VIEW, MATRIX_Proj0 dp4 vPosition.y, TEMP_VIEW, MATRIX_Proj1 cmp EQ, EQ, TEMP_NORM.z, -CONST_1 // compare z component of norm with -1.0 add r4, TEMP_NORM.z, CONST_1 // n.z + 1.0 is in r4 // m4x4 is not done on purposes to prevent stalls in the following mul instruction. dp4 vPosition.z, TEMP_VIEW, MATRIX_Proj2 dp4 vPosition.w, TEMP_VIEW, MATRIX_Proj3 mul r4, r4, CONST_HALF // 0.5*(n.z + 1.0) is in r4 mov vQuaternion.w, CONST_0 // zero out quat.w component rsq r4, r4.x // 1/sqrt(0.5*(n.z + 1.0)) is in r4 mul r5, TEMP_NORM, CONST_HALF // 0.5*n is in r5 ifc 0, 1, COND_MODE_STA0 rcp vQuaternion.z, r4.x // sqrt(0.5*(n.z + 1.0)) is in quat.z component mul vQuaternion.xy, r5, r4 // 0.5*n*quat.z is in quat.xy else mov vQuaternion.xyz, CONST_1_0 // zero out quat.w component endif nop ret nop main: call l_position_view_quaternion mov vColor, aColor end endmain: