Beispiel #1
0
        static void ReadMH2O(BinaryReader fileReader, ADT adt)
        {
            var sig  = fileReader.ReadUInt32();
            var size = fileReader.ReadUInt32();

            long ofsMH2O = fileReader.BaseStream.Position;

            MH20Header[] mh20Header = new MH20Header[256];

            for (int i = 0; i < 256; i++)
            {
                mh20Header[i].ofsData1   = fileReader.ReadUInt32();
                mh20Header[i].LayerCount = fileReader.ReadUInt32();
                mh20Header[i].ofsData2   = fileReader.ReadUInt32();
            }

            // Rows
            for (int x = 0; x < 16; x++)
            {
                // Columns
                for (int y = 0; y < 16; y++)
                {
                    // Indexing is [col, row]
                    adt.LiquidInfo[x, y] = ProcessMH2O(fileReader, mh20Header[x * 16 + y], ofsMH2O);
                }
            }
        }
Beispiel #2
0
        static void ReadMH2O(BinaryReader fileReader, ADT adt)
        {
            var sig = fileReader.ReadUInt32();
            var size = fileReader.ReadUInt32();

            long ofsMH2O = fileReader.BaseStream.Position;
            MH20Header[] mh20Header = new MH20Header[256];

            for (int i = 0; i < 256; i++)
            {
                mh20Header[i].ofsData1 = fileReader.ReadUInt32();
                mh20Header[i].LayerCount = fileReader.ReadUInt32();
                mh20Header[i].ofsData2 = fileReader.ReadUInt32();
            }

            // Rows
            for (int x = 0; x < 16; x++)
            {
                // Columns
                for (int y = 0; y < 16; y++)
                {
                    // Indexing is [col, row]
                    adt.LiquidInfo[x, y] = ProcessMH2O(fileReader, mh20Header[x * 16 + y], ofsMH2O);
                }
            }
        }
Beispiel #3
0
        private static MH2O ProcessMH2O(BinaryReader fileReader, MH20Header header, long waterSegmentBase)
        {
            var water = new MH2O();

            if (header.LayerCount == 0)
            {
                water.Header.Used = false;
                return water;
            }

            water.Header.Used = true;

            fileReader.BaseStream.Position = waterSegmentBase + header.ofsData1;

            water.Header.Flags = (MH2OFlags)fileReader.ReadUInt16();

            water.Header.Type = (LiquidType)fileReader.ReadUInt16();
            water.Header.HeightLevel1 = fileReader.ReadSingle();
            water.Header.HeightLevel2 = fileReader.ReadSingle();
            water.Header.YOffset = fileReader.ReadByte();
            water.Header.XOffset = fileReader.ReadByte();
            water.Header.Width = fileReader.ReadByte();
            water.Header.Height = fileReader.ReadByte();

            var ofsWaterFlags = fileReader.ReadUInt32();
            var ofsWaterHeightMap = fileReader.ReadUInt32();

            water.RenderBitMap = new byte[water.Header.Height];
            if (ofsWaterFlags != 0)
            {
                fileReader.BaseStream.Position = waterSegmentBase + ofsWaterFlags;
                for (var i = 0; i < water.Header.Height; i++)
                {
                    if (i < (ofsWaterHeightMap - ofsWaterFlags))
                    {
                        water.RenderBitMap[i] = fileReader.ReadByte();
                    }
                    else
                    {
                        water.RenderBitMap[i] = 0;
                    }
                }
            }

            //var heightMapLen = (water.Header.Width + 1) * (water.Header.Height + 1);
            var heightMapLen = (TerrainConstants.UnitsPerChunkSide + 1) * (TerrainConstants.UnitsPerChunkSide + 1);
            water.HeightsArray = new float[heightMapLen];

            // If flags is 2, the chunk is for an ocean, and there is no heightmap
            if (ofsWaterHeightMap != 0 && (water.Header.Flags & MH2OFlags.Ocean) == 0)
            {
                fileReader.BaseStream.Position = waterSegmentBase + ofsWaterHeightMap;
                for (var i = 0; i < heightMapLen; i++)
                {
                    water.HeightsArray[i] = fileReader.ReadSingle();
                    if (water.HeightsArray[i].IsWithinEpsilon(0.0f))
                    {
                        water.HeightsArray[i] = water.Header.HeightLevel1;
                    }
                }
            }
            else
            {
                for (var i = 0; i < heightMapLen; i++)
                {
                    water.HeightsArray[i] = water.Header.HeightLevel1;
                }
            }

            return water;
        }
Beispiel #4
0
        static void ReadMH2O(BinaryReader fileReader, ADT adt)
        {
            var sig = fileReader.ReadUInt32();
            var size = fileReader.ReadUInt32();

            var ofsMH2O = fileReader.BaseStream.Position;
            var mh20Header = new MH20Header[256];

            for (var i = 0; i < 256; i++)
            {
                mh20Header[i].ofsInfo = fileReader.ReadUInt32();
                mh20Header[i].LayerCount = fileReader.ReadUInt32();
                //if (mh20Header[i].LayerCount > 0)
                //{
                //    Console.WriteLine();
                //}
                mh20Header[i].ofsRenderMask = fileReader.ReadUInt32();
            }

            // Rows
            for (var x = 0; x < 16; x++)
            {
                // Columns
                for (var y = 0; y < 16; y++)
                {
                    // Indexing is [col, row]
                    adt.LiquidInfo[y, x] = ProcessMH2O(fileReader, mh20Header[x*16 + y], ofsMH2O);
                }
            }
        }
Beispiel #5
0
        private static MH2O ProcessMH2O(BinaryReader fileReader, MH20Header header, long waterSegmentBase)
        {
            var water = new MH2O();

            if (header.LayerCount == 0)
            {
                water.Header.Used = false;
                return(water);
            }

            water.Header.Used = true;

            fileReader.BaseStream.Position = waterSegmentBase + header.ofsData1;

            water.Header.Flags = (MH2OFlags)fileReader.ReadUInt16();

            water.Header.Type         = (LiquidType)fileReader.ReadUInt16();
            water.Header.HeightLevel1 = fileReader.ReadSingle();
            water.Header.HeightLevel2 = fileReader.ReadSingle();
            water.Header.YOffset      = fileReader.ReadByte();
            water.Header.XOffset      = fileReader.ReadByte();
            water.Header.Width        = fileReader.ReadByte();
            water.Header.Height       = fileReader.ReadByte();

            var ofsWaterFlags     = fileReader.ReadUInt32();
            var ofsWaterHeightMap = fileReader.ReadUInt32();

            water.RenderBitMap = new byte[water.Header.Height];
            if (ofsWaterFlags != 0)
            {
                fileReader.BaseStream.Position = waterSegmentBase + ofsWaterFlags;
                for (var i = 0; i < water.Header.Height; i++)
                {
                    if (i < (ofsWaterHeightMap - ofsWaterFlags))
                    {
                        water.RenderBitMap[i] = fileReader.ReadByte();
                    }
                    else
                    {
                        water.RenderBitMap[i] = 0;
                    }
                }
            }


            //var heightMapLen = (water.Header.Width + 1) * (water.Header.Height + 1);
            var heightMapLen = (TerrainConstants.UnitsPerChunkSide + 1) * (TerrainConstants.UnitsPerChunkSide + 1);

            water.HeightsArray = new float[heightMapLen];

            // If flags is 2, the chunk is for an ocean, and there is no heightmap
            if (ofsWaterHeightMap != 0 && (water.Header.Flags & MH2OFlags.Ocean) == 0)
            {
                fileReader.BaseStream.Position = waterSegmentBase + ofsWaterHeightMap;
                for (var i = 0; i < heightMapLen; i++)
                {
                    water.HeightsArray[i] = fileReader.ReadSingle();
                    if (water.HeightsArray[i].IsWithinEpsilon(0.0f))
                    {
                        water.HeightsArray[i] = water.Header.HeightLevel1;
                    }
                }
            }
            else
            {
                for (var i = 0; i < heightMapLen; i++)
                {
                    water.HeightsArray[i] = water.Header.HeightLevel1;
                }
            }

            return(water);
        }