Exemplo n.º 1
0
        public void LoadFromStream(BinaryReader br, MMDImportSettings importSettings, out int pmdIKIndex)
        {
            pmdIKIndex = -1;

            if (importSettings.Format == MMDImportSettings.ModelFormat.PMX)
            { //PMX
                this.NameJP = PMXParser.ReadString(br, importSettings.TextEncoding);
                this.NameEN = PMXParser.ReadString(br, importSettings.TextEncoding);

                this.Position = PMXVector3.LoadFromStreamStatic(br);

                this.parentIndex = PMXParser.ReadIndex(br, importSettings.BitSettings.BoneIndexLength);

                this.Layer = br.ReadInt32();

                short flags = br.ReadInt16();

                this.HasChildBone = ((flags & PMXBone.BONE_TAILPOS_IS_BONE) != 0);
                if (this.HasChildBone)
                {
                    this.childBoneIndex = PMXParser.ReadIndex(br, importSettings.BitSettings.BoneIndexLength);
                }
                else
                {
                    this.ChildVector = PMXVector3.LoadFromStreamStatic(br);
                }

                this.Rotatable    = ((flags & PMXBone.BONE_CAN_ROTATE) != 0);
                this.Translatable = ((flags & PMXBone.BONE_CAN_TRANSLATE) != 0);
                this.Visible      = ((flags & PMXBone.BONE_IS_VISIBLE) != 0);
                this.Operating    = ((flags & PMXBone.BONE_CAN_MANIPULATE) != 0);

                bool extRotation    = ((flags & PMXBone.BONE_IS_EXTERNAL_ROTATION) != 0);
                bool extTranslation = ((flags & PMXBone.BONE_IS_EXTERNAL_TRANSLATION) != 0);

                int rotFlag = 0;
                if (extRotation)
                {
                    rotFlag |= 1;
                }
                if (extTranslation)
                {
                    rotFlag |= 2;
                }
                this.ExternalModificationType = (BoneExternalModificationType)rotFlag;
                if (this.ExternalModificationType != BoneExternalModificationType.None)
                {
                    this.externalBoneIndex  = PMXParser.ReadIndex(br, importSettings.BitSettings.BoneIndexLength);
                    this.ExternalBoneEffect = br.ReadSingle();
                }

                this.FixedAxis = ((flags & PMXBone.BONE_HAS_FIXED_AXIS) != 0);
                if (this.FixedAxis)
                {
                    this.AxisLimit = PMXVector3.LoadFromStreamStatic(br);
                }

                this.LocalCoordinates = ((flags & PMXBone.BONE_HAS_LOCAL_COORDINATE) != 0);
                if (this.LocalCoordinates)
                {
                    this.LocalCoordinatesX = PMXVector3.LoadFromStreamStatic(br);
                    this.LocalCoordinatesZ = PMXVector3.LoadFromStreamStatic(br);
                }

                this.HasExternalParent = ((flags & PMXBone.BONE_IS_EXTERNAL_PARENT_DEFORM) != 0);
                if (this.HasExternalParent)
                {
                    this.ExternalParentKey = br.ReadInt32();
                }

                this.TransformPhysicsFirst = ((flags & PMXBone.BONE_IS_AFTER_PHYSICS_DEFORM) != 0);

                bool isIKBone = ((flags & PMXBone.BONE_IS_IK) != 0);
                if (isIKBone)
                {
                    PMXIK ikData = new PMXIK(this.Model, this);
                    ikData.LoadFromStream(br, importSettings);
                    this.IK = ikData;
                }
                else
                {
                    this.IK = null;
                }
            }

            else
            { //PMD
                this.NameJP      = PMDParser.ReadString(br, 20, importSettings.TextEncoding);
                this.parentIndex = br.ReadInt16();

                this.HasChildBone   = true;
                this.childBoneIndex = br.ReadUInt16();

                byte type = br.ReadByte();

                ushort ikIndex = br.ReadUInt16();

                this.Position = PMXVector3.LoadFromStreamStatic(br);

                switch (type)
                {
                case PMD_BONE_TYPE_ROTATE:
                    //Default
                    break;

                case PMD_BONE_TYPE_ROTATE_MOVE:
                    this.Translatable = true;
                    break;

                case PMD_BONE_TYPE_IK:
                    //IK parameters will be initialised later
                    this.Translatable = true;
                    break;

                case PMD_BONE_TYPE_IK_CHILD:
                    //PMX doesn't even bother about these
                    break;

                case PMD_BONE_TYPE_EXTERNAL_ROTATOR:
                    this.ExternalModificationType = BoneExternalModificationType.Rotation;
                    this.externalBoneIndex        = (int)ikIndex;
                    break;

                case PMD_BONE_TYPE_IK_TARGET:
                    //PMX doesn't bother either
                    this.Visible = false;
                    break;

                case PMD_BONE_TYPE_INVISIBLE:
                    this.Visible = false;
                    break;

                case PMD_BONE_TYPE_TWIST:
                    //PMX handles these differently
                    this._isPMDTwist = true;
                    break;

                case PMD_BONE_TYPE_TWIST_INVISIBLE:
                    //PMX handles these differently
                    this._isPMDTwist = true;
                    this.Visible     = false;
                    break;
                }
            }
        }
Exemplo n.º 2
0
 public PMXIKLink(PMXModel model, PMXIK ik) : base(model)
 {
     this.IK      = ik;
     this.Minimum = new PMXVector3();
     this.Maximum = new PMXVector3();
 }