public override void Read(BinaryReader br, PmxDocument doc) { this.Vertex = doc.ReadVertex(br); this.Offset = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() }; }
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.ReadVertex(br)).ToList(); rt.Textures = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxTexture.Parse(br, rt)).ToList(); rt.Materials = Enumerable.Range(0, br.ReadInt32()).Select(_ => PmxMaterial.Parse(br, rt)).ToList(); Enumerable.Range(0, br.ReadInt32()).Select(_ => { while (rt.Bones.Count <= _) rt.Bones.Add(new PmxBone()); return rt.Bones[_]; }).ForEach(_ => _.Parse(br, rt)); Enumerable.Range(0, br.ReadInt32()).Select(_ => { while (rt.Morphs.Count <= _) rt.Morphs.Add(new PmxMorph()); return rt.Morphs[_]; }).ForEach(_ => _.Parse(br, rt)); 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; }