diff --git a/src/main/java/org/cyclops/cyclopscore/client/particle/BufferBuilderWrapper.java b/src/main/java/org/cyclops/cyclopscore/client/particle/BufferBuilderWrapper.java new file mode 100644 index 00000000000..153257eebbf --- /dev/null +++ b/src/main/java/org/cyclops/cyclopscore/client/particle/BufferBuilderWrapper.java @@ -0,0 +1,5 @@ +package org.cyclops.cyclopscore.client.particle; + +public interface BufferBuilderWrapper { + void cc$setRunnableOnBuild(Runnable runnable); +} diff --git a/src/main/java/org/cyclops/cyclopscore/client/particle/ParticleBlur.java b/src/main/java/org/cyclops/cyclopscore/client/particle/ParticleBlur.java index 7209c44d10c..703b9ec216f 100644 --- a/src/main/java/org/cyclops/cyclopscore/client/particle/ParticleBlur.java +++ b/src/main/java/org/cyclops/cyclopscore/client/particle/ParticleBlur.java @@ -132,7 +132,11 @@ public BufferBuilder begin(Tesselator tesselator, TextureManager textureManager) RenderHelpers.bindTexture(TextureAtlas.LOCATION_PARTICLES); textureManager.getTexture(TextureAtlas.LOCATION_PARTICLES).setBlurMipmap(true, false); - return new BufferBuilderWrapper(tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE), this::end); + BufferBuilder builder = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); + + ((BufferBuilderWrapper) builder).cc$setRunnableOnBuild(this::end); + + return builder; } public void end() { @@ -142,79 +146,4 @@ public void end() { RenderSystem.depthMask(true); } } - - public static class BufferBuilderWrapper extends BufferBuilder { - private final BufferBuilder bufferBuilder; - private final Runnable onBuild; - - public BufferBuilderWrapper(BufferBuilder bufferBuilder, Runnable onBuild) { - super(null, null, DefaultVertexFormat.PARTICLE); - this.bufferBuilder = bufferBuilder; - this.onBuild = onBuild; - } - - @Nullable - @Override - public MeshData build() { - // Flush the buffer manually, so we can ensure on callback is invoked to apply effects - MeshData ret = this.bufferBuilder.build(); - if (ret != null) { - BufferUploader.drawWithShader(ret); - } - this.onBuild.run(); - - return null; - } - - @Override - public VertexConsumer addVertex(float p_350828_, float p_350614_, float p_350700_) { - return this.bufferBuilder.addVertex(p_350828_, p_350614_, p_350700_); - } - - @Override - public VertexConsumer setColor(int p_350581_, int p_350952_, int p_350275_, int p_350985_) { - return this.bufferBuilder.setColor(p_350581_, p_350952_, p_350275_, p_350985_); - } - - @Override - public VertexConsumer setColor(int p_350530_) { - return this.bufferBuilder.setColor(p_350530_); - } - - @Override - public VertexConsumer setUv(float p_350574_, float p_350773_) { - return this.bufferBuilder.setUv(p_350574_, p_350773_); - } - - @Override - public VertexConsumer setUv1(int p_350396_, int p_350722_) { - return this.bufferBuilder.setUv1(p_350396_, p_350722_); - } - - @Override - public VertexConsumer setOverlay(int p_350297_) { - return this.bufferBuilder.setOverlay(p_350297_); - } - - @Override - public VertexConsumer setUv2(int p_351058_, int p_350320_) { - return this.bufferBuilder.setUv2(p_351058_, p_350320_); - } - - @Override - public VertexConsumer setLight(int p_350848_) { - return this.bufferBuilder.setLight(p_350848_); - } - - @Override - public VertexConsumer setNormal(float p_351000_, float p_350982_, float p_350974_) { - return this.bufferBuilder.setNormal(p_351000_, p_350982_, p_350974_); - } - - @Override - public void addVertex(float p_350423_, float p_350381_, float p_350383_, int p_350371_, float p_350977_, float p_350674_, int p_350816_, int p_350690_, float p_350640_, float p_350490_, float p_350810_) { - this.bufferBuilder.addVertex(p_350423_, p_350381_, p_350383_, p_350371_, p_350977_, p_350674_, p_350816_, p_350690_, p_350640_, p_350490_, p_350810_); - } - } - } diff --git a/src/main/java/org/cyclops/cyclopscore/mixin/MixinBufferBuilder.java b/src/main/java/org/cyclops/cyclopscore/mixin/MixinBufferBuilder.java new file mode 100644 index 00000000000..7a1dfb74df4 --- /dev/null +++ b/src/main/java/org/cyclops/cyclopscore/mixin/MixinBufferBuilder.java @@ -0,0 +1,36 @@ +package org.cyclops.cyclopscore.mixin; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.MeshData; +import org.cyclops.cyclopscore.client.particle.BufferBuilderWrapper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BufferBuilder.class) +public class MixinBufferBuilder implements BufferBuilderWrapper { + @Unique + private Runnable cc$runnable = null; + + @Override + public void cc$setRunnableOnBuild(Runnable runnable) { + this.cc$runnable = runnable; + } + + @Inject(method = "build", at = @At("RETURN"), cancellable = true) + private void cc$clearIfRunnableSet(CallbackInfoReturnable cir) { + if (cc$runnable != null) { + // Flush the buffer manually, so we can ensure on callback is invoked to apply effects + MeshData ret = cir.getReturnValue(); + if (ret != null) { + BufferUploader.drawWithShader(ret); + } + this.cc$runnable.run(); + + cir.setReturnValue(null); + } + } +} diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index 615a8565dcf..7e5af4e4cbc 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -15,6 +15,8 @@ Coremod for Integrated Dynamics, EvilCraft and others. ''' [[accessTransformers]] file="META-INF/accesstransformer.cfg" +[[mixins]] + config="mixins.cyclopscore.json" [[dependencies.cyclopscore]] modId="neoforge" type="required" diff --git a/src/main/resources/mixins.cyclopscore.json b/src/main/resources/mixins.cyclopscore.json new file mode 100644 index 00000000000..44c40db3c20 --- /dev/null +++ b/src/main/resources/mixins.cyclopscore.json @@ -0,0 +1,10 @@ +{ + "minVersion": "0.8.5", + "required": true, + "compatibilityLevel": "JAVA_17", + "package": "org.cyclops.cyclopscore.mixin", + "client": [ + "MixinBufferBuilder" + ], + "setSourceFile": true +} \ No newline at end of file