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 13defb b0, true 14 15l_position: 16 m4x4 TEMP_VIEW, dmp_position, dmp_local_to_view_matrix 17 dp4 gl_Position.x, TEMP_VIEW, dmp_projection_matrix[0] 18 dp4 gl_Position.y, TEMP_VIEW, dmp_projection_matrix[1] 19 dp4 gl_Position.z, TEMP_VIEW, dmp_projection_matrix[2] 20 dp4 gl_Position.w, TEMP_VIEW, dmp_projection_matrix[3] 21 ret 22 nop 23 24l_position_view_quaternion: 25 m4x4 TEMP_VIEW, dmp_position, dmp_local_to_view_matrix 26 dp3 TEMP_NORM.z, dmp_normal, dmp_local_to_view_matrix[2] 27 dp3 TEMP_NORM.x, dmp_normal, dmp_local_to_view_matrix[0] 28 dp3 TEMP_NORM.y, dmp_normal, dmp_local_to_view_matrix[1] 29 mov dmp_lrView, -TEMP_VIEW 30 dp4 gl_Position.x, TEMP_VIEW, dmp_projection_matrix[0] 31 dp4 gl_Position.y, TEMP_VIEW, dmp_projection_matrix[1] 32 cmp EQ, EQ, TEMP_NORM.z, -CONST_1 // compare z component of norm with -1.0 33 add r4, TEMP_NORM.z, CONST_1 // n.z + 1.0 is in r4 34 dp4 gl_Position.z, TEMP_VIEW, dmp_projection_matrix[2] 35 dp4 gl_Position.w, TEMP_VIEW, dmp_projection_matrix[3] 36 mul r4, r4, CONST_HALF // 0.5*(n.z + 1.0) is in r4 37 mov dmp_lrQuat.w, CONST_0 // zero out quat.w component 38 rsq r4, r4.x // 1/sqrt(0.5*(n.z + 1.0)) is in r4 39 mul r5, TEMP_NORM, CONST_HALF // 0.5*n is in r5 40 ifc 0, 1, COND_MODE_STA0 41 rcp dmp_lrQuat.z, r4.x // sqrt(0.5*(n.z + 1.0)) is in quat.z component 42 mul dmp_lrQuat.xy, r5, r4 // 0.5*n*quat.z is in quat.xy 43 else 44 mov dmp_lrQuat.xyz, CONST_1_0 // zero out quat.w component 45 endif 46 nop 47 ret 48 nop 49 50l_position_view_quaternion_reflection: 51 m4x4 TEMP_VIEW, dmp_position, dmp_local_to_view_matrix 52 53 dp3 TEMP_NORM.x, dmp_normal, dmp_local_to_view_matrix[0] 54 dp3 TEMP_NORM.y, dmp_normal, dmp_local_to_view_matrix[1] 55 dp3 TEMP_NORM.z, dmp_normal, dmp_local_to_view_matrix[2] 56 57 mov dmp_lrView, -TEMP_VIEW 58 59 dp3 TEMP0, -TEMP_VIEW, TEMP_NORM 60 dp4 gl_Position.x, TEMP_VIEW, dmp_projection_matrix[0] 61 dp4 gl_Position.y, TEMP_VIEW, dmp_projection_matrix[1] 62 cmp EQ, EQ, TEMP_NORM.z, -CONST_1 // compare z component of norm with -1.0 63 add r4, TEMP_NORM.z, CONST_1 // n.z + 1.0 is in r4 64 dp4 gl_Position.z, TEMP_VIEW, dmp_projection_matrix[2] 65 66 add TEMP0, TEMP0, TEMP0 67 68 dp4 gl_Position.w, TEMP_VIEW, dmp_projection_matrix[3] 69 mul r4, r4, CONST_HALF // 0.5*(n.z + 1.0) is in r4 70 71 mad TEMP0, TEMP0, TEMP_NORM, TEMP_VIEW 72 73 mov dmp_lrQuat.w, CONST_0 // zero out quat.w component 74 75 rsq r4, r4.x // 1/sqrt(0.5*(n.z + 1.0)) is in r4 76 mul r5, TEMP_NORM, CONST_HALF // 0.5*n is in r5 77 ifc 0, 1, COND_MODE_STA0 78 rcp dmp_lrQuat.z, r4.x // sqrt(0.5*(n.z + 1.0)) is in quat.z component 79 mul dmp_lrQuat.xy, r5, r4 // 0.5*n*quat.z is in quat.xy 80 else 81 mov dmp_lrQuat.xyz, CONST_1_0 // zero out quat.w component 82 endif 83 84 dp3 gl_TexCoord0.x, TEMP0, dmp_local_to_world_matrix[0] 85 dp3 gl_TexCoord0.y, TEMP0, dmp_local_to_world_matrix[1] 86 dp3 gl_TexCoord0.z, TEMP0, dmp_local_to_world_matrix[2] 87 mov gl_TexCoord0.w, CONST_0 88 ret 89 nop 90 91l_position_view_full_quaternion: 92 m4x4 TEMP_VIEW, dmp_position, dmp_local_to_view_matrix 93 dp3 TEMP_NORM.x, dmp_normal, dmp_local_to_view_matrix[0] 94 dp3 TEMP_NORM.y, dmp_normal, dmp_local_to_view_matrix[1] 95 dp3 TEMP_NORM.z, dmp_normal, dmp_local_to_view_matrix[2] 96 dp3 TEMP_TANG.x, dmp_tangent, dmp_local_to_view_matrix[0] 97 dp3 TEMP_TANG.y, dmp_tangent, dmp_local_to_view_matrix[1] 98 dp3 TEMP_TANG.z, dmp_tangent, dmp_local_to_view_matrix[2] 99 mov dmp_lrView, -TEMP_VIEW 100 dp4 gl_Position.x, TEMP_VIEW, dmp_projection_matrix[0] 101 dp4 gl_Position.y, TEMP_VIEW, dmp_projection_matrix[1] 102 dp4 gl_Position.z, TEMP_VIEW, dmp_projection_matrix[2] 103 dp4 gl_Position.w, TEMP_VIEW, dmp_projection_matrix[3] 104 105 mul r5, TEMP_NORM.yzx, TEMP_TANG.zxy 106 mad r5, -TEMP_TANG.yzx, TEMP_NORM.zxy, r5 // b*|n|^2 is in r5 107 dp3 r5.w, r5, r5 108 rsq r5.w, r5.w 109 mul r5, r5, r5.w 110 add r6.w, TEMP_NORM.z, r5.y 111 mul TEMP_TANG, r5.yzx, TEMP_NORM.zxy 112 mad TEMP_TANG, -TEMP_NORM.yzx, r5.zxy, TEMP_TANG 113 add r6.w, TEMP_TANG.x, r6 114 mov TEMP_TANG.w, r5.z 115 mov r5.z, TEMP_TANG.x 116 add r6.w, CONST_1, r6 117 mov TEMP_NORM.w, r5.x 118 mov r5.x, TEMP_NORM.z 119 cmp CMP_MODE_GT, CMP_MODE_GT, r6.w, CONST_1__256 120 mov r6.x, CONST_1 121 mov r6.y, -CONST_1 122 jpc 0, 0, COND_MODE_STA0, l_full_quaternion_calc_fallback 123 add r7.xz, TEMP_TANG.wwyy, -TEMP_NORM.yyww 124 add r7.y, TEMP_NORM.x, -TEMP_TANG.z 125 mov r7.w, r6 126 dp4 r6, r7, r7 127 rsq r6, r6.x 128 mul dmp_lrQuat, r7, r6 129 jpb b0, true, l_full_quaternion_calc_end 130l_full_quaternion_calc_fallback: 131 cmp CMP_MODE_GT, CMP_MODE_GT, r5.zy, r5.yx 132 ifc 1, 1, COND_MODE_STA0 133 ifc 1, 1, COND_MODE_STA1 134 mul r8, TEMP_TANG.yyzw, r6.xxxy 135 add r8.x, CONST_1, -r5.y 136 add r9, r5.z, -r5.x 137 add r8.yzw, r8, TEMP_NORM.wwxy 138 add r8.x, r9, r8 139 else 140 cmp CMP_MODE_GT, CMP_MODE_GT, r5.z, r5.x 141 mul r8, TEMP_TANG.yyzw, r6.xxxy 142 add r8.x, CONST_1, -r5.y 143 ifc 1, 1, COND_MODE_STA0 144 add r9, r5.z, -r5.x 145 add r8.yzw, r8, TEMP_NORM.wwxy 146 add r8.x, r9, r8 147 else 148 mul r8, TEMP_TANG.zwwy, r6.xxxy 149 add r8.z, CONST_1, -r5.z 150 add r9, r5.x, -r5.y 151 add r8.xyw, r8, TEMP_NORM.xyyw 152 add r8.z, r9, r8 153 endif 154 nop 155 endif 156 dp4 r6, r8, r8 157 else 158 ifc 1, 1, COND_MODE_STA1 159 mul r8, TEMP_TANG.yywz, r6.xxxy 160 add r8.y, CONST_1, -r5.z 161 add r9, r5.y, -r5.x 162 add r8.xzw, r8, TEMP_NORM.wwyx 163 add r8.y, r9, r8 164 else 165 mul r8, TEMP_TANG.zwwy, r6.xxxy 166 add r8.z, CONST_1, -r5.z 167 add r9, r5.x, -r5.y 168 add r8.xyw, r8, TEMP_NORM.xyyw 169 add r8.z, r9, r8 170 endif 171 dp4 r6, r8, r8 172 endif 173 rsq r6, r6.x 174 mul dmp_lrQuat, r8, r6 175l_full_quaternion_calc_end: 176 nop 177 ret 178 179l_position_view_full_quaternion_reflection: 180 m4x4 TEMP_VIEW, dmp_position, dmp_local_to_view_matrix 181 dp3 TEMP_NORM.x, dmp_normal, dmp_local_to_view_matrix[0] 182 dp3 TEMP_NORM.y, dmp_normal, dmp_local_to_view_matrix[1] 183 dp3 TEMP_NORM.z, dmp_normal, dmp_local_to_view_matrix[2] 184 dp3 TEMP_TANG.x, dmp_tangent, dmp_local_to_view_matrix[0] 185 dp3 TEMP_TANG.y, dmp_tangent, dmp_local_to_view_matrix[1] 186 dp3 TEMP_TANG.z, dmp_tangent, dmp_local_to_view_matrix[2] 187 mov dmp_lrView, -TEMP_VIEW 188 dp4 gl_Position.x, TEMP_VIEW, dmp_projection_matrix[0] 189 dp4 gl_Position.y, TEMP_VIEW, dmp_projection_matrix[1] 190 dp4 gl_Position.z, TEMP_VIEW, dmp_projection_matrix[2] 191 dp4 gl_Position.w, TEMP_VIEW, dmp_projection_matrix[3] 192 193 mul r5, TEMP_NORM.yzx, TEMP_TANG.zxy 194 mad r5, -TEMP_TANG.yzx, TEMP_NORM.zxy, r5 // b*|n|^2 is in r5 195 dp3 r5.w, r5, r5 196 rsq r5.w, r5.w 197 mul r5, r5, r5.w 198 add r6.w, TEMP_NORM.z, r5.y 199 mul TEMP_TANG, r5.yzx, TEMP_NORM.zxy 200 mad TEMP_TANG, -TEMP_NORM.yzx, r5.zxy, TEMP_TANG 201 add r6.w, TEMP_TANG.x, r6 202 mov TEMP_TANG.w, r5.z 203 mov r5.z, TEMP_TANG.x 204 add r6.w, CONST_1, r6 205 mov TEMP_NORM.w, r5.x 206 mov r5.x, TEMP_NORM.z 207 cmp CMP_MODE_GT, CMP_MODE_GT, r6.w, CONST_1__256 208 mov r6.x, CONST_1 209 mov r6.y, -CONST_1 210 jpc 0, 0, COND_MODE_STA0, l_full_quaternion_calc_fallback_reflection 211 add r7.xz, TEMP_TANG.wwyy, -TEMP_NORM.yyww 212 add r7.y, TEMP_NORM.x, -TEMP_TANG.z 213 mov r7.w, r6 214 dp4 r6, r7, r7 215 rsq r6, r6.x 216 mul dmp_lrQuat, r7, r6 217 jpb b0, true, l_full_quaternion_reflection_calc_end 218l_full_quaternion_calc_fallback_reflection: 219 cmp CMP_MODE_GT, CMP_MODE_GT, r5.zy, r5.yx 220 ifc 1, 1, COND_MODE_STA0 221 ifc 1, 1, COND_MODE_STA1 222 mul r8, TEMP_TANG.yyzw, r6.xxxy 223 add r8.x, CONST_1, -r5.y 224 add r9, r5.z, -r5.x 225 add r8.yzw, r8, TEMP_NORM.wwxy 226 add r8.x, r9, r8 227 else 228 cmp CMP_MODE_GT, CMP_MODE_GT, r5.z, r5.x 229 mul r8, TEMP_TANG.yyzw, r6.xxxy 230 add r8.x, CONST_1, -r5.y 231 ifc 1, 1, COND_MODE_STA0 232 add r9, r5.z, -r5.x 233 add r8.yzw, r8, TEMP_NORM.wwxy 234 add r8.x, r9, r8 235 else 236 mul r8, TEMP_TANG.zwwy, r6.xxxy 237 add r8.z, CONST_1, -r5.z 238 add r9, r5.x, -r5.y 239 add r8.xyw, r8, TEMP_NORM.xyyw 240 add r8.z, r9, r8 241 endif 242 nop 243 endif 244 dp4 r6, r8, r8 245 else 246 ifc 1, 1, COND_MODE_STA1 247 mul r8, TEMP_TANG.yywz, r6.xxxy 248 add r8.y, CONST_1, -r5.z 249 add r9, r5.y, -r5.x 250 add r8.xzw, r8, TEMP_NORM.wwyx 251 add r8.y, r9, r8 252 else 253 mul r8, TEMP_TANG.zwwy, r6.xxxy 254 add r8.z, CONST_1, -r5.z 255 add r9, r5.x, -r5.y 256 add r8.xyw, r8, TEMP_NORM.xyyw 257 add r8.z, r9, r8 258 endif 259 dp4 r6, r8, r8 260 endif 261 rsq r6, r6.x 262 mul dmp_lrQuat, r8, r6 263l_full_quaternion_reflection_calc_end: 264 dp3 TEMP0, -TEMP_VIEW, TEMP_NORM 265 add TEMP0, TEMP0, TEMP0 266 mad TEMP0, TEMP0, TEMP_NORM, TEMP_VIEW 267 dp3 gl_TexCoord0.x, TEMP0, dmp_local_to_world_matrix[0] 268 dp3 gl_TexCoord0.y, TEMP0, dmp_local_to_world_matrix[1] 269 dp3 gl_TexCoord0.z, TEMP0, dmp_local_to_world_matrix[2] 270 mov gl_TexCoord0.w, CONST_0 271 ret 272 nop 273