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); }
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); }); }
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); }
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() }, }); }
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(), }; }
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), }); }
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); }
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; }
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() }; }
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() }, }); }
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); }
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); }
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(), }); }
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; }
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; }
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; }
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); }
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); }