1// ---------------------------------------------------------------------------
2//  Project:  NintendoWare
3//  File:     UserTransformMatrix.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#include "ShaderConfig.h"
17#include "VertexShader.h"
18
19//-----------------------------------------------------------------------------
20// @brief        �����p�F�ϊ����ʂɃE�F�C�g���|���e���_�����ɉ��Z���܂��B
21//-----------------------------------------------------------------------------
22l_internal_blend_vertex_p:
23    mova    a0.x,               TEMP1.x
24
25    dp4     TEMP3.x,    TEMP_POSI,  nw_matrix_pallet[0 + a0.x]._XYZW
26    dp4     TEMP3.y,    TEMP_POSI,  nw_matrix_pallet[1 + a0.x]._XYZW
27    dp4     TEMP3.z,    TEMP_POSI,  nw_matrix_pallet[2 + a0.x]._XYZW
28
29    mad     MODL_POSI,  TEMP1.w,    TEMP3,  MODL_POSI
30    ret
31
32//-----------------------------------------------------------------------------
33// @brief        �����p�F�ϊ����ʂɃE�F�C�g���|���e���_�����ɉ��Z���܂��B
34//-----------------------------------------------------------------------------
35l_internal_blend_vertex_pn:
36    add     TEMP1.y,            TEMP1.y,        TEMP2.y
37    mova    a0.xy,              TEMP1.xy
38
39    dp4     TEMP3.x,    TEMP_POSI,  nw_matrix_pallet[0 + a0.x]._XYZW
40    dp4     TEMP3.y,    TEMP_POSI,  nw_matrix_pallet[1 + a0.x]._XYZW
41    dp4     TEMP3.z,    TEMP_POSI,  nw_matrix_pallet[2 + a0.x]._XYZW
42
43    dp3     TEMP4.x,    TEMP_NORM,  nw_matrix_pallet[0 + a0.y]._XYZW
44    dp3     TEMP4.y,    TEMP_NORM,  nw_matrix_pallet[1 + a0.y]._XYZW
45    dp3     TEMP4.z,    TEMP_NORM,  nw_matrix_pallet[2 + a0.y]._XYZW
46
47    mad     MODL_POSI,  TEMP1.w,    TEMP3,  MODL_POSI
48    mad     WRLD_NORM,  TEMP1.w,    TEMP4,  WRLD_NORM
49    ret
50
51//-----------------------------------------------------------------------------
52// @brief        �����p�F�ϊ����ʂɃE�F�C�g���|���e���_�����ɉ��Z���܂��B
53//-----------------------------------------------------------------------------
54l_internal_blend_vertex_pnt:
55    add     TEMP1.y,            TEMP1.y,        TEMP2.y
56    mova    a0.xy,              TEMP1.xy
57
58    dp4     TEMP3.x,    TEMP_POSI,  nw_matrix_pallet[0 + a0.x]._XYZW
59    dp4     TEMP3.y,    TEMP_POSI,  nw_matrix_pallet[1 + a0.x]._XYZW
60    dp4     TEMP3.z,    TEMP_POSI,  nw_matrix_pallet[2 + a0.x]._XYZW
61
62    dp3     TEMP4.x,    TEMP_NORM,  nw_matrix_pallet[0 + a0.y]._XYZW
63    dp3     TEMP4.y,    TEMP_NORM,  nw_matrix_pallet[1 + a0.y]._XYZW
64    dp3     TEMP4.z,    TEMP_NORM,  nw_matrix_pallet[2 + a0.y]._XYZW
65
66    dp3     TEMP5.x,    TEMP_TANG,  nw_matrix_pallet[0 + a0.y]._XYZW
67    dp3     TEMP5.y,    TEMP_TANG,  nw_matrix_pallet[1 + a0.y]._XYZW
68    dp3     TEMP5.z,    TEMP_TANG,  nw_matrix_pallet[2 + a0.y]._XYZW
69
70    mad     MODL_POSI,  TEMP1.w,    TEMP3,  MODL_POSI
71    mad     WRLD_NORM,  TEMP1.w,    TEMP4,  WRLD_NORM
72    mad     WRLD_TANG,  TEMP1.w,    TEMP5,  WRLD_TANG
73    ret
74
75//------------------------------------------
76// ���_���W
77//------------------------------------------
78l_transform_matrix:
79    mul     TEMP_POSI.xyz,  nw_position,    nw_attribute_scale0._X
80    mul     TEMP_NORM.xyz,  nw_normal,      nw_attribute_scale0._Y
81    mul     TEMP_TANG.xyz,  nw_tangent,     nw_attribute_scale0._Z
82    add     TEMP_POSI.xyz,  TEMP_POSI,      nw_position_offset._XYZW
83    mov     TEMP_POSI.w,    CONST_1
84    ifb nw_is_smooth_skin // �X���[�X�X�L�j���O�̏ꍇ
85        // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B
86        mov     TEMP0,      nw_attribute_scale0._XYZW
87        cmp     NEQ, NEQ,   TEMP0.yz, CONST_0
88        // ���C�e���V�[�̊֌W�� ifc �Ƃ̊Ԃɑ��̎������܂��B
89
90        mov     MODL_POSI,  CONST_0
91        mov     WRLD_NORM,  CONST_0
92        mov     WRLD_TANG,  CONST_0
93
94        mov     TEMP2.x,    nw_attribute_scale2._X
95        ifb nw_is_use_normal_matrix
96            // �m�[�}���}�g���N�X������ꍇ�́A�}�g���N�X���I�t�Z�b�g�l�����Ă��܂��B
97            mov     TEMP2.y,    nw_attribute_scale2._Z
98        else
99            mov     TEMP2.y,    CONST_0
100        endif
101        mul     TEMP2.xy,   TEMP2.xy,   CONST_3
102
103        ifc 1, 0, COND_MODE_AND
104            // �@��������ꍇ�ł��B
105            // bone0
106            cmp     NEQ, NEQ,   nw_boneWeight.zw, CONST_0
107            mul     TEMP1.xy,           nw_boneIndex.x,     TEMP2.x
108            mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
109            call    l_internal_blend_vertex_pn
110            // bone1
111            mul     TEMP1.xy,           nw_boneIndex.y,     TEMP2.x
112            mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
113            call    l_internal_blend_vertex_pn
114            // bone2
115            mul     TEMP1.xy,           nw_boneIndex.z,     TEMP2.x
116            mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
117            callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pn
118            // bone3
119            ifb nw_is_bone_weight_enable
120                mul     TEMP1.xy,           nw_boneIndex.w,     TEMP2.x
121                mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
122                callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pn
123                nop
124            endif
125
126            mov     MODL_POSI.w,        CONST_1
127            /////////////////////////////////////////////////////////////////////
128            // ���_��@�������ֈ����L�΂��悤�Ɉړ����܂��B                    //
129            // �w�肵���X�P�[���l��@���x�N�g���Ɋ|���A���_�ʒu�ɑ����Ă��܂��B//
130            /////////////////////////////////////////////////////////////////////
131            mul     TEMP3.xyz,          TEMP_NORM.xyz,  extension_deform
132            add     MODL_POSI.xyz,      MODL_POSI.xyz,  TEMP3.xyz
133
134            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
135            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
136            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
137            mov     WRLD_POSI.w,        CONST_1
138            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
139            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
140            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
141            mov     TEMP_VIEW.w,        CONST_1
142            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
143            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
144            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
145            call    l_internal_calc_quaternion_from_normal
146            nop
147        else
148            ifc 1, 1, COND_MODE_AND
149                // �@���ƃ^���W�F���g������ꍇ�ł��B
150                // bone0
151                cmp     NEQ, NEQ,   nw_boneWeight.zw, CONST_0
152                mul     TEMP1.xy,           nw_boneIndex.x,     TEMP2.x
153                mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
154                call    l_internal_blend_vertex_pnt
155                // bone1
156                mul     TEMP1.xy,           nw_boneIndex.y,     TEMP2.x
157                mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
158                call    l_internal_blend_vertex_pnt
159                // bone2
160                mul     TEMP1.xy,           nw_boneIndex.z,     TEMP2.x
161                mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
162                callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pnt
163                // bone3
164                ifb nw_is_bone_weight_enable
165                    mul     TEMP1.xy,           nw_boneIndex.w,     TEMP2.x
166                    mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
167                    callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pnt
168                    nop
169                endif
170
171                mov     MODL_POSI.w,        CONST_1
172                dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
173                dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
174                dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
175                mov     WRLD_POSI.w,        CONST_1
176                dp3     TEMP_TANG.x,        WRLD_TANG,      nw_normal_matrix[0]._XYZW
177                dp3     TEMP_TANG.y,        WRLD_TANG,      nw_normal_matrix[1]._XYZW
178                dp3     TEMP_TANG.z,        WRLD_TANG,      nw_normal_matrix[2]._XYZW
179                dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
180                dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
181                dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
182                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
183                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
184                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
185                mov     TEMP_VIEW.w,        CONST_1
186                call    l_internal_calc_quaternion_from_tangent
187                nop
188            else
189                // bone0
190                cmp     NEQ, NEQ,   nw_boneWeight.zw, CONST_0
191                mul     TEMP1.xy,           nw_boneIndex.x,     TEMP2.x
192                mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
193                call    l_internal_blend_vertex_p
194                // bone1
195                mul     TEMP1.xy,           nw_boneIndex.y,     TEMP2.x
196                mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
197                call    l_internal_blend_vertex_p
198                // bone2
199                mul     TEMP1.xy,           nw_boneIndex.z,     TEMP2.x
200                mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
201                callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_p
202                // bone3
203                ifb nw_is_bone_weight_enable
204                    mul     TEMP1.xy,           nw_boneIndex.w,     TEMP2.x
205                    mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
206                    callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_p
207                    nop
208                endif
209
210                mov     MODL_POSI.w,        CONST_1
211                dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
212                dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
213                dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
214                mov     WRLD_POSI.w,        CONST_1
215                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
216                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
217                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
218                mov     TEMP_VIEW.w,        CONST_1
219                mov     o_Quaternion.xyzw,  CONST_0
220            endif
221            nop
222        endif
223        mov     o_View,             -TEMP_VIEW
224        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
225    else // ���W�b�h�X�L�j���O�ƒP��m�[�h�̏ꍇ
226        // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B
227        mov     TEMP0,      nw_attribute_scale0._XYZW
228        cmp     NEQ, NEQ,   TEMP0.yz, CONST_0
229        // ���C�e���V�[�̊֌W�� ifc �Ƃ̊Ԃɑ��̎������܂��B
230
231        ifb nw_is_rigid_skin
232            mul     TEMP1.xy,           nw_boneIndex.x, nw_attribute_scale2._X
233            ifb nw_is_use_normal_matrix
234                // �m�[�}���}�g���N�X������ꍇ�́A�}�g���N�X���I�t�Z�b�g�l�����Ă��܂��B
235                add     TEMP1.y,            TEMP1.y,        nw_attribute_scale2._Z
236            endif
237            mul     TEMP1.xy,           TEMP1.xy,       CONST_3
238            mova    a0.xy,              TEMP1.xy
239            dp4     MODL_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0 + a0.x]._XYZW
240            dp4     MODL_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1 + a0.x]._XYZW
241            dp4     MODL_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2 + a0.x]._XYZW
242            mov     MODL_POSI.w,        CONST_1
243            /////////////////////////////////////////////////////////////////////
244            // ���_��@�������ֈ����L�΂��悤�Ɉړ����܂��B                    //
245            // �w�肵���X�P�[���l��@���x�N�g���Ɋ|���A���_�ʒu�ɑ����Ă��܂��B//
246            /////////////////////////////////////////////////////////////////////
247            mul     TEMP2.xyz,          TEMP_NORM.xyz,  extension_deform
248            add     MODL_POSI.xyz,      MODL_POSI.xyz,  TEMP2.xyz
249
250            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
251            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
252            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
253            mov     WRLD_POSI.w,        CONST_1
254        else
255            // nw_local_to_world_matrix ���m�[�}���}�g���N�X�͒P�ʃ}�g���N�X�Ȃ̂�0��������B
256            mova    a0.xy,              CONST_0
257#ifdef NW_GFX_MODEL_TRANSLATE_OFFSET_ENABLED
258            dp4     MODL_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0]._XYZW
259            dp4     MODL_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1]._XYZW
260            dp4     MODL_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2]._XYZW
261            mov     MODL_POSI.w,        CONST_1
262            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
263            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
264            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
265            mov     WRLD_POSI.w,        CONST_1
266#else
267            dp4     WRLD_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0]._XYZW
268            dp4     WRLD_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1]._XYZW
269            dp4     WRLD_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2]._XYZW
270            mov     WRLD_POSI.w,        CONST_1
271#endif
272        endif
273
274        ifc 1, 0, COND_MODE_AND
275            // �@��������ꍇ�ł��B
276            dp3     WRLD_NORM.x,        TEMP_NORM,      nw_matrix_pallet[0 + a0.y]._XYZW
277            dp3     WRLD_NORM.y,        TEMP_NORM,      nw_matrix_pallet[1 + a0.y]._XYZW
278            dp3     WRLD_NORM.z,        TEMP_NORM,      nw_matrix_pallet[2 + a0.y]._XYZW
279            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
280            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
281            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
282            mov     TEMP_VIEW.w,        CONST_1
283            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
284            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
285            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
286            call    l_internal_calc_quaternion_from_normal
287            nop
288        else
289            ifc 1, 1, COND_MODE_AND
290                // �@���ƃ^���W�F���g������ꍇ�ł��B
291                dp3     WRLD_NORM.x,        TEMP_NORM,      nw_matrix_pallet[0 + a0.y]._XYZW
292                dp3     WRLD_NORM.y,        TEMP_NORM,      nw_matrix_pallet[1 + a0.y]._XYZW
293                dp3     WRLD_NORM.z,        TEMP_NORM,      nw_matrix_pallet[2 + a0.y]._XYZW
294                dp3     WRLD_TANG.x,        TEMP_TANG,      nw_matrix_pallet[0 + a0.y]._XYZW
295                dp3     WRLD_TANG.y,        TEMP_TANG,      nw_matrix_pallet[1 + a0.y]._XYZW
296                dp3     WRLD_TANG.z,        TEMP_TANG,      nw_matrix_pallet[2 + a0.y]._XYZW
297                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
298                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
299                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
300                mov     TEMP_VIEW.w,        CONST_1
301                dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
302                dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
303                dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
304                dp3     TEMP_TANG.x,        WRLD_TANG,      nw_normal_matrix[0]._XYZW
305                dp3     TEMP_TANG.y,        WRLD_TANG,      nw_normal_matrix[1]._XYZW
306                dp3     TEMP_TANG.z,        WRLD_TANG,      nw_normal_matrix[2]._XYZW
307                call    l_internal_calc_quaternion_from_tangent
308                nop
309            else
310                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
311                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
312                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
313                mov     TEMP_VIEW.w,        CONST_1
314                mov     o_Quaternion.xyzw,  CONST_0
315            endif
316            nop
317        endif
318        mov     o_View,             -TEMP_VIEW
319        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
320    endif
321    nop
322    ret
323