Automap (OSS) GIT software repository
Revision | fb10556337a87e9853f87ba4562e2263bfff1975 (tree) |
---|---|
Time | 2020-11-10 11:01:57 |
Author | ![]() |
Commiter | melchior |
W.I.P. Experimental use of Heightmap to replace Region map data
(edge incline shading)
@@ -30,7 +30,7 @@ namespace Automap | ||
30 | 30 | |
31 | 31 | } |
32 | 32 | |
33 | - public abstract void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mapChunk, ColumnMeta metaData, out uint pixelCount); | |
33 | + public abstract void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mapChunk, ColumnMeta targetColMeta, ref ColumnsMetadata allCols, out uint pixelCount); | |
34 | 34 | |
35 | 35 | public virtual PngWriter SetupPngImage(Vec2i coord, string path, string chunkPath, ref ColumnMeta metadata) |
36 | 36 | { |
@@ -22,7 +22,7 @@ namespace Automap | ||
22 | 22 | |
23 | 23 | } |
24 | 24 | |
25 | - public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta metaData, out uint pixelCount) | |
25 | + public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta metaData, ref ColumnsMetadata allCols, out uint pixelCount) | |
26 | 26 | { |
27 | 27 | pixelCount = 0; |
28 | 28 | BlockPos tmpPos = new BlockPos(); |
@@ -1,4 +1,5 @@ | ||
1 | 1 | using System; |
2 | +using System.Collections.Generic; | |
2 | 3 | using System.Linq; |
3 | 4 | |
4 | 5 | using Hjg.Pngcs; |
@@ -23,7 +24,7 @@ namespace Automap | ||
23 | 24 | |
24 | 25 | } |
25 | 26 | |
26 | - public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta metaData, out uint pixelCount) | |
27 | + public override void GenerateChunkPngShard(Vec2i chunkPos, IMapChunk mc, ColumnMeta targetColMeta, ref ColumnsMetadata allCols, out uint pixelCount) | |
27 | 28 | { |
28 | 29 | pixelCount = 0; |
29 | 30 | BlockPos tmpPos = new BlockPos( ); |
@@ -34,52 +35,74 @@ namespace Automap | ||
34 | 35 | //pre-create PNG line slices... |
35 | 36 | ImageLine[ ] lines = Enumerable.Repeat(new object( ), chunkSize).Select(l => new ImageLine(this.PngWriter.ImgInfo)).ToArray( ); |
36 | 37 | |
37 | - int topChunkY = metaData.YMax / chunkSize; | |
38 | + int topChunkY = targetColMeta.YMax / chunkSize; | |
38 | 39 | |
39 | - for (int chunkY = 0; chunkY <= topChunkY; chunkY++) | |
40 | - { | |
41 | - chunksColumn[chunkY] = ClientAPI.World.BlockAccessor.GetChunk(chunkPos.X, chunkY, chunkPos.Y); | |
42 | - WorldChunk ownChunk = chunksColumn[chunkY] as WorldChunk; | |
43 | - if (ownChunk != null) | |
44 | - { | |
45 | - if (ownChunk.IsPacked( )) ownChunk.Unpack( );//Gah - probably done already by chunk processor | |
46 | - } | |
47 | - else | |
48 | - { | |
49 | - Logger.Warning("CHUNK A.W.O.L. : X{0} Y{1} Z{2} - Missing slice FOR COLUMN", chunkPos.X, chunkY, chunkPos.Y); | |
50 | - //return; | |
51 | - } | |
40 | + for (int chunkY = 0; chunkY <= topChunkY; chunkY++) { | |
41 | + chunksColumn[chunkY] = ClientAPI.World.BlockAccessor.GetChunk(chunkPos.X, chunkY, chunkPos.Y); | |
42 | + WorldChunk ownChunk = chunksColumn[chunkY] as WorldChunk; | |
43 | + if (ownChunk != null) { | |
44 | + if (ownChunk.IsPacked( )) ownChunk.Unpack( );//Gah - probably done already by chunk processor | |
45 | + } | |
46 | + else { | |
47 | + Logger.Warning("CHUNK A.W.O.L. : X{0} Y{1} Z{2} - Missing slice FOR COLUMN", chunkPos.X, chunkY, chunkPos.Y); | |
48 | + //return; | |
49 | + } | |
52 | 50 | } |
53 | 51 | |
54 | 52 | // Prefetch map chunks, in pattern |
55 | - IMapChunk[ ] mapChunks = new IMapChunk[ ] | |
56 | - { | |
57 | - ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X - 1, chunkPos.Y - 1), | |
58 | - ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X - 1, chunkPos.Y), | |
59 | - ClientAPI.World.BlockAccessor.GetMapChunk(chunkPos.X, chunkPos.Y - 1) | |
60 | - }; | |
61 | - | |
53 | + var mapCornerChunks = new List<ColumnMeta>(3); | |
54 | + | |
55 | + var south_west = new Vec2i(chunkPos.X - 1, chunkPos.Y - 1); | |
56 | + var west = new Vec2i(chunkPos.X - 1, chunkPos.Y); | |
57 | + var south = new Vec2i(chunkPos.X, chunkPos.Y - 1); | |
58 | + | |
59 | + /* | |
60 | + For missing corners / cardinal heightmaps... | |
61 | + make fake heightmap dummy | |
62 | + */ | |
63 | + | |
64 | + if (allCols.Contains(south_west)) { | |
65 | + mapCornerChunks.Add(allCols[south_west]); | |
66 | + } | |
67 | + else { | |
68 | + mapCornerChunks.Add(targetColMeta);//TODO: Make mirror image - heightmap | |
69 | + } | |
70 | + | |
71 | + if (allCols.Contains(south)) { | |
72 | + mapCornerChunks.Add(allCols[south]); | |
73 | + } | |
74 | + else { | |
75 | + mapCornerChunks.Add(targetColMeta);//TODO: Make mirror image - heightmap | |
76 | + } | |
77 | + | |
78 | + if (allCols.Contains(west)) { | |
79 | + mapCornerChunks.Add(allCols[west]); | |
80 | + } | |
81 | + else { | |
82 | + mapCornerChunks.Add(targetColMeta);//TODO: Make mirror image - heightmap | |
83 | + } | |
84 | + | |
62 | 85 | |
63 | 86 | for (int pixelIndex = 0; pixelIndex < (chunkSize * chunkSize); pixelIndex++) { |
64 | 87 | MapUtil.PosInt2d(pixelIndex, chunkSize, localpos); |
65 | 88 | int localX = localpos.X; |
66 | 89 | int localZ = localpos.Y; |
67 | - ushort localY = metaData.HeightMap[localX, localZ]; | |
90 | + ushort localY = targetColMeta.HeightMap[localX, localZ]; | |
68 | 91 | |
69 | 92 | int localChunkY = localY / chunkSize; |
70 | 93 | if (localChunkY >= (chunksColumn.Length)) continue;//Out of range! |
71 | 94 | if (chunksColumn[localChunkY] == null) continue;//BIG Gaps! |
72 | - if (mapChunks.Any(chks => chks == null)) { | |
73 | - //Logger.Warning("MapChunk A.W.O.L. near : X{0} Y{1} Z{2} - ", localX, localY, localZ); | |
74 | - continue; | |
75 | - } | |
95 | + //if (mapCornerChunks.Any(chks => chks == null)) { | |
96 | + //Logger.Warning("mapCornerChunks A.W.O.L. near : X{0} Y{1} Z{2} - ", localX, localY, localZ); | |
97 | + //continue; | |
98 | + //} | |
76 | 99 | |
77 | 100 | float slopeBoost = 1; |
78 | 101 | int leftTop, rightTop, leftBot; |
79 | 102 | |
80 | - IMapChunk leftTopMapChunk = mc; | |
81 | - IMapChunk rightTopMapChunk = mc; | |
82 | - IMapChunk leftBotMapChunk = mc; | |
103 | + ColumnMeta leftTopMapChunk = targetColMeta; | |
104 | + ColumnMeta rightTopMapChunk = targetColMeta; | |
105 | + ColumnMeta leftBotMapChunk = targetColMeta; | |
83 | 106 | |
84 | 107 | int topX = localX - 1; |
85 | 108 | int botX = localX; |
@@ -87,27 +110,27 @@ namespace Automap | ||
87 | 110 | int rightZ = localZ; |
88 | 111 | |
89 | 112 | if (topX < 0 && leftZ < 0) { |
90 | - leftTopMapChunk = mapChunks[0]; | |
91 | - rightTopMapChunk = mapChunks[1]; | |
92 | - leftBotMapChunk = mapChunks[2]; | |
113 | + leftTopMapChunk = mapCornerChunks[0]; | |
114 | + rightTopMapChunk = mapCornerChunks[1]; | |
115 | + leftBotMapChunk = mapCornerChunks[2]; | |
93 | 116 | } |
94 | 117 | else { |
95 | 118 | if (topX < 0) { |
96 | - leftTopMapChunk = mapChunks[1]; | |
97 | - rightTopMapChunk = mapChunks[1]; | |
119 | + leftTopMapChunk = mapCornerChunks[1]; | |
120 | + rightTopMapChunk = mapCornerChunks[1]; | |
98 | 121 | } |
99 | 122 | if (leftZ < 0) { |
100 | - leftTopMapChunk = mapChunks[2]; | |
101 | - leftBotMapChunk = mapChunks[2]; | |
123 | + leftTopMapChunk = mapCornerChunks[2]; | |
124 | + leftBotMapChunk = mapCornerChunks[2]; | |
102 | 125 | } |
103 | 126 | } |
104 | 127 | |
105 | 128 | topX = GameMath.Mod(topX, chunkSize); |
106 | 129 | leftZ = GameMath.Mod(leftZ, chunkSize); |
107 | - //TODO: Replace with Metadata Heightmap? | |
108 | - leftTop = leftTopMapChunk == null ? 0 : Math.Sign(localY - leftTopMapChunk.RainHeightMap[leftZ * chunkSize + topX]); | |
109 | - rightTop = rightTopMapChunk == null ? 0 : Math.Sign(localY - rightTopMapChunk.RainHeightMap[rightZ * chunkSize + topX]); | |
110 | - leftBot = leftBotMapChunk == null ? 0 : Math.Sign(localY - leftBotMapChunk.RainHeightMap[leftZ * chunkSize + botX]); | |
130 | + | |
131 | + leftTop = Math.Sign(localY - leftTopMapChunk.HeightMap[topX, leftZ]); | |
132 | + rightTop = Math.Sign(localY - rightTopMapChunk.HeightMap[topX, rightZ]); | |
133 | + leftBot = Math.Sign(localY - leftBotMapChunk.HeightMap[botX, leftZ]); | |
111 | 134 | |
112 | 135 | float slopeness = (leftTop + rightTop + leftBot); |
113 | 136 |
@@ -132,9 +132,14 @@ namespace Automap | ||
132 | 132 | |
133 | 133 | private void ChunkAChanging(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason) |
134 | 134 | { |
135 | - Vec2i topPosition = new Vec2i(chunkCoord.X, chunkCoord.Z); | |
136 | - | |
137 | - columnCounter.AddOrUpdate(topPosition, 1, (key, colAct) => colAct + 1); | |
135 | + Vec2i topPosition = new Vec2i(chunkCoord.X, chunkCoord.Z); | |
136 | + | |
137 | + //TODO: Track Y Chunk - Column, surface chunks being more important | |
138 | + //Only NEW/LOADED chunks unless edits > N | |
139 | + //if (reason == EnumChunkDirtyReason.NewlyCreated || reason == EnumChunkDirtyReason.NewlyLoaded) | |
140 | + //{ | |
141 | + columnCounter.AddOrUpdate(topPosition, 1, (key, colAct) => colAct + 1); | |
142 | + //} | |
138 | 143 | } |
139 | 144 | |
140 | 145 | private void AwakenCartographer(float delayed) |
@@ -221,7 +226,7 @@ namespace Automap | ||
221 | 226 | ProcessChunkBlocks(mostActiveCol.Key, mapChunk, ref chunkMeta); |
222 | 227 | |
223 | 228 | ChunkRenderer.SetupPngImage(mostActiveCol.Key, path, _chunkPath, ref chunkMeta); |
224 | - ChunkRenderer.GenerateChunkPngShard(mostActiveCol.Key, mapChunk, chunkMeta, out updatedPixels); | |
229 | + ChunkRenderer.GenerateChunkPngShard(mostActiveCol.Key, mapChunk, chunkMeta, ref chunkTopMetadata, out updatedPixels); | |
225 | 230 | |
226 | 231 | if (updatedPixels > 0) |
227 | 232 | { |