public PmxBone() { this.Position = new[] { 0f, 0, 0 }; this.ParentBone = this.ConnectToBone = -1; this.ConnectToOffset = new[] { 0f, 0, 0 }; this.FixedAxis = new[] { 0f, 0, 0 }; this.LocalVectorX = new[] { 0f, 0, 0 }; this.LocalVectorZ = new[] { 0f, 0, 0 }; this.IK = new PmxIK(); }
public static PmxBone Parse(BinaryReader br, PmxDocument doc) { var rt = new PmxBone { Name = doc.ReadString(br), EnglishName = doc.ReadString(br), Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() }, ParentBone = doc.ReadIndex(br, PmxIndexKind.Bone), Priority = br.ReadInt32(), Capabilities = (PmxBoneCapabilities)br.ReadUInt16(), }; if (rt.Capabilities.HasFlag(PmxBoneCapabilities.ConnectToBone)) { rt.ConnectToBone = doc.ReadIndex(br, PmxIndexKind.Bone); } else { rt.ConnectToOffset = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() } }; if (rt.Capabilities.HasFlag(PmxBoneCapabilities.RotationAffected) || rt.Capabilities.HasFlag(PmxBoneCapabilities.MovementAffected)) { rt.AffectedBone = doc.ReadIndex(br, PmxIndexKind.Bone); rt.AffectionRate = br.ReadSingle(); } if (rt.Capabilities.HasFlag(PmxBoneCapabilities.FixedAxis)) { rt.FixedAxis = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() } } ; if (rt.Capabilities.HasFlag(PmxBoneCapabilities.LocalAxis)) { rt.LocalVectorX = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() }; rt.LocalVectorZ = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() }; } if (rt.Capabilities.HasFlag(PmxBoneCapabilities.TransformByExternalParent)) { rt.ExternalParentKey = br.ReadInt32(); } if (rt.Capabilities.HasFlag(PmxBoneCapabilities.IK)) { rt.IK = PmxIK.Parse(br, doc); } return(rt); }