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