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#define o_Normal                      o2
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    add     TEMP1.y,            TEMP1.y,        TEMP2.y
39    mova    a0.xy,              TEMP1.xy
40
41    dp4     TEMP3.x,    TEMP_POSI,  nw_matrix_pallet[0 + a0.x]._XYZW
42    dp4     TEMP3.y,    TEMP_POSI,  nw_matrix_pallet[1 + a0.x]._XYZW
43    dp4     TEMP3.z,    TEMP_POSI,  nw_matrix_pallet[2 + a0.x]._XYZW
44
45    dp3     TEMP4.x,    TEMP_NORM,  nw_matrix_pallet[0 + a0.y]._XYZW
46    dp3     TEMP4.y,    TEMP_NORM,  nw_matrix_pallet[1 + a0.y]._XYZW
47    dp3     TEMP4.z,    TEMP_NORM,  nw_matrix_pallet[2 + a0.y]._XYZW
48
49    mad     MODL_POSI,  TEMP1.w,    TEMP3,  MODL_POSI
50    mad     WRLD_NORM,  TEMP1.w,    TEMP4,  WRLD_NORM
51    ret
52
53//------------------------------------------
54// ���_���W
55//------------------------------------------
56l_transform_matrix:
57    mul     TEMP_POSI.xyz,  nw_position,    nw_attribute_scale0._X
58    mul     TEMP_NORM.xyz,  nw_normal,      nw_attribute_scale0._Y
59    add     TEMP_POSI.xyz,  TEMP_POSI,      nw_position_offset._XYZW
60    mov     TEMP_POSI.w,    CONST_1
61    ifb nw_is_smooth_skin // �X���[�X�X�L�j���O�̏ꍇ
62        // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B
63        mov     TEMP0,      nw_attribute_scale0._XYZW
64        cmp     NEQ, NEQ,   TEMP0.yz, CONST_0
65        // ���C�e���V�[�̊֌W�� ifc �Ƃ̊Ԃɑ��̎������܂��B
66
67        mov     MODL_POSI,  CONST_0
68        mov     WRLD_NORM,  CONST_0
69
70        mov     TEMP2.x,    nw_attribute_scale2._X
71        ifb nw_is_use_normal_matrix
72            // �m�[�}���}�g���N�X������ꍇ�́A�}�g���N�X���I�t�Z�b�g�l�����Ă��܂��B
73            mov     TEMP2.y,    nw_attribute_scale2._Z
74        else
75            mov     TEMP2.y,    CONST_0
76        endif
77        mul     TEMP2.xy,   TEMP2.xy,   CONST_3
78
79        ifc 1, 0, COND_MODE_STA0
80            // �@��������ꍇ�ł��B
81            // bone0
82            mul     TEMP1.xy,           nw_boneIndex.x,     TEMP2.x
83            mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
84            call    l_internal_blend_vertex_pn
85            // bone1
86            mul     TEMP1.xy,           nw_boneIndex.y,     TEMP2.x
87            mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
88            call    l_internal_blend_vertex_pn
89            // bone2
90            mul     TEMP1.xy,           nw_boneIndex.z,     TEMP2.x
91            mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
92            call    l_internal_blend_vertex_pn
93            // bone3
94            ifb nw_is_bone_weight_enable
95                mul     TEMP1.xy,           nw_boneIndex.w,     TEMP2.x
96                mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
97                call    l_internal_blend_vertex_pn
98                nop
99            endif
100
101            mov     MODL_POSI.w,        CONST_1
102            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
103            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
104            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
105            mov     WRLD_POSI.w,        CONST_1
106            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
107            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
108            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
109            mov     TEMP_VIEW.w,        CONST_1
110            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
111            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
112            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
113            nop
114        else
115            // bone0
116            mul     TEMP1.xy,           nw_boneIndex.x,     TEMP2.x
117            mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
118            call    l_internal_blend_vertex_p
119            // bone1
120            mul     TEMP1.xy,           nw_boneIndex.y,     TEMP2.x
121            mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
122            call    l_internal_blend_vertex_p
123            // bone2
124            mul     TEMP1.xy,           nw_boneIndex.z,     TEMP2.x
125            mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
126            call    l_internal_blend_vertex_p
127            // bone3
128            ifb nw_is_bone_weight_enable
129            mul     TEMP1.xy,           nw_boneIndex.w,     TEMP2.x
130            mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
131            call    l_internal_blend_vertex_p
132            mov     TEMP_NORM,          CONST_0
133        endif
134
135	mov     MODL_POSI.w,        CONST_1
136	dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
137	dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
138	dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
139	mov     WRLD_POSI.w,        CONST_1
140	dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
141	dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
142	dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
143	mov     TEMP_VIEW.w,        CONST_1
144        endif
145        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
146        mov     o_Normal,           TEMP_NORM
147    else // ���W�b�h�X�L�j���O�ƒP��m�[�h�̏ꍇ
148        // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B
149        mov     TEMP0,      nw_attribute_scale0._XYZW
150        cmp     NEQ, NEQ,   TEMP0.yz, CONST_0
151        // ���C�e���V�[�̊֌W�� ifc �Ƃ̊Ԃɑ��̎������܂��B
152
153        ifb nw_is_rigid_skin
154            mul     TEMP1.xy,           nw_boneIndex.x, nw_attribute_scale2._X
155            ifb nw_is_use_normal_matrix
156                // �m�[�}���}�g���N�X������ꍇ�́A�}�g���N�X���I�t�Z�b�g�l�����Ă��܂��B
157                add     TEMP1.y,            TEMP1.y,        nw_attribute_scale2._Z
158            endif
159            mul     TEMP1.xy,           TEMP1.xy,       CONST_3
160            mova    a0.xy,              TEMP1.xy
161            dp4     MODL_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0 + a0.x]._XYZW
162            dp4     MODL_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1 + a0.x]._XYZW
163            dp4     MODL_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2 + a0.x]._XYZW
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        else
170            // nw_local_to_world_matrix ���m�[�}���}�g���N�X�͒P�ʃ}�g���N�X�Ȃ̂�0��������B
171            mova    a0.xy,              CONST_0
172            dp4     WRLD_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0]._XYZW
173            dp4     WRLD_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1]._XYZW
174            dp4     WRLD_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2]._XYZW
175            mov     WRLD_POSI.w,        CONST_1
176        endif
177        ifc 1, 0, COND_MODE_STA0
178            // �@��������ꍇ�ł��B
179            dp3     WRLD_NORM.x,        TEMP_NORM,      nw_matrix_pallet[0 + a0.y]._XYZW
180            dp3     WRLD_NORM.y,        TEMP_NORM,      nw_matrix_pallet[1 + a0.y]._XYZW
181            dp3     WRLD_NORM.z,        TEMP_NORM,      nw_matrix_pallet[2 + a0.y]._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            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
187            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
188            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
189            mov     TEMP_NORM.w,        CONST_1
190        else
191            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
192            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
193            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
194            mov     TEMP_VIEW.w,        CONST_1
195            mov     TEMP_NORM,          CONST_0
196        endif
197        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
198        mov     o_Normal,           TEMP_NORM
199    endif
200    nop
201    ret
202