using System;
+using System.Collections.Generic;
using System.Linq;
using Hjg.Pngcs;
}
- 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( );
//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);
+
+ /*
+ 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;
- 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;
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 = 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);
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)
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)
{