// --------------------------------------------------------------------------- // Project: NintendoWare // File: TransformMatrix.vsh // // Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. // // These coded instructions, statements, and computer programs contain proprietary // information of Nintendo and/or its licensed developers and are protected by // national and international copyright laws. They may not be disclosed to third // parties or copied or duplicated in any form, in whole or in part, without the // prior written consent of Nintendo. // // The content herein is highly confidential and should be handled accordingly. // // $Revision: $ // --------------------------------------------------------------------------- #include "ShaderConfig.h" #include "VertexShader.h" #define o_Normal o2 //----------------------------------------------------------------------------- // @brief 内部用:変換結果にウェイトを掛け各頂点属性に加算します。 //----------------------------------------------------------------------------- l_internal_blend_vertex_p: mova a0.x, TEMP1.x dp4 TEMP3.x, TEMP_POSI, nw_matrix_pallet[0 + a0.x]._XYZW dp4 TEMP3.y, TEMP_POSI, nw_matrix_pallet[1 + a0.x]._XYZW dp4 TEMP3.z, TEMP_POSI, nw_matrix_pallet[2 + a0.x]._XYZW mad MODL_POSI, TEMP1.w, TEMP3, MODL_POSI ret //----------------------------------------------------------------------------- // @brief 内部用:変換結果にウェイトを掛け各頂点属性に加算します。 //----------------------------------------------------------------------------- l_internal_blend_vertex_pn: mova a0.x, TEMP1.x dp4 TEMP3.x, TEMP_POSI, nw_matrix_pallet[0 + a0.x]._XYZW dp4 TEMP3.y, TEMP_POSI, nw_matrix_pallet[1 + a0.x]._XYZW dp4 TEMP3.z, TEMP_POSI, nw_matrix_pallet[2 + a0.x]._XYZW dp3 TEMP4.x, TEMP_NORM, nw_matrix_pallet[0 + a0.x]._XYZW dp3 TEMP4.y, TEMP_NORM, nw_matrix_pallet[1 + a0.x]._XYZW dp3 TEMP4.z, TEMP_NORM, nw_matrix_pallet[2 + a0.x]._XYZW mad MODL_POSI, TEMP1.w, TEMP3, MODL_POSI mad WRLD_NORM, TEMP1.w, TEMP4, WRLD_NORM ret //------------------------------------------ // 頂点座標 //------------------------------------------ l_transform_matrix: mul TEMP_POSI.xyz, nw_position, nw_attribute_scale0._X mul TEMP_NORM.xyz, nw_normal, nw_attribute_scale0._Y add TEMP_POSI.xyz, TEMP_POSI, nw_position_offset._XYZW mov TEMP_POSI.w, CONST_1 ifb nw_is_smooth_skin // スムーススキニングの場合 // 法線とタンジェントはスケール値が0以外なら存在します。 mov TEMP0, nw_attribute_scale0._XYZW cmp NEQ, NEQ, TEMP0.yz, CONST_0 // レイテンシーの関係で ifc との間に他の事をします。 mov MODL_POSI, CONST_0 mov WRLD_NORM, CONST_0 mul TEMP2, nw_boneIndex, CONST_3 ifc 1, 0, COND_MODE_STA0 // 法線がある場合です。 // bone0 mov TEMP1.xy, TEMP2.x mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W call l_internal_blend_vertex_pn // bone1 mov TEMP1.xy, TEMP2.y mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W call l_internal_blend_vertex_pn // bone2 mov TEMP1.xy, TEMP2.z mul TEMP1.w, nw_boneWeight.z, nw_attribute_scale1._W call l_internal_blend_vertex_pn // bone3 ifb nw_is_bone_weight_enable mov TEMP1.xy, TEMP2.w mul TEMP1.w, nw_boneWeight.w, nw_attribute_scale1._W call l_internal_blend_vertex_pn nop endif mov MODL_POSI.w, CONST_1 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW mov WRLD_POSI.w, CONST_1 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW mov TEMP_VIEW.w, CONST_1 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW nop else // bone0 mov TEMP1.xy, TEMP2.x mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W call l_internal_blend_vertex_p // bone1 mov TEMP1.xy, TEMP2.y mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W call l_internal_blend_vertex_p // bone2 mov TEMP1.xy, TEMP2.z mul TEMP1.w, nw_boneWeight.z, nw_attribute_scale1._W call l_internal_blend_vertex_p // bone3 ifb nw_is_bone_weight_enable mov TEMP1.xy, TEMP2.w mul TEMP1.w, nw_boneWeight.w, nw_attribute_scale1._W call l_internal_blend_vertex_p mov TEMP_NORM, CONST_0 endif mov MODL_POSI.w, CONST_1 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW mov WRLD_POSI.w, CONST_1 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW mov TEMP_VIEW.w, CONST_1 endif m4x4 o_Position, TEMP_VIEW, nw_projection_matrix._XYZW mov o_Normal, TEMP_NORM else // リジッドスキニングと単一ノードの場合 // 法線とタンジェントはスケール値が0以外なら存在します。 mov TEMP0, nw_attribute_scale0._XYZW cmp NEQ, NEQ, TEMP0.yz, CONST_0 ifb nw_is_rigid_skin mul TEMP1.x, nw_boneIndex.x, CONST_3 mova a0.x, TEMP1.x dp4 MODL_POSI.x, TEMP_POSI, nw_matrix_pallet[0 + a0.x]._XYZW dp4 MODL_POSI.y, TEMP_POSI, nw_matrix_pallet[1 + a0.x]._XYZW dp4 MODL_POSI.z, TEMP_POSI, nw_matrix_pallet[2 + a0.x]._XYZW mov MODL_POSI.w, CONST_1 dp4 WRLD_POSI.x, MODL_POSI, nw_local_to_world_matrix[0]._XYZW dp4 WRLD_POSI.y, MODL_POSI, nw_local_to_world_matrix[1]._XYZW dp4 WRLD_POSI.z, MODL_POSI, nw_local_to_world_matrix[2]._XYZW mov WRLD_POSI.w, CONST_1 else // nw_local_to_world_matrix は単位マトリクスなので0を代入する。 mova a0.x, CONST_0 dp4 WRLD_POSI.x, TEMP_POSI, nw_matrix_pallet[0]._XYZW dp4 WRLD_POSI.y, TEMP_POSI, nw_matrix_pallet[1]._XYZW dp4 WRLD_POSI.z, TEMP_POSI, nw_matrix_pallet[2]._XYZW mov WRLD_POSI.w, CONST_1 endif ifc 1, 0, COND_MODE_STA0 // 法線がある場合です。 dp3 WRLD_NORM.x, TEMP_NORM, nw_matrix_pallet[0 + a0.x]._XYZW dp3 WRLD_NORM.y, TEMP_NORM, nw_matrix_pallet[1 + a0.x]._XYZW dp3 WRLD_NORM.z, TEMP_NORM, nw_matrix_pallet[2 + a0.x]._XYZW dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW mov TEMP_VIEW.w, CONST_1 dp3 TEMP_NORM.x, WRLD_NORM, nw_normal_matrix[0]._XYZW dp3 TEMP_NORM.y, WRLD_NORM, nw_normal_matrix[1]._XYZW dp3 TEMP_NORM.z, WRLD_NORM, nw_normal_matrix[2]._XYZW mov TEMP_NORM.w, CONST_1 else dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW mov TEMP_VIEW.w, CONST_1 mov TEMP_NORM, CONST_0 endif m4x4 o_Position, TEMP_VIEW, nw_projection_matrix._XYZW mov o_Normal, TEMP_NORM endif nop ret