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