示例#1
0
        public static PmxConstraint Parse(BinaryReader br, PmxDocument doc)
        {
            var rt = new PmxSpringSixDegreesOfFreedomConstraint
            {
                Name        = doc.ReadString(br),
                EnglishName = doc.ReadString(br),
            };
            var kind = (PmxConstraintKind)br.ReadByte();

            rt.Read(br, doc);

            switch (kind)
            {
            case PmxConstraintKind.SpringSixDegreesOfFreedom:
                return(rt);

            case PmxConstraintKind.SixDegreesOfFreedom:
                return((PmxSixDegreesOfFreedomConstraint)rt);

            case PmxConstraintKind.PointToPoint:
                return((PmxPointToPointConstraint)rt);

            case PmxConstraintKind.ConeTwist:
                return((PmxConeTwistConstraint)rt);

            case PmxConstraintKind.Slider:
                return((PmxSliderConstraint)rt);

            case PmxConstraintKind.Hinge:
                return((PmxHingeConstraint)rt);

            default:
                throw new NotSupportedException();
            }
        }
示例#2
0
 public void Parse(BinaryReader br, PmxDocument doc)
 {
     this.Name = doc.ReadString(br);
     this.EnglishName = doc.ReadString(br);
     this.Category = (PmxMorphCategory)br.ReadByte();
     this.Kind = (PmxMorphKind)br.ReadByte();
     this.Offsets = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxMorphOffset.Parse(br, doc, this.Kind)).ToList();
 }
示例#3
0
 public static PmxModelInformation Parse(BinaryReader br, PmxDocument doc)
 {
     return new PmxModelInformation
     {
         ModelName = doc.ReadString(br),
         EnglishModelName = doc.ReadString(br),
         Description = doc.ReadString(br),
         EnglishDescription = doc.ReadString(br),
     };
 }
示例#4
0
 public static PmxDisplayList Parse(BinaryReader br, PmxDocument doc)
 {
     return new PmxDisplayList
     {
         Name = doc.ReadString(br),
         EnglishName = doc.ReadString(br),
         IsSpecial = br.ReadBoolean(),
         Items = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxDisplayItem.Parse(br, doc)).ToList(),
     };
 }
示例#5
0
 public static PmxDisplayList Parse(BinaryReader br, PmxDocument doc)
 {
     return(new PmxDisplayList
     {
         Name = doc.ReadString(br),
         EnglishName = doc.ReadString(br),
         IsSpecial = br.ReadBoolean(),
         Items = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxDisplayItem.Parse(br, doc)).ToList(),
     });
 }
示例#6
0
 public static PmxModelInformation Parse(BinaryReader br, PmxDocument doc)
 {
     return(new PmxModelInformation
     {
         ModelName = doc.ReadString(br),
         EnglishModelName = doc.ReadString(br),
         Description = doc.ReadString(br),
         EnglishDescription = doc.ReadString(br),
     });
 }
示例#7
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);
        }
示例#8
0
        public static PmxMorph Parse(BinaryReader br, PmxDocument doc)
        {
            var rt = new PmxMorph
            {
                Name = doc.ReadString(br),
                EnglishName = doc.ReadString(br),
                Category = (PmxMorphCategory)br.ReadByte(),
                Kind = (PmxMorphKind)br.ReadByte(),
            };

            rt.Offsets = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxMorphOffset.Parse(br, doc, rt.Kind)).ToList();

            return rt;
        }
示例#9
0
        public static PmxMorph Parse(BinaryReader br, PmxDocument doc)
        {
            var rt = new PmxMorph
            {
                Name        = doc.ReadString(br),
                EnglishName = doc.ReadString(br),
                Category    = (PmxMorphCategory)br.ReadByte(),
                Kind        = (PmxMorphKind)br.ReadByte(),
            };

            rt.Offsets = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxMorphOffset.Parse(br, doc, rt.Kind)).ToList();

            return(rt);
        }
示例#10
0
 public static PmxTexture Parse(BinaryReader br, PmxDocument doc)
 {
     return new PmxTexture
     {
         FileName = doc.ReadString(br),
     };
 }
示例#11
0
 public static PmxRigidBody Parse(BinaryReader br, PmxDocument doc)
 {
     return(new PmxRigidBody
     {
         Name = doc.ReadString(br),
         EnglishName = doc.ReadString(br),
         RelatedBone = doc.ReadIndex(br, PmxIndexKind.Bone),
         Group = br.ReadByte(),
         CollidableGroups = (PmdRigidGroups)br.ReadUInt16(),
         Shape = (PmdRigidShape)br.ReadByte(),
         Size = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Rotation = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Mass = br.ReadSingle(),
         LinearDamping = br.ReadSingle(),
         AngularDamping = br.ReadSingle(),
         Restitution = br.ReadSingle(),
         Friction = br.ReadSingle(),
         Kind = (PmxRigidKind)br.ReadByte(),
     });
 }
示例#12
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);
        }
示例#13
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;
        }
示例#14
0
        public void Parse(BinaryReader br, PmxDocument doc)
        {
            this.Name = doc.ReadString(br);
            this.EnglishName = doc.ReadString(br);
            this.Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() };
            this.ParentBone = doc.ReadBone(br);
            this.Priority = br.ReadInt32();
            this.Capabilities = (PmxBoneCapabilities)br.ReadUInt16();

            if (this.Capabilities.HasFlag(PmxBoneCapabilities.ConnectToBone))
                this.ConnectToBone = doc.ReadBone(br);
            else
                this.ConnectToOffset = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() };

            if (this.Capabilities.HasFlag(PmxBoneCapabilities.RotationAffected) ||
                this.Capabilities.HasFlag(PmxBoneCapabilities.MovementAffected))
            {
                this.AffectedBone = doc.ReadBone(br);
                this.AffectionRate = br.ReadSingle();
            }

            if (this.Capabilities.HasFlag(PmxBoneCapabilities.FixedAxis))
                this.FixedAxis = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() };

            if (this.Capabilities.HasFlag(PmxBoneCapabilities.LocalAxis))
            {
                this.LocalVectorX = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() };
                this.LocalVectorZ = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() };
            }

            if (this.Capabilities.HasFlag(PmxBoneCapabilities.TransformByExternalParent))
                this.ExternalParentKey = br.ReadInt32();

            if (this.Capabilities.HasFlag(PmxBoneCapabilities.IK))
                this.IK = PmxIK.Parse(br, doc);
        }
示例#15
0
        public static PmxConstraint Parse(BinaryReader br, PmxDocument doc)
        {
            var rt = new PmxSpringSixDegreesOfFreedomConstraint
            {
                Name = doc.ReadString(br),
                EnglishName = doc.ReadString(br),
            };
            var kind = (PmxConstraintKind)br.ReadByte();

            rt.Read(br, doc);

            switch (kind)
            {
                case PmxConstraintKind.SpringSixDegreesOfFreedom:
                    return rt;
                case PmxConstraintKind.SixDegreesOfFreedom:
                    return (PmxSixDegreesOfFreedomConstraint)rt;
                case PmxConstraintKind.PointToPoint:
                    return (PmxPointToPointConstraint)rt;
                case PmxConstraintKind.ConeTwist:
                    return (PmxConeTwistConstraint)rt;
                case PmxConstraintKind.Slider:
                    return (PmxSliderConstraint)rt;
                case PmxConstraintKind.Hinge:
                    return (PmxHingeConstraint)rt;
                default:
                    throw new NotSupportedException();
            }
        }
示例#16
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;
        }
示例#17
0
 public static PmxRigidBody Parse(BinaryReader br, PmxDocument doc)
 {
     return new PmxRigidBody
     {
         Name = doc.ReadString(br),
         EnglishName = doc.ReadString(br),
         RelatedBone = doc.ReadIndex(br, PmxIndexKind.Bone),
         Group = br.ReadByte(),
         CollidableGroups = (PmdRigidGroups)br.ReadUInt16(),
         Shape = (PmdRigidShape)br.ReadByte(),
         Size = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Rotation = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Mass = br.ReadSingle(),
         LinearDamping = br.ReadSingle(),
         AngularDamping = br.ReadSingle(),
         Restitution = br.ReadSingle(),
         Friction = br.ReadSingle(),
         Kind = (PmxRigidKind)br.ReadByte(),
     };
 }