Exemplo n.º 1
0
 public void Write(BinaryWriter bw)
 {
     PmdDocument.WritePmdString(bw, this.Name, 20);
     bw.Write(this.ParentBone);
     bw.Write(this.ConnectedToOrAssociatedBone);
     bw.Write((byte)this.Kind);
     bw.Write(this.IKParentBoneOrAssociationRate);
     this.Position.ForEach(bw.Write);
 }
Exemplo n.º 2
0
 public void Write(BinaryWriter bw)
 {
     PmdDocument.WritePmdString(bw, this.Name, 20);
     bw.Write((uint)this.Offsets.Count);
     bw.Write((byte)this.Kind);
     this.Indices.Zip(this.Offsets, Tuple.Create).ForEach(_ =>
     {
         bw.Write((uint)_.Item1);
         _.Item2.ForEach(bw.Write);
     });
 }
Exemplo n.º 3
0
 public void Write(BinaryWriter bw)
 {
     this.Diffuse.ForEach(bw.Write);
     bw.Write(this.Power);
     this.Specular.ForEach(bw.Write);
     this.Ambient.ForEach(bw.Write);
     bw.Write(this.ToonIndex);
     bw.Write(this.NoEdge);
     bw.Write(this.IndexCount);
     PmdDocument.WritePmdString(bw, this.Texture, 20);
 }
Exemplo n.º 4
0
 public static PmdBone Parse(BinaryReader br)
 {
     return(new PmdBone
     {
         Name = PmdDocument.ReadPmdString(br, 20),
         ParentBone = br.ReadInt16(),
         ConnectedToOrAssociatedBone = br.ReadInt16(),
         Kind = (PmdBoneKind)br.ReadByte(),
         IKParentBoneOrAssociationRate = br.ReadInt16(),
         Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
     });
 }
Exemplo n.º 5
0
 public static PmdVertex Parse(BinaryReader br, PmdDocument doc)
 {
     return new PmdVertex
     {
         Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Normal = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         UV = new[] {br.ReadSingle(), br.ReadSingle() },
         RelatedBones = new[] { doc.GetBone(br.ReadInt16()), doc.GetBone(br.ReadInt16()) },
         BoneWeight = br.ReadByte() / 100f,
         NoEdge = br.ReadBoolean(),
     };
 }
Exemplo n.º 6
0
 public static PmdMaterial Parse(BinaryReader br)
 {
     return(new PmdMaterial
     {
         Diffuse = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Power = br.ReadSingle(),
         Specular = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Ambient = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         ToonIndex = br.ReadSByte(),
         NoEdge = br.ReadBoolean(),
         IndexCount = br.ReadInt32(),
         Texture = PmdDocument.ReadPmdString(br, 20),
     });
 }
Exemplo n.º 7
0
 public void Write(BinaryWriter bw)
 {
     PmdDocument.WritePmdString(bw, this.Name, 20);
     bw.Write(this.RigidA);
     bw.Write(this.RigidB);
     this.Position.ForEach(bw.Write);
     this.Rotation.ForEach(bw.Write);
     this.LinearLowerLimit.ForEach(bw.Write);
     this.LinearUpperLimit.ForEach(bw.Write);
     this.AngularLowerLimit.ForEach(bw.Write);
     this.AngularUpperLimit.ForEach(bw.Write);
     this.LinearSpringStiffness.ForEach(bw.Write);
     this.AngularSpringStiffness.ForEach(bw.Write);
 }
Exemplo n.º 8
0
        public static PmdIK Parse(BinaryReader br, PmdDocument doc)
        {
            var rt = new PmdIK
            {
                IKBone = doc.GetBone(br.ReadInt16()),
                TargetBone = doc.GetBone(br.ReadInt16()),
            };
            var bindedBones = br.ReadByte();

            rt.LoopCount = br.ReadUInt16();
            rt.AngleLimitUnit = br.ReadSingle();
            rt.BindedBones = Enumerable.Range(0, bindedBones).Select(_ => doc.GetBone(br.ReadInt16())).ToList();

            return rt;
        }
Exemplo n.º 9
0
        public void Parse(BinaryReader br, PmdDocument doc)
        {
            this.Name = PmdDocument.ReadPmdString(br, 20);
            this.ParentBone = doc.GetBone(br.ReadInt16());
            this.ConnectedToOrAssociatedBone = doc.GetBone(br.ReadInt16());
            this.Kind = (PmdBoneKind)br.ReadByte();

            var parentOrRate = br.ReadInt16();

            if (this.Kind == PmdBoneKind.RotationAssociated)
                this.AssosiationRate = parentOrRate / 100f;
            else
                this.IKParentOrAffectedBone = doc.GetBone(parentOrRate);

            this.Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() };
        }
Exemplo n.º 10
0
 public static PmdConstraint Parse(BinaryReader br)
 {
     return(new PmdConstraint
     {
         Name = PmdDocument.ReadPmdString(br, 20),
         RigidA = br.ReadInt32(),
         RigidB = br.ReadInt32(),
         Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         Rotation = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         LinearLowerLimit = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         LinearUpperLimit = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         AngularLowerLimit = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         AngularUpperLimit = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         LinearSpringStiffness = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
         AngularSpringStiffness = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() },
     });
 }
Exemplo n.º 11
0
 public void Write(BinaryWriter bw)
 {
     PmdDocument.WritePmdString(bw, this.Name, 20);
     bw.Write(this.RelatedBone);
     bw.Write(this.Group);
     bw.Write((ushort)this.CollidableGroups);
     bw.Write((byte)this.Shape);
     this.Size.ForEach(bw.Write);
     this.Position.ForEach(bw.Write);
     this.Rotation.ForEach(bw.Write);
     bw.Write(this.Mass);
     bw.Write(this.LinearDamping);
     bw.Write(this.AngularDamping);
     bw.Write(this.Restitution);
     bw.Write(this.Friction);
     bw.Write((byte)this.Kind);
 }
Exemplo n.º 12
0
        public static PmdMorph Parse(BinaryReader br)
        {
            var rt = new PmdMorph
            {
                Name = PmdDocument.ReadPmdString(br, 20),
            };
            var count = br.ReadUInt32();

            rt.Kind = (PmdMorphKind)br.ReadByte();

            for (uint i = 0; i < count; i++)
            {
                rt.Indices.Add((ushort)br.ReadUInt32());
                rt.Offsets.Add(new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() });
            }

            return(rt);
        }
Exemplo n.º 13
0
 public static PmdRigidBody Parse(BinaryReader br)
 {
     return(new PmdRigidBody
     {
         Name = PmdDocument.ReadPmdString(br, 20),
         RelatedBone = br.ReadInt16(),
         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 = (PmdRigidKind)br.ReadByte(),
     });
 }
Exemplo n.º 14
0
        public static PmdMorph Parse(BinaryReader br, PmdDocument doc, PmdMorph morphBase)
        {
            var rt = new PmdMorph
            {
                Name = PmdDocument.ReadPmdString(br, 20),
            };
            var count = br.ReadUInt32();

            rt.Kind = (PmdMorphKind)br.ReadByte();

            for (uint i = 0; i < count; i++)
            {
                var idx = (ushort)br.ReadUInt32();

                rt.Indices.Add(rt.Kind == PmdMorphKind.None ? doc.Vertices[idx] : morphBase.Indices[idx]);
                rt.Offsets.Add(new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() });
            }

            return rt;
        }
Exemplo n.º 15
0
        public static PmdDocument Parse(Stream stream)
        {
            var rt = new PmdDocument();

            // leave open
            var br = new BinaryReader(stream);
            var header = ReadPmdString(br, 3);

            if (header != "Pmd")
                throw new InvalidOperationException("invalid format");

            rt.Version = br.ReadSingle();

            if (rt.Version >= 2)
                throw new NotSupportedException("specified format version not supported");

            rt.ModelName = ReadPmdString(br, 20);
            rt.Description = ReadPmdString(br, 256);

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
                rt.Vertices.Add(PmdVertex.Parse(br, rt));

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
                rt.Indices.Add(rt.Vertices[br.ReadUInt16()]);

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
                rt.Materials.Add(PmdMaterial.Parse(br));

            Enumerable.Range(0, br.ReadUInt16()).Select(_ =>
            {
                while (rt.Bones.Count <= _)
                    rt.Bones.Add(new PmdBone());

                return rt.Bones[_];
            }).ForEach(_ => _.Parse(br, rt));

            for (var i = br.ReadUInt16() - 1; i >= 0; i--)
                rt.IK.Add(PmdIK.Parse(br, rt));

            var morphs = br.ReadUInt16();
            PmdMorph morphBase = null;

            for (ushort i = 0; i < morphs; i++)
            {
                var m = PmdMorph.Parse(br, rt, morphBase);

                if (m.Kind == PmdMorphKind.None)
                    morphBase = m;
                else
                    rt.Morphs.Add(m);
            }

            for (var i = br.ReadByte() - 1; i >= 0; i--)
                rt.MorphDisplayList.Add(rt.Morphs[br.ReadUInt16() - 1]);

            var visibleBoneCategories = br.ReadByte();

            for (byte i = 0; i < visibleBoneCategories; i++)
                rt.BoneDisplayList.Add(PmdDisplayList.Parse(br));

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
            {
                var bone = rt.Bones[br.ReadInt16()];

                rt.BoneDisplayList[br.ReadByte() - 1].Bones.Add(bone);
            }

            if (br.GetRemainingLength() > 0)
            {
                rt.EnglishCompatible = br.ReadBoolean();

                if (rt.EnglishCompatible)
                {
                    rt.EnglishModelName = ReadPmdString(br, 20);
                    rt.EnglishDescription = ReadPmdString(br, 256);

                    for (ushort i = 0; i < rt.Bones.Count; i++)
                        rt.Bones[i].EnglishName = ReadPmdString(br, 20);

                    for (ushort i = 0; i < morphs - 1; i++)
                        rt.Morphs[i].EnglishName = ReadPmdString(br, 20);

                    for (byte i = 0; i < visibleBoneCategories; i++)
                        rt.BoneDisplayList[i].EnglishName = ReadPmdString(br, 50);
                }

                if (br.GetRemainingLength() > 0)
                    rt.ToonFileNames = Enumerable.Range(0, 10).Select(_ => ReadPmdString(br, 100)).ToList();

                if (br.GetRemainingLength() > 0)
                {
                    for (var i = br.ReadInt32() - 1; i >= 0; i--)
                        rt.Rigids.Add(PmdRigidBody.Parse(br));

                    for (var i = br.ReadInt32() - 1; i >= 0; i--)
                        rt.Constraints.Add(PmdConstraint.Parse(br));
                }
            }

            return rt;
        }
Exemplo n.º 16
0
        public static PmdDocument Parse(Stream stream)
        {
            var rt = new PmdDocument();

            // leave open
            var br = new BinaryReader(stream);
            var header = ReadPmdString(br, 3);

            if (header != "Pmd")
                throw new InvalidOperationException("invalid format");

            rt.Version = br.ReadSingle();

            if (rt.Version >= 2)
                throw new NotSupportedException("specified format version not supported");

            rt.ModelName = ReadPmdString(br, 20);
            rt.Description = ReadPmdString(br, 256);

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
                rt.Vertices.Add(PmdVertex.Parse(br));

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
                rt.Indices.Add(br.ReadUInt16());

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
                rt.Materials.Add(PmdMaterial.Parse(br));

            var bones = br.ReadUInt16();

            for (ushort i = 0; i < bones; i++)
                rt.Bones.Add(PmdBone.Parse(br));

            for (var i = br.ReadUInt16() - 1; i >= 0; i--)
                rt.IK.Add(PmdIK.Parse(br));

            var morphs = br.ReadUInt16();

            for (ushort i = 0; i < morphs; i++)
                rt.Morphs.Add(PmdMorph.Parse(br));

            for (var i = br.ReadByte() - 1; i >= 0; i--)
                rt.VisibleMorphs.Add(br.ReadUInt16());

            var visibleBoneCategories = br.ReadByte();

            for (byte i = 0; i < visibleBoneCategories; i++)
                rt.VisibleBoneCategories.Add(ReadPmdString(br, 50));

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
                rt.VisibleBones.Add(br.ReadInt16(), br.ReadByte());

            if (br.GetRemainingLength() > 0)
            {
                rt.EnglishCompatible = br.ReadBoolean();

                if (rt.EnglishCompatible)
                {
                    rt.EnglishModelName = ReadPmdString(br, 20);
                    rt.EnglishDescription = ReadPmdString(br, 256);

                    for (ushort i = 0; i < bones; i++)
                        rt.EnglishBoneNames.Add(ReadPmdString(br, 20));

                    for (ushort i = 0; i < morphs - 1; i++)
                        rt.EnglishMorphNames.Add(ReadPmdString(br, 20));

                    for (byte i = 0; i < visibleBoneCategories; i++)
                        rt.EnglishVisibleBoneCategories.Add(ReadPmdString(br, 50));
                }

                if (br.GetRemainingLength() > 0)
                    rt.ToonFileNames = Enumerable.Range(0, 10).Select(_ => ReadPmdString(br, 100)).ToList();

                if (br.GetRemainingLength() > 0)
                {
                    for (var i = br.ReadInt32() - 1; i >= 0; i--)
                        rt.Rigids.Add(PmdRigidBody.Parse(br));

                    for (var i = br.ReadInt32() - 1; i >= 0; i--)
                        rt.Constraints.Add(PmdConstraint.Parse(br));
                }
            }

            return rt;
        }
Exemplo n.º 17
0
 public PmdIndexCache(PmdDocument doc)
 {
     this.doc = doc;
     this.Vertices = doc.Vertices.Select((i, j) => Tuple.Create(i, j)).ToDictionary(_ => _.Item1, _ => _.Item2);
     this.Bones = doc.Bones.Select((i, j) => Tuple.Create(i, j)).ToDictionary(_ => _.Item1, _ => _.Item2);
 }
Exemplo n.º 18
0
        public static PmdDocument Parse(Stream stream)
        {
            var rt = new PmdDocument();

            // leave open
            var br     = new BinaryReader(stream);
            var header = ReadPmdString(br, 3);

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

            rt.Version = br.ReadSingle();

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

            rt.ModelName   = ReadPmdString(br, 20);
            rt.Description = ReadPmdString(br, 256);

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
            {
                rt.Vertices.Add(PmdVertex.Parse(br));
            }

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
            {
                rt.Indices.Add(br.ReadUInt16());
            }

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
            {
                rt.Materials.Add(PmdMaterial.Parse(br));
            }

            var bones = br.ReadUInt16();

            for (ushort i = 0; i < bones; i++)
            {
                rt.Bones.Add(PmdBone.Parse(br));
            }

            for (var i = br.ReadUInt16() - 1; i >= 0; i--)
            {
                rt.IK.Add(PmdIK.Parse(br));
            }

            var morphs = br.ReadUInt16();

            for (ushort i = 0; i < morphs; i++)
            {
                rt.Morphs.Add(PmdMorph.Parse(br));
            }

            for (var i = br.ReadByte() - 1; i >= 0; i--)
            {
                rt.VisibleMorphs.Add(br.ReadUInt16());
            }

            var visibleBoneCategories = br.ReadByte();

            for (byte i = 0; i < visibleBoneCategories; i++)
            {
                rt.VisibleBoneCategories.Add(ReadPmdString(br, 50));
            }

            for (var i = br.ReadInt32() - 1; i >= 0; i--)
            {
                rt.VisibleBones.Add(br.ReadInt16(), br.ReadByte());
            }

            if (br.GetRemainingLength() > 0)
            {
                rt.EnglishCompatible = br.ReadBoolean();

                if (rt.EnglishCompatible)
                {
                    rt.EnglishModelName   = ReadPmdString(br, 20);
                    rt.EnglishDescription = ReadPmdString(br, 256);

                    for (ushort i = 0; i < bones; i++)
                    {
                        rt.EnglishBoneNames.Add(ReadPmdString(br, 20));
                    }

                    for (ushort i = 0; i < morphs - 1; i++)
                    {
                        rt.EnglishMorphNames.Add(ReadPmdString(br, 20));
                    }

                    for (byte i = 0; i < visibleBoneCategories; i++)
                    {
                        rt.EnglishVisibleBoneCategories.Add(ReadPmdString(br, 50));
                    }
                }

                if (br.GetRemainingLength() > 0)
                {
                    rt.ToonFileNames = Enumerable.Range(0, 10).Select(_ => ReadPmdString(br, 100)).ToList();
                }

                if (br.GetRemainingLength() > 0)
                {
                    for (var i = br.ReadInt32() - 1; i >= 0; i--)
                    {
                        rt.Rigids.Add(PmdRigidBody.Parse(br));
                    }

                    for (var i = br.ReadInt32() - 1; i >= 0; i--)
                    {
                        rt.Constraints.Add(PmdConstraint.Parse(br));
                    }
                }
            }

            return(rt);
        }