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//----------------------------------------------------------------------------- 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.xy, 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.xy, 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.xy, 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.xy, 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 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 117 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 118 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 119 mov WRLD_POSI.w, CONST_1 120 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 121 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 122 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 123 mov TEMP_VIEW.w, CONST_1 124 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW 125 dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW 126 dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW 127 call l_internal_calc_quaternion_from_normal 128 nop 129 else 130 ifc 1, 1, COND_MODE_AND // �@���ƃ^���W�F���g������ꍇ 131 // bone0 132 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 133 mov TEMP1.xy, TEMP2.x 134 mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W 135 call l_internal_blend_vertex_pnt 136 // bone1 137 mov TEMP1.xy, TEMP2.y 138 mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W 139 call l_internal_blend_vertex_pnt 140 // bone2 141 mov TEMP1.xy, TEMP2.z 142 mul TEMP1.w, nw_boneWeight.z, nw_attribute_scale1._W 143 callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pnt 144 // bone3 145 ifb nw_is_bone_weight_enable 146 mov TEMP1.xy, TEMP2.w 147 mul TEMP1.w, nw_boneWeight.w, nw_attribute_scale1._W 148 callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pnt 149 nop 150 endif 151 152 mov MODL_POSI.w, CONST_1 153 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 154 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 155 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 156 mov WRLD_POSI.w, CONST_1 157 dp3 TEMP_TANG.x, WRLD_TANG, nw_normal_matrix[0]._XYZW 158 dp3 TEMP_TANG.y, WRLD_TANG, nw_normal_matrix[1]._XYZW 159 dp3 TEMP_TANG.z, WRLD_TANG, nw_normal_matrix[2]._XYZW 160 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW 161 dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW 162 dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW 163 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 164 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 165 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 166 mov TEMP_VIEW.w, CONST_1 167 call l_internal_calc_quaternion_from_tangent 168 nop 169 else // ���_�݂̂̏ꍇ 170 // bone0 171 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 172 mov TEMP1.xy, TEMP2.x 173 mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W 174 call l_internal_blend_vertex_p 175 // bone1 176 mov TEMP1.xy, TEMP2.y 177 mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W 178 call l_internal_blend_vertex_p 179 // bone2 180 mov TEMP1.xy, TEMP2.z 181 mul TEMP1.w, nw_boneWeight.z, nw_attribute_scale1._W 182 callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_p 183 // bone3 184 ifb nw_is_bone_weight_enable 185 mov TEMP1.xy, TEMP2.w 186 mul TEMP1.w, nw_boneWeight.w, nw_attribute_scale1._W 187 callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_p 188 nop 189 endif 190 191 mov MODL_POSI.w, CONST_1 192 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 193 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 194 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 195 mov WRLD_POSI.w, CONST_1 196 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 197 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 198 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 199 mov TEMP_VIEW.w, CONST_1 200 mov o_Quaternion.xyzw, CONST_0 201 endif 202 nop 203 endif 204 mov o_View, -TEMP_VIEW 205 m4x4 o_Position, TEMP_VIEW, nw_projection_matrix._XYZW 206 else // ���W�b�h�X�L�j���O�ƒP��m�[�h�̏ꍇ 207 // �@���ƃ^���W�F���g�̓X�P�[���l���O�ȊO�Ȃ瑶�݂��܂��B 208 mov TEMP0, nw_attribute_scale0._XYZW 209 cmp NEQ, NEQ, TEMP0.yz, CONST_0 210 ifb nw_is_rigid_skin 211 mul TEMP1.x, nw_boneIndex.x, CONST_3 212 mova a0.x, TEMP1.x 213 dp4 MODL_POSI.x, TEMP_POSI, nw_matrix_pallet[0 + a0.x]._XYZW 214 dp4 MODL_POSI.y, TEMP_POSI, nw_matrix_pallet[1 + a0.x]._XYZW 215 dp4 MODL_POSI.z, TEMP_POSI, nw_matrix_pallet[2 + a0.x]._XYZW 216 mov MODL_POSI.w, CONST_1 217 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 218 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 219 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 220 mov WRLD_POSI.w, CONST_1 221 else 222 // nw_local_to_world_matrix �͒P�ʃ}�g���N�X�Ȃ̂�0��������B 223 mova a0.x, CONST_0 224#ifdef NW_GFX_MODEL_TRANSLATE_OFFSET_ENABLED 225 dp4 MODL_POSI.x, TEMP_POSI, nw_matrix_pallet[0]._XYZW 226 dp4 MODL_POSI.y, TEMP_POSI, nw_matrix_pallet[1]._XYZW 227 dp4 MODL_POSI.z, TEMP_POSI, nw_matrix_pallet[2]._XYZW 228 mov MODL_POSI.w, CONST_1 229 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW 230 dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW 231 dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW 232 mov WRLD_POSI.w, CONST_1 233#else 234 dp4 WRLD_POSI.x, TEMP_POSI, nw_matrix_pallet[0]._XYZW 235 dp4 WRLD_POSI.y, TEMP_POSI, nw_matrix_pallet[1]._XYZW 236 dp4 WRLD_POSI.z, TEMP_POSI, nw_matrix_pallet[2]._XYZW 237 mov WRLD_POSI.w, CONST_1 238#endif 239 endif 240 241 ifc 1, 0, COND_MODE_AND 242 // �@��������ꍇ�ł��B 243 dp3 WRLD_NORM.x, TEMP_NORM, nw_matrix_pallet[0 + a0.x]._XYZW 244 dp3 WRLD_NORM.y, TEMP_NORM, nw_matrix_pallet[1 + a0.x]._XYZW 245 dp3 WRLD_NORM.z, TEMP_NORM, nw_matrix_pallet[2 + a0.x]._XYZW 246 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 247 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 248 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 249 mov TEMP_VIEW.w, CONST_1 250 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW 251 dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW 252 dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW 253 call l_internal_calc_quaternion_from_normal 254 nop 255 else 256 ifc 1, 1, COND_MODE_AND 257 // �@���ƃ^���W�F���g������ꍇ�ł��B 258 dp3 WRLD_NORM.x, TEMP_NORM, nw_matrix_pallet[0 + a0.x]._XYZW 259 dp3 WRLD_NORM.y, TEMP_NORM, nw_matrix_pallet[1 + a0.x]._XYZW 260 dp3 WRLD_NORM.z, TEMP_NORM, nw_matrix_pallet[2 + a0.x]._XYZW 261 dp3 WRLD_TANG.x, TEMP_TANG, nw_matrix_pallet[0 + a0.x]._XYZW 262 dp3 WRLD_TANG.y, TEMP_TANG, nw_matrix_pallet[1 + a0.x]._XYZW 263 dp3 WRLD_TANG.z, TEMP_TANG, nw_matrix_pallet[2 + a0.x]._XYZW 264 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 265 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 266 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 267 mov TEMP_VIEW.w, CONST_1 268 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW 269 dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW 270 dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW 271 dp3 TEMP_TANG.x, WRLD_TANG, nw_normal_matrix[0]._XYZW 272 dp3 TEMP_TANG.y, WRLD_TANG, nw_normal_matrix[1]._XYZW 273 dp3 TEMP_TANG.z, WRLD_TANG, nw_normal_matrix[2]._XYZW 274 call l_internal_calc_quaternion_from_tangent 275 nop 276 else 277 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW 278 dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW 279 dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW 280 mov TEMP_VIEW.w, CONST_1 281 mov o_Quaternion.xyzw, CONST_0 282 endif 283 nop 284 endif 285 mov o_View, -TEMP_VIEW 286 m4x4 o_Position, TEMP_VIEW, nw_projection_matrix._XYZW 287 endif 288 nop 289 ret 290