Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        public static PmxDocument Parse(Stream stream)
        {
            // leave open
            var br     = new BinaryReader(stream);
            var header = Encoding.ASCII.GetString(br.ReadBytes(4));
            var rt     = new PmxDocument();

            if (header != "PMX ")
            {
                throw new InvalidOperationException("invalid format");
            }

            rt.Version = br.ReadSingle();

            if (rt.Version != 2 &&
                rt.Version != 2.1f)
            {
                throw new NotSupportedException("specified format version not supported");
            }

            rt.Header           = PmxHeader.Parse(br);
            rt.ModelInformation = PmxModelInformation.Parse(br, rt);
            rt.Vertices         = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxVertex.Parse(br, rt)).ToList();
            rt.Indices          = Enumerable.Range(0, br.ReadInt32()).Select(_ => rt.ReadIndex(br, PmxIndexKind.Vertex)).ToList();
            rt.Textures         = Enumerable.Range(0, br.ReadInt32()).Select(_ => rt.ReadString(br)).ToList();
            rt.Materials        = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxMaterial.Parse(br, rt)).ToList();
            rt.Bones            = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxBone.Parse(br, rt)).ToList();
            rt.Morphs           = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxMorph.Parse(br, rt)).ToList();
            rt.DisplayList      = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxDisplayList.Parse(br, rt)).ToList();
            rt.Rigids           = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxRigidBody.Parse(br, rt)).ToList();
            rt.Constraints      = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxConstraint.Parse(br, rt)).ToList();

            if (rt.Version > 2)
            {
                rt.SoftBodies = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxSoftBody.Parse(br, rt)).ToList();
            }

            return(rt);
        }
Ejemplo n.º 3
0
 public override void Read(BinaryReader br, PmxDocument doc)
 {
     this.Bone = doc.ReadBone(br);
 }
Ejemplo n.º 4
0
 public void Write(PmxBone bone)
 {
     doc.WriteIndex(bw, PmxIndexKind.Bone, bone == null ? -1 : this.Bones[bone]);
 }
Ejemplo n.º 5
0
        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;
        }