Example #1
0
        /// <inheritdoc/>
        public uint GetSize()
        {
            int size = MH2OHeader.GetSize() * 256;

            foreach (var header in MH2OHeaders)
            {
                if (header.Attributes != null && !header.Attributes.HasOnlyZeroes)
                {
                    size += MH2OAttribute.GetSize();
                }

                foreach (var instance in header.Instances)
                {
                    size += MH2OInstance.GetSize();

                    if (instance.RenderBitmapBytes.Length == (instance.Width * instance.Height + 7) / 8)
                    {
                        size += instance.RenderBitmapBytes.Length;
                    }
                    if (instance.VertexData != null)
                    {
                        size += MH2OInstanceVertexData.GetSize();
                    }
                }
            }
            return((uint)size);
        }
Example #2
0
        /// <inheritdoc/>
        public void LoadBinaryData(byte[] inData)
        {
            using (var ms = new MemoryStream(inData))
                using (var br = new BinaryReader(ms))
                {
                    for (int i = 0; i < 256; i++)
                    {
                        MH2OHeaders[i] = new MH2OHeader(br.ReadBytes(MH2OHeader.GetSize()));
                    }

                    foreach (var header in MH2OHeaders)
                    {
                        // load MH2O header subdata
                        if (header.LayerCount > 0)
                        {
                            // load MH2O instances
                            br.BaseStream.Position = header.OffsetInstances;
                            for (int i = 0; i < header.LayerCount; i++)
                            {
                                header.Instances[i] = new MH2OInstance(br.ReadBytes(MH2OInstance.GetSize()));
                            }

                            // load MH2O attributes
                            if (header.OffsetAttributes > 0)
                            {
                                br.BaseStream.Position = header.OffsetAttributes;
                                header.Attributes      = new MH2OAttribute(br.ReadBytes(MH2OAttribute.GetSize()));
                            }

                            // load MH2O instance subdata
                            foreach (var instance in header.Instances)
                            {
                                if (instance.OffsetExistsBitmap > 0)
                                {
                                    br.BaseStream.Position     = instance.OffsetExistsBitmap;
                                    instance.RenderBitmapBytes = br.ReadBytes(((instance.Width * instance.Height) + 7) / 8);
                                }

                                if (instance.OffsetVertexData > 0)
                                {
                                    br.BaseStream.Position = instance.OffsetVertexData;
                                    instance.VertexData    = new MH2OInstanceVertexData(br.ReadBytes(MH2OInstanceVertexData.GetSize(instance)), instance);
                                }
                            }
                        }
                    }
                }
        }