diff --git a/src/main/java/top/hendrixshen/magiclib/event/render/api/IRenderEvent.java b/src/main/java/top/hendrixshen/magiclib/event/render/api/IRenderEvent.java new file mode 100644 index 00000000..e40efc5d --- /dev/null +++ b/src/main/java/top/hendrixshen/magiclib/event/render/api/IRenderEvent.java @@ -0,0 +1,16 @@ +package top.hendrixshen.magiclib.event.render.api; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import top.hendrixshen.magiclib.event.render.impl.RenderContext; + +import java.util.function.Supplier; + +@Environment(EnvType.CLIENT) +interface IRenderEvent { + default Supplier getProfilerSectionSupplier() { + return () -> this.getClass().getName(); + } + + void render(T obj, RenderContext context, float tickDelta); +} diff --git a/src/main/java/top/hendrixshen/magiclib/render/api/IPostRenderEntityRenderer.java b/src/main/java/top/hendrixshen/magiclib/event/render/api/PostRenderEntityEvent.java similarity index 54% rename from src/main/java/top/hendrixshen/magiclib/render/api/IPostRenderEntityRenderer.java rename to src/main/java/top/hendrixshen/magiclib/event/render/api/PostRenderEntityEvent.java index b78e3437..6f07c4df 100644 --- a/src/main/java/top/hendrixshen/magiclib/render/api/IPostRenderEntityRenderer.java +++ b/src/main/java/top/hendrixshen/magiclib/event/render/api/PostRenderEntityEvent.java @@ -1,12 +1,13 @@ -package top.hendrixshen.magiclib.render.api; +package top.hendrixshen.magiclib.event.render.api; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.world.entity.Entity; -import top.hendrixshen.magiclib.render.impl.RenderContext; +import top.hendrixshen.magiclib.event.render.impl.RenderContext; -@Environment(EnvType.CLIENT) @FunctionalInterface -public interface IPostRenderEntityRenderer { +@Environment(EnvType.CLIENT) +public interface PostRenderEntityEvent extends IRenderEvent { + @Override void render(Entity entity, RenderContext context, float tickDelta); } diff --git a/src/main/java/top/hendrixshen/magiclib/render/api/IPostRenderLevelRenderer.java b/src/main/java/top/hendrixshen/magiclib/event/render/api/PostRenderLevelEvent.java similarity index 54% rename from src/main/java/top/hendrixshen/magiclib/render/api/IPostRenderLevelRenderer.java rename to src/main/java/top/hendrixshen/magiclib/event/render/api/PostRenderLevelEvent.java index cafc3de6..1251fd82 100644 --- a/src/main/java/top/hendrixshen/magiclib/render/api/IPostRenderLevelRenderer.java +++ b/src/main/java/top/hendrixshen/magiclib/event/render/api/PostRenderLevelEvent.java @@ -1,12 +1,13 @@ -package top.hendrixshen.magiclib.render.api; +package top.hendrixshen.magiclib.event.render.api; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.world.level.Level; -import top.hendrixshen.magiclib.render.impl.RenderContext; +import top.hendrixshen.magiclib.event.render.impl.RenderContext; -@Environment(EnvType.CLIENT) @FunctionalInterface -public interface IPostRenderLevelRenderer { +@Environment(EnvType.CLIENT) +public interface PostRenderLevelEvent extends IRenderEvent { + @Override void render(Level level, RenderContext context, float tickDelta); } diff --git a/src/main/java/top/hendrixshen/magiclib/render/impl/RenderContext.java b/src/main/java/top/hendrixshen/magiclib/event/render/impl/RenderContext.java similarity index 86% rename from src/main/java/top/hendrixshen/magiclib/render/impl/RenderContext.java rename to src/main/java/top/hendrixshen/magiclib/event/render/impl/RenderContext.java index a22c0ce5..63633489 100644 --- a/src/main/java/top/hendrixshen/magiclib/render/impl/RenderContext.java +++ b/src/main/java/top/hendrixshen/magiclib/event/render/impl/RenderContext.java @@ -1,4 +1,4 @@ -package top.hendrixshen.magiclib.render.impl; +package top.hendrixshen.magiclib.event.render.impl; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; @@ -62,6 +62,14 @@ public void blendFunc(GlStateManager.SourceFactor srcFactor, GlStateManager.Dest RenderSystem.blendFunc(srcFactor, dstFactor); } + public void color4f(float red, float green, float blue, float alpha) { + //#if MC > 11605 + RenderSystem.setShaderColor(red, green, blue, alpha); + //#else + //$$ RenderSystem.color4f(red, green, blue, alpha); + //#endif + } + //#if MC < 11904 //$$ public void enableTexture() { //$$ RenderSystem.enableTexture(); @@ -77,10 +85,4 @@ public void blendFunc(GlStateManager.SourceFactor srcFactor, GlStateManager.Dest //$$ RenderSystem.disableLighting(); //$$ } //#endif - - //#if MC < 11600 - //$$ public void color4f(float red, float green, float blue, float alpha) { - //$$ RenderSystem.color4f(red, green, blue, alpha); - //$$ } - //#endif } diff --git a/src/main/java/top/hendrixshen/magiclib/event/render/impl/RenderEventHandler.java b/src/main/java/top/hendrixshen/magiclib/event/render/impl/RenderEventHandler.java new file mode 100644 index 00000000..c651b90e --- /dev/null +++ b/src/main/java/top/hendrixshen/magiclib/event/render/impl/RenderEventHandler.java @@ -0,0 +1,53 @@ +package top.hendrixshen.magiclib.event.render.impl; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import lombok.Getter; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import top.hendrixshen.magiclib.event.render.api.PostRenderEntityEvent; +import top.hendrixshen.magiclib.event.render.api.PostRenderLevelEvent; + +import java.util.List; + +public class RenderEventHandler { + @Getter + private static final RenderEventHandler instance = new RenderEventHandler(); + private static final Minecraft mc = Minecraft.getInstance(); + private static final List postRenderEntityEvents = Lists.newArrayList(); + private static final List postRenderLevelEvents = Lists.newArrayList(); + + public static void registerPostRenderEntityEvent(PostRenderEntityEvent event) { + RenderEventHandler.postRenderEntityEvents.add(event); + } + + public static void registerPostRenderLevelEvent(PostRenderLevelEvent event) { + RenderEventHandler.postRenderLevelEvents.add(event); + } + + public void dispatchPostRenderEntityEvent(Entity entity, PoseStack poseStack, float tickDelta) { + if (!RenderEventHandler.postRenderEntityEvents.isEmpty()) { + mc.getProfiler().push("MagicRenderEventHandler::dispatchPostRenderEntityEvent"); + RenderContext renderContext = new RenderContext(poseStack); + RenderEventHandler.postRenderEntityEvents.forEach(event -> { + mc.getProfiler().push(event.getProfilerSectionSupplier()); + event.render(entity, renderContext, tickDelta); + mc.getProfiler().pop(); + }); + mc.getProfiler().pop(); + } + } + + public void dispatchPostRenderLevelEvent(Level level, PoseStack poseStack, float tickDelta) { + if (!RenderEventHandler.postRenderLevelEvents.isEmpty()) { + mc.getProfiler().popPush("MagicRenderEventHandler::dispatchPostRenderLevelEvent"); + RenderContext renderContext = new RenderContext(poseStack); + RenderEventHandler.postRenderLevelEvents.forEach(event -> { + mc.getProfiler().push(event.getProfilerSectionSupplier()); + event.render(level, renderContext, tickDelta); + mc.getProfiler().pop(); + }); + } + } +} diff --git a/src/main/java/top/hendrixshen/magiclib/render/mixin/MixinEntityRenderer.java b/src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinEntityRenderer.java similarity index 90% rename from src/main/java/top/hendrixshen/magiclib/render/mixin/MixinEntityRenderer.java rename to src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinEntityRenderer.java index eb6315c4..180625e6 100644 --- a/src/main/java/top/hendrixshen/magiclib/render/mixin/MixinEntityRenderer.java +++ b/src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinEntityRenderer.java @@ -1,4 +1,4 @@ -package top.hendrixshen.magiclib.render.mixin; +package top.hendrixshen.magiclib.event.render.mixin; import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.hendrixshen.magiclib.render.impl.RenderEventHandler; +import top.hendrixshen.magiclib.event.render.impl.RenderEventHandler; //#if MC > 11404 import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/top/hendrixshen/magiclib/render/mixin/MixinGameRenderer.java b/src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinGameRenderer.java similarity index 90% rename from src/main/java/top/hendrixshen/magiclib/render/mixin/MixinGameRenderer.java rename to src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinGameRenderer.java index cd1f04a1..0897df80 100644 --- a/src/main/java/top/hendrixshen/magiclib/render/mixin/MixinGameRenderer.java +++ b/src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinGameRenderer.java @@ -1,4 +1,4 @@ -package top.hendrixshen.magiclib.render.mixin; +package top.hendrixshen.magiclib.event.render.mixin; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -13,7 +13,7 @@ //$$ import org.spongepowered.asm.mixin.injection.At; //$$ import org.spongepowered.asm.mixin.injection.Inject; //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ import top.hendrixshen.magiclib.render.impl.RenderEventHandler; +//$$ import top.hendrixshen.magiclib.event.render.impl.RenderEventHandler; //$$ import top.hendrixshen.magiclib.util.MiscUtil; //#endif diff --git a/src/main/java/top/hendrixshen/magiclib/render/mixin/MixinLevelRenderer.java b/src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinLevelRenderer.java similarity index 93% rename from src/main/java/top/hendrixshen/magiclib/render/mixin/MixinLevelRenderer.java rename to src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinLevelRenderer.java index 44a81e26..e13864fc 100644 --- a/src/main/java/top/hendrixshen/magiclib/render/mixin/MixinLevelRenderer.java +++ b/src/main/java/top/hendrixshen/magiclib/event/render/mixin/MixinLevelRenderer.java @@ -1,4 +1,4 @@ -package top.hendrixshen.magiclib.render.mixin; +package top.hendrixshen.magiclib.event.render.mixin; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.hendrixshen.magiclib.render.impl.RenderEventHandler; +import top.hendrixshen.magiclib.event.render.impl.RenderEventHandler; //#else //$$ import top.hendrixshen.magiclib.compat.preprocess.api.DummyClass; //#endif diff --git a/src/main/java/top/hendrixshen/magiclib/render/impl/CameraPositionTransformer.java b/src/main/java/top/hendrixshen/magiclib/render/impl/CameraPositionTransformer.java new file mode 100644 index 00000000..65adf8e4 --- /dev/null +++ b/src/main/java/top/hendrixshen/magiclib/render/impl/CameraPositionTransformer.java @@ -0,0 +1,39 @@ +package top.hendrixshen.magiclib.render.impl; + +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix4f; +import top.hendrixshen.magiclib.event.render.impl.RenderContext; + +import java.util.Objects; + +public class CameraPositionTransformer { + private final Vec3 pos; + private RenderContext context; + + public CameraPositionTransformer(Vec3 pos) { + this.pos = pos; + } + + public void apply(@NotNull RenderContext context) { + this.context = context; + Minecraft mc = Minecraft.getInstance(); + Camera camera = mc.gameRenderer.getMainCamera(); + Vec3 vec3 = this.pos.subtract(camera.getPosition()); + context.pushMatrix(); + context.translate(vec3.x(), vec3.y(), vec3.z()); + //#if MC > 11902 + context.mulPoseMatrix(new Matrix4f().rotation(camera.rotationCompat())); + //#else + //$$ new Matrix4f(camera.rotationCompat()); + //#endif + } + + public void restore() { + Objects.requireNonNull(this.context); + this.context.popMatrix(); + this.context = null; + } +} diff --git a/src/main/java/top/hendrixshen/magiclib/render/impl/RenderEventHandler.java b/src/main/java/top/hendrixshen/magiclib/render/impl/RenderEventHandler.java deleted file mode 100644 index 255ecfb1..00000000 --- a/src/main/java/top/hendrixshen/magiclib/render/impl/RenderEventHandler.java +++ /dev/null @@ -1,53 +0,0 @@ -package top.hendrixshen.magiclib.render.impl; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import lombok.Getter; -import net.minecraft.client.Minecraft; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.Level; -import top.hendrixshen.magiclib.render.api.IPostRenderEntityRenderer; -import top.hendrixshen.magiclib.render.api.IPostRenderLevelRenderer; - -import java.util.List; - -public class RenderEventHandler { - @Getter - private static final RenderEventHandler instance = new RenderEventHandler(); - private static final Minecraft mc = Minecraft.getInstance(); - private static final List postRenderEntityRenderers = Lists.newArrayList(); - private static final List postRenderLevelRenderers = Lists.newArrayList(); - - public static void registerPostRenderEntityRenderer(IPostRenderEntityRenderer renderer) { - RenderEventHandler.postRenderEntityRenderers.add(renderer); - } - - public static void registerPostRenderLevelRenderer(IPostRenderLevelRenderer renderer) { - RenderEventHandler.postRenderLevelRenderers.add(renderer); - } - - public void dispatchPostRenderEntityEvent(Entity entity, PoseStack poseStack, float tickDelta) { - if (!RenderEventHandler.postRenderEntityRenderers.isEmpty()) { - mc.getProfiler().push("MagicRenderEventHandler::dispatchPostRenderEntityEvent"); - RenderContext renderContext = new RenderContext(poseStack); - RenderEventHandler.postRenderEntityRenderers.forEach(renderer -> { - mc.getProfiler().push(String.format("%s::render", renderer.getClass().getName())); - renderer.render(entity, renderContext, tickDelta); - mc.getProfiler().pop(); - }); - mc.getProfiler().pop(); - } - } - - public void dispatchPostRenderLevelEvent(Level level, PoseStack poseStack, float tickDelta) { - if (!RenderEventHandler.postRenderLevelRenderers.isEmpty()) { - mc.getProfiler().popPush("MagicRenderEventHandler::dispatchPostRenderLevelEvent"); - RenderContext renderContext = new RenderContext(poseStack); - RenderEventHandler.postRenderLevelRenderers.forEach(renderer -> { - mc.getProfiler().push(String.format("%s::render", renderer.getClass().getName())); - renderer.render(level, renderContext, tickDelta); - mc.getProfiler().pop(); - }); - } - } -} diff --git a/src/main/java/top/hendrixshen/magiclib/render/impl/TextRenderer.java b/src/main/java/top/hendrixshen/magiclib/render/impl/TextRenderer.java index f9cd5a7f..6d489a78 100644 --- a/src/main/java/top/hendrixshen/magiclib/render/impl/TextRenderer.java +++ b/src/main/java/top/hendrixshen/magiclib/render/impl/TextRenderer.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; import top.hendrixshen.magiclib.compat.minecraft.api.network.chat.ComponentCompatApi; +import top.hendrixshen.magiclib.event.render.impl.RenderContext; import java.util.Collections; import java.util.List; @@ -36,6 +37,7 @@ public class TextRenderer { private boolean shadow = false; private boolean seeThrough = false; + @SuppressWarnings("UnnecessaryLocalVariable") public void render(RenderContext context) { if (this.lines.isEmpty()) { return; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ec02333b..0e68c67c 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -41,10 +41,10 @@ }, "mixins": [ "${mod_id}-carpet.mixins.json", + "${mod_id}-event.mixins.json", "${mod_id}-i18n.mixins.json", "${mod_id}-malilib.mixins.json", - "${mod_id}-minecraft-compat-api.mixins.json", - "${mod_id}-render.mixins.json" + "${mod_id}-minecraft-compat-api.mixins.json" ], "depends": { "minecraft": "${minecraft_dependency}" diff --git a/src/main/resources/magiclib-render.mixins.json b/src/main/resources/magiclib-event.mixins.json similarity index 82% rename from src/main/resources/magiclib-render.mixins.json rename to src/main/resources/magiclib-event.mixins.json index c844df67..66785b7c 100644 --- a/src/main/resources/magiclib-render.mixins.json +++ b/src/main/resources/magiclib-event.mixins.json @@ -1,6 +1,6 @@ { "required": true, - "package": "top.hendrixshen.magiclib.render.mixin", + "package": "top.hendrixshen.magiclib.event.render.mixin", "plugin": "top.hendrixshen.magiclib.MagicLibMixinPlugin", "minVersion": "0.8", "compatibilityLevel": "JAVA_8",