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