// --------------------------------------------------------------------------- // Project: NintendoWare // File: TransformMatrix.vsh // // Copyright (C)2009-2010 Nintendo Co., Ltd. All rights reserved. // // These coded instructions, statements, and computer programs contain // proprietary information of Nintendo of America Inc. and/or Nintendo // Company Ltd., and are protected by Federal copyright law. 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. // // $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: add TEMP1.y, TEMP1.y, TEMP2.y mova a0.xy, TEMP1.xy 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.y]._XYZW dp3 TEMP4.y, TEMP_NORM, nw_matrix_pallet[1 + a0.y]._XYZW dp3 TEMP4.z, TEMP_NORM, nw_matrix_pallet[2 + a0.y]._XYZW mad MODL_POSI, TEMP1.w, TEMP3, MODL_POSI mad WRLD_NORM, TEMP1.w, TEMP4, WRLD_NORM ret //----------------------------------------------------------------------------- // @brief 内部用:変換結果にウェイトを掛け各頂点属性に加算します。 //----------------------------------------------------------------------------- l_internal_blend_vertex_pnt: add TEMP1.y, TEMP1.y, TEMP2.y mova a0.xy, TEMP1.xy 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.y]._XYZW dp3 TEMP4.y, TEMP_NORM, nw_matrix_pallet[1 + a0.y]._XYZW dp3 TEMP4.z, TEMP_NORM, nw_matrix_pallet[2 + a0.y]._XYZW dp3 TEMP5.x, TEMP_TANG, nw_matrix_pallet[0 + a0.y]._XYZW dp3 TEMP5.y, TEMP_TANG, nw_matrix_pallet[1 + a0.y]._XYZW dp3 TEMP5.z, TEMP_TANG, nw_matrix_pallet[2 + a0.y]._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 mov TEMP2.x, nw_attribute_scale2._X ifb nw_is_use_normal_matrix // ノーマルマトリクスがある場合は、マトリクス分オフセット値を足してやります。 mov TEMP2.y, nw_attribute_scale2._Z else mov TEMP2.y, CONST_0 endif mul TEMP2.xy, TEMP2.xy, CONST_3 ifc 1, 0, COND_MODE_AND // 法線がある場合です。 // bone0 cmp NEQ, NEQ, nw_boneWeight.zw, CONST_0 mul TEMP1.xy, nw_boneIndex.x, TEMP2.x mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W call l_internal_blend_vertex_pn // bone1 mul TEMP1.xy, nw_boneIndex.y, TEMP2.x mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W call l_internal_blend_vertex_pn // bone2 mul TEMP1.xy, nw_boneIndex.z, TEMP2.x 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 mul TEMP1.xy, nw_boneIndex.w, TEMP2.x 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 mul TEMP1.xy, nw_boneIndex.x, TEMP2.x mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W call l_internal_blend_vertex_pnt // bone1 mul TEMP1.xy, nw_boneIndex.y, TEMP2.x mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W call l_internal_blend_vertex_pnt // bone2 mul TEMP1.xy, nw_boneIndex.z, TEMP2.x 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 mul TEMP1.xy, nw_boneIndex.w, TEMP2.x 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 mul TEMP1.xy, nw_boneIndex.x, TEMP2.x mul TEMP1.w, nw_boneWeight.x, nw_attribute_scale1._W call l_internal_blend_vertex_p // bone1 mul TEMP1.xy, nw_boneIndex.y, TEMP2.x mul TEMP1.w, nw_boneWeight.y, nw_attribute_scale1._W call l_internal_blend_vertex_p // bone2 mul TEMP1.xy, nw_boneIndex.z, TEMP2.x 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 mul TEMP1.xy, nw_boneIndex.w, TEMP2.x 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 // レイテンシーの関係で ifc との間に他の事をします。 ifb nw_is_rigid_skin mul TEMP1.xy, nw_boneIndex.x, nw_attribute_scale2._X ifb nw_is_use_normal_matrix // ノーマルマトリクスがある場合は、マトリクス分オフセット値を足してやります。 add TEMP1.y, TEMP1.y, nw_attribute_scale2._Z endif mul TEMP1.xy, TEMP1.xy, CONST_3 mova a0.xy, TEMP1.xy 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.xy, 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.y]._XYZW dp3 WRLD_NORM.y, TEMP_NORM, nw_matrix_pallet[1 + a0.y]._XYZW dp3 WRLD_NORM.z, TEMP_NORM, nw_matrix_pallet[2 + a0.y]._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.y]._XYZW dp3 WRLD_NORM.y, TEMP_NORM, nw_matrix_pallet[1 + a0.y]._XYZW dp3 WRLD_NORM.z, TEMP_NORM, nw_matrix_pallet[2 + a0.y]._XYZW dp3 WRLD_TANG.x, TEMP_TANG, nw_matrix_pallet[0 + a0.y]._XYZW dp3 WRLD_TANG.y, TEMP_TANG, nw_matrix_pallet[1 + a0.y]._XYZW dp3 WRLD_TANG.z, TEMP_TANG, nw_matrix_pallet[2 + a0.y]._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