forked from mirrors/NBTExplorer
Improved performance of edge reconciliation for chunk lighting.
This commit is contained in:
parent
0657cf5bd3
commit
324d997f52
2 changed files with 130 additions and 2 deletions
|
@ -199,8 +199,29 @@ namespace Substrate
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (ChunkRef chunk in dirty) {
|
foreach (ChunkRef chunk in dirty) {
|
||||||
chunk.UpdateEdgeBlockLight();
|
ChunkRef east = chunk.GetEastNeighbor();
|
||||||
chunk.UpdateEdgeSkyLight();
|
if (!east.IsDirty) {
|
||||||
|
chunk.UpdateEdgeBlockLight(east);
|
||||||
|
chunk.UpdateEdgeSkyLight(east);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChunkRef west = chunk.GetWestNeighbor();
|
||||||
|
if (!west.IsDirty) {
|
||||||
|
chunk.UpdateEdgeBlockLight(west);
|
||||||
|
chunk.UpdateEdgeSkyLight(west);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChunkRef north = chunk.GetNorthNeighbor();
|
||||||
|
if (!north.IsDirty) {
|
||||||
|
chunk.UpdateEdgeBlockLight(north);
|
||||||
|
chunk.UpdateEdgeSkyLight(north);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChunkRef south = chunk.GetSouthNeighbor();
|
||||||
|
if (!south.IsDirty) {
|
||||||
|
chunk.UpdateEdgeBlockLight(south);
|
||||||
|
chunk.UpdateEdgeSkyLight(south);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,11 @@ namespace Substrate
|
||||||
set { _autoLight = value; }
|
set { _autoLight = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsDirty
|
||||||
|
{
|
||||||
|
get { return _dirty; }
|
||||||
|
}
|
||||||
|
|
||||||
public ChunkRef (IChunkContainer container, IChunkCache cache, int cx, int cz)
|
public ChunkRef (IChunkContainer container, IChunkCache cache, int cx, int cz)
|
||||||
{
|
{
|
||||||
_container = container;
|
_container = container;
|
||||||
|
@ -805,6 +810,108 @@ namespace Substrate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateEdgeBlockLight (ChunkRef chunk)
|
||||||
|
{
|
||||||
|
GetChunk();
|
||||||
|
|
||||||
|
if (chunk.X == X && chunk.Z == Z - 1) {
|
||||||
|
for (int x = 0; x < XDim; x++) {
|
||||||
|
for (int y = 0; y < YDim; y++) {
|
||||||
|
TestBlockLight(chunk, x, y, 0, x, y, ZDim - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (chunk.X == X && chunk.Z == Z + 1) {
|
||||||
|
for (int x = 0; x < XDim; x++) {
|
||||||
|
for (int y = 0; y < YDim; y++) {
|
||||||
|
TestBlockLight(chunk, x, y, ZDim - 1, x, y, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (chunk.Z == Z && chunk.X == X - 1) {
|
||||||
|
for (int z = 0; z < ZDim; z++) {
|
||||||
|
for (int y = 0; y < YDim; y++) {
|
||||||
|
TestBlockLight(chunk, 0, y, z, XDim - 1, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (chunk.Z == Z && chunk.X == X + 1) {
|
||||||
|
for (int z = 0; z < ZDim; z++) {
|
||||||
|
for (int y = 0; y < YDim; y++) {
|
||||||
|
TestBlockLight(chunk, XDim - 1, y, z, 0, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateBlockLight();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateEdgeSkyLight (ChunkRef chunk)
|
||||||
|
{
|
||||||
|
GetChunk();
|
||||||
|
|
||||||
|
if (chunk.X == X && chunk.Z == Z - 1) {
|
||||||
|
for (int x = 0; x < XDim; x++) {
|
||||||
|
for (int y = 0; y < YDim; y++) {
|
||||||
|
TestSkyLight(chunk, x, y, 0, x, y, ZDim - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (chunk.X == X && chunk.Z == Z + 1) {
|
||||||
|
for (int x = 0; x < XDim; x++) {
|
||||||
|
for (int y = 0; y < YDim; y++) {
|
||||||
|
TestSkyLight(chunk, x, y, ZDim - 1, x, y, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (chunk.Z == Z && chunk.X == X - 1) {
|
||||||
|
for (int z = 0; z < ZDim; z++) {
|
||||||
|
for (int y = 0; y < YDim; y++) {
|
||||||
|
TestSkyLight(chunk, 0, y, z, XDim - 1, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (chunk.Z == Z && chunk.X == X + 1) {
|
||||||
|
for (int z = 0; z < ZDim; z++) {
|
||||||
|
for (int y = 0; y < YDim; y++) {
|
||||||
|
TestSkyLight(chunk, XDim - 1, y, z, 0, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateSkyLight();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TestBlockLight (ChunkRef chunk, int x1, int y1, int z1, int x2, int y2, int z2)
|
||||||
|
{
|
||||||
|
int light1 = GetBlockLight(x1, y1, z1);
|
||||||
|
int light2 = chunk.GetBlockLight(x2, y2, z2);
|
||||||
|
int lum1 = GetBlockInfo(x1, y1, z1).Luminance;
|
||||||
|
int lum2 = chunk.GetBlockInfo(x2, y2, z2).Luminance;
|
||||||
|
|
||||||
|
int v1 = Math.Max(light1, lum1);
|
||||||
|
int v2 = Math.Max(light2, lum2);
|
||||||
|
if (Math.Abs(v1 - v2) > 1) {
|
||||||
|
QueueRelight(new BlockKey(x1, y1, z1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TestSkyLight (ChunkRef chunk, int x1, int y1, int z1, int x2, int y2, int z2)
|
||||||
|
{
|
||||||
|
int light1 = GetBlockSkyLight(x1, y1, z1);
|
||||||
|
int light2 = chunk.GetBlockSkyLight(x2, y2, z2);
|
||||||
|
|
||||||
|
if (Math.Abs(light1 - light2) > 1) {
|
||||||
|
QueueRelight(new BlockKey(x1, y1, z1));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue