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// Input registers map
10#define aPosition       v0
11#define aColor          v1
12#define aTexcoord       v2
13#define aNormal         v3
14
15// Output registers map
16#define vPosition       o0
17#define vQuaternion     o1
18#define vView           o2
19#define vColor          o3
20#define vTexcoord       o4
21
22// Constant registers map
23#define MATRIX_Proj         c0
24#define MATRIX_Proj0        c0
25#define MATRIX_Proj1        c1
26#define MATRIX_Proj2        c2
27#define MATRIX_Proj3        c3
28
29#define MATRIX_ModelView    c4
30#define MATRIX_ModelView0   c4
31#define MATRIX_ModelView00  c4
32#define MATRIX_ModelView01  c5
33#define MATRIX_ModelView02  c6
34#define MATRIX_ModelView03  c7
35
36//------------------------------------------
37//  related cmp
38//------------------------------------------
39#define CMP_MODE_EQ         0
40#define CMP_MODE_NE         1
41#define CMP_MODE_LT         2
42#define CMP_MODE_LE         3
43#define CMP_MODE_GT         4
44#define CMP_MODE_GE         5
45
46//------------------------------------------
47//  related condition
48//------------------------------------------
49#define COND_MODE_OR        0
50#define COND_MODE_AND       1
51#define COND_MODE_STA0      2
52#define COND_MODE_STA1      3
53
54#define EQ                  0
55
56// Temporary registers map
57#define TEMP_VIEW           r15
58#define TEMP_NORM           r14
59#define TEMP_POS            r12
60
61// Constant registers
62#define CONSTANT            c93
63
64def     CONSTANT[0], 0.0, 1.0, 2.0, 3.0
65def     CONSTANT[1], 0.125, 0.00390625, 0.5, 0.25
66
67#define CONST_0                 CONSTANT[0].x
68#define CONST_1                 CONSTANT[0].y
69#define CONST_HALF              CONSTANT[1].z
70#define CONST_1_0               CONSTANT[0].yx
71
72#pragma bind_symbol(aPosition.xyz,v0,v0)
73#pragma bind_symbol(aColor.xyzw,v1,v1)
74#pragma bind_symbol(aTexcoord.xyz,v2,v2)
75#pragma bind_symbol(aNormal.xyz,v3,v3)
76
77#pragma bind_symbol(uProjection,c0,c3)
78#pragma bind_symbol(uModelView,c4,c7)
79
80#pragma output_map ( position, o0 )
81#pragma output_map ( quaternion, o1 )
82#pragma output_map ( view, o2 )
83#pragma output_map ( color, o3 )
84#pragma output_map (texture0, o4)
85
86l_position_view_quaternion:
87    m4x4    TEMP_VIEW,          aPosition,       MATRIX_ModelView
88	// m3x3 is not done on purpuse to prevent stalls in the following cmp instructions.
89    dp3     TEMP_NORM.z,        aNormal,         MATRIX_ModelView02
90    dp3     TEMP_NORM.x,        aNormal,         MATRIX_ModelView00
91    dp3     TEMP_NORM.y,        aNormal,         MATRIX_ModelView01
92    mov     vView,             -TEMP_VIEW
93    dp4     vPosition.x,        TEMP_VIEW,          MATRIX_Proj0
94    dp4     vPosition.y,        TEMP_VIEW,          MATRIX_Proj1
95    cmp     EQ, EQ,             TEMP_NORM.z,        -CONST_1                // compare z component of norm with -1.0
96    add     r4,                 TEMP_NORM.z,        CONST_1                 // n.z + 1.0 is in r4
97	// m4x4 is not done on purpose to prevent stalls in the following mul instructions .
98    dp4     vPosition.z,        TEMP_VIEW,          MATRIX_Proj2
99    dp4     vPosition.w,        TEMP_VIEW,          MATRIX_Proj3
100    mul     r4,                 r4,                 CONST_HALF              // 0.5*(n.z + 1.0) is in r4
101    mov     vQuaternion.w,      CONST_0                                     // zero out quat.w component
102    rsq     r4,                 r4.x                                        // 1/sqrt(0.5*(n.z + 1.0)) is in r4
103    mul     r5,                 TEMP_NORM,          CONST_HALF              // 0.5*n is in r5
104    ifc 0, 1, COND_MODE_STA0
105        rcp     vQuaternion.z,   r4.x                                        // sqrt(0.5*(n.z + 1.0)) is in quat.z component
106        mul     vQuaternion.xy,  r5,                 r4                      // 0.5*n*quat.z is in quat.xy
107    else
108        mov     vQuaternion.xyz,     CONST_1_0                                   // zero out quat.w component
109    endif
110    nop
111    ret
112    nop
113
114main:
115    call    l_position_view_quaternion
116    mov     vColor, aColor
117    mov     vTexcoord, aTexcoord
118    end
119endmain:
120