diff --git a/Minecraft.Client/Chunk.cpp b/Minecraft.Client/Chunk.cpp index 803b99df..afea63a0 100644 --- a/Minecraft.Client/Chunk.cpp +++ b/Minecraft.Client/Chunk.cpp @@ -325,12 +325,14 @@ void Chunk::rebuild() if( empty ) { // 4J - added - clear any renderer data associated with this - for (int currentLayer = 0; currentLayer < 2; currentLayer++) + for (int currentLayer = 0; currentLayer < LevelRenderer::CHUNK_RENDER_LAYERS; currentLayer++) { - levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, currentLayer); + if (currentLayer < 2) + { + levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, currentLayer); + } RenderManager.CBuffClear(lists + currentLayer); } - RenderManager.CBuffClear(lists + 2); delete region; delete tileRenderer; @@ -483,13 +485,26 @@ void Chunk::rebuild() if((currentLayer==0)&&(!renderNextLayer)) { levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY1); - RenderManager.CBuffClear(lists + 1); - RenderManager.CBuffClear(lists + 2); + for (int clearLayer = 1; clearLayer < LevelRenderer::CHUNK_RENDER_LAYERS; clearLayer++) + { + RenderManager.CBuffClear(lists + clearLayer); + } break; } if((currentLayer==1)&&(!renderNextLayer)) { - RenderManager.CBuffClear(lists + 2); + for (int clearLayer = 2; clearLayer < LevelRenderer::CHUNK_RENDER_LAYERS; clearLayer++) + { + RenderManager.CBuffClear(lists + clearLayer); + } + break; + } + if((currentLayer==2)&&(!renderNextLayer)) + { + for (int clearLayer = 3; clearLayer < LevelRenderer::CHUNK_RENDER_LAYERS; clearLayer++) + { + RenderManager.CBuffClear(lists + clearLayer); + } break; } } diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp index 532ad094..1d99aa6b 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -1659,6 +1659,18 @@ void GameRenderer::renderLevel(float a, int64_t until) PIXEndNamedEvent(); } + glBlendFunc(GL_ZERO, GL_ONE); + PIXBeginNamedEvent(0,"Fourth pass level render"); + int visibleTopTransparentChunksLayer3 = levelRenderer->render(cameraEntity, 3, a, updateChunks); + PIXEndNamedEvent(); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + if (visibleTopTransparentChunksLayer3 > 0) + { + PIXBeginNamedEvent(0,"Fourth pass level direct render"); + levelRenderer->renderChunksDirect(3, a); + PIXEndNamedEvent(); + } + GL11::glShadeModel(GL11::GL_FLAT); } else @@ -1669,6 +1681,9 @@ void GameRenderer::renderLevel(float a, int64_t until) PIXBeginNamedEvent(0,"Third pass level render"); levelRenderer->render(cameraEntity, 2, a, updateChunks); PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Fourth pass level render"); + levelRenderer->render(cameraEntity, 3, a, updateChunks); + PIXEndNamedEvent(); } // 4J - added - have split out translucent particle rendering so that it happens after the water is rendered, primarily for fireworks diff --git a/Minecraft.Client/LevelRenderer.cpp b/Minecraft.Client/LevelRenderer.cpp index daa6622d..8f3ec44d 100644 --- a/Minecraft.Client/LevelRenderer.cpp +++ b/Minecraft.Client/LevelRenderer.cpp @@ -166,9 +166,11 @@ LevelRenderer::LevelRenderer(Minecraft *mc, Textures *textures) visibleLists_layer0 = nullptr; visibleLists_layer1 = nullptr; visibleLists_layer2 = nullptr; + visibleLists_layer3 = nullptr; visibleCount_layer0 = 0; visibleCount_layer1 = 0; visibleCount_layer2 = 0; + visibleCount_layer3 = 0; this->mc = mc; this->textures = textures; @@ -473,9 +475,11 @@ void LevelRenderer::allChanged(int playerIndex) delete[] visibleLists_layer0; delete[] visibleLists_layer1; delete[] visibleLists_layer2; + delete[] visibleLists_layer3; visibleLists_layer0 = nullptr; visibleLists_layer1 = nullptr; visibleLists_layer2 = nullptr; + visibleLists_layer3 = nullptr; chunks[playerIndex] = ClipChunkArray(xChunks * yChunks * zChunks); // sortedChunks[playerIndex] = new vector(xChunks * yChunks * zChunks); // 4J - removed - not sorting our chunks anymore @@ -514,9 +518,11 @@ void LevelRenderer::allChanged(int playerIndex) visibleLists_layer0 = new int[totalChunkCount]; visibleLists_layer1 = new int[totalChunkCount]; visibleLists_layer2 = new int[totalChunkCount]; + visibleLists_layer3 = new int[totalChunkCount]; visibleCount_layer0 = 0; visibleCount_layer1 = 0; visibleCount_layer2 = 0; + visibleCount_layer3 = 0; if (level != nullptr) { @@ -810,6 +816,11 @@ void LevelRenderer::renderChunksDirect(int layer, double alpha) lists = visibleLists_layer1; numVisible = visibleCount_layer1; } + else if (layer == 3) + { + lists = visibleLists_layer3; + numVisible = visibleCount_layer3; + } bool first = true; if (lists != nullptr) { @@ -909,6 +920,11 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha) lists = visibleLists_layer1; numVisible = visibleCount_layer1; } + else if (layer == 3) + { + lists = visibleLists_layer3; + numVisible = visibleCount_layer3; + } if (lists != nullptr) { for (int i = 0; i < numVisible; i++) @@ -2684,6 +2700,7 @@ void LevelRenderer::cull(Culler *culler, float a) visibleCount_layer0 = 0; visibleCount_layer1 = 0; visibleCount_layer2 = 0; + visibleCount_layer3 = 0; // Column-level frustum culling: test one AABB per XZ column before testing individual Y chunks. // At dist 64 this reduces ~278K clip() calls to ~17K column tests + per-chunk tests only for visible columns. @@ -2743,6 +2760,7 @@ void LevelRenderer::cull(Culler *culler, float a) if (!((flags & CHUNK_FLAG_EMPTY1) == CHUNK_FLAG_EMPTY1)) visibleLists_layer1[visibleCount_layer1++] = list + 1; visibleLists_layer2[visibleCount_layer2++] = list + 2; + visibleLists_layer3[visibleCount_layer3++] = list + 3; } } } diff --git a/Minecraft.Client/LevelRenderer.h b/Minecraft.Client/LevelRenderer.h index 4ba0f6d7..43f35302 100644 --- a/Minecraft.Client/LevelRenderer.h +++ b/Minecraft.Client/LevelRenderer.h @@ -49,7 +49,7 @@ public: void doBarrierParticles(int posX, int posY, int posZ); static const int CHUNK_XZSIZE = 16; - static const int CHUNK_RENDER_LAYERS = 3; + static const int CHUNK_RENDER_LAYERS = 4; #ifdef _LARGE_WORLDS static const int CHUNK_SIZE = 16; #else @@ -286,9 +286,11 @@ public: int *visibleLists_layer0; int *visibleLists_layer1; int *visibleLists_layer2; + int *visibleLists_layer3; int visibleCount_layer0; int visibleCount_layer1; int visibleCount_layer2; + int visibleCount_layer3; bool dirtyChunkPresent; int64_t lastDirtyChunkFound; diff --git a/Minecraft.World/StainedGlassBlock.cpp b/Minecraft.World/StainedGlassBlock.cpp index dcf4e401..e1aa67e2 100644 --- a/Minecraft.World/StainedGlassBlock.cpp +++ b/Minecraft.World/StainedGlassBlock.cpp @@ -27,7 +27,7 @@ int StainedGlassBlock::getItemAuxValueForBlockData(int data) int StainedGlassBlock::getRenderLayer() { - return 2; + return 3; } void StainedGlassBlock::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/StainedGlassPaneBlock.cpp b/Minecraft.World/StainedGlassPaneBlock.cpp index a73be08b..7d075150 100644 --- a/Minecraft.World/StainedGlassPaneBlock.cpp +++ b/Minecraft.World/StainedGlassPaneBlock.cpp @@ -38,7 +38,7 @@ int StainedGlassPaneBlock::getItemAuxValueForBlockData(int data) int StainedGlassPaneBlock::getRenderLayer() { - return 2; + return 3; } void StainedGlassPaneBlock::registerIcons(IconRegister *iconRegister)