1// ---------------------------------------------------------------------------
2//  Project:  NintendoWare
3//  File:     TransformMatrix.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.xy,           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.xy,           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.xy,           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.xy,           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            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
117            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
118            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
119            mov     WRLD_POSI.w,        CONST_1
120            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
121            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
122            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
123            mov     TEMP_VIEW.w,        CONST_1
124            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
125            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
126            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
127            call    l_internal_calc_quaternion_from_normal
128            nop
129        else
130            ifc 1, 1, COND_MODE_AND // �@���ƃ^���W�F���g������ꍇ
131                // bone0
132                cmp     NEQ, NEQ,   nw_boneWeight.zw, CONST_0
133                mov     TEMP1.xy,           TEMP2.x
134                mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
135                call    l_internal_blend_vertex_pnt
136                // bone1
137                mov     TEMP1.xy,           TEMP2.y
138                mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
139                call    l_internal_blend_vertex_pnt
140                // bone2
141                mov     TEMP1.xy,           TEMP2.z
142                mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
143                callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pnt
144                // bone3
145                ifb nw_is_bone_weight_enable
146                    mov     TEMP1.xy,           TEMP2.w
147                    mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
148                    callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pnt
149                    nop
150                endif
151
152                mov     MODL_POSI.w,        CONST_1
153                dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
154                dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
155                dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
156                mov     WRLD_POSI.w,        CONST_1
157                dp3     TEMP_TANG.x,        WRLD_TANG,      nw_normal_matrix[0]._XYZW
158                dp3     TEMP_TANG.y,        WRLD_TANG,      nw_normal_matrix[1]._XYZW
159                dp3     TEMP_TANG.z,        WRLD_TANG,      nw_normal_matrix[2]._XYZW
160                dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
161                dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
162                dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
163                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
164                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
165                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
166                mov     TEMP_VIEW.w,        CONST_1
167                call    l_internal_calc_quaternion_from_tangent
168                nop
169            else // ���_�݂̂̏ꍇ
170                // bone0
171                cmp     NEQ, NEQ,   nw_boneWeight.zw, CONST_0
172                mov     TEMP1.xy,           TEMP2.x
173                mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
174                call    l_internal_blend_vertex_p
175                // bone1
176                mov     TEMP1.xy,           TEMP2.y
177                mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
178                call    l_internal_blend_vertex_p
179                // bone2
180                mov     TEMP1.xy,           TEMP2.z
181                mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
182                callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_p
183                // bone3
184                ifb nw_is_bone_weight_enable
185                    mov     TEMP1.xy,           TEMP2.w
186                    mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
187                    callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_p
188                    nop
189                endif
190
191                mov     MODL_POSI.w,        CONST_1
192                dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
193                dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
194                dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
195                mov     WRLD_POSI.w,        CONST_1
196                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
197                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
198                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
199                mov     TEMP_VIEW.w,        CONST_1
200                mov     o_Quaternion.xyzw,  CONST_0
201            endif
202            nop
203        endif
204        mov     o_View,             -TEMP_VIEW
205        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
206    else // ���W�b�h�X�L�j���O�ƒP��m�[�h�̏ꍇ
207        // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B
208        mov     TEMP0,      nw_attribute_scale0._XYZW
209        cmp     NEQ, NEQ,   TEMP0.yz, CONST_0
210        ifb nw_is_rigid_skin
211            mul     TEMP1.x,            nw_boneIndex.x, CONST_3
212            mova    a0.x,               TEMP1.x
213            dp4     MODL_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0 + a0.x]._XYZW
214            dp4     MODL_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1 + a0.x]._XYZW
215            dp4     MODL_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2 + a0.x]._XYZW
216            mov     MODL_POSI.w,        CONST_1
217            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
218            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
219            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
220            mov     WRLD_POSI.w,        CONST_1
221        else
222            // nw_local_to_world_matrix �͒P�ʃ}�g���N�X�Ȃ̂�0��������B
223            mova    a0.x,               CONST_0
224#ifdef NW_GFX_MODEL_TRANSLATE_OFFSET_ENABLED
225            dp4     MODL_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0]._XYZW
226            dp4     MODL_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1]._XYZW
227            dp4     MODL_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2]._XYZW
228            mov     MODL_POSI.w,        CONST_1
229            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
230            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
231            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
232            mov     WRLD_POSI.w,        CONST_1
233#else
234            dp4     WRLD_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0]._XYZW
235            dp4     WRLD_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1]._XYZW
236            dp4     WRLD_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2]._XYZW
237            mov     WRLD_POSI.w,        CONST_1
238#endif
239        endif
240
241        ifc 1, 0, COND_MODE_AND
242            // �@��������ꍇ�ł��B
243            dp3     WRLD_NORM.x,        TEMP_NORM,      nw_matrix_pallet[0 + a0.x]._XYZW
244            dp3     WRLD_NORM.y,        TEMP_NORM,      nw_matrix_pallet[1 + a0.x]._XYZW
245            dp3     WRLD_NORM.z,        TEMP_NORM,      nw_matrix_pallet[2 + a0.x]._XYZW
246            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
247            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
248            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
249            mov     TEMP_VIEW.w,        CONST_1
250            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
251            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
252            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
253            call    l_internal_calc_quaternion_from_normal
254            nop
255        else
256            ifc 1, 1, COND_MODE_AND
257                // �@���ƃ^���W�F���g������ꍇ�ł��B
258                dp3     WRLD_NORM.x,        TEMP_NORM,      nw_matrix_pallet[0 + a0.x]._XYZW
259                dp3     WRLD_NORM.y,        TEMP_NORM,      nw_matrix_pallet[1 + a0.x]._XYZW
260                dp3     WRLD_NORM.z,        TEMP_NORM,      nw_matrix_pallet[2 + a0.x]._XYZW
261                dp3     WRLD_TANG.x,        TEMP_TANG,      nw_matrix_pallet[0 + a0.x]._XYZW
262                dp3     WRLD_TANG.y,        TEMP_TANG,      nw_matrix_pallet[1 + a0.x]._XYZW
263                dp3     WRLD_TANG.z,        TEMP_TANG,      nw_matrix_pallet[2 + a0.x]._XYZW
264                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
265                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
266                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
267                mov     TEMP_VIEW.w,        CONST_1
268                dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
269                dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
270                dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
271                dp3     TEMP_TANG.x,        WRLD_TANG,      nw_normal_matrix[0]._XYZW
272                dp3     TEMP_TANG.y,        WRLD_TANG,      nw_normal_matrix[1]._XYZW
273                dp3     TEMP_TANG.z,        WRLD_TANG,      nw_normal_matrix[2]._XYZW
274                call    l_internal_calc_quaternion_from_tangent
275                nop
276            else
277                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
278                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
279                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
280                mov     TEMP_VIEW.w,        CONST_1
281                mov     o_Quaternion.xyzw,  CONST_0
282            endif
283            nop
284        endif
285        mov     o_View,             -TEMP_VIEW
286        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
287    endif
288    nop
289    ret
290