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