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); } } }
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); } } }
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; }
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); } } }
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); }