diff --git a/build.gradle b/build.gradle index 4370d0c..ea24e3c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.9-SNAPSHOT' + id 'fabric-loom' version '1.11-SNAPSHOT' id 'maven-publish' } diff --git a/gradle.properties b/gradle.properties index ee3b70b..7000162 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,16 +4,16 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21.1 -yarn_mappings=1.21.1+build.3 +minecraft_version=1.21.6 +yarn_mappings=1.21.6+build.1 loader_version=0.16.10 # Mod Properties -mod_version=0.0.2-beta +mod_version=0.0.3-beta maven_group=net.superkat.tidal archives_base_name=tidal # Dependencies -fabric_version=0.115.0+1.21.1 +fabric_version=0.128.2+1.21.6 midnightlib_version = 1.6.9+1.21-fabric modmenu_version=11.0.3 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e2847c8..ca025c8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/net/superkat/tidal/TidalClient.java b/src/main/java/net/superkat/tidal/TidalClient.java index 532a8fb..1cfdb59 100644 --- a/src/main/java/net/superkat/tidal/TidalClient.java +++ b/src/main/java/net/superkat/tidal/TidalClient.java @@ -1,6 +1,5 @@ package net.superkat.tidal; -import com.mojang.blaze3d.systems.RenderSystem; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; @@ -10,14 +9,8 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.BufferRenderer; -import net.minecraft.client.render.BuiltBuffer; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.LightmapTextureManager; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.gl.RenderPipelines; +import net.minecraft.client.render.*; import net.minecraft.resource.ResourceType; import net.superkat.tidal.duck.TidalWorld; import net.superkat.tidal.event.ClientBlockUpdateEvent; @@ -86,30 +79,24 @@ public void onInitializeClient() { WorldRenderEvents.AFTER_TRANSLUCENT.register(context -> { if(context.world() == null) return; TidalWorld tidalWorld = (TidalWorld) context.world(); - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buffer = tessellator.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR_TEXTURE_LIGHT); - - tidalWorld.tidal$tidalWaveHandler().render(buffer, context); - - BuiltBuffer builtBuffer = buffer.endNullable(); - if(builtBuffer == null) return; - - LightmapTextureManager lightmapTextureManager = MinecraftClient.getInstance().gameRenderer.getLightmapTextureManager(); - - lightmapTextureManager.enable(); - - RenderSystem.depthMask(true); - RenderSystem.enableDepthTest(); - RenderSystem.setShader(GameRenderer::getRenderTypeTripwireProgram); - RenderSystem.setShaderTexture(0, TidalSpriteHandler.WAVE_ATLAS_ID); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - BufferRenderer.drawWithGlobalProgram(builtBuffer); - - RenderSystem.depthMask(true); - RenderSystem.disableBlend(); - lightmapTextureManager.disable(); + VertexConsumerProvider vertexConsumers = context.consumers(); + + RenderLayer waveRenderLayer = RenderLayer.of( + "tidal_waves", + 1536, + false, + true, + RenderPipelines.TRANSLUCENT_PARTICLE, + RenderLayer.MultiPhaseParameters.builder() + .texture(new RenderPhase.Texture(TidalSpriteHandler.WAVE_ATLAS_ID, false)) + .lightmap(RenderPhase.ENABLE_LIGHTMAP) + .overlay(RenderPhase.DISABLE_OVERLAY_COLOR) + .target(RenderPhase.PARTICLES_TARGET) + .build(false) + ); + + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(waveRenderLayer); + tidalWorld.tidal$tidalWaveHandler().render(vertexConsumer, context); }); ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(TIDAL_SPRITE_HANDLER); diff --git a/src/main/java/net/superkat/tidal/mixin/ClientWorldMixin.java b/src/main/java/net/superkat/tidal/mixin/ClientWorldMixin.java index 89fafb1..fa74ac6 100644 --- a/src/main/java/net/superkat/tidal/mixin/ClientWorldMixin.java +++ b/src/main/java/net/superkat/tidal/mixin/ClientWorldMixin.java @@ -7,6 +7,8 @@ import net.minecraft.registry.RegistryKey; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; import net.superkat.tidal.duck.TidalWorld; import net.superkat.tidal.event.ClientBlockUpdateEvent; import net.superkat.tidal.wave.TidalWaveHandler; @@ -24,7 +26,7 @@ public class ClientWorldMixin implements TidalWorld { public TidalWaveHandler tidalWaveHandler; @Inject(method = "", at = @At("TAIL")) - public void tidal$createTidalWaveHandler(ClientPlayNetworkHandler networkHandler, ClientWorld.Properties properties, RegistryKey registryRef, RegistryEntry dimensionTypeEntry, int loadDistance, int simulationDistance, Supplier profiler, WorldRenderer worldRenderer, boolean debugWorld, long seed, CallbackInfo ci) { + public void tidal$createTidalWaveHandler(ClientPlayNetworkHandler networkHandler, ClientWorld.Properties properties, RegistryKey registryRef, RegistryEntry dimensionType, int loadDistance, int simulationDistance, WorldRenderer worldRenderer, boolean debugWorld, long seed, int seaLevel, CallbackInfo ci) { this.tidalWaveHandler = new TidalWaveHandler((ClientWorld) (Object) this); } diff --git a/src/main/java/net/superkat/tidal/particles/SprayParticle.java b/src/main/java/net/superkat/tidal/particles/SprayParticle.java index 78e8f4d..6577587 100644 --- a/src/main/java/net/superkat/tidal/particles/SprayParticle.java +++ b/src/main/java/net/superkat/tidal/particles/SprayParticle.java @@ -49,7 +49,7 @@ public SprayParticle(ClientWorld world, double x, double y, double z, double vel this.gravityStrength = 0.5f; if(spawnWhite()) { - this.world.addParticle(new WhiteSprayParticleEffect(yaw, intensity, this.scale), x, y, z, velX, velY, velZ); + this.world.addParticleClient(new WhiteSprayParticleEffect(yaw, intensity, this.scale), x, y, z, velX, velY, velZ); this.updateWaterColor(); //only need to update on spawn because it lasts for so little time } @@ -70,14 +70,14 @@ public void tick() { this.x -= this.velocityX * 8; this.z -= this.velocityZ * 8f; for (int i = 0; i < 5; i++) { - this.world.addParticle(TidalParticles.SPLASH_PARTICLE, + this.world.addParticleClient(TidalParticles.SPLASH_PARTICLE, this.x + this.random.nextGaussian(), this.y + 1, this.z + this.random.nextGaussian(), this.random.nextGaussian() * 0.05f, Math.abs(this.world.random.nextGaussian()) * 0.1f + MathHelper.clamp(intensity, 0.1, 0.3), this.random.nextGaussian() * 0.05f); - this.world.addParticle(ParticleTypes.BUBBLE, + this.world.addParticleClient(ParticleTypes.BUBBLE, this.x + this.random.nextGaussian() / 2f, this.y + 1, this.z + this.random.nextGaussian() / 2f, this.random.nextGaussian() / 8f, @@ -87,7 +87,7 @@ public void tick() { this.markDead(); } - this.prevAngle = this.angle; + this.lastAngle = this.angle; if(this.velocityY != 0 && !onGround) { this.angle = this.angle + (float) this.velocityY * 35f; } else { @@ -98,7 +98,7 @@ public void tick() { } @Override - public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { + public void render(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { Quaternionf quaternionf = new Quaternionf(); quaternionf.rotateX((float) Math.toRadians(-90f)); quaternionf.rotateZ((float) Math.toRadians(-90f - this.yaw)); @@ -110,9 +110,9 @@ public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float ti protected void render(VertexConsumer vertexConsumer, Camera camera, Quaternionf quaternionf, float tickDelta) { Vec3d vec3d = camera.getPos(); - float x = (float)(MathHelper.lerp(tickDelta, this.prevPosX, this.x) - vec3d.getX()); - float y = (float)(MathHelper.lerp(tickDelta, this.prevPosY, this.y) - vec3d.getY()) + (spawnWhite() ? 0.025f : 0.125f); - float z = (float)(MathHelper.lerp(tickDelta, this.prevPosZ, this.z) - vec3d.getZ()); + float x = (float)(MathHelper.lerp(tickDelta, this.lastX, this.x) - vec3d.getX()); + float y = (float)(MathHelper.lerp(tickDelta, this.lastY, this.y) - vec3d.getY()) + (spawnWhite() ? 0.025f : 0.125f); + float z = (float)(MathHelper.lerp(tickDelta, this.lastZ, this.z) - vec3d.getZ()); this.quad(vertexConsumer, quaternionf, x, y, z, tickDelta); } diff --git a/src/main/java/net/superkat/tidal/particles/debug/DebugShoreParticle.java b/src/main/java/net/superkat/tidal/particles/debug/DebugShoreParticle.java index 435ae6d..fb1f485 100644 --- a/src/main/java/net/superkat/tidal/particles/debug/DebugShoreParticle.java +++ b/src/main/java/net/superkat/tidal/particles/debug/DebugShoreParticle.java @@ -47,7 +47,7 @@ public static class DebugShoreParticleEffect extends AbstractDustParticleEffect .apply(instance, DebugShoreParticleEffect::new) ); public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( - PacketCodecs.VECTOR3F, effect -> effect.color, PacketCodecs.FLOAT, AbstractDustParticleEffect::getScale, DebugShoreParticleEffect::new + PacketCodecs.VECTOR_3F, effect -> effect.color, PacketCodecs.FLOAT, AbstractDustParticleEffect::getScale, DebugShoreParticleEffect::new ); private final Vector3f color; diff --git a/src/main/java/net/superkat/tidal/particles/debug/DebugWaterParticle.java b/src/main/java/net/superkat/tidal/particles/debug/DebugWaterParticle.java index b44dc11..b4b53f8 100644 --- a/src/main/java/net/superkat/tidal/particles/debug/DebugWaterParticle.java +++ b/src/main/java/net/superkat/tidal/particles/debug/DebugWaterParticle.java @@ -47,7 +47,7 @@ public static class DebugWaterParticleEffect extends AbstractDustParticleEffect .apply(instance, DebugWaterParticleEffect::new) ); public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( - PacketCodecs.VECTOR3F, effect -> effect.color, PacketCodecs.FLOAT, AbstractDustParticleEffect::getScale, DebugWaterParticleEffect::new + PacketCodecs.VECTOR_3F, effect -> effect.color, PacketCodecs.FLOAT, AbstractDustParticleEffect::getScale, DebugWaterParticleEffect::new ); private final Vector3f color; diff --git a/src/main/java/net/superkat/tidal/particles/debug/DebugWaveMovementParticle.java b/src/main/java/net/superkat/tidal/particles/debug/DebugWaveMovementParticle.java index c3be0f5..243dfa4 100644 --- a/src/main/java/net/superkat/tidal/particles/debug/DebugWaveMovementParticle.java +++ b/src/main/java/net/superkat/tidal/particles/debug/DebugWaveMovementParticle.java @@ -68,9 +68,9 @@ public DebugWaveMovementParticle(ClientWorld world, double x, double y, double z } @Override - public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { + public void render(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { if(lifetimeColorMode) updateColor(tickDelta); - super.buildGeometry(vertexConsumer, camera, tickDelta); + super.render(vertexConsumer, camera, tickDelta); } private void updateColor(float tickDelta) { @@ -118,7 +118,7 @@ public static class DebugWaveMovementParticleEffect extends AbstractDustParticle .apply(instance, DebugWaveMovementParticleEffect::new) ); public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( - PacketCodecs.VECTOR3F, effect -> effect.color, + PacketCodecs.VECTOR_3F, effect -> effect.color, PacketCodecs.FLOAT, AbstractDustParticleEffect::getScale, PacketCodecs.FLOAT, DebugWaveMovementParticleEffect::getYaw, PacketCodecs.FLOAT, DebugWaveMovementParticleEffect::getSpeed, diff --git a/src/main/java/net/superkat/tidal/particles/old/AbstractWaveParticle.java b/src/main/java/net/superkat/tidal/particles/old/AbstractWaveParticle.java index d7dec49..6602be6 100644 --- a/src/main/java/net/superkat/tidal/particles/old/AbstractWaveParticle.java +++ b/src/main/java/net/superkat/tidal/particles/old/AbstractWaveParticle.java @@ -75,7 +75,7 @@ public AbstractWaveParticle(ClientWorld world, double x, double y, double z, dou for (int i = 0; i < this.positions.size(); i++) { BlockPos pos = this.positions.get(i); - this.world.addParticle(ParticleTypes.EGG_CRACK, pos.getX(), pos.getY() + 2, pos.getZ(), 0, 0, 0); + this.world.addParticleClient(ParticleTypes.EGG_CRACK, pos.getX(), pos.getY() + 2, pos.getZ(), 0, 0, 0); Vector3f color = new Vector3f(1f, 1f, 1f); float yaw = this.yaws.get(i); DebugWaveMovementParticle.DebugWaveMovementParticleEffect particleEffect = new DebugWaveMovementParticle.DebugWaveMovementParticleEffect( @@ -85,7 +85,7 @@ public AbstractWaveParticle(ClientWorld world, double x, double y, double z, dou 0.3f, 20 ); - this.world.addParticle(particleEffect, pos.getX(), pos.getY() + 1.5, pos.getZ(), 0, 0, 0); + this.world.addParticleClient(particleEffect, pos.getX(), pos.getY() + 1.5, pos.getZ(), 0, 0, 0); } } @@ -123,7 +123,7 @@ public void onBlockHit() { public void spray() { for (int i = 1; i < this.spanWidth; i++) { for (int j = 0; j < 15; j++) { - this.world.addParticle(ParticleTypes.SPLASH, this.x + 0.5 + this.random.nextBetween(-1, 1), this.y, this.z + 0.5 + this.random.nextBetween(-1, 1), this.random.nextGaussian() * 4 * i, this.random.nextGaussian() * 8 * (i / 2f), this.random.nextGaussian() * 4 * i); + this.world.addParticleClient(ParticleTypes.SPLASH, this.x + 0.5 + this.random.nextBetween(-1, 1), this.y, this.z + 0.5 + this.random.nextBetween(-1, 1), this.random.nextGaussian() * 4 * i, this.random.nextGaussian() * 8 * (i / 2f), this.random.nextGaussian() * 4 * i); } } this.markDead(); @@ -131,9 +131,9 @@ public void spray() { @Override public void tick() { - this.prevPosX = this.x; - this.prevPosY = this.y; - this.prevPosZ = this.z; + this.lastX = this.x; + this.lastY = this.y; + this.lastZ = this.z; if (this.age++ >= this.maxAge || this.scale <= 0f) { this.markDead(); } @@ -191,7 +191,7 @@ public void move(double dx, double dy, double dz) { } @Override - public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { + public void render(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { Quaternionf quaternionf = new Quaternionf(); quaternionf.rotateX((float) Math.toRadians(-90f)); quaternionf.rotateZ((float) Math.toRadians(-90f - this.yaw)); @@ -200,9 +200,9 @@ public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float ti protected void render(VertexConsumer vertexConsumer, Camera camera, Quaternionf quaternionf, float tickDelta) { Vec3d vec3d = camera.getPos(); - float x = (float)(MathHelper.lerp(tickDelta, this.prevPosX, this.x) - vec3d.getX()); - float y = (float)(MathHelper.lerp(tickDelta, this.prevPosY, this.y) - vec3d.getY()); - float z = (float)(MathHelper.lerp(tickDelta, this.prevPosZ, this.z) - vec3d.getZ()); + float x = (float)(MathHelper.lerp(tickDelta, this.lastX, this.x) - vec3d.getX()); + float y = (float)(MathHelper.lerp(tickDelta, this.lastY, this.y) - vec3d.getY()); + float z = (float)(MathHelper.lerp(tickDelta, this.lastZ, this.z) - vec3d.getZ()); this.quad(vertexConsumer, quaternionf, x, y, z, tickDelta); } diff --git a/src/main/java/net/superkat/tidal/particles/old/WaveParticle.java b/src/main/java/net/superkat/tidal/particles/old/WaveParticle.java index 8492fa2..0ccb03a 100644 --- a/src/main/java/net/superkat/tidal/particles/old/WaveParticle.java +++ b/src/main/java/net/superkat/tidal/particles/old/WaveParticle.java @@ -22,7 +22,7 @@ public WaveParticle(ClientWorld world, double x, double y, double z, double velX super(world, x, y, z, velX, velY, velZ, params, spriteProvider); this.updateWaterColor(); - this.world.addParticle(new WhiteWaveParticleEffect(params), x, y + 0.05f, z, velX, velY, velZ); + this.world.addParticleClient(new WhiteWaveParticleEffect(params), x, y + 0.05f, z, velX, velY, velZ); //incase I want it for later: This creates a SpriteProvider with this particle's sprites as an example //AW: ParticleManager#SimpleSpriteProviderer, ParticleManager#loadTextureList diff --git a/src/main/java/net/superkat/tidal/renderer/WaveRenderer.java b/src/main/java/net/superkat/tidal/renderer/WaveRenderer.java index a5b8115..2527dc5 100644 --- a/src/main/java/net/superkat/tidal/renderer/WaveRenderer.java +++ b/src/main/java/net/superkat/tidal/renderer/WaveRenderer.java @@ -2,12 +2,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.LightmapTextureManager; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.render.*; import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.world.ClientWorld; @@ -43,18 +38,23 @@ public WaveRenderer(TidalWaveHandler handler, ClientWorld world) { this.world = world; } - public void render(BufferBuilder buffer, WorldRenderContext context) { + public void render(VertexConsumer vertexConsumer, WorldRenderContext context) { List waves = this.handler.getWaves(); if (waves == null || waves.isEmpty()) return; - float tickDelta = context.tickCounter().getTickDelta(false); + float tickDelta = context.tickCounter().getFixedDeltaTicks(); Camera camera = context.camera(); + Frustum frustum = context.frustum(); + for (Wave wave : waves) { - renderWave(buffer, camera, wave, tickDelta); + if (frustum != null && !frustum.isVisible(wave.getBoundingBox())) { + continue; + } + renderWave(vertexConsumer, camera, wave, tickDelta); } - renderOverlays(buffer, camera, handler.coveredBlocks); + renderOverlays(vertexConsumer, camera, handler.coveredBlocks); if (MinecraftClient.getInstance().getEntityRenderDispatcher().shouldRenderHitboxes()) { renderDebugHitboxes(context, waves, camera); @@ -65,23 +65,61 @@ public void render(BufferBuilder buffer, WorldRenderContext context) { * I made this its own method just so I can link it in the Javadoc */ private static void renderDebugHitboxes(WorldRenderContext context, List waves, Camera camera) { + VertexConsumer lineConsumer = context.consumers().getBuffer(RenderLayer.getLines()); + Vec3d cameraPos = camera.getPos(); + for (Wave wave : waves) { MatrixStack matrixStack = new MatrixStack(); - VertexConsumer lines = context.consumers().getBuffer(RenderLayer.getLines()); - Vec3d cameraPos = camera.getPos(); matrixStack.translate(-cameraPos.getX(), -cameraPos.getY(), -cameraPos.getZ()); - WorldRenderer.drawBox(matrixStack, lines, wave.getHitBox(), 1f, 1f, 1f, 1f); + Box box = wave.getHitBox(); + // idk where drawBox went in WorldRenderer class, that's why a custom rendering implementation is used + drawBoxOutline(matrixStack, lineConsumer, box, 1f, 1f, 1f, 1f); + } + } + + /** + * Implementation of rendering debug hitbox + * Here is a simplified version of the rendering implementation + */ + private static void drawBoxOutline(MatrixStack matrices, VertexConsumer vertexConsumer, Box box, float r, float g, float b, float a) { + Matrix4f matrix = matrices.peek().getPositionMatrix(); + + float minX = (float) box.minX; + float minY = (float) box.minY; + float minZ = (float) box.minZ; + float maxX = (float) box.maxX; + float maxY = (float) box.maxY; + float maxZ = (float) box.maxZ; + + float[][] points = { + {minX, minY, minZ}, {maxX, minY, minZ}, + {maxX, minY, maxZ}, {minX, minY, maxZ}, + {minX, maxY, minZ}, {maxX, maxY, minZ}, + {maxX, maxY, maxZ}, {minX, maxY, maxZ} + }; + + int[][] edges = { + {0, 1}, {1, 2}, {2, 3}, {3, 0}, // bottom + {4, 5}, {5, 6}, {6, 7}, {7, 4}, // top + {0, 4}, {1, 5}, {2, 6}, {3, 7} // verticals + }; + + for (int[] edge : edges) { + float[] p1 = points[edge[0]]; + float[] p2 = points[edge[1]]; + vertexConsumer.vertex(matrix, p1[0], p1[1], p1[2]).color(r, g, b, a).normal(0, 1, 0); + vertexConsumer.vertex(matrix, p2[0], p2[1], p2[2]).color(r, g, b, a).normal(0, 1, 0); } } - public void renderWave(BufferBuilder buffer, Camera camera, Wave wave, float delta) { + public void renderWave(VertexConsumer vertexConsumer, Camera camera, Wave wave, float delta) { if (wave == null) return; MatrixStack matrices = new MatrixStack(); matrices.push(); Box box = wave.getBoundingBox(); - Vec3d center = box.getBottomCenter(); + Vec3d center = box.getHorizontalCenter(); Vec3d cameraPos = camera.getPos(); Vec3d transPos = center.subtract(cameraPos); @@ -112,8 +150,8 @@ public void renderWave(BufferBuilder buffer, Camera camera, Wave wave, float del // normal wave texture for (int i = 0; i < wave.width; i++) { - waveQuad(posMatrix, buffer, colorableSprite, age, maxAge, i, 0, 0, 1, wave.length, red, green, blue, alpha, light); - waveQuad(posMatrix, buffer, whiteSprite, age, maxAge, i, 0.05f, 0, 1, wave.length, 1f, 1f, 1f, alpha, light); + waveQuad(posMatrix, vertexConsumer, colorableSprite, age, maxAge, i, 0, 0, 1, wave.length, red, green, blue, alpha, light); + waveQuad(posMatrix, vertexConsumer, whiteSprite, age, maxAge, i, 0.05f, 0, 1, wave.length, 1f, 1f, 1f, alpha, light); } // beneath wave texture after hitting shore @@ -128,15 +166,15 @@ public void renderWave(BufferBuilder buffer, Camera camera, Wave wave, float del float washingZ = ageDelta > turnBackDelta ? MathHelper.lerp((ageDelta - turnBackDelta) * 2, 1.35f, 0) : 1.35f; matrices.scale(1.25f, 1, 1); for (int i = 0; i < wave.width; i++) { - waveQuad(posMatrix, buffer, washingColorableSprite, age, maxAge, i - 0.15f, -0.05f, washingZ, 1, washingLength, red, green, blue, alpha, light); - waveQuad(posMatrix, buffer, washingWhiteSprite, age, maxAge, i - 0.15f, -0.01f, washingZ, 1, washingLength, 1f, 1f, 1f, alpha, light); + waveQuad(posMatrix, vertexConsumer, washingColorableSprite, age, maxAge, i - 0.15f, -0.05f, washingZ, 1, washingLength, red, green, blue, alpha, light); + waveQuad(posMatrix, vertexConsumer, washingWhiteSprite, age, maxAge, i - 0.15f, -0.01f, washingZ, 1, washingLength, 1f, 1f, 1f, alpha, light); } } matrices.pop(); } - private void waveQuad(Matrix4f matrix4f, BufferBuilder buffer, Sprite sprite, int waveAge, int waveMaxAge, float x, float y, float z, float width, float length, float red, float green, float blue, float alpha, int light) { + private void waveQuad(Matrix4f matrix4f, VertexConsumer vertexConsumer, Sprite sprite, int waveAge, int waveMaxAge, float x, float y, float z, float width, float length, float red, float green, float blue, float alpha, int light) { float halfWidth = width / 2f; float halfLength = length / 2f; @@ -151,26 +189,28 @@ private void waveQuad(Matrix4f matrix4f, BufferBuilder buffer, Sprite sprite, in // float v0 = 0f; // float v1 = 1f; - buffer.vertex(matrix4f, x - halfWidth, y, z - halfLength) + vertexConsumer.vertex(matrix4f, x - halfWidth, y, z - halfLength) .color(red, green, blue, alpha).texture(u0, v1).light(light); - buffer.vertex(matrix4f, x - halfWidth, y, z + halfLength) + vertexConsumer.vertex(matrix4f, x - halfWidth, y, z + halfLength) .color(red, green, blue, alpha).texture(u0, v0).light(light); - buffer.vertex(matrix4f, x + halfWidth, y, z + halfLength) + vertexConsumer.vertex(matrix4f, x + halfWidth, y, z + halfLength) .color(red, green, blue, alpha).texture(u1, v0).light(light); - buffer.vertex(matrix4f, x + halfWidth, y, z - halfLength) + vertexConsumer.vertex(matrix4f, x + halfWidth, y, z - halfLength) .color(red, green, blue, alpha).texture(u1, v1).light(light); } - public void renderOverlays(BufferBuilder buffer, Camera camera, Set coveredBlocks) { + public void renderOverlays(VertexConsumer vertexConsumer, Camera camera, Set coveredBlocks) { + if (coveredBlocks.isEmpty()) return; + for (BlockPos covered : coveredBlocks) { - renderCoverOverlay(buffer, camera, covered); + renderCoverOverlay(vertexConsumer, camera, covered); } } - public void renderCoverOverlay(BufferBuilder buffer, Camera camera, BlockPos pos) { + public void renderCoverOverlay(VertexConsumer vertexConsumer, Camera camera, BlockPos pos) { MatrixStack matrices = new MatrixStack(); Vec3d cameraPos = camera.getPos(); Vec3d transPos = pos.toBottomCenterPos().subtract(cameraPos); @@ -187,16 +227,16 @@ public void renderCoverOverlay(BufferBuilder buffer, Camera camera, BlockPos pos matrices.translate(transPos.x - 0.5, transPos.y + 1.01, transPos.z - 0.5); // offsets to the wave's position Matrix4f matrix4f = matrices.peek().getPositionMatrix(); - buffer.vertex(matrix4f, 0, 0, 0) + vertexConsumer.vertex(matrix4f, 0, 0, 0) .color(0.1f, 0.1f, 0.25f, 0.25f).texture(u0, v0).light(light); - buffer.vertex(matrix4f, 0, 0, 1) + vertexConsumer.vertex(matrix4f, 0, 0, 1) .color(0.1f, 0.1f, 0.25f, 0.25f).texture(u0, v1).light(light); - buffer.vertex(matrix4f, 1, 0, 1) + vertexConsumer.vertex(matrix4f, 1, 0, 1) .color(0.1f, 0.1f, 0.25f, 0.25f).texture(u1, v1).light(light); - buffer.vertex(matrix4f, 1, 0, 0) + vertexConsumer.vertex(matrix4f, 1, 0, 0) .color(0.1f, 0.1f, 0.25f, 0.25f).texture(u1, v0).light(light); matrices.pop(); diff --git a/src/main/java/net/superkat/tidal/scan/WaterHandler.java b/src/main/java/net/superkat/tidal/scan/WaterHandler.java index c31380a..700601b 100644 --- a/src/main/java/net/superkat/tidal/scan/WaterHandler.java +++ b/src/main/java/net/superkat/tidal/scan/WaterHandler.java @@ -354,7 +354,7 @@ private void debugTick(MinecraftClient client, ClientPlayerEntity player) { // display all sitePos' List allSites = this.sites.values().stream().flatMap(Collection::stream).toList(); for (SitePos site : allSites) { - this.world.addParticle(ParticleTypes.EGG_CRACK, true, site.getX() + 0.5, site.getY() + 2, site.getZ() + 0.5, 0, 0, 0); + this.world.addParticleClient(ParticleTypes.EGG_CRACK, true, false, site.getX() + 0.5, site.getY() + 2, site.getZ() + 0.5, 0, 0, 0); } if (!DebugHelper.debug()) return; @@ -365,7 +365,7 @@ private void debugTick(MinecraftClient client, ClientPlayerEntity player) { ParticleEffect shoreEffect = new DebugShoreParticle.DebugShoreParticleEffect(new Vector3f(1f, 1f, 1f), 1f); for (BlockPos shore : allShoreBLocks) { Vec3d pos = shore.toCenterPos(); - this.world.addParticle(shoreEffect, pos.getX(), pos.getY() + 1, pos.getZ(), 0, 0, 0); + this.world.addParticleClient(shoreEffect, pos.getX(), pos.getY() + 1, pos.getZ(), 0, 0, 0); } // display all water blocks pos', colored by closest site @@ -381,7 +381,7 @@ private void debugTick(MinecraftClient client, ClientPlayerEntity player) { Vec3d pos = blockPos.toCenterPos(); ParticleEffect particleEffect = new DebugWaterParticle.DebugWaterParticleEffect(color, 1f); - this.world.addParticle(particleEffect, farParticles, pos.getX(), pos.getY() + 1, pos.getZ(), 0, 0, 0); + this.world.addParticleClient(particleEffect, farParticles, false, pos.getX(), pos.getY() + 1, pos.getZ(), 0, 0, 0); } } } diff --git a/src/main/java/net/superkat/tidal/sprite/TidalSpriteHandler.java b/src/main/java/net/superkat/tidal/sprite/TidalSpriteHandler.java index c50597a..10406e7 100644 --- a/src/main/java/net/superkat/tidal/sprite/TidalSpriteHandler.java +++ b/src/main/java/net/superkat/tidal/sprite/TidalSpriteHandler.java @@ -7,9 +7,10 @@ import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.client.texture.SpriteLoader; import net.minecraft.resource.ResourceManager; -import net.minecraft.resource.metadata.ResourceMetadataReader; +import net.minecraft.resource.metadata.ResourceMetadataSerializer; import net.minecraft.util.Identifier; import net.minecraft.util.profiler.Profiler; +import net.minecraft.util.profiler.Profilers; import net.superkat.tidal.Tidal; import java.util.Set; @@ -27,7 +28,7 @@ public class TidalSpriteHandler implements SimpleResourceReloadListener> METADATA_READERS = Set.of(WaveResourceMetadata.SERIALIZER); + public static final Set> METADATA_READERS = Set.of(WaveResourceMetadata.SERIALIZER); public SpriteAtlasTexture atlas; @@ -36,7 +37,7 @@ public Sprite getSprite(Identifier id) { } @Override - public CompletableFuture load(ResourceManager manager, Profiler profiler, Executor executor) { + public CompletableFuture load(ResourceManager manager, Executor executor) { if(this.atlas == null) { this.atlas = new SpriteAtlasTexture(WAVE_ATLAS_ID); MinecraftClient.getInstance().getTextureManager().registerTexture(this.atlas.getId(), this.atlas); @@ -47,7 +48,8 @@ public CompletableFuture load(ResourceManager manager } @Override - public CompletableFuture apply(SpriteLoader.StitchResult stitchResult, ResourceManager manager, Profiler profiler, Executor executor) { + public CompletableFuture apply(SpriteLoader.StitchResult stitchResult, ResourceManager manager, Executor executor) { + Profiler profiler = Profilers.get(); return CompletableFuture.runAsync(() -> { profiler.startTick(); profiler.push("upload"); diff --git a/src/main/java/net/superkat/tidal/sprite/WaveResourceMetadata.java b/src/main/java/net/superkat/tidal/sprite/WaveResourceMetadata.java index 555b6fd..239a003 100644 --- a/src/main/java/net/superkat/tidal/sprite/WaveResourceMetadata.java +++ b/src/main/java/net/superkat/tidal/sprite/WaveResourceMetadata.java @@ -14,7 +14,7 @@ public record WaveResourceMetadata(int frameTime, int frameHeight) { Codec.INT.optionalFieldOf("frametime", 5).forGetter(WaveResourceMetadata::frameTime), Codecs.POSITIVE_INT.optionalFieldOf("frame_height", 16).forGetter(WaveResourceMetadata::frameHeight) ).apply(instance, WaveResourceMetadata::new)); - public static final ResourceMetadataSerializer SERIALIZER = ResourceMetadataSerializer.fromCodec(KEY, CODEC); + public static final ResourceMetadataSerializer SERIALIZER = new ResourceMetadataSerializer<>(KEY, CODEC); } diff --git a/src/main/java/net/superkat/tidal/wave/TidalWaveHandler.java b/src/main/java/net/superkat/tidal/wave/TidalWaveHandler.java index e571024..8fa6772 100644 --- a/src/main/java/net/superkat/tidal/wave/TidalWaveHandler.java +++ b/src/main/java/net/superkat/tidal/wave/TidalWaveHandler.java @@ -8,7 +8,7 @@ import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.world.ClientWorld; import net.minecraft.fluid.FluidState; import net.minecraft.particle.ParticleTypes; @@ -84,8 +84,8 @@ public void tick() { } - public void render(BufferBuilder buffer, WorldRenderContext context) { - this.renderer.render(buffer, context); + public void render(VertexConsumer vertexConsumer, WorldRenderContext context) { + this.renderer.render(vertexConsumer, context); } /** @@ -98,7 +98,7 @@ public void tidalTick() { spawnAllWaves(); } - boolean updateCoveredBlocks = time % 10 == 0; + boolean updateCoveredBlocks = time % 20 == 0; ObjectArraySet updatedCovered = new ObjectArraySet<>(); for (Iterator iterator = waves.iterator(); iterator.hasNext(); ) { @@ -131,7 +131,7 @@ public void spawnAllWaves() { if (DebugHelper.offhandClock()) { for (BlockPos water : waterBlocks) { Vec3d pos = water.toCenterPos(); - this.world.addParticle(ParticleTypes.END_ROD, pos.getX(), pos.getY() + 2.5, pos.getZ(), 0, 0, 0); + this.world.addParticleClient(ParticleTypes.END_ROD, pos.getX(), pos.getY() + 2.5, pos.getZ(), 0, 0, 0); } } } @@ -210,7 +210,7 @@ public void debugWaveParticles(Set waterBlocks) { site.getYaw(), 0.3f, 20); - this.world.addParticle(particleEffect, farParticles, water.getX(), water.getY() + 2, water.getZ(), 0, 0, 0); + this.world.addParticleClient(particleEffect, farParticles, false, water.getX(), water.getY() + 2, water.getZ(), 0, 0, 0); } } @@ -340,7 +340,7 @@ public void debugChunkDirectionParticles(long chunkPosL, boolean farParticles) { sitePos.getYaw(), 0.3f, 20); - this.world.addParticle(particleEffect, farParticles, pos.getX(), pos.getY() + 2, pos.getZ(), 0, 0, 0); + this.world.addParticleClient(particleEffect, farParticles, false, pos.getX(), pos.getY() + 2, pos.getZ(), 0, 0, 0); } } diff --git a/src/main/java/net/superkat/tidal/wave/Wave.java b/src/main/java/net/superkat/tidal/wave/Wave.java index 8f34fc8..ad6dbfc 100644 --- a/src/main/java/net/superkat/tidal/wave/Wave.java +++ b/src/main/java/net/superkat/tidal/wave/Wave.java @@ -222,14 +222,14 @@ public void spray() { double splashZ = this.z + this.velZ * 10; for (int i = 0; i < sprayAmount; i++) { - this.world.addParticle(TidalParticles.SPLASH_PARTICLE, splashX, this.y, splashZ, this.world.random.nextGaussian() * 0.1f, Math.abs(this.world.random.nextGaussian()) * 0.1f + 0.1f, this.world.random.nextGaussian() * 0.1f); + this.world.addParticleClient(TidalParticles.SPLASH_PARTICLE, splashX, this.y, splashZ, this.world.random.nextGaussian() * 0.1f, Math.abs(this.world.random.nextGaussian()) * 0.1f + 0.1f, this.world.random.nextGaussian() * 0.1f); if (this.bigWave) { - this.world.addParticle(TidalParticles.BIG_SPLASH_PARTICLE, splashX + this.world.random.nextGaussian() / 2f, this.y, splashZ + this.world.random.nextGaussian() / 2f, 0, 0.01, 0); + this.world.addParticleClient(TidalParticles.BIG_SPLASH_PARTICLE, splashX + this.world.random.nextGaussian() / 2f, this.y, splashZ + this.world.random.nextGaussian() / 2f, 0, 0.01, 0); } } - this.world.addParticle(new SprayParticleEffect(this.yaw - 180f, sprayIntensity, this.scale), splashX, this.y - 0.05f, splashZ, -this.velX, 0, -this.velZ); + this.world.addParticleClient(new SprayParticleEffect(this.yaw - 180f, sprayIntensity, this.scale), splashX, this.y - 0.05f, splashZ, -this.velX, 0, -this.velZ); this.velX = 0; this.velY = 0; @@ -264,7 +264,7 @@ public boolean updateWashingUp() { for (int i = 0; i < this.width; i++) { for (int j = 0; j < splashAmount; j++) { - this.world.addParticle(TidalParticles.SPLASH_PARTICLE, + this.world.addParticleClient(TidalParticles.SPLASH_PARTICLE, splashX + this.world.random.nextGaussian(), this.y, splashZ + this.world.random.nextGaussian(), diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 689de20..9ccb919 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -32,7 +32,7 @@ "accessWidener": "tidal.accesswidener", "depends": { "fabricloader": ">=0.16.10", - "minecraft": "1.21.1", + "minecraft": ">=1.21.6", "java": ">=21", "fabric-api": "*", "midnightlib": "*"