1// 2//------------------------------------------------------------ 3// Copyright(c) 2009-2010 by Digital Media Professionals Inc. 4// All rights reserved. 5//------------------------------------------------------------ 6// This source code is the confidential and proprietary 7// of Digital Media Professionals Inc. 8//------------------------------------------------------------ 9// 10 11#include "Commonasm.h" 12 13// Input registers map 14#define aPosition v0 15#define aNormal v1 16#define aTang v2 17#define aTexCoord v3 18 19// Output registers map 20#define vPosition o0 21#define vQuaternion o1 22#define vView o2 23#define vTexCoord1 o4 24 25defi i0, 0, 0, 1 26 27#pragma bind_symbol(aPosition.xyz,v0,v0) 28#pragma bind_symbol(aNormal.xyz,v1,v1) 29#pragma bind_symbol(aTang.xyz,v2,v2) 30#pragma bind_symbol(aTexCoord.xy,v3,v3) 31 32#pragma bind_symbol(uProjection,c0,c3) 33#pragma bind_symbol(uModelView,c4,c7) 34#pragma bind_symbol(uWorld,c8,c11) 35#pragma bind_symbol(uCameraPos,c12,c12) 36 37#pragma output_map ( position, o0 ) 38#pragma output_map ( quaternion, o1 ) 39#pragma output_map ( view, o2 ) 40#pragma output_map ( texture0, o3.xy ) 41#pragma output_map ( texture0w, o3.z ) 42#pragma output_map ( texture1, o4 ) 43 44defb b0, true 45 46l_position_view_full_quaternion_reflection: 47 m4x4 TEMP_VIEW, dmp_position, dmp_local_to_view_matrix 48 m3x3 TEMP_NORM.xyz, dmp_normal, dmp_local_to_view_matrix 49 m3x3 TEMP_TANG.xyz, aTang, dmp_local_to_view_matrix 50 mov dmp_lrView, -TEMP_VIEW 51 m4x4 gl_Position, TEMP_VIEW, dmp_projection_matrix 52 53 mul r5, TEMP_NORM.yzx, TEMP_TANG.zxy 54 mad r5, -TEMP_TANG.yzx, TEMP_NORM.zxy, r5 // b*|n|^2 is in r5 55 dp3 r5.w, r5, r5 56 rsq r5.w, r5.w 57 mul r5, r5, r5.w 58 add r6.w, TEMP_NORM.z, r5.y // m11+m22 in r6.w 59 mul TEMP_TANG, r5.yzx, TEMP_NORM.zxy 60 mad TEMP_TANG, -TEMP_NORM.yzx, r5.zxy, TEMP_TANG 61 add r6.w, TEMP_TANG.x, r6 // m00+m11+m22 in r6.w 62 mov TEMP_TANG.w, r5.z // m21 in tang.w 63 mov r5.z, TEMP_TANG.x // m00 in r5.z 64 add r6.w, CONST_1, r6 // 1+m00+m11+m22 in r6.w 65 mov TEMP_NORM.w, r5.x // m01 in norm.w 66 mov r5.x, TEMP_NORM.z // m22 in r5.x -> m22,m11,m00 in r5 67 cmp CMP_MODE_GT, CMP_MODE_GT, r6.w, CONST_1__256 68 mov r6.x, CONST_1 69 mov r6.y, -CONST_1 // 1,-1,?,1+m00+m11+m22 in r6 70 jpc 0, 0, COND_MODE_STA0, l_full_quaternion_calc_fallback_reflection 71 add r7.xz, TEMP_TANG.wwyy, -TEMP_NORM.yyww // m21-m12,?,m10-m01,? in r7 72 add r7.y, TEMP_NORM.x, -TEMP_TANG.z // m21-m12,m02-m20,m10-m01,? in r7 73 mov r7.w, r6 // m21-m12,m02-m20,m10-m01,1+m00+m11+m22 in r7 74 dp4 r6, r7, r7 75 rsq r6, r6.x 76 mul dmp_lrQuat, r7, r6 77 jpb b0, true, l_full_quaternion_reflection_calc_end 78l_full_quaternion_calc_fallback_reflection: 79 cmp CMP_MODE_GT, CMP_MODE_GT, r5.zy, r5.yx // comparing m00,m11 with m11,m22 80 ifc 1, 1, COND_MODE_STA0 81 ifc 1, 1, COND_MODE_STA1 // if m00>m11 && m11>m22 - m00 is greatest 82 mul r8, TEMP_TANG.yyzw, r6.xxxy // m10,m10,m20,-m21 in r8 83 add r8.x, CONST_1, -r5.y // 1-m11,m10,m20,-m21 in r8 84 add r9, r5.z, -r5.x // m00-m22 in r9 85 add r8.yzw, r8, TEMP_NORM.wwxy // 1-m11,m10+m01,m20+m02,m12-m21 in r8 <==should be m21-m12? 86 add r8.x, r9, r8 // 1+m00-m22-m11,m10+m01,m20+m02,m12-m21 in r8 87 else 88 cmp CMP_MODE_GT, CMP_MODE_GT, r5.z, r5.x 89 mul r8, TEMP_TANG.yyzw, r6.xxxy // m10,m10,m20,-m21 in r8 90 add r8.x, CONST_1, -r5.y // 1-m11,m10,m20,-m21 in r8 91 ifc 1, 1, COND_MODE_STA0 // if m00>m11 && m11<=m22 && m00 > m22 - m00 is greatest 92 add r9, r5.z, -r5.x // m00-m22 in r9 93 add r8.yzw, r8, TEMP_NORM.wwxy // 1-m11,m10+m01,m20+m02,m12-m21 in r8 <==should be m21-m12? 94 add r8.x, r9, r8 // 1+m00-m22-m11,m10+m01,m20+m02,m12-m21 in r8 95 else // if m00>m11 && m11<=m22 && m00 <= m22 - m22 is greatest 96 mul r8, TEMP_TANG.zwwy, r6.xxxy // m20,m21,m21,-m10 in r8 97 add r8.z, CONST_1, -r5.z // m20,m21,1-m00,-m10 in r8 98 add r9, r5.x, -r5.y // m22-m11 in r9 99 add r8.xyw, r8, TEMP_NORM.xyyw // m20+m02,m21+m12,1-m00,m01-m10 100 add r8.z, r9, r8 // m20+m02,m21+m12,1+m22-m11-m00,m01-m10 <= should be m10-m01 101 endif 102 nop 103 endif 104 mov r8.w, -r8 105 else 106 ifc 1, 1, COND_MODE_STA1 // if m00<=m11 && m11>m22 - m11 is greatest 107 mul r8, TEMP_TANG.yywz, r6.xxxy // m10,m10,m21,-m20 in r8 108 add r8.y, CONST_1, -r5.z // m10,1-m00,m21,-m20 in r8 109 add r9, r5.y, -r5.x // m11-m22 in r9 110 add r8.xzw, r8, TEMP_NORM.wwyx // m01+m10,1-m00,m12+m21,m02-m20 in r8 111 add r8.y, r9, r8 // m01+m10,1+m11-m22-m00,m12+m21,m02-m20 in r8 112 else // if m00<=m11 && m11<=m22 - m22 is greatest 113 mul r8, TEMP_TANG.zwwy, r6.xxxy 114 add r8.z, CONST_1, -r5.z 115 add r9, r5.x, -r5.y 116 add r8.xyw, r8, TEMP_NORM.xyyw 117 add r8.z, r9, r8 // m20+m02,m21+m12,1+m22-m11-m00,m01-m10 <= should be m10-m01 118 mov r8.w, -r8 119 endif 120 nop 121 endif 122 dp4 r6, r8, r8 123 rsq r6, r6.x 124 mul dmp_lrQuat, r8, r6 125l_full_quaternion_reflection_calc_end: 126 dp3 TEMP0, -TEMP_VIEW, TEMP_NORM 127 add TEMP0, TEMP0, TEMP0 128 mad TEMP0, TEMP0, TEMP_NORM, TEMP_VIEW 129 m3x3 gl_TexCoord0.xyz, TEMP0, dmp_local_to_world_matrix 130 mov gl_TexCoord0.w, CONST_0 131 ret 132 nop 133 134main: 135 mov vTexCoord1, aTexCoord.xyxy 136 call l_position_view_full_quaternion_reflection 137 end 138endmain: 139 140