diff --git a/src/main/java/me/cortex/voxelmon/core/VoxelCore.java b/src/main/java/me/cortex/voxelmon/core/VoxelCore.java index 05ce4090..e2a7615f 100644 --- a/src/main/java/me/cortex/voxelmon/core/VoxelCore.java +++ b/src/main/java/me/cortex/voxelmon/core/VoxelCore.java @@ -73,7 +73,7 @@ public class VoxelCore { //Trigger the shared index buffer loading SharedIndexBuffer.INSTANCE.id(); this.renderer = new Gl46FarWorldRenderer(); - this.world = new WorldEngine(new File("storagefile2.db"), 5, 20, 5);//"storagefile.db"//"ethoslab.db" + this.world = new WorldEngine(new File("storagefile2.db"), 2, 5, 5);//"storagefile.db"//"ethoslab.db" this.renderTracker = new RenderTracker(this.world, this.renderer); this.renderGen = new RenderGenerationService(this.world,5, this.renderTracker::processBuildResult); @@ -83,7 +83,7 @@ public class VoxelCore { //To get to chunk scale multiply the scale by 2, the scale is after how many chunks does the lods halve this.distanceTracker = new DistanceTracker(this.renderTracker, 5, 16); - this.postProcessing = null;// = new PostProcessing(); + this.postProcessing = new PostProcessing(); this.world.getMapper().setCallbacks(this::stateUpdate, this::biomeUpdate); @@ -178,8 +178,10 @@ public class VoxelCore { // this is cause the terrain might not exist and so all the caves are visible causing hell for the // occlusion culler this.renderer.renderFarAwayOpaque(matrices, cameraX, cameraY, cameraZ); + + //glBindFramebuffer(GL_FRAMEBUFFER, boundFB); - // this.postProcessing.renderPost(boundFB); + //this.postProcessing.renderPost(boundFB); } public void addDebugInfo(List debug) { @@ -198,8 +200,8 @@ public class VoxelCore { // since they are AABBS crossing the normal is impossible without one of the axis being equal public void shutdown() { - try {this.renderGen.shutdown();} catch (Exception e) {System.err.println(e);} try {this.world.shutdown();} catch (Exception e) {System.err.println(e);} + try {this.renderGen.shutdown();} catch (Exception e) {System.err.println(e);} try {this.renderer.shutdown();} catch (Exception e) {System.err.println(e);} try {this.postProcessing.shutdown();} catch (Exception e) {System.err.println(e);} } diff --git a/src/main/java/me/cortex/voxelmon/core/rendering/RenderTracker.java b/src/main/java/me/cortex/voxelmon/core/rendering/RenderTracker.java index 0e5ac7f2..5a68b3b2 100644 --- a/src/main/java/me/cortex/voxelmon/core/rendering/RenderTracker.java +++ b/src/main/java/me/cortex/voxelmon/core/rendering/RenderTracker.java @@ -160,6 +160,17 @@ public class RenderTracker { //Called by the world engine when a section gets dirtied public void sectionUpdated(WorldSection section) { + if (this.activeSections.containsKey(section.getKey())) { + //TODO:FIXME: if the section gets updated, that means that its neighbors might need to be updated aswell + // (due to block occlusion) + + //TODO: FIXME: REBUILDING THE ENTIRE NEIGHBORS when probably only the internal layout changed is NOT SMART + this.renderGen.enqueueTask(section.lvl, section.x, section.y, section.z, this::shouldStillBuild, this::getBuildFlagsOrAbort); + this.renderGen.enqueueTask(section.lvl, section.x-1, section.y, section.z, this::shouldStillBuild, this::getBuildFlagsOrAbort); + this.renderGen.enqueueTask(section.lvl, section.x+1, section.y, section.z, this::shouldStillBuild, this::getBuildFlagsOrAbort); + this.renderGen.enqueueTask(section.lvl, section.x, section.y, section.z-1, this::shouldStillBuild, this::getBuildFlagsOrAbort); + this.renderGen.enqueueTask(section.lvl, section.x, section.y, section.z+1, this::shouldStillBuild, this::getBuildFlagsOrAbort); + } //this.renderGen.enqueueTask(section); } diff --git a/src/main/java/me/cortex/voxelmon/core/world/WorldEngine.java b/src/main/java/me/cortex/voxelmon/core/world/WorldEngine.java index c4286d1b..215285e7 100644 --- a/src/main/java/me/cortex/voxelmon/core/world/WorldEngine.java +++ b/src/main/java/me/cortex/voxelmon/core/world/WorldEngine.java @@ -62,6 +62,9 @@ public class WorldEngine { MemoryUtil.memFree(data); } } else { + //TODO: if we need to fetch an lod from a server, send the request here and block until the request is finished + // the response should be put into the local db so that future data can just use that + // the server can also send arbitrary updates to the client for arbitrary lods return 1; } } diff --git a/src/main/java/me/cortex/voxelmon/mixin/minecraft/MixinWorldRenderer.java b/src/main/java/me/cortex/voxelmon/mixin/minecraft/MixinWorldRenderer.java index 91db6c22..c932d324 100644 --- a/src/main/java/me/cortex/voxelmon/mixin/minecraft/MixinWorldRenderer.java +++ b/src/main/java/me/cortex/voxelmon/mixin/minecraft/MixinWorldRenderer.java @@ -8,7 +8,9 @@ import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(WorldRenderer.class) public abstract class MixinWorldRenderer { @@ -16,19 +18,19 @@ public abstract class MixinWorldRenderer { @Shadow protected abstract void setupTerrain(Camera camera, Frustum frustum, boolean hasForcedFrustum, boolean spectator); - @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;setupTerrain(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;ZZ)V")) - private void injectSetup(WorldRenderer instance, Camera camera, Frustum frustum, boolean hasForcedFrustum, boolean spectator) { - //Call the actual terrain setup method - this.setupTerrain(camera, frustum, hasForcedFrustum, spectator); + @Shadow private Frustum frustum; + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;setupTerrain(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;ZZ)V", shift = At.Shift.AFTER)) + private void injectSetup(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f projectionMatrix, CallbackInfo ci) { //Call our setup method - VoxelCore.INSTANCE.renderSetup(frustum, camera); + VoxelCore.INSTANCE.renderSetup(this.frustum, camera); } - @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderLayer(Lnet/minecraft/client/render/RenderLayer;Lnet/minecraft/client/util/math/MatrixStack;DDDLorg/joml/Matrix4f;)V", ordinal = 2)) - private void injectOpaqueRender(WorldRenderer instance, RenderLayer renderLayer, MatrixStack matrices, double cameraX, double cameraY, double cameraZ, Matrix4f positionMatrix) { + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderLayer(Lnet/minecraft/client/render/RenderLayer;Lnet/minecraft/client/util/math/MatrixStack;DDDLorg/joml/Matrix4f;)V", ordinal = 2, shift = At.Shift.AFTER)) + private void injectOpaqueRender(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f projectionMatrix, CallbackInfo ci) { + var cam = camera.getPos(); //Call the actual render method - this.renderLayer(renderLayer, matrices, cameraX, cameraY, cameraZ, positionMatrix); - VoxelCore.INSTANCE.renderOpaque(matrices, cameraX, cameraY, cameraZ); + VoxelCore.INSTANCE.renderOpaque(matrices, cam.x, cam.y, cam.z); } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ca31c2f2..7c159203 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,10 +1,12 @@ { "schemaVersion": 1, - "id": "voxelmon", + "id": "zenith", "version": "${version}", - "name": "voxelmon", + "name": "zenith", "description": "", - "authors": [], + "authors": [ + "Cortex" + ], "contact": { }, "license": "All-Rights-Reserved",