From c0e27634f4ebde70d31debc0149c8701b8d59022 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Wed, 1 Apr 2020 23:44:59 +0200 Subject: [PATCH] Fix particle orientation during omnidirectional rendering in 1.15 --- .../render/mixin/MixinParticleManager.java | 45 +++++++++++++++++-- .../resources/mixins.render.replaymod.json | 2 - 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java b/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java index 1f4955f9..6b0fbac9 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java +++ b/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java @@ -1,20 +1,25 @@ package com.replaymod.render.mixin; -// FIXME 1.15 seems like the way orientation is passed to particles has changed significantly -//#if MC>=10904 && MC<11500 +//#if MC>=10904 import com.replaymod.core.versions.MCVer; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.ParticlesExporter; -import com.replaymod.render.blend.mixin.ParticleAccessor; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleManager; -import net.minecraft.client.render.BufferBuilder; import net.minecraft.util.math.Vec3d; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +//#if MC>=11500 +//$$ import net.minecraft.client.render.VertexConsumer; +//$$ import net.minecraft.util.math.Quaternion; +//#else +import com.replaymod.render.blend.mixin.ParticleAccessor; +import net.minecraft.client.render.BufferBuilder; +//#endif + //#if MC>=11400 import net.minecraft.client.render.Camera; //#else @@ -23,6 +28,37 @@ import net.minecraft.client.render.Camera; @Mixin(ParticleManager.class) public abstract class MixinParticleManager { + //#if MC>=11500 + //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;buildGeometry(Lnet/minecraft/client/render/VertexConsumer;Lnet/minecraft/client/render/Camera;F)V")) + //$$ private void buildOrientedGeometry(Particle particle, VertexConsumer vertexConsumer, Camera camera, float partialTicks) { + //$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); + //$$ if (handler == null || !handler.omnidirectional) { + //$$ buildGeometry(particle, vertexConsumer, camera, partialTicks); + //$$ } else { + //$$ Quaternion rotation = camera.getRotation(); + //$$ Quaternion org = rotation.copy(); + //$$ try { + //$$ Vec3d from = new Vec3d(0, 0, 1); + //$$ Vec3d to = MCVer.getPosition(particle, partialTicks).subtract(camera.getPos()).normalize(); + //$$ Vec3d axis = from.crossProduct(to); + //$$ rotation.set((float) axis.x, (float) axis.y, (float) axis.z, (float) (1 + from.dotProduct(to))); + //$$ rotation.normalize(); + //$$ + //$$ buildGeometry(particle, vertexConsumer, camera, partialTicks); + //$$ } finally { + //$$ rotation.set(org.getA(), org.getB(), org.getC(), org.getD()); + //$$ } + //$$ } + //$$ } + //$$ + //$$ private void buildGeometry(Particle particle, VertexConsumer vertexConsumer, Camera camera, float partialTicks) { + //$$ BlendState blendState = BlendState.getState(); + //$$ if (blendState != null) { + //$$ blendState.get(ParticlesExporter.class).onRender(particle, partialTicks); + //$$ } + //$$ particle.buildGeometry(vertexConsumer, camera, partialTicks); + //$$ } + //#else //#if MC>=11200 //#if MC>=11400 @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;buildGeometry(Lnet/minecraft/client/render/BufferBuilder;Lnet/minecraft/client/render/Camera;FFFFFF)V")) @@ -87,5 +123,6 @@ public abstract class MixinParticleManager { } particle.buildGeometry(vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); } + //#endif } //#endif diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index 1e5ffb84..d516fd4a 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -17,9 +17,7 @@ //#endif "WorldRendererAccessor", //#if MC>=10904 - //#if MC<11500 "MixinParticleManager", - //#endif //#else //$$ "MixinEffectRenderer", //$$ "MixinRendererLivingEntity",