Example #1
0
 public override void Read(BinaryReader br, PmxDocument doc)
 {
     this.Vertex = doc.ReadVertex(br);
     this.Offset = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle() };
 }
Example #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.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;
        }