// --------------------------------------------------------------------------- // 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" //----------------------------------------------------------------------------- // @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 //----------------------------------------------------------------------------- // @brief 内部用:変換結果にウェイトを掛け各頂点属性に加算します。 //----------------------------------------------------------------------------- l_internal_blend_vertex_pnt: 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 dp3 TEMP5.x, TEMP_TANG, nw_matrix_pallet[0 + a0.x]._XYZW dp3 TEMP5.y, TEMP_TANG, nw_matrix_pallet[1 + a0.x]._XYZW dp3 TEMP5.z, TEMP_TANG, nw_matrix_pallet[2 + a0.x]._XYZW mad MODL_POSI, TEMP1.w, TEMP3, MODL_POSI mad WRLD_NORM, TEMP1.w, TEMP4, WRLD_NORM mad WRLD_TANG, TEMP1.w, TEMP5, WRLD_TANG ret //------------------------------------------ // 頂点座標 //------------------------------------------ l_transform_matrix: mul TEMP_POSI.xyz, nw_position, nw_attribute_scale0._X mul TEMP_NORM.xyz, nw_normal, nw_attribute_scale0._Y mul TEMP_TANG.xyz, nw_tangent, nw_attribute_scale0._Z 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 mov WRLD_TANG, CONST_0 mul TEMP2, nw_boneIndex, CONST_3 ifc 1, 0, COND_MODE_AND // 法線がある場合 // bone0 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 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 callc 1, 0, COND_MODE_STA0, 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 callc 0, 1, COND_MODE_STA1, 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 call l_internal_calc_quaternion_from_normal nop else ifc 1, 1, COND_MODE_AND // 法線とタンジェントがある場合 // bone0 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 mov TEMP1.xy, TEMP2.x mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W call l_internal_blend_vertex_pnt // bone1 mov TEMP1.xy, TEMP2.y mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W call l_internal_blend_vertex_pnt // bone2 mov TEMP1.xy, TEMP2.z mul TEMP1.w, nw_boneWeight.z, nw_attribute_scale1._W callc 1, 0, COND_MODE_STA0, l_internal_blend_vertex_pnt // bone3 ifb nw_is_bone_weight_enable mov TEMP1.xy, TEMP2.w mul TEMP1.w, nw_boneWeight.w, nw_attribute_scale1._W callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_pnt 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 dp3 TEMP_TANG.x, WRLD_TANG, nw_normal_matrix[0]._XYZW dp3 TEMP_TANG.y, WRLD_TANG, nw_normal_matrix[1]._XYZW dp3 TEMP_TANG.z, WRLD_TANG, nw_normal_matrix[2]._XYZW 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 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 call l_internal_calc_quaternion_from_tangent nop else // 頂点のみの場合 // bone0 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 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 callc 1, 0, COND_MODE_STA0, 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 callc 0, 1, COND_MODE_STA1, l_internal_blend_vertex_p 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 mov o_Quaternion.xyzw, CONST_0 endif nop endif mov o_View, -TEMP_VIEW m4x4 o_Position, TEMP_VIEW, nw_projection_matrix._XYZW 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 #ifdef NW_GFX_MODEL_TRANSLATE_OFFSET_ENABLED dp4 MODL_POSI.x, TEMP_POSI, nw_matrix_pallet[0]._XYZW dp4 MODL_POSI.y, TEMP_POSI, nw_matrix_pallet[1]._XYZW dp4 MODL_POSI.z, TEMP_POSI, nw_matrix_pallet[2]._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 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 endif ifc 1, 0, COND_MODE_AND // 法線がある場合です。 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 call l_internal_calc_quaternion_from_normal nop else ifc 1, 1, COND_MODE_AND // 法線とタンジェントがある場合です。 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 dp3 WRLD_TANG.x, TEMP_TANG, nw_matrix_pallet[0 + a0.x]._XYZW dp3 WRLD_TANG.y, TEMP_TANG, nw_matrix_pallet[1 + a0.x]._XYZW dp3 WRLD_TANG.z, TEMP_TANG, 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 dp3 TEMP_TANG.x, WRLD_TANG, nw_normal_matrix[0]._XYZW dp3 TEMP_TANG.y, WRLD_TANG, nw_normal_matrix[1]._XYZW dp3 TEMP_TANG.z, WRLD_TANG, nw_normal_matrix[2]._XYZW call l_internal_calc_quaternion_from_tangent nop 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 o_Quaternion.xyzw, CONST_0 endif nop endif mov o_View, -TEMP_VIEW m4x4 o_Position, TEMP_VIEW, nw_projection_matrix._XYZW endif nop ret