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    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// ���_���W
54//------------------------------------------
55l_transform_matrix:
56    mul     TEMP_POSI.xyz,  nw_position,    nw_attribute_scale0._X
57    mul     TEMP_NORM.xyz,  nw_normal,      nw_attribute_scale0._Y
58    add     TEMP_POSI.xyz,  TEMP_POSI,      nw_position_offset._XYZW
59    mov     TEMP_POSI.w,    CONST_1
60    ifb nw_is_smooth_skin // �X���[�X�X�L�j���O�̏ꍇ
61        // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B
62        mov     TEMP0,      nw_attribute_scale0._XYZW
63        cmp     NEQ, NEQ,   TEMP0.yz, CONST_0
64        // ���C�e���V�[�̊֌W�� ifc �Ƃ̊Ԃɑ��̎������܂��B
65
66        mov     MODL_POSI,  CONST_0
67        mov     WRLD_NORM,  CONST_0
68        mul     TEMP2,                  nw_boneIndex,       CONST_3
69
70        ifc 1, 0, COND_MODE_STA0
71            // �@��������ꍇ�ł��B
72            // bone0
73            mov     TEMP1.xy,           TEMP2.x
74            mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
75            call    l_internal_blend_vertex_pn
76            // bone1
77            mov     TEMP1.xy,           TEMP2.y
78            mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
79            call    l_internal_blend_vertex_pn
80            // bone2
81            mov     TEMP1.xy,           TEMP2.z
82            mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
83            call    l_internal_blend_vertex_pn
84            // bone3
85            ifb nw_is_bone_weight_enable
86                mov     TEMP1.xy,           TEMP2.w
87                mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
88                call    l_internal_blend_vertex_pn
89                nop
90            endif
91
92            mov     MODL_POSI.w,        CONST_1
93            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
94            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
95            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
96            mov     WRLD_POSI.w,        CONST_1
97            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
98            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
99            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
100            mov     TEMP_VIEW.w,        CONST_1
101            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
102            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
103            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
104            nop
105        else
106            // bone0
107            mov     TEMP1.xy,           TEMP2.x
108            mul     TEMP1.w,            nw_boneWeight.x,    nw_attribute_scale1._W
109            call    l_internal_blend_vertex_p
110            // bone1
111            mov     TEMP1.xy,           TEMP2.y
112            mul     TEMP1.w,            nw_boneWeight.y,    nw_attribute_scale1._W
113            call    l_internal_blend_vertex_p
114            // bone2
115            mov     TEMP1.xy,           TEMP2.z
116            mul     TEMP1.w,            nw_boneWeight.z,    nw_attribute_scale1._W
117            call    l_internal_blend_vertex_p
118            // bone3
119            ifb nw_is_bone_weight_enable
120            mov     TEMP1.xy,           TEMP2.w
121            mul     TEMP1.w,            nw_boneWeight.w,    nw_attribute_scale1._W
122            call    l_internal_blend_vertex_p
123            mov     TEMP_NORM,          CONST_0
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        endif
136        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
137        mov     o_Normal,           TEMP_NORM
138    else // ���W�b�h�X�L�j���O�ƒP��m�[�h�̏ꍇ
139        // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B
140        mov     TEMP0,      nw_attribute_scale0._XYZW
141        cmp     NEQ, NEQ,   TEMP0.yz, CONST_0
142        ifb nw_is_rigid_skin
143            mul     TEMP1.x,            nw_boneIndex.x, CONST_3
144            mova    a0.x,               TEMP1.x
145            dp4     MODL_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0 + a0.x]._XYZW
146            dp4     MODL_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1 + a0.x]._XYZW
147            dp4     MODL_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2 + a0.x]._XYZW
148            mov     MODL_POSI.w,        CONST_1
149            dp4     WRLD_POSI.x,        MODL_POSI,      nw_local_to_world_matrix[0]._XYZW
150            dp4     WRLD_POSI.y,        MODL_POSI,      nw_local_to_world_matrix[1]._XYZW
151            dp4     WRLD_POSI.z,        MODL_POSI,      nw_local_to_world_matrix[2]._XYZW
152            mov     WRLD_POSI.w,        CONST_1
153        else
154            // nw_local_to_world_matrix �͒P�ʃ}�g���N�X�Ȃ̂�0��������B
155            mova    a0.x,               CONST_0
156            dp4     WRLD_POSI.x,        TEMP_POSI,      nw_matrix_pallet[0]._XYZW
157            dp4     WRLD_POSI.y,        TEMP_POSI,      nw_matrix_pallet[1]._XYZW
158            dp4     WRLD_POSI.z,        TEMP_POSI,      nw_matrix_pallet[2]._XYZW
159            mov     WRLD_POSI.w,        CONST_1
160        endif
161        ifc 1, 0, COND_MODE_STA0
162            // �@��������ꍇ�ł��B
163            dp3     WRLD_NORM.x,        TEMP_NORM,      nw_matrix_pallet[0 + a0.x]._XYZW
164            dp3     WRLD_NORM.y,        TEMP_NORM,      nw_matrix_pallet[1 + a0.x]._XYZW
165            dp3     WRLD_NORM.z,        TEMP_NORM,      nw_matrix_pallet[2 + a0.x]._XYZW
166            dp4     TEMP_VIEW.x,        WRLD_POSI,      nw_world_to_view_matrix[0]._XYZW
167            dp4     TEMP_VIEW.y,        WRLD_POSI,      nw_world_to_view_matrix[1]._XYZW
168            dp4     TEMP_VIEW.z,        WRLD_POSI,      nw_world_to_view_matrix[2]._XYZW
169            mov     TEMP_VIEW.w,        CONST_1
170            dp3     TEMP_NORM.x,        WRLD_NORM,      nw_normal_matrix[0]._XYZW
171            dp3     TEMP_NORM.y,        WRLD_NORM,      nw_normal_matrix[1]._XYZW
172            dp3     TEMP_NORM.z,        WRLD_NORM,      nw_normal_matrix[2]._XYZW
173            mov     TEMP_NORM.w,        CONST_1
174        else
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            mov     TEMP_NORM,          CONST_0
180        endif
181        m4x4    o_Position,         TEMP_VIEW,      nw_projection_matrix._XYZW
182        mov     o_Normal,           TEMP_NORM
183    endif
184    nop
185    ret
186