private static PMXFormat.Bone ConvertBone(PMDFormat pmd, int bone_index)
    {
        PMXFormat.Bone result   = new PMXFormat.Bone();
        PMDFormat.Bone pmd_bone = pmd.bone_list.bone[bone_index];

        result.bone_name         = pmd_bone.bone_name;
        result.bone_english_name = ((null != pmd.eg_bone_name_list)? pmd.eg_bone_name_list.bone_name_eg[bone_index]: null);
        result.bone_position     = pmd_bone.bone_head_pos;
        result.parent_bone_index = ((ushort.MaxValue == pmd_bone.parent_bone_index)? uint.MaxValue: (uint)pmd_bone.parent_bone_index);
        result.transform_level   = 0;
        switch (pmd_bone.bone_type)
        {
        case 0:         //回転
            result.bone_flag = PMXFormat.Bone.Flag.Movable | PMXFormat.Bone.Flag.DisplayFlag | PMXFormat.Bone.Flag.CanOperate;
            break;

        case 1:         //回転と移動
            result.bone_flag = PMXFormat.Bone.Flag.Movable | PMXFormat.Bone.Flag.Rotatable | PMXFormat.Bone.Flag.DisplayFlag | PMXFormat.Bone.Flag.CanOperate;
            break;

        case 2:         //IK
            result.bone_flag = PMXFormat.Bone.Flag.IkFlag | PMXFormat.Bone.Flag.DisplayFlag | PMXFormat.Bone.Flag.CanOperate;
            break;

        case 3:         //不明
            goto default;

        case 4:         //IK影響下
            goto default;

        case 5:           //回転影響下
            goto default; //付与親に変換しないといけないのかも

        case 6:           //IK接続先
            goto default;

        case 7:         //非表示
            goto default;

        case 8:         //捻り
            goto default;

        case 9:         //回転運動
            goto default;

        default:
            result.bone_flag = new PMXFormat.Bone.Flag();
            break;
        }
        result.position_offset         = Vector3.zero;
        result.connection_index        = 0;
        result.additional_parent_index = 0;
        result.additional_rate         = 0.0f;
        result.axis_vector             = Vector3.zero;
        result.x_axis_vector           = Vector3.zero;
        result.z_axis_vector           = Vector3.zero;
        result.key_value = 0;
        result.ik_data   = ConvertIKData(pmd.ik_list.ik_data.Where(x => x.ik_bone_index == bone_index).FirstOrDefault());
        return(result);
    }
    private static PMDFormat.Bone ConvertBone(PMXFormat pmx, int bone_index)
    {
        PMDFormat.Bone result   = new PMDFormat.Bone();
        PMXFormat.Bone pmx_bone = pmx.bone_list.bone[bone_index];
        result.bone_name           = pmx_bone.bone_name;
        result.parent_bone_index   = (ushort)((uint.MaxValue == pmx_bone.parent_bone_index)? ushort.MaxValue: pmx_bone.parent_bone_index);
        result.tail_pos_bone_index = ushort.MaxValue;
#if false
        //PMD側 0:回転 1:回転と移動 2:IK 3:不明 4:IK影響下 5:回転影響下 6:IK接続先 7:非表示 8:捻り 9:回転運動
        result.bone_type = pmx_bone.bone_flag;
    private PMXFormat.Bone ReadBone()
    {
        PMXFormat.Bone result = new PMXFormat.Bone();
        result.bone_name         = ReadString();
        result.bone_english_name = ReadString();
        result.bone_position     = ReadSinglesToVector3(binary_reader_);
        result.parent_bone_index = CastIntRead(binary_reader_, format_.header.boneIndexSize);
        result.transform_level   = binary_reader_.ReadInt32();
        result.bone_flag         = (PMXFormat.Bone.Flag)binary_reader_.ReadUInt16();

        if ((result.bone_flag & PMXFormat.Bone.Flag.Connection) == 0)
        {
            // 座標オフセットで指定
            result.position_offset = ReadSinglesToVector3(binary_reader_);
        }
        else
        {
            // ボーンで指定
            result.connection_index = CastIntRead(binary_reader_, format_.header.boneIndexSize);
        }
        if ((result.bone_flag & (PMXFormat.Bone.Flag.AddRotation | PMXFormat.Bone.Flag.AddMove)) != 0)
        {
            result.additional_parent_index = CastIntRead(binary_reader_, format_.header.boneIndexSize);
            result.additional_rate         = binary_reader_.ReadSingle();
        }
        if ((result.bone_flag & PMXFormat.Bone.Flag.FixedAxis) != 0)
        {
            result.axis_vector = ReadSinglesToVector3(binary_reader_);
        }
        if ((result.bone_flag & PMXFormat.Bone.Flag.LocalAxis) != 0)
        {
            result.x_axis_vector = ReadSinglesToVector3(binary_reader_);
            result.z_axis_vector = ReadSinglesToVector3(binary_reader_);
        }
        if ((result.bone_flag & PMXFormat.Bone.Flag.ExternalParentTransform) != 0)
        {
            result.key_value = binary_reader_.ReadUInt32();
        }
        if ((result.bone_flag & PMXFormat.Bone.Flag.IkFlag) != 0)
        {
            result.ik_data = ReadIkData();
        }
        return(result);
    }
예제 #4
0
	private PMXFormat.Bone ReadBone() {
		PMXFormat.Bone result = new PMXFormat.Bone();
		result.bone_name = ReadString();
		result.bone_english_name = ReadString();
		result.bone_position = ReadSinglesToVector3(binary_reader_);
		result.parent_bone_index = CastIntRead(binary_reader_, format_.header.boneIndexSize);
		result.transform_level = binary_reader_.ReadInt32();
		result.bone_flag = (PMXFormat.Bone.Flag)binary_reader_.ReadUInt16();
		
		if ((result.bone_flag & PMXFormat.Bone.Flag.Connection) == 0) {
			// 座標オフセットで指定
			result.position_offset = ReadSinglesToVector3(binary_reader_);
		} else {
			// ボーンで指定
			result.connection_index = CastIntRead(binary_reader_, format_.header.boneIndexSize);
		}
		if ((result.bone_flag & (PMXFormat.Bone.Flag.AddRotation | PMXFormat.Bone.Flag.AddMove)) != 0) {
			result.additional_parent_index = CastIntRead(binary_reader_, format_.header.boneIndexSize);
			result.additional_rate = binary_reader_.ReadSingle();
		}
		if ((result.bone_flag & PMXFormat.Bone.Flag.FixedAxis) != 0) {
			result.axis_vector = ReadSinglesToVector3(binary_reader_);
		}
		if ((result.bone_flag & PMXFormat.Bone.Flag.LocalAxis) != 0) {
			result.x_axis_vector = ReadSinglesToVector3(binary_reader_);
			result.z_axis_vector = ReadSinglesToVector3(binary_reader_);
		}
		if((result.bone_flag & PMXFormat.Bone.Flag.ExternalParentTransform) != 0) {
			result.key_value = binary_reader_.ReadUInt32();
		}
		if((result.bone_flag & PMXFormat.Bone.Flag.IkFlag) != 0) {
			result.ik_data = ReadIkData();
		}
		return result;
	}
	private static PMXFormat.Bone ConvertBone(PMDFormat pmd, int bone_index) {
		PMXFormat.Bone result = new PMXFormat.Bone();
		PMDFormat.Bone pmd_bone = pmd.bone_list.bone[bone_index];

		result.bone_name = pmd_bone.bone_name;
		result.bone_english_name = ((null != pmd.eg_bone_name_list)? pmd.eg_bone_name_list.bone_name_eg[bone_index]: null);
		result.bone_position = pmd_bone.bone_head_pos;
		result.parent_bone_index = ((ushort.MaxValue == pmd_bone.parent_bone_index)? uint.MaxValue: (uint)pmd_bone.parent_bone_index);
		result.transform_level = 0;
		switch (pmd_bone.bone_type) {
		case 0: //回転
			result.bone_flag = PMXFormat.Bone.Flag.Movable | PMXFormat.Bone.Flag.DisplayFlag | PMXFormat.Bone.Flag.CanOperate;
			break;
		case 1: //回転と移動
			result.bone_flag = PMXFormat.Bone.Flag.Movable | PMXFormat.Bone.Flag.Rotatable | PMXFormat.Bone.Flag.DisplayFlag | PMXFormat.Bone.Flag.CanOperate;
			break;
		case 2: //IK
			result.bone_flag = PMXFormat.Bone.Flag.IkFlag | PMXFormat.Bone.Flag.DisplayFlag | PMXFormat.Bone.Flag.CanOperate;
			break;
		case 3: //不明
			goto default;
		case 4: //IK影響下
			goto default;
		case 5: //回転影響下
			goto default; //付与親に変換しないといけないのかも
		case 6: //IK接続先
			goto default;
		case 7: //非表示
			goto default;
		case 8: //捻り
			goto default;
		case 9: //回転運動
			goto default;
		default:
			result.bone_flag = new PMXFormat.Bone.Flag();
			break;
		}
		result.position_offset = Vector3.zero;
		result.connection_index = 0;
		result.additional_parent_index = 0;
		result.additional_rate = 0.0f;
		result.axis_vector = Vector3.zero;
		result.x_axis_vector = Vector3.zero;
		result.z_axis_vector = Vector3.zero;
		result.key_value = 0;
		result.ik_data = ConvertIKData(pmd.ik_list.ik_data.Where(x=>x.ik_bone_index==bone_index).FirstOrDefault());
		return result;
	}