Esempio n. 1
0
        private List <Tuple <int, int> > WritePrimitives(EndianBinaryWriter writer)
        {
            List <Tuple <int, int> > outList = new List <Tuple <int, int> >();

            long start = writer.BaseStream.Position;

            foreach (Shape shape in Shapes)
            {
                foreach (Packet pack in shape.Packets)
                {
                    int offset = (int)(writer.BaseStream.Position - start);

                    foreach (Primitive prim in pack.Primitives)
                    {
                        prim.Write(writer, shape.Descriptor);
                    }

                    StreamUtility.PadStreamWithZero(writer, 32);

                    outList.Add(new Tuple <int, int>((int)((writer.BaseStream.Position - start) - offset), offset));
                }
            }

            return(outList);
        }
Esempio n. 2
0
        public void Write(EndianBinaryWriter writer)
        {
            long start = writer.BaseStream.Position;

            writer.WriteSignature("MDL3".ToCharArray());
            writer.Write(0); // Placeholder for section size
            writer.Write((short)Entries.Count);
            writer.Write((short)-1);

            writer.Write(0x40); // Offset to command data offset/size block
            writer.Write(0);
            writer.Write(0);
            writer.Write(0);
            writer.Write(0);
            writer.Write(0);

            StreamUtility.PadStreamWithString(writer, 32);

            long cmdBlockStart = writer.BaseStream.Position;

            for (int i = 0; i < Entries.Count; i++)
            {
                writer.Write(0);
                writer.Write(0);
            }

            StreamUtility.PadStreamWithString(writer, 32);

            for (int i = 0; i < Entries.Count; i++)
            {
                long absoluteStartOffset = writer.BaseStream.Position;
                long relativeStartOffset = writer.BaseStream.Position - cmdBlockStart - i * 8;

                Entries[i].Write(writer);

                StreamUtility.PadStreamWithZero(writer, 32);

                long size = writer.BaseStream.Position - absoluteStartOffset;
                writer.Seek((int)cmdBlockStart + (i * 8), System.IO.SeekOrigin.Begin);

                writer.Write((int)relativeStartOffset);
                writer.Write((int)size);

                writer.Seek(0, System.IO.SeekOrigin.End);
            }

            long subsection2StartOffset = writer.BaseStream.Position;

            writer.Seek((int)start + 0x10, System.IO.SeekOrigin.Begin);
            var x = (int)subsection2StartOffset - start;

            writer.Write((int)(subsection2StartOffset - start));
            writer.Seek((int)subsection2StartOffset, System.IO.SeekOrigin.Begin);
            for (int i = 0; i < Entries.Count; i++)
            {
                writer.Write(0);
                writer.Write(0);
                writer.Write(0);
                writer.Write(0);
            }

            long subsection3StartOffset = writer.BaseStream.Position;

            writer.Seek((int)start + 0x14, System.IO.SeekOrigin.Begin);
            writer.Write((int)(subsection3StartOffset - start));
            writer.Seek((int)subsection3StartOffset, System.IO.SeekOrigin.Begin);
            for (int i = 0; i < Entries.Count; i++)
            {
                writer.Write(0);
                writer.Write(0);
            }

            long subsection4StartOffset = writer.BaseStream.Position;

            writer.Seek((int)start + 0x18, System.IO.SeekOrigin.Begin);
            writer.Write((int)(subsection4StartOffset - start));
            writer.Seek((int)subsection4StartOffset, System.IO.SeekOrigin.Begin);
            for (int i = 0; i < Entries.Count; i++)
            {
                writer.Write((byte)1);
            }
            StreamUtility.PadStreamWithString(writer, 4);

            long subsection5StartOffset = writer.BaseStream.Position;

            writer.Seek((int)start + 0x1C, System.IO.SeekOrigin.Begin);
            writer.Write((int)(subsection5StartOffset - start));
            writer.Seek((int)subsection5StartOffset, System.IO.SeekOrigin.Begin);
            for (int i = 0; i < Entries.Count; i++)
            {
                writer.Write((short)i);
            }
            StreamUtility.PadStreamWithString(writer, 4);

            long stringTableStartOffset = writer.BaseStream.Position;

            writer.Seek((int)start + 0x20, System.IO.SeekOrigin.Begin);
            writer.Write((int)(stringTableStartOffset - start));
            writer.Seek((int)stringTableStartOffset, System.IO.SeekOrigin.Begin);
            writer.Write((short)0);

            StreamUtility.PadStreamWithString(writer, 32);

            long end    = writer.BaseStream.Position;
            long length = (end - start);

            writer.Seek((int)start + 4, System.IO.SeekOrigin.Begin);
            writer.Write((int)length);
            writer.Seek((int)end, System.IO.SeekOrigin.Begin);
        }