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