feat(TU25): add new render layer for water so some semi transparent objects don't cull water

This commit is contained in:
Patoke authored and la committed 2026-04-22 09:43:31 +10:00
1 parent 0b3b9c4c9f
commit b3fb0e9ec0
6 files changed
+51 -31

No files matched your search

+22 -15
View File
@@ -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);
+13 -13
View File
@@ -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);
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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;
+13
View File
@@ -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);
}
+1 -1
View File
@@ -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)