diff --git a/Minecraft.Client/Chunk.cpp b/Minecraft.Client/Chunk.cpp index dddb628b..8285ffb3 100644 --- a/Minecraft.Client/Chunk.cpp +++ b/Minecraft.Client/Chunk.cpp @@ -213,7 +213,7 @@ void Chunk::rebuild() int r = 1; - int lists = levelRenderer->getGlobalIndexForChunk(this->x,this->y,this->z,level) * 2; + int lists = levelRenderer->getGlobalIndexForChunk(this->x,this->y,this->z,level) * 3; lists += levelRenderer->chunkLists; PIXEndNamedEvent(); @@ -323,7 +323,7 @@ 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 < 3; currentLayer++) { levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, currentLayer); RenderManager.CBuffClear(lists + currentLayer); @@ -348,7 +348,7 @@ void Chunk::rebuild() bounds.boundingBox[4] = SIZE+g; bounds.boundingBox[5] = XZSIZE+g; } - for (int currentLayer = 0; currentLayer < 2; currentLayer++) + for (int currentLayer = 0; currentLayer < 3; currentLayer++) { bool renderNextLayer = false; bool rendered = false; @@ -465,10 +465,16 @@ void Chunk::rebuild() } if((currentLayer==0)&&(!renderNextLayer)) { - levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY1); + levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY1 | LevelRenderer::CHUNK_FLAG_NOTSKYLIT); RenderManager.CBuffClear(lists + 1); + RenderManager.CBuffClear(lists + 2); break; } + if((currentLayer==2)&&(!renderNextLayer)) + { + levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); + RenderManager.CBuffClear(lists + 2); + } } // 4J MGH - added this to take the bound from the value calc'd in the tesselator @@ -599,14 +605,15 @@ void Chunk::rebuild() // 4J - These removed items are now also removed from globalRenderableTileEntities - if( LevelChunk::touchedSky ) - { - levelRenderer->clearGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); - } - else - { - levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); - } + // @Patoke: this is now unused in favour of the new render layer + //if( LevelChunk::touchedSky ) + //{ + // levelRenderer->clearGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); + //} + //else + //{ + // levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); + //} levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_COMPILED); PIXEndNamedEvent(); return; @@ -960,11 +967,11 @@ void Chunk::reset() // printf("\t\t [dec] refcount %d at %d, %d, %d\n",refCount,x,y,z); if( refCount == 0 ) { - int lists = levelRenderer->getGlobalIndexForChunk(x, y, z, level) * 2; + int lists = levelRenderer->getGlobalIndexForChunk(x, y, z, level) * 3; if(lists >= 0) { lists += levelRenderer->chunkLists; - for (int i = 0; i < 2; i++) + for (int i = 0; i < 3; i++) { // 4J - added - clear any renderer data associated with this unused list RenderManager.CBuffClear(lists + i); @@ -988,7 +995,7 @@ int Chunk::getList(int layer) { if (!clipChunk->visible) return -1; - int lists = levelRenderer->getGlobalIndexForChunk(x, y, z,level) * 2; + int lists = levelRenderer->getGlobalIndexForChunk(x, y, z,level) * 3; lists += levelRenderer->chunkLists; bool empty = levelRenderer->getGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, layer); diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp index a43f83f0..5ec0d6ab 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -1383,24 +1383,22 @@ void GameRenderer::renderLevel(float a, __int64 until) GL11::glShadeModel(GL11::GL_SMOOTH); } - glBlendFunc(GL_ZERO, GL_ONE); PIXBeginNamedEvent(0,"Fancy second pass - writing z"); - int visibleWaterChunks = levelRenderer->render(cameraEntity, 1, a, updateChunks); + glBlendFunc(GL_ZERO, GL_ONE); + glEnable(GL_CULL_FACE); + + levelRenderer->render(cameraEntity, 2, a, updateChunks); PIXEndNamedEvent(); + + PIXBeginNamedEvent(0, "Fancy second pass - actual render"); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + levelRenderer->render(cameraEntity, 2, a, updateChunks); // 4J - chanaged, used to be renderSameAsLast but we don't support that anymore + PIXEndNamedEvent(); - if (visibleWaterChunks > 0) - { - PIXBeginNamedEvent(0,"Fancy second pass - actual rendering"); - levelRenderer->render(cameraEntity, 1, a, updateChunks); // 4J - chanaged, used to be renderSameAsLast but we don't support that anymore - PIXEndNamedEvent(); - } + // @Patoke todo: implement, this is really important for rendering of order independent alpha objects + // RenderManager.BeginOrderIndependentAlpha(); - GL11::glShadeModel(GL11::GL_FLAT); - } - else - { - PIXBeginNamedEvent(0,"Second pass level render"); + PIXBeginNamedEvent(0, "Fancy second pass - actual rendering"); levelRenderer->render(cameraEntity, 1, a, updateChunks); PIXEndNamedEvent(); } @@ -1415,6 +1413,8 @@ void GameRenderer::renderLevel(float a, __int64 until) particleEngine->render(cameraEntity, a, ParticleEngine::TRANSLUCENT_LIST); PIXEndNamedEvent(); turnOffLightLayer(a); // 4J - brought forward from 1.8.2 + // @Patoke todo: implement + // RenderManager.EndOrderIndependentAlpha(); ////////////////////////// End of 4J added section glDepthMask(true); diff --git a/Minecraft.Client/LevelRenderer.cpp b/Minecraft.Client/LevelRenderer.cpp index 8947b759..4c4ede10 100644 --- a/Minecraft.Client/LevelRenderer.cpp +++ b/Minecraft.Client/LevelRenderer.cpp @@ -810,7 +810,7 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha) if( ( globalChunkFlags[pClipChunk->globalIdx] & emptyFlag ) == emptyFlag ) continue; // Check that this particular layer isn't empty // List can be calculated directly from the chunk's global idex - int list = pClipChunk->globalIdx * 2 + layer; + int list = pClipChunk->globalIdx * 3 + layer; list += chunkLists; if(RenderManager.CBuffCall(list, first)) diff --git a/Minecraft.Client/TileRenderer.cpp b/Minecraft.Client/TileRenderer.cpp index a3e96316..90595919 100644 --- a/Minecraft.Client/TileRenderer.cpp +++ b/Minecraft.Client/TileRenderer.cpp @@ -315,7 +315,7 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat // now we need to set the shape setShape(tt); - + retVal = tesselateBlockInWorld( tt, x, y, z, faceFlags ); } break; diff --git a/Minecraft.World/HalfTransparentTile.cpp b/Minecraft.World/HalfTransparentTile.cpp index c9464f72..cea8a449 100644 --- a/Minecraft.World/HalfTransparentTile.cpp +++ b/Minecraft.World/HalfTransparentTile.cpp @@ -17,6 +17,19 @@ bool HalfTransparentTile::isSolidRender(bool isServerLevel) bool HalfTransparentTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { int id = level->getTile(x, y, z); + + if (this->id == 95) // Tile::stained_glass + { + bool isBlocking = level->isTopSolidBlocking(x, y, z); + if (face == 0 && level->isSolidBlockingTile(x, y + 1, z) != isBlocking) return true; // Facing::DOWN + else if (face == 1 && level->isTopSolidBlocking(x, y - 1, z) != isBlocking) return true; // Facing::UP + else if (face == 2 && level->isSolidBlockingTile(x, y, z + 1) != isBlocking) return true; // Facing::NORTH + else if (face == 3 && level->isSolidBlockingTile(x, y, z - 1) != isBlocking) return true; // Facing::SOUTH + else if (face == 4 && level->isSolidBlockingTile(x + 1, y, z) != isBlocking) return true; // Facing::WEST + else if (face == 5 && level->isSolidBlockingTile(x - 1, y, z) != isBlocking) return true; // Facing::EAST + else if (face == 6 && level->isSolidBlockingTile(x, y, z) != isBlocking) return true; // not really a direction? is this supposed to be here? + } + if (!allowSame && id == this->id) return false; return Tile::shouldRenderFace(level, x, y, z, face); } diff --git a/Minecraft.World/LiquidTile.cpp b/Minecraft.World/LiquidTile.cpp index b1850332..880f6d4f 100644 --- a/Minecraft.World/LiquidTile.cpp +++ b/Minecraft.World/LiquidTile.cpp @@ -253,7 +253,7 @@ float LiquidTile::getBrightness(LevelSource *level, int x, int y, int z) int LiquidTile::getRenderLayer() { - return material == Material::water ? 1 : 0; + return material == Material::water ? 2 : 0; } void LiquidTile::animateTick(Level *level, int x, int y, int z, Random *random)