1// ---------------------------------------------------------------------------
2//  Project:  NintendoWare
3//  File:     TransformMatrix.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
18#include "ShaderConfig.h"
19#include "VertexShader.h"
20
21//-----------------------------------------------------------------------------
22// @brief        �����p�F�ϊ����ʂɃE�F�C�g���|���e���_�����ɉ��Z���܂��B
23//-----------------------------------------------------------------------------
24l_internal_blend_vertex_p:
25    mova    a0.x,               TEMP1.x
26
27    dp4     TEMP3.x,    TEMP_POSI,  nw_matrix_pallet[0 + a0.x]._XYZW
28    dp4     TEMP3.y,    TEMP_POSI,  nw_matrix_pallet[1 + a0.x]._XYZW
29    dp4     TEMP3.z,    TEMP_POSI,  nw_matrix_pallet[2 + a0.x]._XYZW
30
31    mad     MODL_POSI,  TEMP1.w,    TEMP3,  MODL_POSI
32    ret
33
34//-----------------------------------------------------------------------------
35// @brief        �����p�F�ϊ����ʂɃE�F�C�g���|���e���_�����ɉ��Z���܂��B
36//-----------------------------------------------------------------------------
37l_internal_blend_vertex_pn:
38    mova    a0.x,               TEMP1.x
39
40    dp4     TEMP3.x,    TEMP_POSI,  nw_matrix_pallet[0 + a0.x]._XYZW
41    dp4     TEMP3.y,    TEMP_POSI,  nw_matrix_pallet[1 + a0.x]._XYZW
42    dp4     TEMP3.z,    TEMP_POSI,  nw_matrix_pallet[2 + a0.x]._XYZW
43
44    dp3     TEMP4.x,    TEMP_NORM,  nw_matrix_pallet[0 + a0.x]._XYZW
45    dp3     TEMP4.y,    TEMP_NORM,  nw_matrix_pallet[1 + a0.x]._XYZW
46    dp3     TEMP4.z,    TEMP_NORM,  nw_matrix_pallet[2 + a0.x]._XYZW
47
48    mad     MODL_POSI,  TEMP1.w,    TEMP3,  MODL_POSI
49    mad     WRLD_NORM,  TEMP1.w,    TEMP4,  WRLD_NORM
50    ret
51
52//-----------------------------------------------------------------------------
53// @brief        �����p�F�ϊ����ʂɃE�F�C�g���|���e���_�����ɉ��Z���܂��B
54//-----------------------------------------------------------------------------
55l_internal_blend_vertex_pnt:
56    mova    a0.x,               TEMP1.x
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.x]._XYZW
63    dp3     TEMP4.y,    TEMP_NORM,  nw_matrix_pallet[1 + a0.x]._XYZW
64    dp3     TEMP4.z,    TEMP_NORM,  nw_matrix_pallet[2 + a0.x]._XYZW
65
66    dp3     TEMP5.x,    TEMP_TANG,  nw_matrix_pallet[0 + a0.x]._XYZW
67    dp3     TEMP5.y,    TEMP_TANG,  nw_matrix_pallet[1 + a0.x]._XYZW
68    dp3     TEMP5.z,    TEMP_TANG,  nw_matrix_pallet[2 + a0.x]._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
89        // ���C�e���V�[�̊֌W�� ifc �Ƃ̊Ԃɑ��̎������܂��B
90        mov     MODL_POSI,  CONST_0
91        mov     WRLD_NORM,  CONST_0
92        mov     WRLD_TANG,  CONST_0
93        mul     TEMP2,              nw_boneIndex,       CONST_3
94
95        ifc 1, 0, COND_MODE_AND // �@��������ꍇ
96            // bone0
97            cmp     NEQ, NEQ,   nw_boneWeight.zw, CONST_0
98            mov     TEMP1.xy,           TEMP2.x
99            mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
100            call    l_internal_blend_vertex_pn
101            // bone1
102            mov     TEMP1.xy,           TEMP2.y
103            mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
104            call    l_internal_blend_vertex_pn
105            // bone2
106            mov     TEMP1.xy,           TEMP2.z
107            mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
108            callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pn
109            // bone3
110            ifb nw_is_bone_weight_enable
111                mov     TEMP1.xy,           TEMP2.w
112                mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
113                callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pn
114                nop
115            endif
116
117            mov     MODL_POSI.w,        CONST_1
118            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
119            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
120            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
121            mov     WRLD_POSI.w,        CONST_1
122            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
123            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
124            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
125            mov     TEMP_VIEW.w,        CONST_1
126            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
127            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
128            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
129            call    l_internal_calc_quaternion_from_normal
130            nop
131        else
132            ifc 1, 1, COND_MODE_AND // �@���ƃ^���W�F���g������ꍇ
133                // bone0
134                cmp     NEQ, NEQ,   nw_boneWeight.zw, CONST_0
135                mov     TEMP1.xy,           TEMP2.x
136                mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
137                call    l_internal_blend_vertex_pnt
138                // bone1
139                mov     TEMP1.xy,           TEMP2.y
140                mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
141                call    l_internal_blend_vertex_pnt
142                // bone2
143                mov     TEMP1.xy,           TEMP2.z
144                mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
145                callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pnt
146                // bone3
147                ifb nw_is_bone_weight_enable
148                    mov     TEMP1.xy,           TEMP2.w
149                    mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
150                    callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pnt
151                    nop
152                endif
153
154                mov     MODL_POSI.w,        CONST_1
155                dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
156                dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
157                dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
158                mov     WRLD_POSI.w,        CONST_1
159                dp3     TEMP_TANG.x,        WRLD_TANG,      nw_normal_matrix[0]._XYZW
160                dp3     TEMP_TANG.y,        WRLD_TANG,      nw_normal_matrix[1]._XYZW
161                dp3     TEMP_TANG.z,        WRLD_TANG,      nw_normal_matrix[2]._XYZW
162                dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
163                dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
164                dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
165                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
166                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
167                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
168                mov     TEMP_VIEW.w,        CONST_1
169                call    l_internal_calc_quaternion_from_tangent
170                nop
171            else // ���_�݂̂̏ꍇ
172                // bone0
173                cmp     NEQ, NEQ,   nw_boneWeight.zw, CONST_0
174                mov     TEMP1.xy,           TEMP2.x
175                mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
176                call    l_internal_blend_vertex_p
177                // bone1
178                mov     TEMP1.xy,           TEMP2.y
179                mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
180                call    l_internal_blend_vertex_p
181                // bone2
182                mov     TEMP1.xy,           TEMP2.z
183                mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
184                callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_p
185                // bone3
186                ifb nw_is_bone_weight_enable
187                    mov     TEMP1.xy,           TEMP2.w
188                    mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
189                    callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_p
190                    nop
191                endif
192
193                mov     MODL_POSI.w,        CONST_1
194                dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
195                dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
196                dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
197                mov     WRLD_POSI.w,        CONST_1
198                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
199                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
200                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
201                mov     TEMP_VIEW.w,        CONST_1
202                mov     o_Quaternion.xyzw,  CONST_0
203            endif
204            nop
205        endif
206        mov     o_View,             -TEMP_VIEW
207        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
208    else // ���W�b�h�X�L�j���O�ƒP��m�[�h�̏ꍇ
209        // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B
210        mov     TEMP0,      nw_attribute_scale0._XYZW
211        cmp     NEQ, NEQ,   TEMP0.yz, CONST_0
212        ifb nw_is_rigid_skin
213            mul     TEMP1.x,            nw_boneIndex.x, CONST_3
214            mova    a0.x,               TEMP1.x
215            dp4     MODL_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0 + a0.x]._XYZW
216            dp4     MODL_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1 + a0.x]._XYZW
217            dp4     MODL_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2 + a0.x]._XYZW
218            mov     MODL_POSI.w,        CONST_1
219            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
220            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
221            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
222            mov     WRLD_POSI.w,        CONST_1
223        else
224            // nw_local_to_world_matrix �͒P�ʃ}�g���N�X�Ȃ̂�0��������B
225            mova    a0.x,               CONST_0
226#ifdef NW_GFX_MODEL_TRANSLATE_OFFSET_ENABLED
227            dp4     MODL_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0]._XYZW
228            dp4     MODL_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1]._XYZW
229            dp4     MODL_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2]._XYZW
230            mov     MODL_POSI.w,        CONST_1
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            dp4     WRLD_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0]._XYZW
237            dp4     WRLD_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1]._XYZW
238            dp4     WRLD_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2]._XYZW
239            mov     WRLD_POSI.w,        CONST_1
240#endif
241        endif
242
243        ifc 1, 0, COND_MODE_AND
244            // �@��������ꍇ�ł��B
245            dp3     WRLD_NORM.x,        TEMP_NORM,      nw_matrix_pallet[0 + a0.x]._XYZW
246            dp3     WRLD_NORM.y,        TEMP_NORM,      nw_matrix_pallet[1 + a0.x]._XYZW
247            dp3     WRLD_NORM.z,        TEMP_NORM,      nw_matrix_pallet[2 + a0.x]._XYZW
248            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
249            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
250            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
251            mov     TEMP_VIEW.w,        CONST_1
252            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
253            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
254            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
255            call    l_internal_calc_quaternion_from_normal
256            nop
257        else
258            ifc 1, 1, COND_MODE_AND
259                // �@���ƃ^���W�F���g������ꍇ�ł��B
260                dp3     WRLD_NORM.x,        TEMP_NORM,      nw_matrix_pallet[0 + a0.x]._XYZW
261                dp3     WRLD_NORM.y,        TEMP_NORM,      nw_matrix_pallet[1 + a0.x]._XYZW
262                dp3     WRLD_NORM.z,        TEMP_NORM,      nw_matrix_pallet[2 + a0.x]._XYZW
263                dp3     WRLD_TANG.x,        TEMP_TANG,      nw_matrix_pallet[0 + a0.x]._XYZW
264                dp3     WRLD_TANG.y,        TEMP_TANG,      nw_matrix_pallet[1 + a0.x]._XYZW
265                dp3     WRLD_TANG.z,        TEMP_TANG,      nw_matrix_pallet[2 + a0.x]._XYZW
266                dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
267                dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
268                dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
269                mov     TEMP_VIEW.w,        CONST_1
270                dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
271                dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
272                dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
273                dp3     TEMP_TANG.x,        WRLD_TANG,      nw_normal_matrix[0]._XYZW
274                dp3     TEMP_TANG.y,        WRLD_TANG,      nw_normal_matrix[1]._XYZW
275                dp3     TEMP_TANG.z,        WRLD_TANG,      nw_normal_matrix[2]._XYZW
276                call    l_internal_calc_quaternion_from_tangent
277                nop
278            else
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                mov     o_Quaternion.xyzw,  CONST_0
284            endif
285            nop
286        endif
287        mov     o_View,             -TEMP_VIEW
288        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
289    endif
290    nop
291    ret
292