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