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; } } }
public PMXIKLink(PMXModel model, PMXIK ik) : base(model) { this.IK = ik; this.Minimum = new PMXVector3(); this.Maximum = new PMXVector3(); }