OSDN Git Service

W.I.P. Experimental use of Heightmap to replace Region map data
authormelchior <melchior@users.osdn.me>
Tue, 10 Nov 2020 02:01:57 +0000 (21:01 -0500)
committermelchior <melchior@users.osdn.me>
Tue, 10 Nov 2020 02:01:57 +0000 (21:01 -0500)
(edge incline shading)

Automap/Renderers/AChunkRenderer.cs
Automap/Renderers/AlternateRenderer.cs
Automap/Renderers/StandardRenderer.cs
Automap/Subsystems/AutomapSystem.cs

index d44427f..01661e2 100644 (file)
@@ -30,7 +30,7 @@ namespace Automap
 
                }
 
 
                }
 
-        public abstract void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mapChunk, ColumnMeta metaData,  out uint pixelCount);
+        public abstract void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mapChunk, ColumnMeta targetColMeta, ref ColumnsMetadata allCols, out uint pixelCount);
 
                public virtual PngWriter SetupPngImage(Vec2i coord, string path, string chunkPath, ref ColumnMeta metadata)
                {
 
                public virtual PngWriter SetupPngImage(Vec2i coord, string path, string chunkPath, ref ColumnMeta metadata)
                {
index 78f3298..387c77a 100644 (file)
@@ -22,7 +22,7 @@ namespace Automap
                        
                }
 
                        
                }
 
-               public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta metaData, out uint pixelCount)
+               public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta metaData, ref ColumnsMetadata allCols, out uint pixelCount)
                {
                        pixelCount = 0;
                        BlockPos tmpPos = new BlockPos();
                {
                        pixelCount = 0;
                        BlockPos tmpPos = new BlockPos();
index 6613555..740623d 100644 (file)
@@ -1,4 +1,5 @@
 using System;
 using System;
+using System.Collections.Generic;
 using System.Linq;
 
 using Hjg.Pngcs;
 using System.Linq;
 
 using Hjg.Pngcs;
@@ -23,7 +24,7 @@ namespace Automap
 
                }
 
 
                }
 
-               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( );
                {
                pixelCount = 0;
                BlockPos tmpPos = new BlockPos( );
@@ -34,52 +35,74 @@ namespace Automap
                //pre-create PNG line slices...
                ImageLine[ ] lines = Enumerable.Repeat(new object( ), chunkSize).Select(l => new ImageLine(this.PngWriter.ImgInfo)).ToArray( );
 
                //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
                }
 
                // 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);
+
+               /* 
+               For missing corners / cardinal heightmaps...
+               make fake heightmap dummy
+               */
+
+               if (allCols.Contains(south_west)) {
+               mapCornerChunks.Add(allCols[south_west]);
+               }
+               else {                  
+               mapCornerChunks.Add(targetColMeta);//TODO: Make mirror image - heightmap
+               }
+
+               if (allCols.Contains(south)) {
+               mapCornerChunks.Add(allCols[south]);
+               }
+               else {
+               mapCornerChunks.Add(targetColMeta);//TODO: Make mirror image - heightmap
+               }
+
+               if (allCols.Contains(west)) {
+               mapCornerChunks.Add(allCols[west]);
+               }
+               else {
+               mapCornerChunks.Add(targetColMeta);//TODO: Make mirror image - heightmap
+               }
+
 
                for (int pixelIndex = 0; pixelIndex < (chunkSize * chunkSize); pixelIndex++) {
                MapUtil.PosInt2d(pixelIndex, chunkSize, localpos);
                int localX = localpos.X;
                int localZ = localpos.Y;
 
                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!
 
                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;
 
 
                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;
 
                int topX = localX - 1;
                int botX = localX;
@@ -87,27 +110,27 @@ namespace Automap
                int rightZ = localZ;
 
                if (topX < 0 && leftZ < 0) {
                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) {
                }
                else {
                if (topX < 0) {
-               leftTopMapChunk = mapChunks[1];
-               rightTopMapChunk = mapChunks[1];
+               leftTopMapChunk = mapCornerChunks[1];
+               rightTopMapChunk = mapCornerChunks[1];
                }
                if (leftZ < 0) {
                }
                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);
                }
                }
 
                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 = Math.Sign(localY - leftTopMapChunk.HeightMap[topX, leftZ]);
+               rightTop = Math.Sign(localY - rightTopMapChunk.HeightMap[topX, rightZ]);
+               leftBot = Math.Sign(localY - leftBotMapChunk.HeightMap[botX, leftZ]);
 
                float slopeness = (leftTop + rightTop + leftBot);
 
 
                float slopeness = (leftTop + rightTop + leftBot);
 
index 4013b9a..e83bc1a 100644 (file)
@@ -132,9 +132,14 @@ namespace Automap
 
                private void ChunkAChanging(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason)
                {
 
                private void ChunkAChanging(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason)
                {
-                       Vec2i topPosition = new Vec2i(chunkCoord.X, chunkCoord.Z);
-
-                       columnCounter.AddOrUpdate(topPosition, 1, (key, colAct) => colAct + 1);
+               Vec2i topPosition = new Vec2i(chunkCoord.X, chunkCoord.Z);
+
+               //TODO: Track Y Chunk - Column, surface chunks being more important
+               //Only NEW/LOADED chunks unless edits > N 
+               //if (reason == EnumChunkDirtyReason.NewlyCreated || reason == EnumChunkDirtyReason.NewlyLoaded)
+               //{
+               columnCounter.AddOrUpdate(topPosition, 1, (key, colAct) => colAct + 1);
+               //}
                }
 
                private void AwakenCartographer(float delayed)
                }
 
                private void AwakenCartographer(float delayed)
@@ -221,7 +226,7 @@ namespace Automap
                                                ProcessChunkBlocks(mostActiveCol.Key, mapChunk, ref chunkMeta);
 
                                                ChunkRenderer.SetupPngImage(mostActiveCol.Key, path, _chunkPath, ref chunkMeta);
                                                ProcessChunkBlocks(mostActiveCol.Key, mapChunk, ref chunkMeta);
 
                                                ChunkRenderer.SetupPngImage(mostActiveCol.Key, path, _chunkPath, ref chunkMeta);
-                                               ChunkRenderer.GenerateChunkPngShard(mostActiveCol.Key, mapChunk, chunkMeta, out updatedPixels);
+                                               ChunkRenderer.GenerateChunkPngShard(mostActiveCol.Key, mapChunk, chunkMeta, ref chunkTopMetadata, out updatedPixels);
 
                                                if (updatedPixels > 0)
                                                {
 
                                                if (updatedPixels > 0)
                                                {