diff --git a/gradle.properties b/gradle.properties index 720494b1..1b3adb35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=1.20.4+build.1 loader_version=0.15.0 # Mod Properties -mod_version = 0.0.2-alpha +mod_version = 0.0.3-alpha maven_group = me.cortex archives_base_name = zenith diff --git a/src/main/java/me/cortex/zenith/client/core/VoxelCore.java b/src/main/java/me/cortex/zenith/client/core/VoxelCore.java index 0e300dc3..28a6535f 100644 --- a/src/main/java/me/cortex/zenith/client/core/VoxelCore.java +++ b/src/main/java/me/cortex/zenith/client/core/VoxelCore.java @@ -65,7 +65,7 @@ public class VoxelCore { this.postProcessing = null;//new PostProcessing(); - this.world.getMapper().setCallbacks(a->{}, a->{}); + this.world.getMapper().setCallbacks(this.renderer::addBlockState, a->{}); ////Resave the db incase it failed a recovery diff --git a/src/main/java/me/cortex/zenith/client/core/model/ModelManager.java b/src/main/java/me/cortex/zenith/client/core/model/ModelManager.java index f6e66e8a..07b8e440 100644 --- a/src/main/java/me/cortex/zenith/client/core/model/ModelManager.java +++ b/src/main/java/me/cortex/zenith/client/core/model/ModelManager.java @@ -244,6 +244,8 @@ public class ModelManager { faceModelData |= needsAlphaDiscard?1<<22:0; + faceModelData |= (!faceCoversFullBlock)?1<<23:0; + MemoryUtil.memPutInt(faceUploadPtr, faceModelData); } this.metadataCache[modelId] = metadata; diff --git a/src/main/java/me/cortex/zenith/client/core/rendering/AbstractFarWorldRenderer.java b/src/main/java/me/cortex/zenith/client/core/rendering/AbstractFarWorldRenderer.java index b8b9cf26..a409529a 100644 --- a/src/main/java/me/cortex/zenith/client/core/rendering/AbstractFarWorldRenderer.java +++ b/src/main/java/me/cortex/zenith/client/core/rendering/AbstractFarWorldRenderer.java @@ -7,6 +7,8 @@ import me.cortex.zenith.client.core.gl.GlBuffer; import me.cortex.zenith.client.core.model.ModelManager; import me.cortex.zenith.client.core.rendering.building.BuiltSection; import me.cortex.zenith.client.core.rendering.util.UploadStream; +import me.cortex.zenith.common.world.other.Mapper; +import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Camera; import net.minecraft.client.render.Frustum; @@ -15,6 +17,8 @@ import org.joml.FrustumIntersection; import org.lwjgl.system.MemoryUtil; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedDeque; import static org.lwjgl.opengl.ARBMultiDrawIndirect.glMultiDrawElementsIndirect; import static org.lwjgl.opengl.GL30.*; @@ -43,6 +47,7 @@ public abstract class AbstractFarWorldRenderer { protected FrustumIntersection frustum; + private final ConcurrentLinkedDeque blockStateUpdates = new ConcurrentLinkedDeque<>(); public AbstractFarWorldRenderer(int geometrySize, int maxSections) { this.uniformBuffer = new GlBuffer(1024); this.lightDataBuffer = new GlBuffer(256*4);//256 of uint @@ -59,7 +64,6 @@ public abstract class AbstractFarWorldRenderer { this.sy = camera.getBlockPos().getY() >> 5; this.sz = camera.getBlockPos().getZ() >> 5; - //TODO: move this to a render function that is only called // once per frame when using multi viewport mods //it shouldent matter if its called multiple times a frame however, as its synced with fences @@ -80,6 +84,12 @@ public abstract class AbstractFarWorldRenderer { //Upload any new geometry this.geometry.uploadResults(); + + //Do any BlockChanges + while (!this.blockStateUpdates.isEmpty()) { + var update = this.blockStateUpdates.pop(); + this.models.addEntry(update.id, update.state); + } } public abstract void renderFarAwayOpaque(MatrixStack stack, double cx, double cy, double cz); @@ -90,6 +100,10 @@ public abstract class AbstractFarWorldRenderer { this.geometry.enqueueResult(result); } + public void addBlockState(Mapper.StateEntry entry) { + this.blockStateUpdates.add(entry); + } + public void addDebugData(List debug) { this.models.addDebugInfo(debug); } diff --git a/src/main/resources/assets/zenith/shaders/lod/gl46/block_model.glsl b/src/main/resources/assets/zenith/shaders/lod/gl46/block_model.glsl index 9a8198e4..b87b101c 100644 --- a/src/main/resources/assets/zenith/shaders/lod/gl46/block_model.glsl +++ b/src/main/resources/assets/zenith/shaders/lod/gl46/block_model.glsl @@ -10,4 +10,8 @@ vec4 extractFaceSizes(uint faceData) { uint faceHasAlphaCuttout(uint faceData) { return (faceData>>22)&1; +} + +uint faceHasAlphaCuttoutOverride(uint faceData) { + return (faceData>>23)&1; } \ No newline at end of file diff --git a/src/main/resources/assets/zenith/shaders/lod/gl46/cull/raster.vert b/src/main/resources/assets/zenith/shaders/lod/gl46/cull/raster.vert index 0d0980de..42c6a5e7 100644 --- a/src/main/resources/assets/zenith/shaders/lod/gl46/cull/raster.vert +++ b/src/main/resources/assets/zenith/shaders/lod/gl46/cull/raster.vert @@ -20,7 +20,8 @@ void main() { //Transform ipos with respect to the vertex corner ivec3 pos = (((ipos<>2)&1, (gl_VertexID>>1)&1)*size)*(1<>2)&1, (gl_VertexID>>1)&1)*(size+1))*(1<>1)&1, cornerIdx&1)); - vec2 size = (quadSize + faceOffset) * (1<>1)&1, cornerIdx&1)); + vec2 size = (respectiveQuadSize + faceOffset) * (1< 1 + discardAlpha |= uint(any(greaterThan(quadSize, ivec2(1)))) & faceHasAlphaCuttoutOverride(faceData); + //Compute lighting colourTinting = getLighting(extractLightId(quad));