1// ---------------------------------------------------------------------------
2//  Project:  NintendoWare
3//  File:     font_RectDrawerShader.vsh
4//
5//  Copyright (C)2009-2010 Nintendo Co., Ltd.  All rights reserved.
6//
7//  These coded instructions, statements, and computer programs contain
8//  proprietary information of Nintendo of America Inc. and/or Nintendo
9//  Company Ltd., and are protected by Federal copyright law.  They may
10//  not be disclosed to third parties or copied or duplicated in any form,
11//  in whole or in part, without the prior written consent of Nintendo.
12//
13//  $Revision:$
14// ---------------------------------------------------------------------------
15
16//----------------------------------------------------------
17// Input registers map
18
19#pragma     bind_symbol(    vVtxData,       v0,     v0 )
20#define     vVtxData                        v0
21
22// Input map
23// { bufferIndex, vtxIndex, X, Y }
24//----------------------------------------------------------
25
26//----------------------------------------------------------
27// Constant values
28
29#define     cVal                            c5
30def         cVal,           0.0,    1.0,    2.0,    3.0
31//----------------------------------------------------------
32
33//----------------------------------------------------------
34// Uniform
35
36#define                     uProjection     c0
37#define                     uStereoCamera   c4
38#define                     uUniformAddr    c6
39#define                     uUniformMtx     c32
40#define                     uUniformData    c64
41#define                     uTexCoordMode   i0
42
43//----------------------------------------------------------
44
45
46//----------------------------------------------------------
47// Output registers map
48
49#pragma output_map(position,      o0)
50#pragma output_map(color,         o1)
51#pragma output_map(texture0,      o2.xy)
52#pragma output_map(texture1,      o3.xy)
53#pragma output_map(texture2,      o4.xy)
54#define oPosition                 o0
55#define oColor                    o1
56#define oTexCoord0                o2
57#define oTexCoord1                o3
58#define oTexCoord2                o4
59//----------------------------------------------------------
60
61//----------------------------------------------------------
62// Temporary registers
63
64#define     rQuad       r0
65#define     rPosition   r1
66#define     rTransform  r2
67#define     rTempView   r3
68#define     rTempPos    r4
69#define     rTexCoord0  r5
70#define     rTexCoord1  r6
71#define     rTexCoord2  r7
72#define     rCounter    r8
73
74//----------------------------------------------------------
75
76main:
77    // ���Ԗڂ̎l�p�`�����擾
78    mova    a0.x,           vVtxData
79
80    // �A�h���X����ۑ�
81    mov     rQuad,          uUniformAddr[ a0.x ].wzyx
82
83    // ��{�l�p�`�̍��W��ݒ�
84    mov     rPosition.xy,   vVtxData.zwzw
85    mov     rPosition.zw,   cVal.xyxy
86
87    // �s��f�[�^�̃A�h���X�A����сA��`���̃A�h���X���擾
88    mova    a0.xy,          rQuad.xy
89
90    // �l�p�`��ό`�i���[�J�����W�n�j
91    mov     rTransform.xw,  uUniformData[ a0.y ].wwyy
92    mov     rTransform.yz,  cVal.xxxx
93    dp4     rTempPos.x,     rPosition, rTransform
94    mov     rTransform.yw,  uUniformData[ a0.y ].zzxx
95    mov     rTransform.xz,  cVal.xxxx
96    dp4     rTempPos.y,     rPosition,      rTransform
97    mov     rTempPos.zw,    rPosition.zwzw
98
99    // �l�p�`���X�N���[�����W�n�ɕϊ�
100    dp4     rTempView.x,    rTempPos,       uUniformMtx[ a0.x + 0 ].wzyx
101    dp4     rTempView.y,    rTempPos,       uUniformMtx[ a0.x + 1 ].wzyx
102    dp4     rTempView.z,    rTempPos,       uUniformMtx[ a0.x + 2 ].wzyx
103    mov     rTempView.w,    rPosition.w
104
105    mov     rTempPos.z,     uUniformMtx[ a0.x + 2 ].x           // temp z = z
106    abs     rTempPos.z,     rTempPos.z                          // temp z = abs(temp z)
107    add     rTempPos.z,     rTempPos.z,     uStereoCamera.y     // temp z += add dist
108
109    // �������‚��邩�ǂ����̔���
110    mov     rTempPos.x,     uStereoCamera.w
111    cmp     1, 1, rTempPos.xz, cVal.xx          // 1: !=     half parallax != 0, z != 0 ?
112    ifc     1, 1, 1                             // 1: AND
113
114    mov     rTempPos.x,     uStereoCamera.w                             // temp x = half parallax
115    sub     rTempPos.y,     rTempPos.z,         uStereoCamera.z         // temp y = temp z - Dlevel
116    rcp     rTempPos.z,     rTempPos.z                                  // temp z = 1 / temp z
117    mul     rTempPos.z,     rTempPos.y,         rTempPos.z              // temp z *= temp y
118    mad     rTempView.x,    rTempPos.x,         rTempPos.z,         rTempView.x     // x = temp x * temp z + x
119
120    endif
121
122    dp4     oPosition.x,    rTempView,      uProjection[ 0 ].wzyx
123    dp4     oPosition.y,    rTempView,      uProjection[ 1 ].wzyx
124    dp4     oPosition.z,    rTempView,      uProjection[ 2 ].wzyx
125    dp4     oPosition.w,    rTempView,      uProjection[ 3 ].wzyx
126
127    // ���_�J���[�̏�����邩���擾
128    cmp   3, 3,     rQuad.w, cVal.y
129
130    ifc   1, 1, 1
131    // ���_�J���[�̐ݒ�Ȃ��B
132
133    // ���_�J���[���f�t�H���g�Őݒ�
134    mov   oColor.xyz, cVal.y
135
136    // �A���t�@��ݒ�
137    mov   oColor.w,   rQuad.w
138
139    else
140    // ���_�J���[�̐ݒ肠��B
141
142    // ���_�J���[���̃A�h���X���擾
143    mova    a0.y,           rQuad.w
144
145    // ���ݏ������Ă��钸�_�ɂ‚��āA�㉺���E�̔���
146    cmp     1,  1,          cVal.xx,    rPosition.xy
147
148    ifc     0,  0,  1       // ����
149    mov     oColor,         uUniformMtx[ a0.y + 0 ].wzyx
150    endif
151    ifc     1,  0,  1       // �E��
152    mov     oColor,         uUniformMtx[ a0.y + 1 ].wzyx
153    endif
154    ifc     0,  1,  1       // ����
155    mov     oColor,         uUniformMtx[ a0.y + 2 ].wzyx
156    endif
157    ifc     1,  1,  1       // �E��
158    mov     oColor,         uUniformMtx[ a0.y + 3 ].wzyx
159    endif
160    nop
161    endif
162
163    // �e�N�X�`�����W�̏�����
164    cmp     1,  1,  cVal.xx,    rPosition.xy
165    ifc     0,  0,  1           // ����
166    mov     rTexCoord0,         cVal.xyyy
167    mov     rTexCoord1,         cVal.xyyy
168    mov     rTexCoord2,         cVal.xyyy
169    endif
170    ifc     1,  0,  1           // �E��
171    mov     rTexCoord0,         cVal.yyyy
172    mov     rTexCoord1,         cVal.yyyy
173    mov     rTexCoord2,         cVal.yyyy
174    endif
175    ifc     0,  1,  1           // ����
176    mov     rTexCoord0,         cVal.xxyy
177    mov     rTexCoord1,         cVal.xxyy
178    mov     rTexCoord2,         cVal.xxyy
179    endif
180    ifc     1,  1,  1           // �E��
181    mov     rTexCoord0,         cVal.yxyy
182    mov     rTexCoord1,         cVal.yxyy
183    mov     rTexCoord2,         cVal.yxyy
184    endif
185
186    // �e�N�X�`�����W�̐ݒ�
187    mov     rCounter,           cVal.x
188    loop    uTexCoordMode
189
190    cmp     0,  0,  cVal.y,     rCounter
191    ifc     1,  1,  1
192
193    // �e�N�X�`�����W�̃A�h���X���擾
194    mova    a0.y,               rQuad.z
195    cmp     1,  1,  cVal.xx,    rPosition.xy
196    ifc     0,  0,  1           // ����
197    mov     rTexCoord0.xy,      uUniformData[ a0.y + 0 ].wz
198    mov     rTexCoord1.xy,      uUniformData[ a0.y + 1 ].wz
199    mov     rTexCoord2.xy,      uUniformData[ a0.y + 2 ].wz
200    endif
201    ifc     1,  0,  1           // �E��
202    mov     rTexCoord0.xy,      uUniformData[ a0.y + 0 ].yz
203    mov     rTexCoord1.xy,      uUniformData[ a0.y + 1 ].yz
204    mov     rTexCoord2.xy,      uUniformData[ a0.y + 2 ].yz
205    endif
206    ifc     0,  1,  1           // ����
207    mov     rTexCoord0.xy,      uUniformData[ a0.y + 0 ].wx
208    mov     rTexCoord1.xy,      uUniformData[ a0.y + 1 ].wx
209    mov     rTexCoord2.xy,      uUniformData[ a0.y + 2 ].wx
210    endif
211    ifc     1,  1,  1           // �E��
212    mov     rTexCoord0.xy,      uUniformData[ a0.y + 0 ].yx
213    mov     rTexCoord1.xy,      uUniformData[ a0.y + 1 ].yx
214    mov     rTexCoord2.xy,      uUniformData[ a0.y + 2 ].yx
215    endif
216    nop
217    endif
218
219    // �e�N�X�`���s����]���Ă���ꍇ�Ɍ���A�E��ƍ����̍��W�������Ă���
220    cmp     2,  2,  cVal.w,     rCounter
221    ifc     1,  1,  1
222
223    cmp     1,  1,  cVal.xx,    rPosition.xy
224    ifc     1,  0,  1           // �E����㏑��
225    mov     rTexCoord0.xy,      uUniformData[ a0.y + 3 ].yx
226    mov     rTexCoord1.xy,      uUniformData[ a0.y + 4 ].yx
227    mov     rTexCoord2.xy,      uUniformData[ a0.y + 5 ].yx
228    endif
229    ifc     0,  1,  1           // �������㏑��
230    mov     rTexCoord0.xy,      uUniformData[ a0.y + 3 ].wz
231    mov     rTexCoord1.xy,      uUniformData[ a0.y + 4 ].wz
232    mov     rTexCoord2.xy,      uUniformData[ a0.y + 5 ].wz
233    endif
234    nop
235    endif
236
237    add     rCounter,   rCounter,   cVal.y
238    endloop
239
240    mov     oTexCoord0,         rTexCoord0
241    mov     oTexCoord1,         rTexCoord1
242    mov     oTexCoord2,         rTexCoord2
243
244    end
245endmain:
246