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