1// ---------------------------------------------------------------------------
2//  Project:  NintendoWare
3//  File:     gfx_ParticleVShader.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: 15928 $
14// ---------------------------------------------------------------------------
15#include "VertexShader.h"
16
17// Input registers map
18// �p�[�e�B�N���p�̐ݒ�ł�
19#define aTranslate  v0
20#define aScale      v1
21#define aRotate     v2
22#define aColor      v3
23#define aAlpha      v4
24#define aTextureTranslate   v5
25#define aTextureScale       v6
26#define aTextureRotate      v7
27#define aScaleExt           v8
28
29// ���O�͎g��Ȃ��̂ŁA�ԈႦ���N����Ȃ��悤�ɒP���ȋK���ɂ��Ă��܂��B
30#pragma bind_symbol(aInput0.xyz, v0, v0) // translate
31#pragma bind_symbol(aInput1.xyz, v1, v1) // rotate
32#pragma bind_symbol(aInput2.xyz, v2, v2) // scale
33#pragma bind_symbol(aInput3.xyz, v3, v3) // color
34#pragma bind_symbol(aInput4.x,   v4, v4) // alpha
35#pragma bind_symbol(aInput5.xy,  v5, v5) // textureTranslate
36#pragma bind_symbol(aInput6.xy,  v6, v6) // textureScale
37#pragma bind_symbol(aInput7.x,   v7, v7) // textureRotate
38#pragma bind_symbol(aInput8.xyz, v8, v8) // scaleExt
39
40#pragma output_map(position,   o0)
41#pragma output_map(quaternion, o1)
42#pragma output_map(view,       o2)
43#pragma output_map(color,      o3)
44#pragma output_map (generic,   o4)
45#pragma output_map (generic,   o5)
46#pragma output_map (generic,   o6)
47#pragma output_map (generic,   o7)
48
49#pragma bind_symbol(WrldMtx, c0, c2)
50#pragma bind_symbol(NormMtx, c3, c5)
51#pragma bind_symbol(PosOffs.xyz, c6, c6)
52#pragma bind_symbol(IrScale, c7, c9)
53#pragma bind_symbol(TexcMap.xyz, c10, c10)
54#pragma bind_symbol(TexMtx0, c11, c13)
55#pragma bind_symbol(TexMtx1, c14, c16)
56#pragma bind_symbol(TexMtx2, c17, c19)
57#pragma bind_symbol(MatAmbi, c20, c20)
58#pragma bind_symbol(MatDiff, c21, c21)
59#pragma bind_symbol(HslGCol, c22, c22)
60#pragma bind_symbol(HslSCol, c23, c23)
61#pragma bind_symbol(HslSDir, c24, c24)
62#pragma bind_symbol(UnivReg, c25, c80)
63
64#pragma bind_symbol(ProjMtx, c86, c89)
65#pragma bind_symbol(ViewMtx, c90, c92)
66
67#define uModelView      c25 // view . model
68#define uInvModelView   c28 // Inv(view . model)
69#define uInvModel       c31 // Inv(model)
70#define uModel          c34 // model
71#define uOffset         c37
72#define uScaleOffset    c38
73#define uRotateOffset   c39
74
75#pragma bind_symbol(IsSmoSk, b1, b1)
76#pragma bind_symbol(IsRgdSk, b2, b2)
77#pragma bind_symbol(IsUniSc, b3, b3)
78#pragma bind_symbol(UseNorM, b4, b4)
79#pragma bind_symbol(IsHemiL, b5, b5)
80#pragma bind_symbol(IsHemiO, b6, b6)
81#pragma bind_symbol(IsVertA, b7, b7)
82#pragma bind_symbol(IsBoneW, b8, b8)
83#pragma bind_symbol(UvMap0, b9, b9)
84#pragma bind_symbol(UvMap1, b10, b10)
85#pragma bind_symbol(UvMap2, b11, b11)
86#pragma bind_symbol(IsVertL, b12, b12)
87#pragma bind_symbol(IsText1, b13, b13)
88#pragma bind_symbol(IsText2, b14, b14)
89#pragma bind_symbol(IsQuate, b15, b15)
90
91#define shapeType0      b1 // ���q��XYZ�̉�]�s��̐���
92#define shapeType1      b2
93#define shapeType2      b3
94#define shapeType3      b4
95
96#define CONST_1__2PI c84.x
97
98#define sincos_table c81
99def c81, 64.81226000634280664816344, -41.1989059448242187500, -19.733086445622068119813801, 6.27851724624633789062
100def c82, 57.38797321366921352108833, -72.0021514892578125000, -84.572341395128292218841051, 80.3578109741210937500
101def c83, 3.765142073243151942892024, -6.68470811843872070312, -21.659571217007130946603447, 33.2480163574218750000
102def c84, 0.1591549430918, 6.747892669487678532020627, 0, 0
103
104main:
105
106    // �������炵�΂炭�|���S���̊��x�N�g���̌v�Z
107
108#define xvector r6
109#define yvector r7
110#define zvector r8
111#define mat0 r9
112#define	mat1 r10
113#define	mat2 r11
114#define in_rotate r12
115#define in_scale  r13
116
117    mov     TEMP0,              aRotate
118    add     TEMP0,              TEMP0,          uRotateOffset
119    mul     TEMP0,              TEMP0,          CONST_1__2PI
120    flr     TEMP1,              TEMP0
121    add     in_rotate,          TEMP0,          -TEMP1
122
123    mov     TEMP0,              aScale
124    mul     TEMP0,              TEMP0,          aScaleExt
125    mul     in_scale,           TEMP0,          uScaleOffset
126
127    ifb shapeType0
128        // ��]�s��
129        mov     mat0,       CONST_0
130        mov     mat1,       CONST_0
131        mov     mat2,       CONST_0
132
133        mul     TEMP3,      in_rotate,      in_rotate
134
135        mov     TEMP1,      sincos_table[2]
136        mov     TEMP2,      sincos_table[1]
137        mov     TEMP5,      sincos_table[0]
138        // sincos x
139        mad     TEMP0.xy,   TEMP3.x,        TEMP1.xy,       TEMP1.zw
140        mad     TEMP0.xy,   TEMP3.x,        TEMP0.xy,       TEMP2.xy
141        mad     TEMP0.xy,   TEMP3.x,        TEMP0.xy,       TEMP2.zw
142        mad     TEMP0.xy,   TEMP3.x,        TEMP0.xy,       TEMP5.xy
143        mad     TEMP0.xy,   TEMP3.x,        TEMP0.xy,       TEMP5.zw
144        mul     TEMP0.y,    TEMP0.y,        in_rotate.x
145        mad     TEMP0.x,    TEMP3.x,        TEMP0.x,    CONST_1
146
147        mov     TEMP4.xy,   TEMP0 // TEMP4 = cos x, sin x, -, -
148
149        // sincos y
150        mad     TEMP0.xy,   TEMP3.y,        TEMP1.xy,       TEMP1.zw
151        mad     TEMP0.xy,   TEMP3.y,        TEMP0.xy,       TEMP2.xy
152        mad     TEMP0.xy,   TEMP3.y,        TEMP0.xy,       TEMP2.zw
153        mad     TEMP0.xy,   TEMP3.y,        TEMP0.xy,       TEMP5.xy
154        mad     TEMP0.xy,   TEMP3.y,        TEMP0.xy,       TEMP5.zw
155        mul     TEMP0.y,    TEMP0.y,        in_rotate.y
156        mad     TEMP0.x,    TEMP3.y,        TEMP0.x,    CONST_1
157
158        mov     TEMP4.zw,   TEMP0.xxxy // TEMP4 = cos x, sin x, cos y, sin y
159
160        // sincos z
161        mad     TEMP0.xy,   TEMP3.z,        TEMP1.xy,       TEMP1.zw
162        mad     TEMP0.xy,   TEMP3.z,        TEMP0.xy,       TEMP2.xy
163        mad     TEMP0.xy,   TEMP3.z,        TEMP0.xy,       TEMP2.zw
164        mad     TEMP0.xy,   TEMP3.z,        TEMP0.xy,       TEMP5.xy
165        mad     TEMP0.xy,   TEMP3.z,        TEMP0.xy,       TEMP5.zw
166        mul     TEMP0.y,    TEMP0.y,        in_rotate.z
167        mad     TEMP0.x,    TEMP3.z,        TEMP0.x,    CONST_1
168
169#define cosx TEMP4.x
170#define sinx TEMP4.y
171#define cosy TEMP4.z
172#define siny TEMP4.w
173#define cosz TEMP0.x
174#define sinz TEMP0.y
175#define cossinx TEMP4.xy
176#define sincosz TEMP0.yx
177#define sincosx TEMP4.yx
178
179        mov     mat2.x,     -siny
180        mul     mat0.x,     cosz, cosy
181        mul     mat1.x,     sinz, cosy
182        mul     mat2.y,     sinx, cosy
183        mul     mat2.z,     cosx, cosy
184
185        mul     TEMP1.xy,   cossinx, sincosz
186        mad     mat0.y,     TEMP1.y, siny,      -TEMP1.x
187        mad     mat1.z,     TEMP1.x, siny,      -TEMP1.y
188
189        mul     TEMP1.xy,   sincosx, sincosz
190        mad     mat0.z,     TEMP1.y, siny,      TEMP1.x
191        mad     mat1.y,     TEMP1.x, siny,      TEMP1.y
192
193#undef cosx
194#undef sinx
195#undef cosy
196#undef siny
197#undef cosz
198#undef sinz
199    endif
200
201    ifb shapeType2
202        // �|���S����
203        mov     xvector.yz,     CONST_0
204        mov     yvector.xz,     CONST_0
205        mov     xvector.xw,     CONST_1
206        mov     yvector.yw,     CONST_1
207
208        mul     xvector.xyz,    xvector,        in_scale.x
209        mul     yvector.xyz,    yvector,        in_scale.y
210
211        dp3     TEMP0.x,        xvector,        mat0
212        dp3     TEMP0.y,        xvector,        mat1
213        dp3     TEMP0.z,        xvector,        mat2
214        mov     xvector,        TEMP0
215        dp3     TEMP1.x,        yvector,        mat0
216        dp3     TEMP1.y,        yvector,        mat1
217        dp3     TEMP1.z,        yvector,        mat2
218        mov     yvector,        TEMP1
219
220        mov     TEMP0,          xvector
221        dp3     xvector.x,      TEMP0.xyz,          uModelView[0]._XYZ
222        dp3     xvector.y,      TEMP0.xyz,          uModelView[1]._XYZ
223        dp3     xvector.z,      TEMP0.xyz,          uModelView[2]._XYZ
224
225        mov     TEMP0,          yvector
226        dp3     yvector.x,      TEMP0.xyz,          uModelView[0]._XYZ
227        dp3     yvector.y,      TEMP0.xyz,          uModelView[1]._XYZ
228        dp3     yvector.z,      TEMP0.xyz,          uModelView[2]._XYZ
229    else
230        ifb shapeType1
231            // Y���r���{�[�h
232            mov     zvector.x,      uInvModelView[0]._Z
233            mov     zvector.y,      uInvModelView[1]._Z
234            mov     zvector.z,      uInvModelView[2]._Z
235            dp3     TEMP0,          zvector,        zvector
236            rsq     TEMP1,          TEMP0.x
237            mul     zvector,        zvector,        TEMP1.x
238
239            mov     xvector,        CONST_0
240            mov     yvector,        CONST_0
241            mov     xvector.x,      CONST_1
242            mov     yvector.y,      CONST_1
243
244            dp3     TEMP0.x,        xvector,        mat0
245            dp3     TEMP0.y,        xvector,        mat1
246            dp3     TEMP0.z,        xvector,        mat2
247            mov     xvector,        TEMP0
248            dp3     TEMP1.x,        yvector,        mat0
249            dp3     TEMP1.y,        yvector,        mat1
250            dp3     TEMP1.z,        yvector,        mat2
251            mov     yvector,        TEMP1
252
253            crs     TEMP0.xyz,      yvector,        zvector
254            crs     zvector.xyz,    TEMP0,          yvector
255
256            dp3     TEMP1,          xvector,        xvector
257            rsq     TEMP3,          TEMP1.x
258
259            crs     xvector.xyz,    yvector,        zvector
260            dp3     TEMP0,          xvector,        xvector
261            rsq     TEMP1,          TEMP0.x
262            mul     xvector,        xvector,        TEMP1.x
263            mul     xvector,        xvector,        TEMP3.x
264
265            // �����܂�local���W�n
266
267            mov     TEMP0,          xvector
268            dp3     xvector.x,      TEMP0.xyz,          uModelView[0]._XYZ
269            dp3     xvector.y,      TEMP0.xyz,          uModelView[1]._XYZ
270            dp3     xvector.z,      TEMP0.xyz,          uModelView[2]._XYZ
271
272            mov     TEMP0,          yvector
273            dp3     yvector.x,      TEMP0.xyz,          uModelView[0]._XYZ
274            dp3     yvector.y,      TEMP0.xyz,          uModelView[1]._XYZ
275            dp3     yvector.z,      TEMP0.xyz,          uModelView[2]._XYZ
276
277            // �X�P�[�����O
278            mul     xvector,        xvector,            in_scale.x
279            mul     yvector,        yvector,            in_scale.y
280
281        else
282            ifb shapeType3
283                // ���[���h�w��
284                mov     zvector.x,      uInvModelView[0]._Z
285                mov     zvector.y,      uInvModelView[1]._Z
286                mov     zvector.z,      uInvModelView[2]._Z
287                dp3     TEMP0,          zvector,        zvector
288                rsq     TEMP1,          TEMP0.x
289                mul     zvector,        zvector,        TEMP1.x
290
291                mov     yvector.xz,     CONST_0
292                mov     yvector.yw,     CONST_1
293
294                crs     TEMP0.xyz,      yvector,        zvector
295                crs     yvector.xyz,    zvector,        TEMP0
296                crs     xvector.xyz,    yvector,        zvector
297            else
298                // �X�N���[�����s
299                mov     zvector.x,      uInvModelView[0]._Z
300                mov     zvector.y,      uInvModelView[1]._Z
301                mov     zvector.z,      uInvModelView[2]._Z
302                dp3     TEMP0,          zvector,        zvector
303                rsq     TEMP1,          TEMP0.x
304                mul     zvector,        zvector,        TEMP1.x
305
306                mov     yvector.x,      uInvModelView[0]._Y
307                mov     yvector.y,      uInvModelView[1]._Y
308                mov     yvector.z,      uInvModelView[2]._Y
309                dp3     TEMP0,          yvector,        yvector
310                rsq     TEMP1,          TEMP0.x
311                mul     yvector,        yvector,        TEMP1.x
312
313                crs     TEMP0.xyz,      yvector,        zvector
314                crs     yvector.xyz,    zvector,        TEMP0
315                crs     xvector.xyz,    yvector,        zvector
316            endif
317
318            dp3     TEMP0,          xvector,            xvector
319            rsq     TEMP1,          TEMP0.x
320            mul     xvector,        xvector,            TEMP1.x
321
322            dp3     TEMP0,          yvector,            yvector
323            rsq     TEMP1,          TEMP0.x
324            mul     yvector,        yvector,            TEMP1.x
325
326            // �����܂�local���W�n
327
328            mov     TEMP0,          xvector
329            dp3     xvector.x,      TEMP0.xyz,          uModelView[0]._XYZ
330            dp3     xvector.y,      TEMP0.xyz,          uModelView[1]._XYZ
331            dp3     xvector.z,      TEMP0.xyz,          uModelView[2]._XYZ
332
333            mov     TEMP0,          yvector
334            dp3     yvector.x,      TEMP0.xyz,          uModelView[0]._XYZ
335            dp3     yvector.y,      TEMP0.xyz,          uModelView[1]._XYZ
336            dp3     yvector.z,      TEMP0.xyz,          uModelView[2]._XYZ
337
338            // �X�P�[�����O
339            mul     xvector,        xvector,            in_scale.x
340            mul     yvector,        yvector,            in_scale.y
341
342            // ��]
343            // sincos  TEMP0.xy, in_rotate.z, TEMP1, TEMP2 // cos, sin
344            mov     TEMP1,          sincos_table[2]
345            mov     TEMP2,          sincos_table[1]
346            mul     TEMP0.z,        in_rotate.z,    in_rotate.z
347            mad     TEMP0.xy,       TEMP0.z,        TEMP1.xy,       TEMP1.zw
348            mad     TEMP0.xy,       TEMP0.z,        TEMP0.xy,       TEMP2.xy
349            mad     TEMP0.xy,       TEMP0.z,        TEMP0.xy,       TEMP2.zw
350            mov     TEMP1,          sincos_table[0]
351            mad     TEMP0.xy,       TEMP0.z,        TEMP0.xy,       TEMP1.xy
352            mad     TEMP0.xy,       TEMP0.z,        TEMP0.xy,       TEMP1.zw
353            mul     TEMP0.y,        TEMP0.y,        in_rotate.z
354            mad     TEMP0.x,        TEMP0.z,        TEMP0.x,        CONST_1
355
356            mov     TEMP0.z,        -TEMP0.y
357
358            mul     TEMP1.xyzw,     TEMP0.xzyx,     xvector.xyxy
359            add     xvector.xy,     TEMP1.xz,       TEMP1.yw
360            mov     xvector.zw,     CONST_0
361
362            mul     TEMP1.xyzw,     TEMP0.xzyx,     yvector.xyxy
363            add     yvector.xy,     TEMP1.xz,       TEMP1.yw
364            mov     yvector.zw,     CONST_0
365        endif
366
367        nop
368
369    endif
370
371    // �����܂łŁAxvector, yvector�ɂ̓r���[���W�n�Ń|���S���̊��x�N�g���������Ă��܂��B
372    // ���`�Ȃ̂ŁA���S�_�{���x�N�g���Ŏ��ۂ̌`���\����A�W�I���g���V�F�[�_�Ōv�Z����܂��B
373
374    // ���S�ʒu��View���W��
375    mov     TEMP_POSI.w,        CONST_1
376    add     TEMP_POSI.xyz,      nw_position,    nw_position_offset._XYZW
377
378    dp4     WRLD_POSI.x,        TEMP_POSI,      uModel[0]._XYZW
379    dp4     WRLD_POSI.y,        TEMP_POSI,      uModel[1]._XYZW
380    dp4     WRLD_POSI.z,        TEMP_POSI,      uModel[2]._XYZW
381    mov     WRLD_POSI.w,        CONST_1
382
383    dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
384    dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
385    dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
386    mov     TEMP_VIEW.w,        CONST_1
387
388    // ���x�N�g���̃I�t�Z�b�g�ɂ��ړ������Z
389    mul     TEMP0,              xvector,        uOffset.x
390    mul     TEMP1,              yvector,        uOffset.y
391    add     TEMP_VIEW.xyz,      TEMP_VIEW,      -TEMP0
392    add     TEMP_VIEW.xyz,      TEMP_VIEW,      -TEMP1
393
394    // Quaternion
395    mov     o_Quaternion.xyzw,  CONST_0
396
397    // View
398    mov     o_View,             -TEMP_VIEW
399
400    // �ʒu�i���S�j
401    dp4     o_Position.x,       TEMP_VIEW,      nw_projection_matrix[0]._XYZW
402    dp4     o_Position.y,       TEMP_VIEW,      nw_projection_matrix[1]._XYZW
403    dp4     o_Position.z,       TEMP_VIEW,      nw_projection_matrix[2]._XYZW
404    dp4     o_Position.w,       TEMP_VIEW,      nw_projection_matrix[3]._XYZW
405
406    // �J���[�E�A���t�@
407    mov     o_Color.xyz,        aColor.xyz
408    mov     o_Color.w,          aAlpha.x
409
410    // �e�N�X�`�����W
411    mul     TEMP0,              aTextureRotate, CONST_1__2PI
412    flr     TEMP1,              TEMP0
413    add     TEMP3,              TEMP0,          -TEMP1
414
415    // TEMP3.x��sin��TEMP0.y�ɁAcos��TEMP0.x�ɓ���܂��B
416    mov     TEMP1,              sincos_table[2]
417    mov     TEMP2,              sincos_table[1]
418    mul     TEMP0.z,            TEMP3.x,        TEMP3.x
419    mad     TEMP0.xy,           TEMP0.z,        TEMP1.xy,   TEMP1.zw
420    mad     TEMP0.xy,           TEMP0.z,        TEMP0.xy,   TEMP2.xy
421    mad     TEMP0.xy,           TEMP0.z,        TEMP0.xy,   TEMP2.zw
422    mov     TEMP1,              sincos_table[0]
423    mad     TEMP0.xy,           TEMP0.z,        TEMP0.xy,   TEMP1.xy
424    mad     TEMP0.xy,           TEMP0.z,        TEMP0.xy,   TEMP1.zw
425    mul     TEMP0.y,            TEMP0.y,        TEMP3.x
426    mad     TEMP0.x,            TEMP0.z,        TEMP0.x,    CONST_1
427
428    mul     TEMP1.xyzw,         aTextureScale.xyxy,   TEMP0.yxxy // TEMP1.xyzw = scaleXsin,scaleYcos, scaleXcos, scaleYsin
429    mov     TEMP1.x,            -TEMP1.x
430
431    add     TEMP2.x,            -aTextureTranslate.x, -CONST_HALF
432    add     TEMP2.y,            aTextureTranslate.y, -CONST_HALF
433
434    mul     TEMP0.xyzw,         TEMP1.xyzw,     TEMP2.yyxx
435    add     TEMP2.xy,           TEMP0.xy,       CONST_HALF
436    add     TEMP0.xy,           TEMP0.zw,       TEMP2.xy
437
438    // �e�N�X�`�����W�̊�_
439    mov     TEMP2.xy,           TEMP0
440    mov     TEMP2.zw,           CONST_0_0_0_1
441    dp4     TEMP0.x,            TEMP2,       nw_texture_matrix0[0]._XYZW
442    dp4     TEMP0.y,            TEMP2,       nw_texture_matrix0[1]._XYZW
443    dp4     TEMP0.z,            TEMP2,       nw_texture_matrix0[2]._XYZW
444    mov     o4, TEMP0
445
446    // �e�N�X�`�����W�̊��x�N�g��1
447    mov     TEMP2.xy,           TEMP1.xy
448    dp3     TEMP0.x,            TEMP2,       nw_texture_matrix0[0]._XYZ
449    dp3     TEMP0.y,            TEMP2,       nw_texture_matrix0[1]._XYZ
450    mov     o5.xy,              TEMP0.xy
451
452    // �e�N�X�`�����W�̊��x�N�g��2
453    mov     TEMP2.xy,           TEMP1.zw
454    dp3     TEMP0.x,            TEMP2,       nw_texture_matrix0[0]._XYZ
455    dp3     TEMP0.y,            TEMP2,       nw_texture_matrix0[1]._XYZ
456    mov     o5.zw,              TEMP0.xxxy
457
458    // �|���S���̊��x�N�g��1
459    add     TEMP0.xyz,      xvector.xyz,     yvector.xyz
460    dp3     o6.x,           TEMP0,           nw_projection_matrix[0]._XYZ
461    dp3     o6.y,           TEMP0,           nw_projection_matrix[1]._XYZ
462    dp3     o6.z,           TEMP0,           nw_projection_matrix[2]._XYZ
463    dp3     o6.w,           TEMP0,           nw_projection_matrix[3]._XYZ
464
465    // �|���S���̊��x�N�g��2
466    add     TEMP0.xyz,      xvector.xyz,    -yvector.xyz
467    dp3     o7.x,           TEMP0,          nw_projection_matrix[0]._XYZ
468    dp3     o7.y,           TEMP0,          nw_projection_matrix[1]._XYZ
469    dp3     o7.z,           TEMP0,          nw_projection_matrix[2]._XYZ
470    dp3     o7.w,           TEMP0,          nw_projection_matrix[3]._XYZ
471
472    end
473endmain:
474