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