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