X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=Automap%2FData%2FColumnMeta.cs;h=b7670666c1604beb67c2a6f0870e961f1f45fe44;hb=refs%2Fheads%2FSplit_renderers;hp=bd07aaa25945e06884583cba63d422bbfefc27c5;hpb=3a26629e3ee0961a34ddcac63e636581a371a7b1;p=automap%2Fautomap.git diff --git a/Automap/Data/ColumnMeta.cs b/Automap/Data/ColumnMeta.cs index bd07aaa..b767066 100644 --- a/Automap/Data/ColumnMeta.cs +++ b/Automap/Data/ColumnMeta.cs @@ -1,13 +1,16 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; +using System.Collections.Specialized; + using Vintagestory.API.MathTools; using Vintagestory.API.Common; using ProtoBuf; - +using System.IO; +using System.Collections.ObjectModel; +using System.Text; +using Vintagestory.API.Client; namespace Automap { @@ -15,43 +18,61 @@ namespace Automap public struct ColumnMeta { [ProtoMember(1)] + [DisplayName(0, "Coords.")] public Vec2i Location; [ProtoMember(2)] + [DisplayName(1, "Age")] public TimeSpan ChunkAge;//OLDEST CHUNK. from chunk last edit [ProtoMember(3)] + [DisplayName(2, "Temp.")] public float Temperature;// Temperature - surface [ProtoMember(4)] + [DisplayName(3, "Y Max.")] public ushort YMax;// Y feature height [ProtoMember(5)] + //[DisplayName(10, "Rocks")] public Dictionary RockRatio;//[Column] Geographic region (rock) Ratio. [BlockID * count] [ProtoMember(6)] + [DisplayName(4, "Fert.")] public float Fertility; [ProtoMember(7)] + [DisplayName(5, "Forest")] public float ForestDensity; [ProtoMember(8)] + [DisplayName(6, "Rain")] public float Rainfall; [ProtoMember(9)] + [DisplayName(7, "Shrub")] public float ShrubDensity; [ProtoMember(10)] - public ushort AirBlocks; + [DisplayName(8, "Air blocks")] + public uint AirBlocks; [ProtoMember(11)] - public ushort NonAirBlocks; + [DisplayName(9, "Non-air")] + public uint NonAirBlocks; + + [ProtoMember(12)] + public byte ChunkSize; + - //[ProtoMember(12,OverwriteList = true)] [ProtoIgnore] - public ushort[,] HeightMap; + public ushort[,] HeightMap;//Needs to be 'flattened' for Protocol-Buffer serialization + + [ProtoMember(13)] + private ushort[] _flattened_HeightMap; - public ColumnMeta(Vec2i loc, int chunkSize = 32) + + public ColumnMeta(Vec2i loc, byte chunkSize = 32) { Location = loc; ChunkAge = TimeSpan.Zero; @@ -64,7 +85,9 @@ namespace Automap ShrubDensity = 0f; AirBlocks = 0; NonAirBlocks = 0; - HeightMap = new ushort[chunkSize, chunkSize]; + ChunkSize = chunkSize; + HeightMap = new ushort[ChunkSize, ChunkSize]; + _flattened_HeightMap = null; } internal void UpdateFieldsFrom(ClimateCondition climate, IMapChunk mapChunk, TimeSpan chunkAge) @@ -77,8 +100,60 @@ namespace Automap this.ShrubDensity = climate.ShrubDensity; this.YMax = mapChunk.YMax; + } + + [ProtoBeforeSerialization] + private void PrepareData() + { + + if (HeightMap != null) + { + _flattened_HeightMap = new ushort[ChunkSize * ChunkSize]; + int flatIndex = 0; + + for (byte col = 0; col < ChunkSize; col++) + { + for (byte row = 0; row < ChunkSize; row++) + { + _flattened_HeightMap[flatIndex] = HeightMap[col, row]; + flatIndex++; + } + } + + } } + + + [ProtoAfterDeserialization] + private void PostProcess() + { + ChunkSize = (ChunkSize == byte.MinValue) ? (byte)32 : ChunkSize;//Not good - if chunk wasn't 32 orignally! + + if (this.HeightMap == null || this.HeightMap.Length != (ChunkSize * ChunkSize)) { + this.HeightMap = new ushort[ChunkSize, ChunkSize]; + } + + if (_flattened_HeightMap != null) + { + int col, row; + var bitMasker = new BitVector32(0); + var rowSection = BitVector32.CreateSection((short) (ChunkSize - 1)); + var colSection = BitVector32.CreateSection((short) (ChunkSize - 1), rowSection); + + for (uint rowcol = 0; rowcol < (ChunkSize * ChunkSize); rowcol++) + { + bitMasker = new BitVector32(data: (int) rowcol); + row = bitMasker[rowSection]; + col = bitMasker[colSection]; + HeightMap[col, row] = _flattened_HeightMap[rowcol]; + } + + } + + } + + } public class ColumnsMetadata : KeyedCollection @@ -160,6 +235,14 @@ namespace Automap base.Add(newItem); } + public void ClearMetadata( ) + { + for (int i = 0, maxItemsCount = this.Items.Count; i < maxItemsCount; i++) { + ColumnMeta entry = this.Items[i]; + entry.HeightMap = null; + entry.RockRatio = null;//Also regenerated when any chunk in a column is changed... + } + } + } } -