Skip to content

Commit

Permalink
Merge in translucency fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
IMS212 committed May 20, 2024
2 parents ebdae56 + baf5759 commit 70cc373
Show file tree
Hide file tree
Showing 42 changed files with 1,027 additions and 727 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public static class PerformanceSettings {
public boolean sortingEnabled = true;

public SortBehavior getSortBehavior() {
return this.sortingEnabled ? SortBehavior.DYNAMIC_DEFER_NEARBY_ONE_FRAME : SortBehavior.OFF;
return this.sortingEnabled ? SortBehavior.DYNAMIC_DEFER_NEARBY_ZERO_FRAMES : SortBehavior.OFF;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public enum ModelQuadFacing {
public static final int OPPOSING_X = 1 << ModelQuadFacing.POS_X.ordinal() | 1 << ModelQuadFacing.NEG_X.ordinal();
public static final int OPPOSING_Y = 1 << ModelQuadFacing.POS_Y.ordinal() | 1 << ModelQuadFacing.NEG_Y.ordinal();
public static final int OPPOSING_Z = 1 << ModelQuadFacing.POS_Z.ordinal() | 1 << ModelQuadFacing.NEG_Z.ordinal();
public static final int UNASSIGNED_MASK = 1 << ModelQuadFacing.UNASSIGNED.ordinal();

public static ModelQuadFacing fromDirection(Direction dir) {
return switch (dir) {
Expand Down Expand Up @@ -120,4 +121,12 @@ public static ModelQuadFacing fromNormal(float x, float y, float z) {
public static ModelQuadFacing fromPackedNormal(int normal) {
return fromNormal(NormI8.unpackX(normal), NormI8.unpackY(normal), NormI8.unpackZ(normal));
}

public static boolean bitmapIsOpposingAligned(int bitmap) {
return bitmap == OPPOSING_X || bitmap == OPPOSING_Y || bitmap == OPPOSING_Z;
}

public static boolean bitmapHasUnassigned(int bitmap) {
return (bitmap & UNASSIGNED_MASK) != 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.joml.Vector3d;

import java.util.Collection;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.function.Consumer;

import org.joml.Vector3d;

/**
* Provides an extension to vanilla's {@link LevelRenderer}.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,7 @@ public void setTranslucentData(TranslucentData translucentData) {
if (translucentData == null) {
throw new IllegalArgumentException("new translucentData cannot be null");
}
if (this.translucentData != null && this.translucentData != translucentData) {
this.translucentData.delete();
}

this.translucentData = translucentData;
}

Expand All @@ -136,9 +134,6 @@ public void delete() {
this.taskCancellationToken.setCancelled();
this.taskCancellationToken = null;
}
if (this.translucentData != null) {
this.translucentData.delete();
}

this.clearRenderState();
this.disposed = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortBehavior.DeferMode;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortBehavior.PriorityMode;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.DynamicTopoData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.NoData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.TopoSortDynamicData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.TranslucentData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.trigger.CameraMovement;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.trigger.SortTriggering;
Expand Down Expand Up @@ -303,7 +303,7 @@ public void uploadChunks() {
this.needsGraphUpdate = this.needsGraphUpdate || this.processChunkBuildResults(results);

for (var result : results) {
result.deleteAfterUploadSafe();
result.destroy();
}
}

Expand All @@ -325,9 +325,10 @@ private boolean processChunkBuildResults(ArrayList<BuilderTaskOutput> results) {
// a rebuild always generates new translucent data which means applyTriggerChanges isn't necessary
result.render.setTranslucentData(chunkBuildOutput.translucentData);
}
} else if (result instanceof ChunkSortOutput chunkSortOutput
&& chunkSortOutput.dynamicData instanceof TopoSortDynamicData data) {
this.sortTriggering.applyTriggerChanges(data, result.render.getPosition(), this.cameraPosition);
} else if (result instanceof ChunkSortOutput sortOutput
&& sortOutput.getTopoSorter() != null
&& result.render.getTranslucentData() instanceof DynamicTopoData data) {
this.sortTriggering.applyTriggerChanges(data, sortOutput.getTopoSorter(), result.render.getPosition(), this.cameraPosition);
}

var job = result.render.getTaskCancellationToken();
Expand Down Expand Up @@ -358,10 +359,8 @@ private static List<BuilderTaskOutput> filterChunkBuildResults(ArrayList<Builder
var map = new Reference2ReferenceLinkedOpenHashMap<RenderSection, BuilderTaskOutput>();

for (var output : outputs) {
// when outdated or duplicate outputs are thrown out, make sure to delete their
// buffers to avoid memory leaks
// throw out outdated or duplicate outputs
if (output.render.isDisposed() || output.render.getLastUploadFrame() > output.submitTime) {
output.deleteFully();
continue;
}

Expand All @@ -370,9 +369,6 @@ private static List<BuilderTaskOutput> filterChunkBuildResults(ArrayList<Builder

if (previous == null || previous.submitTime < output.submitTime) {
map.put(render, output);
if (previous != null) {
previous.deleteFully();
}
}
}

Expand Down Expand Up @@ -542,7 +538,7 @@ public void destroy() {
this.builder.shutdown(); // stop all the workers, and cancel any tasks

for (var result : this.collectChunkBuildResults()) {
result.deleteFully(); // delete resources for any pending tasks (including those that were cancelled)
result.destroy(); // delete resources for any pending tasks (including those that were cancelled)
}

for (var section : this.sectionByPosition.values()) {
Expand Down Expand Up @@ -581,7 +577,7 @@ public void scheduleSort(long sectionPos, boolean isDirectTrigger) {
var pendingUpdate = ChunkUpdateType.SORT;
var priorityMode = SodiumClientMod.options().performance.getSortBehavior().getPriorityMode();
if (priorityMode == PriorityMode.ALL
|| priorityMode == PriorityMode.NEARBY && this.shouldPrioritizeTask(section)) {
|| priorityMode == PriorityMode.NEARBY && this.shouldPrioritizeTask(section, NEARBY_SORT_DISTANCE)) {
pendingUpdate = ChunkUpdateType.IMPORTANT_SORT;
}
pendingUpdate = ChunkUpdateType.getPromotionUpdateType(section.getPendingUpdate(), pendingUpdate);
Expand All @@ -602,7 +598,7 @@ public void scheduleRebuild(int x, int y, int z, boolean important) {
if (section != null && section.isBuilt()) {
ChunkUpdateType pendingUpdate;

if (allowImportantRebuilds() && (important || this.shouldPrioritizeTask(section))) {
if (allowImportantRebuilds() && (important || this.shouldPrioritizeTask(section, NEARBY_REBUILD_DISTANCE))) {
pendingUpdate = ChunkUpdateType.IMPORTANT_REBUILD;
} else {
pendingUpdate = ChunkUpdateType.REBUILD;
Expand All @@ -618,9 +614,10 @@ public void scheduleRebuild(int x, int y, int z, boolean important) {
}

private static final float NEARBY_REBUILD_DISTANCE = Mth.square(16.0f);
private static final float NEARBY_SORT_DISTANCE = Mth.square(25.0f);

private boolean shouldPrioritizeTask(RenderSection section) {
return this.cameraPosition != null && section.getSquaredDistance(this.cameraBlockPos) < NEARBY_REBUILD_DISTANCE;
private boolean shouldPrioritizeTask(RenderSection section, float distance) {
return this.cameraBlockPos != null && section.getSquaredDistance(this.cameraBlockPos) < distance;
}

private static boolean allowImportantRebuilds() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,12 @@
public abstract class BuilderTaskOutput {
public final RenderSection render;
public final int submitTime;
private boolean fullyDeleted;

public BuilderTaskOutput(RenderSection render, int buildTime) {
this.render = render;
this.submitTime = buildTime;
}

public void deleteFully() {
this.fullyDeleted = true;
this.deleteAfterUpload();
}

public void deleteAfterUploadSafe() {
if (!this.fullyDeleted) {
this.deleteAfterUpload();
}
}

protected void deleteAfterUpload() {
public void destroy() {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,23 +80,21 @@ public BuiltSectionMeshParts createMesh(TerrainRenderPass pass, boolean forceUna
vertexCount += buffer.count();
}

if (forceUnassigned) {
vertexRanges[ModelQuadFacing.UNASSIGNED.ordinal()] = new VertexRange(0, vertexCount);
}

if (vertexCount == 0) {
return null;
}

if (forceUnassigned) {
vertexRanges[ModelQuadFacing.UNASSIGNED.ordinal()] = new VertexRange(0, vertexCount);
}

var mergedBuffer = new NativeBuffer(vertexCount * this.vertexType.getVertexFormat().getStride());
var mergedBufferBuilder = mergedBuffer.getDirectBuffer();

for (var buffer : vertexBuffers) {
mergedBufferBuilder.put(buffer);
}

mergedBufferBuilder.flip(); // TODO: necessary?

return new BuiltSectionMeshParts(mergedBuffer, vertexRanges);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package net.caffeinemc.mods.sodium.client.render.chunk.compile;

import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection;
import net.caffeinemc.mods.sodium.client.render.chunk.data.BuiltSectionInfo;
import net.caffeinemc.mods.sodium.client.render.chunk.data.BuiltSectionMeshParts;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.PresentTranslucentData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.TranslucentData;
import net.caffeinemc.mods.sodium.client.render.chunk.data.BuiltSectionMeshParts;
import net.caffeinemc.mods.sodium.client.render.chunk.data.BuiltSectionInfo;

import java.util.Map;

Expand All @@ -15,7 +14,7 @@
* finishing its work and not before the result is processed, the result will
* instead be discarded.
*/
public class ChunkBuildOutput extends BuilderTaskOutput implements OutputWithIndexData {
public class ChunkBuildOutput extends ChunkSortOutput {
public final BuiltSectionInfo info;
public final TranslucentData translucentData;
public final Map<TerrainRenderPass, BuiltSectionMeshParts> meshes;
Expand All @@ -34,32 +33,11 @@ public BuiltSectionMeshParts getMesh(TerrainRenderPass pass) {
}

@Override
public PresentTranslucentData getTranslucentData() {
if (this.translucentData instanceof PresentTranslucentData present) {
return present;
}
return null;
}

@Override
public void deleteAfterUpload() {
super.deleteAfterUpload();

// delete translucent data if it's not persisted for dynamic sorting
if (this.translucentData != null && !this.translucentData.retainAfterUpload()) {
this.translucentData.delete();
}
public void destroy() {
super.destroy();

for (BuiltSectionMeshParts data : this.meshes.values()) {
data.getVertexData().free();
}
}

@Override
public void deleteFully() {
super.deleteFully();
if (this.translucentData != null) {
this.translucentData.delete();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,57 @@
package net.caffeinemc.mods.sodium.client.render.chunk.compile;

import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.DynamicData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.PresentTranslucentData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.DynamicTopoData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.SortData;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.Sorter;
import net.caffeinemc.mods.sodium.client.util.NativeBuffer;

public class ChunkSortOutput extends BuilderTaskOutput implements OutputWithIndexData {
public final DynamicData dynamicData;
public class ChunkSortOutput extends BuilderTaskOutput implements SortData {
private NativeBuffer indexBuffer;
private boolean reuseUploadedIndexData;
private DynamicTopoData.DynamicTopoSorter topoSorter;

public ChunkSortOutput(RenderSection render, int buildTime, DynamicData dynamicData) {
public ChunkSortOutput(RenderSection render, int buildTime) {
super(render, buildTime);
}

public ChunkSortOutput(RenderSection render, int buildTime, Sorter data) {
this(render, buildTime);
this.copyResultFrom(data);
}

this.dynamicData = dynamicData;
public void copyResultFrom(Sorter sorter) {
this.indexBuffer = sorter.getIndexBuffer();
this.reuseUploadedIndexData = false;
if (sorter instanceof DynamicTopoData.DynamicTopoSorter topoSorterInstance) {
this.topoSorter = topoSorterInstance;
}
}

public void markAsReusingUploadedData() {
this.reuseUploadedIndexData = true;
}

@Override
public PresentTranslucentData getTranslucentData() {
return this.dynamicData;
public NativeBuffer getIndexBuffer() {
return this.indexBuffer;
}

// doesn't implement deletion because the task doesn't allocate any new buffers.
// the buffers used belong to the section and are deleted when it is deleted.
// buffers created during section building are deleted at section deletion or
// when the rebuild is cancelled.
@Override
public boolean isReusingUploadedIndexData() {
return this.reuseUploadedIndexData;
}

public DynamicTopoData.DynamicTopoSorter getTopoSorter() {
return this.topoSorter;
}

@Override
public void destroy() {
super.destroy();

if (this.indexBuffer != null) {
this.indexBuffer.free();
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void onJobFinished(ChunkJobResult<? extends BuilderTaskOutput> result) {
}

public void awaitCompletion(ChunkBuilder builder) {
if (this.submitted.size() == 0) {
if (this.submitted.isEmpty()) {
return;
}

Expand Down
Loading

0 comments on commit 70cc373

Please sign in to comment.