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