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