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 mova a0.x, TEMP1.x 37 38 dp4 TEMP3.x, TEMP_POSI, nw_matrix_pallet[0 + a0.x]._XYZW 39 dp4 TEMP3.y, TEMP_POSI, nw_matrix_pallet[1 + a0.x]._XYZW 40 dp4 TEMP3.z, TEMP_POSI, nw_matrix_pallet[2 + a0.x]._XYZW 41 42 dp3 TEMP4.x, TEMP_NORM, nw_matrix_pallet[0 + a0.x]._XYZW 43 dp3 TEMP4.y, TEMP_NORM, nw_matrix_pallet[1 + a0.x]._XYZW 44 dp3 TEMP4.z, TEMP_NORM, nw_matrix_pallet[2 + a0.x]._XYZW 45 46 mad MODL_POSI, TEMP1.w, TEMP3, MODL_POSI 47 mad WRLD_NORM, TEMP1.w, TEMP4, WRLD_NORM 48 ret 49 50//----------------------------------------------------------------------------- 51// @brief �����p�F�ϊ����ʂɃE�F�C�g���|���e���_�����ɉ��Z���܂��B 52//----------------------------------------------------------------------------- 53l_internal_blend_vertex_pnt: 54 mova a0.x, TEMP1.x 55 56 dp4 TEMP3.x, TEMP_POSI, nw_matrix_pallet[0 + a0.x]._XYZW 57 dp4 TEMP3.y, TEMP_POSI, nw_matrix_pallet[1 + a0.x]._XYZW 58 dp4 TEMP3.z, TEMP_POSI, nw_matrix_pallet[2 + a0.x]._XYZW 59 60 dp3 TEMP4.x, TEMP_NORM, nw_matrix_pallet[0 + a0.x]._XYZW 61 dp3 TEMP4.y, TEMP_NORM, nw_matrix_pallet[1 + a0.x]._XYZW 62 dp3 TEMP4.z, TEMP_NORM, nw_matrix_pallet[2 + a0.x]._XYZW 63 64 dp3 TEMP5.x, TEMP_TANG, nw_matrix_pallet[0 + a0.x]._XYZW 65 dp3 TEMP5.y, TEMP_TANG, nw_matrix_pallet[1 + a0.x]._XYZW 66 dp3 TEMP5.z, TEMP_TANG, nw_matrix_pallet[2 + a0.x]._XYZW 67 68 mad MODL_POSI, TEMP1.w, TEMP3, MODL_POSI 69 mad WRLD_NORM, TEMP1.w, TEMP4, WRLD_NORM 70 mad WRLD_TANG, TEMP1.w, TEMP5, WRLD_TANG 71 ret 72 73//------------------------------------------ 74// ���_���W 75//------------------------------------------ 76l_transform_matrix: 77 mul TEMP_POSI.xyz, nw_position, nw_attribute_scale0._X 78 mul TEMP_NORM.xyz, nw_normal, nw_attribute_scale0._Y 79 mul TEMP_TANG.xyz, nw_tangent, nw_attribute_scale0._Z 80 add TEMP_POSI.xyz, TEMP_POSI, nw_position_offset._XYZW 81 mov TEMP_POSI.w, CONST_1 82 ifb nw_is_smooth_skin // �X���[�X�X�L�j���O�̏ꍇ 83 // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B 84 mov TEMP0, nw_attribute_scale0._XYZW 85 cmp NEQ, NEQ, TEMP0.yz, CONST_0 86 87 // ���C�e���V�[�̊W�� ifc �Ƃ̊Ԃɑ��̎������܂��B 88 mov MODL_POSI, CONST_0 89 mov WRLD_NORM, CONST_0 90 mov WRLD_TANG, CONST_0 91 mul TEMP2, nw_boneIndex, CONST_3 92 93 ifc 1, 0, COND_MODE_AND // �@��������ꍇ 94 // bone0 95 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 96 mov TEMP1.x, TEMP2.x 97 mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W 98 call l_internal_blend_vertex_pn 99 // bone1 100 mov TEMP1.x, TEMP2.y 101 mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W 102 call l_internal_blend_vertex_pn 103 // bone2 104 mov TEMP1.x, TEMP2.z 105 mul TEMP1.w, nw_boneWeight.z, nw_attribute_scale1._W 106 callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pn 107 // bone3 108 ifb nw_is_bone_weight_enable 109 mov TEMP1.x, TEMP2.w 110 mul TEMP1.w, nw_boneWeight.w, nw_attribute_scale1._W 111 callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pn 112 nop 113 endif 114 115 mov MODL_POSI.w, CONST_1 116 ///////////////////////////////////////////////////////////////////// 117 // ���_��@�������ֈ����L���悤�Ɉړ����܂��B // 118 // �w�肵���X�P�[���l��@���x�N�g���Ɋ|���A���_�ʒu�ɑ����Ă��܂��B// 119 ///////////////////////////////////////////////////////////////////// 120 mul TEMP3.xyz, TEMP_NORM.xyz, extension_deform 121 add MODL_POSI.xyz, MODL_POSI.xyz, TEMP3.xyz 122 123 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 124 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 125 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 126 mov WRLD_POSI.w, CONST_1 127 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 128 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 129 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 130 mov TEMP_VIEW.w, CONST_1 131 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW 132 dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW 133 dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW 134 call l_internal_calc_quaternion_from_normal 135 nop 136 else 137 ifc 1, 1, COND_MODE_AND // �@���ƃ^���W�F���g������ꍇ 138 // bone0 139 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 140 mov TEMP1.xy, TEMP2.x 141 mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W 142 call l_internal_blend_vertex_pnt 143 // bone1 144 mov TEMP1.xy, TEMP2.y 145 mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W 146 call l_internal_blend_vertex_pnt 147 // bone2 148 mov TEMP1.xy, TEMP2.z 149 mul TEMP1.w, nw_boneWeight.z, nw_attribute_scale1._W 150 callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pnt 151 // bone3 152 ifb nw_is_bone_weight_enable 153 mov TEMP1.xy, TEMP2.w 154 mul TEMP1.w, nw_boneWeight.w, nw_attribute_scale1._W 155 callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pnt 156 nop 157 endif 158 159 mov MODL_POSI.w, CONST_1 160 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 161 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 162 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 163 mov WRLD_POSI.w, CONST_1 164 dp3 TEMP_TANG.x, WRLD_TANG, nw_normal_matrix[0]._XYZW 165 dp3 TEMP_TANG.y, WRLD_TANG, nw_normal_matrix[1]._XYZW 166 dp3 TEMP_TANG.z, WRLD_TANG, nw_normal_matrix[2]._XYZW 167 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW 168 dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW 169 dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW 170 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 171 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 172 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 173 mov TEMP_VIEW.w, CONST_1 174 call l_internal_calc_quaternion_from_tangent 175 nop 176 else // ���_�݂̂̏ꍇ 177 // bone0 178 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 179 mov TEMP1.x, TEMP2.x 180 mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W 181 call l_internal_blend_vertex_p 182 // bone1 183 mov TEMP1.x, TEMP2.y 184 mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W 185 call l_internal_blend_vertex_p 186 // bone2 187 mov TEMP1.x, TEMP2.z 188 mul TEMP1.w, nw_boneWeight.z, nw_attribute_scale1._W 189 callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_p 190 // bone3 191 ifb nw_is_bone_weight_enable 192 mov TEMP1.x, TEMP2.w 193 mul TEMP1.w, nw_boneWeight.w, nw_attribute_scale1._W 194 callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_p 195 nop 196 endif 197 198 mov MODL_POSI.w, CONST_1 199 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 200 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 201 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 202 mov WRLD_POSI.w, CONST_1 203 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 204 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 205 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 206 mov TEMP_VIEW.w, CONST_1 207 mov o_Quaternion.xyzw, CONST_0 208 endif 209 nop 210 endif 211 mov o_View, -TEMP_VIEW 212 m4x4 o_Position, TEMP_VIEW, nw_projection_matrix._XYZW 213 else // ���W�b�h�X�L�j���O�ƒP��m�[�h�̏ꍇ 214 // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B 215 mov TEMP0, nw_attribute_scale0._XYZW 216 cmp NEQ, NEQ, TEMP0.yz, CONST_0 217 ifb nw_is_rigid_skin 218 mul TEMP1.x, nw_boneIndex.x, CONST_3 219 mova a0.x, TEMP1.x 220 dp4 MODL_POSI.x, TEMP_POSI, nw_matrix_pallet[0 + a0.x]._XYZW 221 dp4 MODL_POSI.y, TEMP_POSI, nw_matrix_pallet[1 + a0.x]._XYZW 222 dp4 MODL_POSI.z, TEMP_POSI, nw_matrix_pallet[2 + a0.x]._XYZW 223 mov MODL_POSI.w, CONST_1 224 ///////////////////////////////////////////////////////////////////// 225 // ���_��@�������ֈ����L���悤�Ɉړ����܂��B // 226 // �w�肵���X�P�[���l��@���x�N�g���Ɋ|���A���_�ʒu�ɑ����Ă��܂��B// 227 ///////////////////////////////////////////////////////////////////// 228 mul TEMP2.xyz, TEMP_NORM.xyz, extension_deform 229 add MODL_POSI.xyz, MODL_POSI.xyz, TEMP2.xyz 230 231 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 232 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 233 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 234 mov WRLD_POSI.w, CONST_1 235 else 236 // nw_local_to_world_matrix �͒P�ʃ}�g���N�X�Ȃ̂�0��������B 237 mova a0.x, CONST_0 238#ifdef NW_GFX_MODEL_TRANSLATE_OFFSET_ENABLED 239 dp4 MODL_POSI.x, TEMP_POSI, nw_matrix_pallet[0]._XYZW 240 dp4 MODL_POSI.y, TEMP_POSI, nw_matrix_pallet[1]._XYZW 241 dp4 MODL_POSI.z, TEMP_POSI, nw_matrix_pallet[2]._XYZW 242 mov MODL_POSI.w, CONST_1 243 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 244 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 245 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 246 mov WRLD_POSI.w, CONST_1 247#else 248 dp4 WRLD_POSI.x, TEMP_POSI, nw_matrix_pallet[0]._XYZW 249 dp4 WRLD_POSI.y, TEMP_POSI, nw_matrix_pallet[1]._XYZW 250 dp4 WRLD_POSI.z, TEMP_POSI, nw_matrix_pallet[2]._XYZW 251 mov WRLD_POSI.w, CONST_1 252#endif 253 endif 254 255 ifc 1, 0, COND_MODE_AND 256 // �@��������ꍇ�ł��B 257 dp3 WRLD_NORM.x, TEMP_NORM, nw_matrix_pallet[0 + a0.x]._XYZW 258 dp3 WRLD_NORM.y, TEMP_NORM, nw_matrix_pallet[1 + a0.x]._XYZW 259 dp3 WRLD_NORM.z, TEMP_NORM, nw_matrix_pallet[2 + a0.x]._XYZW 260 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 261 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 262 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 263 mov TEMP_VIEW.w, CONST_1 264 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW 265 dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW 266 dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW 267 call l_internal_calc_quaternion_from_normal 268 nop 269 else 270 ifc 1, 1, COND_MODE_AND 271 // �@���ƃ^���W�F���g������ꍇ�ł��B 272 dp3 WRLD_NORM.x, TEMP_NORM, nw_matrix_pallet[0 + a0.x]._XYZW 273 dp3 WRLD_NORM.y, TEMP_NORM, nw_matrix_pallet[1 + a0.x]._XYZW 274 dp3 WRLD_NORM.z, TEMP_NORM, nw_matrix_pallet[2 + a0.x]._XYZW 275 dp3 WRLD_TANG.x, TEMP_TANG, nw_matrix_pallet[0 + a0.x]._XYZW 276 dp3 WRLD_TANG.y, TEMP_TANG, nw_matrix_pallet[1 + a0.x]._XYZW 277 dp3 WRLD_TANG.z, TEMP_TANG, nw_matrix_pallet[2 + a0.x]._XYZW 278 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 279 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 280 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 281 mov TEMP_VIEW.w, CONST_1 282 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW 283 dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW 284 dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW 285 dp3 TEMP_TANG.x, WRLD_TANG, nw_normal_matrix[0]._XYZW 286 dp3 TEMP_TANG.y, WRLD_TANG, nw_normal_matrix[1]._XYZW 287 dp3 TEMP_TANG.z, WRLD_TANG, nw_normal_matrix[2]._XYZW 288 call l_internal_calc_quaternion_from_tangent 289 nop 290 else 291 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 292 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 293 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 294 mov TEMP_VIEW.w, CONST_1 295 mov o_Quaternion.xyzw, CONST_0 296 endif 297 nop 298 endif 299 mov o_View, -TEMP_VIEW 300 m4x4 o_Position, TEMP_VIEW, nw_projection_matrix._XYZW 301 endif 302 nop 303 ret 304