diff --git a/Substrate/SubstrateCS/Source/AlphaBlockCollection.cs b/Substrate/SubstrateCS/Source/AlphaBlockCollection.cs index 4b3809d..b01e333 100644 --- a/Substrate/SubstrateCS/Source/AlphaBlockCollection.cs +++ b/Substrate/SubstrateCS/Source/AlphaBlockCollection.cs @@ -201,21 +201,8 @@ namespace Substrate // Update height map - if (BlockInfo.BlockTable[id] != null) { - int tileHeight = _heightMap[x, z]; - int newOpacity = BlockInfo.BlockTable[id].Opacity; - - if (y > tileHeight && newOpacity > BlockInfo.MIN_OPACITY) { - _heightMap[x, z] = (byte)y; - } - else if (y == tileHeight && newOpacity == BlockInfo.MIN_OPACITY) { - for (int i = y - 1; i >= 0; i--) { - if (BlockInfo.BlockTable[_blocks[x, i, z]].Opacity > BlockInfo.MIN_OPACITY) { - _heightMap[x, z] = (byte)i; - break; - } - } - } + if (info1.ObscuresLight != info2.ObscuresLight) { + _lightManager.UpdateHeightMap(x, y, z); } // Light consistency diff --git a/Substrate/SubstrateCS/Source/BlockInfo.cs b/Substrate/SubstrateCS/Source/BlockInfo.cs index 9dfd323..36038df 100644 --- a/Substrate/SubstrateCS/Source/BlockInfo.cs +++ b/Substrate/SubstrateCS/Source/BlockInfo.cs @@ -216,6 +216,11 @@ namespace Substrate get { return _transmitLight; } } + public bool ObscuresLight + { + get { return _opacity > MIN_OPACITY || !_transmitLight; } + } + public BlockState State { get { return _state; } diff --git a/Substrate/SubstrateCS/Source/BlockLight.cs b/Substrate/SubstrateCS/Source/BlockLight.cs index f2a2dcb..4f32754 100644 --- a/Substrate/SubstrateCS/Source/BlockLight.cs +++ b/Substrate/SubstrateCS/Source/BlockLight.cs @@ -89,6 +89,32 @@ namespace Substrate UpdateBlockSkyLight(); } + public void UpdateHeightMap (int lx, int ly, int lz) + { + BlockInfo info = _blockset.GetInfo(lx, ly, lz); + int h = Math.Min(ly + 1, _ydim - 1); + + int height = _blockset.GetHeight(lx, lz); + if (h < height) { + return; + } + + if (h == height && !info.ObscuresLight) { + for (int i = ly - 1; i >= 0; i--) { + BlockInfo info2 = _blockset.GetInfo(lx, i, lz); + if (info2.ObscuresLight) { + _blockset.SetHeight(lx, lz, Math.Min(i + 1, _ydim - 1)); + break; + } + } + UpdateBlockSkyLight(lx, h, lz); + } + else if (h > height && info.ObscuresLight) { + _blockset.SetHeight(lx, lz, h); + UpdateBlockSkyLight(lx, h, lz); + } + } + public void RebuildBlockLight () { @@ -152,7 +178,7 @@ namespace Substrate for (int z = 0; z < zdim; z++) { for (int y = ydim - 1; y >= 0; y--) { BlockInfo info = _blockset.GetInfo(x, y, z); - if (info.Opacity > BlockInfo.MIN_OPACITY || !info.TransmitsLight) { + if (info.ObscuresLight) { _blockset.SetHeight(x, z, Math.Min(y + 1, ydim - 1)); break; } @@ -303,6 +329,7 @@ namespace Substrate IBoundedLitBlockCollection[,] chunkMap = LocalBlockLightMap(); int xdim = _xdim; + int ydim = _ydim; int zdim = _zdim; while (_update.Count > 0) { @@ -348,10 +375,15 @@ namespace Substrate cc.SetBlockLight(x, y, z, light); if (info.TransmitsLight) { + if (k.y > 0) { + QueueRelight(new BlockKey(k.x, k.y - 1, k.z)); + } + if (k.y < ydim - 1) { + QueueRelight(new BlockKey(k.x, k.y + 1, k.z)); + } + QueueRelight(new BlockKey(k.x - 1, k.y, k.z)); QueueRelight(new BlockKey(k.x + 1, k.y, k.z)); - QueueRelight(new BlockKey(k.x, k.y - 1, k.z)); - QueueRelight(new BlockKey(k.x, k.y + 1, k.z)); QueueRelight(new BlockKey(k.x, k.y, k.z - 1)); QueueRelight(new BlockKey(k.x, k.y, k.z + 1)); } @@ -364,6 +396,7 @@ namespace Substrate IBoundedLitBlockCollection[,] chunkMap = LocalBlockLightMap(); int xdim = _xdim; + int ydim = _ydim; int zdim = _zdim; while (_update.Count > 0) { @@ -415,10 +448,15 @@ namespace Substrate cc.SetSkyLight(x, y, z, light); if (info.TransmitsLight) { + if (k.y > 0) { + QueueRelight(new BlockKey(k.x, k.y - 1, k.z)); + } + if (k.y < ydim - 1) { + QueueRelight(new BlockKey(k.x, k.y + 1, k.z)); + } + QueueRelight(new BlockKey(k.x - 1, k.y, k.z)); QueueRelight(new BlockKey(k.x + 1, k.y, k.z)); - QueueRelight(new BlockKey(k.x, k.y - 1, k.z)); - QueueRelight(new BlockKey(k.x, k.y + 1, k.z)); QueueRelight(new BlockKey(k.x, k.y, k.z - 1)); QueueRelight(new BlockKey(k.x, k.y, k.z + 1)); }