Divided transparent from opaque in the rendering (transparent are not rendering for some reason)

This commit is contained in:
Morippi
2022-08-24 21:54:56 +02:00
parent 427105189b
commit 8b877a5f1a
5 changed files with 97 additions and 31 deletions
@@ -24,10 +24,11 @@ public interface LodRenderSource {
/**
* Try and swap in new render buffer for this section. Note that before this call, there should be no other
* places storing or referencing the render buffer.
* @param referenceSlot The slot for swapping in the new buffer.
* @param referenceSlotsOpaque The opaque slot for swapping in the new buffer.
* @param referenceSlotsTransparent The transparent slot for swapping in the new buffer.
* @return True if the swap was successful. False if swap is not needed or if it is in progress.
*/
boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference<RenderBuffer> referenceSlot);
boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference<RenderBuffer> referenceSlotsOpaque, AtomicReference<RenderBuffer> referenceSlotsTransparent);
void saveRender(IClientLevel level, RenderMetaFile file, OutputStream dataStream) throws IOException;
@@ -41,7 +41,7 @@ public class PlaceHolderRenderSource implements LodRenderSource {
return 0;
}
@Override
public boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference<RenderBuffer> referenceSlot) {
public boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference<RenderBuffer> referenceSlotsOpaque, AtomicReference<RenderBuffer> referenceSlotsTransparent) {
return false;
}
@Override
@@ -267,8 +267,9 @@ public class ColumnRenderSource implements LodRenderSource, IColumnDatatype {
return SECTION_SIZE_OFFSET;
}
private CompletableFuture<ColumnRenderBuffer> inBuildRenderBuffer = null;
private Reference<ColumnRenderBuffer> usedBuffer = new Reference<>();
private CompletableFuture<ColumnRenderBuffer[]> inBuildRenderBuffer = null;
private Reference<ColumnRenderBuffer> usedBufferOpaque = new Reference<>();
private Reference<ColumnRenderBuffer> usedBufferTransparent = new Reference<>();
private void tryBuildBuffer(IClientLevel level, LodQuadTree quadTree) {
@@ -280,7 +281,7 @@ public class ColumnRenderSource implements LodRenderSource, IColumnDatatype {
data[direction.ordinal()-2] = ((ColumnRenderSource) section.getRenderContainer());
}
}
inBuildRenderBuffer = ColumnRenderBuffer.build(level, usedBuffer, this, data);
inBuildRenderBuffer = ColumnRenderBuffer.build(level, usedBufferOpaque, usedBufferTransparent, this, data);
}
}
private void cancelBuildBuffer() {
@@ -319,7 +320,7 @@ public class ColumnRenderSource implements LodRenderSource, IColumnDatatype {
private static final long SWAP_BUSY_COLLISION_TIMEOUT = /* 1 sec */ 1_000_000_000L;
@Override
public boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference<RenderBuffer> referenceSlot) {
public boolean trySwapRenderBuffer(LodQuadTree quadTree, AtomicReference<RenderBuffer> referenceSlotsOpaque, AtomicReference<RenderBuffer> referenceSlotsTransparent) {
if (lastNs != -1 && System.nanoTime() - lastNs < SWAP_TIMEOUT) {
return false;
}
@@ -327,11 +328,20 @@ public class ColumnRenderSource implements LodRenderSource, IColumnDatatype {
if (inBuildRenderBuffer.isDone()) {
lastNs = System.nanoTime();
//LOGGER.info("Swapping render buffer for {}", sectionPos);
RenderBuffer oldBuffer = referenceSlot.getAndSet(inBuildRenderBuffer.join());
if (oldBuffer instanceof ColumnRenderBuffer) {
ColumnRenderBuffer swapped = usedBuffer.swap((ColumnRenderBuffer) oldBuffer);
RenderBuffer[] newBuffers = inBuildRenderBuffer.join();
RenderBuffer oldBuffersOpaque = referenceSlotsOpaque.getAndSet(newBuffers[0]);
RenderBuffer oldBuffersTransparent = referenceSlotsOpaque.getAndSet(newBuffers[1]);
ColumnRenderBuffer swapped;
if (oldBuffersOpaque instanceof ColumnRenderBuffer) {
swapped = usedBufferOpaque.swap((ColumnRenderBuffer) oldBuffersOpaque);
LodUtil.assertTrue(swapped == null);
}
if (oldBuffersTransparent instanceof ColumnRenderBuffer) {
swapped = usedBufferTransparent.swap((ColumnRenderBuffer) oldBuffersTransparent);
LodUtil.assertTrue(swapped == null);
}
inBuildRenderBuffer = null;
return true;
}
@@ -185,7 +185,7 @@ public class ColumnRenderBuffer extends RenderBuffer {
return getCurrentJobsCount() > MAX_CONCURRENT_CALL;
}
public static CompletableFuture<ColumnRenderBuffer> build(IClientLevel clientLevel, Reference<ColumnRenderBuffer> usedBufferSlot, ColumnRenderSource data, ColumnRenderSource[] adjData) {
public static CompletableFuture<ColumnRenderBuffer[]> build(IClientLevel clientLevel, Reference<ColumnRenderBuffer> usedBufferSlotOpaque, Reference<ColumnRenderBuffer> usedBufferSlotTransparent, ColumnRenderSource data, ColumnRenderSource[] adjData) {
if (isBusy()) return null;
//LOGGER.info("RenderRegion startBuild @ {}", data.sectionPos);
return CompletableFuture.supplyAsync(() -> {
@@ -194,14 +194,22 @@ public class ColumnRenderBuffer extends RenderBuffer {
int skyLightCullingBelow = Config.Client.Graphics.AdvancedGraphics.caveCullingHeight.get();
// FIXME: Clamp also to the max world height.
skyLightCullingBelow = Math.max(skyLightCullingBelow, clientLevel.getMinY());
LodQuadBuilder builder = new LodQuadBuilder(true,
LodQuadBuilder builderOpaque = new LodQuadBuilder(true,
(short) (skyLightCullingBelow - clientLevel.getMinY()));
makeLodRenderData(builder, data, adjData);
if (builder.getCurrentQuadsCount() > 0) {
LodQuadBuilder builderTransparent = new LodQuadBuilder(true,
(short) (skyLightCullingBelow - clientLevel.getMinY()));
makeLodRenderData(builderOpaque, builderTransparent, data, adjData);
if (builderOpaque.getCurrentQuadsCount() > 0) {
//LOGGER.info("her");
}
EVENT_LOGGER.trace("RenderRegion end QuadBuild @ {}", data.sectionPos);
return builder;
LodQuadBuilder[] builders = new LodQuadBuilder[2];
builders[0] = builderOpaque;
builders[1] = builderOpaque;
return builders;
} catch (UncheckedInterruptedException e) {
throw e;
}
@@ -210,24 +218,35 @@ public class ColumnRenderBuffer extends RenderBuffer {
throw e3;
}
}, BUFFER_BUILDERS)
.thenApplyAsync((builder) -> {
.thenApplyAsync((builders) -> {
try {
EVENT_LOGGER.trace("RenderRegion start Upload @ {}", data.sectionPos);
GLProxy glProxy = GLProxy.getInstance();
EGpuUploadMethod method = GLProxy.getInstance().getGpuUploadMethod();
EGLProxyContext oldContext = glProxy.getGlContext();
glProxy.setGlContext(EGLProxyContext.LOD_BUILDER);
ColumnRenderBuffer buffer = usedBufferSlot.swap(null);
if (buffer == null)
buffer = new ColumnRenderBuffer(
ColumnRenderBuffer buffersSlotOpaque = usedBufferSlotOpaque.swap(null);
ColumnRenderBuffer buffersSlotTransparent = usedBufferSlotTransparent.swap(null);
if (buffersSlotOpaque == null)
buffersSlotOpaque = new ColumnRenderBuffer(
new DHBlockPos(data.sectionPos.getCorner().getCorner(), clientLevel.getMinY())
);
if (buffersSlotTransparent == null)
buffersSlotTransparent = new ColumnRenderBuffer(
new DHBlockPos(data.sectionPos.getCorner().getCorner(), clientLevel.getMinY())
);
try {
buffer.uploadBuffer(builder, method);
buffersSlotOpaque.uploadBuffer(builders[0], method);
buffersSlotTransparent.uploadBuffer(builders[1], method);
EVENT_LOGGER.trace("RenderRegion end Upload @ {}", data.sectionPos);
return buffer;
ColumnRenderBuffer[] buffers = new ColumnRenderBuffer[2];
buffers[0] = buffersSlotOpaque;
buffers[1] = buffersSlotTransparent;
return buffers;
} catch (Exception e) {
buffer.close();
buffersSlotOpaque.close();
buffersSlotTransparent.close();
throw e;
} finally {
glProxy.setGlContext(oldContext);
@@ -241,7 +260,14 @@ public class ColumnRenderBuffer extends RenderBuffer {
}, BUFFER_UPLOADER).handle((v, e) -> {
//LOGGER.info("RenderRegion endBuild @ {}", data.sectionPos);
if (e != null) {
if (!usedBufferSlot.isEmpty()) usedBufferSlot.swap(null).close();
if (!usedBufferSlotOpaque.isEmpty()) {
ColumnRenderBuffer buffersSlot = usedBufferSlotOpaque.swap(null);
buffersSlot.close();
}
if (!usedBufferSlotTransparent.isEmpty()) {
ColumnRenderBuffer buffersSlot = usedBufferSlotTransparent.swap(null);
buffersSlot.close();
}
return null;
} else {
return v;
@@ -251,7 +277,7 @@ public class ColumnRenderBuffer extends RenderBuffer {
private static void makeLodRenderData(LodQuadBuilder quadBuilder, ColumnRenderSource region, ColumnRenderSource[] adjRegions) {
private static void makeLodRenderData(LodQuadBuilder quadBuilderOpaque, LodQuadBuilder quadBuilderTransparent, ColumnRenderSource region, ColumnRenderSource[] adjRegions) {
// Variable initialization
EDebugMode debugMode = Config.Client.Advanced.Debugging.debugMode.get();
@@ -343,12 +369,21 @@ public class ColumnRenderBuffer extends RenderBuffer {
long adjDataTop = i - 1 >= 0 ? posData.get(i - 1) : DataPointUtil.EMPTY_DATA;
long adjDataBot = i + 1 < posData.size() ? posData.get(i + 1) : DataPointUtil.EMPTY_DATA;
// We send the call to create the vertices
CubicLodTemplate.addLodToBuffer(data, adjDataTop, adjDataBot, adjData, detailLevel,
x, z, quadBuilder, debugMode);
if(DataPointUtil.getAlpha(data) == 255)
{
CubicLodTemplate.addLodToBuffer(data, adjDataTop, adjDataBot, adjData, detailLevel,
x, z, quadBuilderOpaque, debugMode);
}else
{
CubicLodTemplate.addLodToBuffer(data, adjDataTop, adjDataBot, adjData, detailLevel,
x, z, quadBuilderTransparent, debugMode);
}
}
}
}
quadBuilder.mergeQuads();
quadBuilderOpaque.mergeQuads();
quadBuilderTransparent.mergeQuads();
}
}
@@ -17,14 +17,29 @@ public class RenderBufferHandler {
class RenderBufferNode implements AutoCloseable {
public final DhSectionPos pos;
public volatile RenderBufferNode[] children = null;
public final AtomicReference<RenderBuffer> renderBufferSlot = new AtomicReference<>();
public final AtomicReference<RenderBuffer> renderBufferSlotOpaque = new AtomicReference<>();
public final AtomicReference<RenderBuffer> renderBufferSlotTransparent = new AtomicReference<>();
public RenderBufferNode(DhSectionPos pos) {
this.pos = pos;
}
public void render(a7LodRenderer renderContext) {
RenderBuffer buff = renderBufferSlot.get();
RenderBuffer buff;
buff = renderBufferSlotOpaque.get();
if (buff != null) {
buff.render(renderContext);
} else {
RenderBufferNode[] childs = children;
if (childs != null) {
for (RenderBufferNode child : childs) {
child.render(renderContext);
}
}
}
buff = renderBufferSlotTransparent.get();
if (buff != null) {
buff.render(renderContext);
} else {
@@ -57,7 +72,7 @@ public class RenderBufferHandler {
// }
} else {
LodUtil.assertTrue(container != null); // section.isLoaded() should have ensured this
container.trySwapRenderBuffer(target, renderBufferSlot);
container.trySwapRenderBuffer(target, renderBufferSlotOpaque, renderBufferSlotTransparent);
}
// Update children's render buffer state
@@ -97,7 +112,12 @@ public class RenderBufferHandler {
child.close();
}
}
RenderBuffer buff = renderBufferSlot.getAndSet(null);
RenderBuffer buff;
buff = renderBufferSlotOpaque.getAndSet(null);
if (buff != null) {
buff.close();
}
buff = renderBufferSlotTransparent.getAndSet(null);
if (buff != null) {
buff.close();
}