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