OSDN Git Service

Added configurability for Renderer choice,
[automap/automap.git] / Automap / Renderers / StandardRenderer.cs
index 6613555..a47897e 100644 (file)
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using System.Linq;
 
 using Hjg.Pngcs;
@@ -12,6 +13,7 @@ namespace Automap
 {
        public class StandardRenderer : AChunkRenderer
        {
+               public const string Name = @"Standard";
 
                /// <summary>
                /// Renders shards similar to the Default VS version, plus P.O.I. markings.
@@ -20,10 +22,10 @@ namespace Automap
                /// <param name="logger">Logger.</param>
                public StandardRenderer(ICoreClientAPI clientAPI, ILogger logger, bool seasonalColor) : base(clientAPI, logger, seasonalColor)
                {
-
+                       
                }
 
-               public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta metaData, out uint pixelCount)
+               public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta targetColMeta, ref ColumnsMetadata allCols, out uint pixelCount)
                {
                pixelCount = 0;
                BlockPos tmpPos = new BlockPos( );
@@ -34,52 +36,79 @@ namespace Automap
                //pre-create PNG line slices...
                ImageLine[ ] lines = Enumerable.Repeat(new object( ), chunkSize).Select(l => new ImageLine(this.PngWriter.ImgInfo)).ToArray( );
 
-               int topChunkY = metaData.YMax / chunkSize;
+               int topChunkY = targetColMeta.YMax / chunkSize;
 
-               for (int chunkY = 0; chunkY <= topChunkY; chunkY++) 
-               {
-                       chunksColumn[chunkY] = ClientAPI.World.BlockAccessor.GetChunk(chunkPos.X, chunkY, chunkPos.Y);
-                       WorldChunk ownChunk = chunksColumn[chunkY] as WorldChunk;
-                       if (ownChunk != null) 
-                               {
-                               if (ownChunk.IsPacked( )) ownChunk.Unpack( );//Gah - probably done already by chunk processor
-                               }
-                               else 
-                               {
-                               Logger.Warning("CHUNK A.W.O.L. : X{0} Y{1} Z{2} - Missing slice FOR COLUMN", chunkPos.X, chunkY, chunkPos.Y);
-                               //return;
-                               }
+               for (int chunkY = 0; chunkY <= topChunkY; chunkY++) {
+               chunksColumn[chunkY] = ClientAPI.World.BlockAccessor.GetChunk(chunkPos.X, chunkY, chunkPos.Y);
+               WorldChunk ownChunk = chunksColumn[chunkY] as WorldChunk;
+               if (ownChunk != null) {
+               if (ownChunk.IsPacked( )) ownChunk.Unpack( );//Gah - probably done already by chunk processor
+               }
+               else {
+               Logger.Warning("CHUNK A.W.O.L. : X{0} Y{1} Z{2} - Missing slice FOR COLUMN", chunkPos.X, chunkY, chunkPos.Y);
+               //return;
+               }
                }
 
                // Prefetch map chunks, in pattern
-               IMapChunk[ ] mapChunks = new IMapChunk[ ]
-               {
-                       ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X - 1, chunkPos.Y - 1),
-                       ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X - 1, chunkPos.Y),
-                       ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X, chunkPos.Y - 1)
-               };
-               
+               var mapCornerChunks = new List<ColumnMeta>(3);
+
+               var south_west = new Vec2i(chunkPos.X - 1, chunkPos.Y - 1);
+               var west = new Vec2i(chunkPos.X - 1, chunkPos.Y);
+               var south = new Vec2i(chunkPos.X, chunkPos.Y - 1);
+
+               bool nullSouthWest = false, nullSouth = false, nullWest = false;
+
+               /* 
+               For missing corners / cardinal heightmaps...
+               make fake heightmap dummy
+               */
+
+               if (allCols.Contains(south_west)) {
+               mapCornerChunks.Add(allCols[south_west]);               
+               }
+               else {
+               nullSouthWest = true;
+               mapCornerChunks.Add(targetColMeta);//Temporary!
+               }
+
+               if (allCols.Contains(south)) {
+               mapCornerChunks.Add(allCols[south]);
+               }
+               else {
+               nullSouth = true;
+               mapCornerChunks.Add(targetColMeta);//Temporary!
+               }
+
+               if (allCols.Contains(west)) {
+               mapCornerChunks.Add(allCols[west]);
+               }
+               else {
+               nullWest = true;
+               mapCornerChunks.Add(targetColMeta);//Temporary!
+               }
+
 
                for (int pixelIndex = 0; pixelIndex < (chunkSize * chunkSize); pixelIndex++) {
                MapUtil.PosInt2d(pixelIndex, chunkSize, localpos);
                int localX = localpos.X;
                int localZ = localpos.Y;
-               ushort localY = metaData.HeightMap[localX, localZ];
+               ushort localY = targetColMeta.HeightMap[localX, localZ];
 
                int localChunkY = localY / chunkSize;
                if (localChunkY >= (chunksColumn.Length)) continue;//Out of range!
                if (chunksColumn[localChunkY] == null) continue;//BIG Gaps!
-               if (mapChunks.Any(chks => chks == null)) {
-               //Logger.Warning("MapChunk A.W.O.L. near : X{0} Y{1} Z{2}       - ", localX, localY, localZ);
-               continue;
-               }
+               //if (mapCornerChunks.Any(chks => chks == null)) {
+               //Logger.Warning("mapCornerChunks A.W.O.L. near : X{0} Y{1} Z{2}        - ", localX, localY, localZ);
+               //continue;
+               //}
 
                float slopeBoost = 1;
                int leftTop, rightTop, leftBot;
 
-               IMapChunk leftTopMapChunk = mc;
-               IMapChunk rightTopMapChunk = mc;
-               IMapChunk leftBotMapChunk = mc;
+               ColumnMeta leftTopMapChunk = targetColMeta;
+               ColumnMeta rightTopMapChunk = targetColMeta;
+               ColumnMeta leftBotMapChunk = targetColMeta;
 
                int topX = localX - 1;
                int botX = localX;
@@ -87,27 +116,27 @@ namespace Automap
                int rightZ = localZ;
 
                if (topX < 0 && leftZ < 0) {
-               leftTopMapChunk = mapChunks[0];
-               rightTopMapChunk = mapChunks[1];
-               leftBotMapChunk = mapChunks[2];
+               leftTopMapChunk = mapCornerChunks[0];
+               rightTopMapChunk = mapCornerChunks[1];
+               leftBotMapChunk = mapCornerChunks[2];
                }
                else {
                if (topX < 0) {
-               leftTopMapChunk = mapChunks[1];
-               rightTopMapChunk = mapChunks[1];
+               leftTopMapChunk = mapCornerChunks[1];
+               rightTopMapChunk = mapCornerChunks[1];
                }
                if (leftZ < 0) {
-               leftTopMapChunk = mapChunks[2];
-               leftBotMapChunk = mapChunks[2];
+               leftTopMapChunk = mapCornerChunks[2];
+               leftBotMapChunk = mapCornerChunks[2];
                }
                }
 
                topX = GameMath.Mod(topX, chunkSize);
                leftZ = GameMath.Mod(leftZ, chunkSize);
-               //TODO: Replace with Metadata Heightmap?
-               leftTop = leftTopMapChunk == null ? 0 : Math.Sign(localY - leftTopMapChunk.RainHeightMap[leftZ * chunkSize + topX]);
-               rightTop = rightTopMapChunk == null ? 0 : Math.Sign(localY - rightTopMapChunk.RainHeightMap[rightZ * chunkSize + topX]);
-               leftBot = leftBotMapChunk == null ? 0 : Math.Sign(localY - leftBotMapChunk.RainHeightMap[leftZ * chunkSize + botX]);
+               
+               leftTop = nullSouthWest ? 0 : Math.Sign(localY - leftTopMapChunk.HeightMap[topX, leftZ]);
+               rightTop = nullSouth ? 0 : Math.Sign(localY - rightTopMapChunk.HeightMap[topX, rightZ]);
+               leftBot = nullWest ? 0 : Math.Sign(localY - leftBotMapChunk.HeightMap[botX, leftZ]);
 
                float slopeness = (leftTop + rightTop + leftBot);