From 6206df0ad85e5803dca831f88ccfec5642c3c9dd Mon Sep 17 00:00:00 2001 From: lcy0x1 Date: Tue, 27 Aug 2024 09:06:07 +0800 Subject: [PATCH] icon render --- gradle.properties | 2 +- .../base/effects/api/DelayedEntityRender.java | 26 +++++++++++-- .../base/effects/api/IDelayedRender.java | 21 +++++++++++ .../l2core/base/effects/api/SimpleIcon.java | 20 ++++++++++ .../events/ClientEffectRenderEvents.java | 37 ++++++------------- .../dev/xkmc/l2core/init/reg/simple/Val.java | 14 +++++-- 6 files changed, 87 insertions(+), 33 deletions(-) create mode 100644 src/main/java/dev/xkmc/l2core/base/effects/api/IDelayedRender.java create mode 100644 src/main/java/dev/xkmc/l2core/base/effects/api/SimpleIcon.java diff --git a/gradle.properties b/gradle.properties index 7ddc334..45a4508 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=l2core mod_name=L2Core mod_license=LGPL-2.1 -mod_version=3.0.7+21 +mod_version=3.0.7+23 mod_group_id=dev.xkmc mod_authors=lcy0x1 mod_description=Core Library mod for all L2 mods diff --git a/src/main/java/dev/xkmc/l2core/base/effects/api/DelayedEntityRender.java b/src/main/java/dev/xkmc/l2core/base/effects/api/DelayedEntityRender.java index 65fe4f1..c273db7 100644 --- a/src/main/java/dev/xkmc/l2core/base/effects/api/DelayedEntityRender.java +++ b/src/main/java/dev/xkmc/l2core/base/effects/api/DelayedEntityRender.java @@ -1,12 +1,16 @@ package dev.xkmc.l2core.base.effects.api; +import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.Vec3; -public record DelayedEntityRender(LivingEntity entity, IconRenderRegion region, ResourceLocation rl, - double xo, double yo, double zo, - float tx, float ty, float tw, float th) { - +public record DelayedEntityRender( + LivingEntity entity, IconRenderRegion region, ResourceLocation rl, + double xo, double yo, double zo, + float tx, float ty, float tw, float th +) implements IDelayedRender { public static DelayedEntityRender icon(LivingEntity entity, ResourceLocation rl) { return icon(entity, IconRenderRegion.identity(), rl); @@ -25,4 +29,18 @@ public record DelayedEntityRender(LivingEntity entity, IconRenderRegion region, return new DelayedEntityRender(entity, r.resize(region), rl, xo, yo, zo, tx, ty, tw, th); } + @Override + public Vec3 pos(float partial) { + LivingEntity entity = entity(); + float f = entity.getBbHeight() / 2; + double x0 = Mth.lerp(partial, xo(), entity.getX()); + double y0 = Mth.lerp(partial, yo(), entity.getY()); + double z0 = Mth.lerp(partial, zo(), entity.getZ()); + var dispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); + Vec3 offset = dispatcher.getRenderer(entity).getRenderOffset(entity, partial); + double x = x0 + offset.x(); + double y = y0 + offset.y() + f; + double z = z0 + offset.z(); + return new Vec3(x, y, z); + } } \ No newline at end of file diff --git a/src/main/java/dev/xkmc/l2core/base/effects/api/IDelayedRender.java b/src/main/java/dev/xkmc/l2core/base/effects/api/IDelayedRender.java new file mode 100644 index 0000000..ef1db40 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/base/effects/api/IDelayedRender.java @@ -0,0 +1,21 @@ +package dev.xkmc.l2core.base.effects.api; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; + +public interface IDelayedRender { + ResourceLocation rl(); + + IconRenderRegion region(); + + float tx(); + + float ty(); + + float tw(); + + float th(); + + Vec3 pos(float partial); + +} diff --git a/src/main/java/dev/xkmc/l2core/base/effects/api/SimpleIcon.java b/src/main/java/dev/xkmc/l2core/base/effects/api/SimpleIcon.java new file mode 100644 index 0000000..9390cc9 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/base/effects/api/SimpleIcon.java @@ -0,0 +1,20 @@ +package dev.xkmc.l2core.base.effects.api; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; + +public record SimpleIcon( + ResourceLocation rl, IconRenderRegion region, + float tx, float ty, float tw, float th, Vec3 pos +) implements IDelayedRender { + + public static SimpleIcon of(ResourceLocation rl, Vec3 pos) { + return new SimpleIcon(rl, IconRenderRegion.identity(), 0, 0, 1, 1, pos); + } + + @Override + public Vec3 pos(float partial) { + return pos; + } + +} diff --git a/src/main/java/dev/xkmc/l2core/events/ClientEffectRenderEvents.java b/src/main/java/dev/xkmc/l2core/events/ClientEffectRenderEvents.java index 3676ec0..26ad3ba 100644 --- a/src/main/java/dev/xkmc/l2core/events/ClientEffectRenderEvents.java +++ b/src/main/java/dev/xkmc/l2core/events/ClientEffectRenderEvents.java @@ -7,10 +7,7 @@ import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.datafixers.util.Pair; import dev.xkmc.l2core.base.effects.ClientEffectCap; import dev.xkmc.l2core.base.effects.EffectToClient; -import dev.xkmc.l2core.base.effects.api.ClientRenderEffect; -import dev.xkmc.l2core.base.effects.api.DelayedEntityRender; -import dev.xkmc.l2core.base.effects.api.FirstPlayerRenderEffect; -import dev.xkmc.l2core.base.effects.api.IconRenderRegion; +import dev.xkmc.l2core.base.effects.api.*; import dev.xkmc.l2core.init.L2Core; import dev.xkmc.l2core.init.L2LibReg; import dev.xkmc.l2core.util.Proxy; @@ -18,13 +15,10 @@ import net.minecraft.Util; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.Vec3; @@ -46,7 +40,11 @@ import static net.minecraft.client.renderer.RenderStateShard.POSITION_TEX_SHADER @EventBusSubscriber(value = Dist.CLIENT, modid = L2Core.MODID, bus = EventBusSubscriber.Bus.GAME) public class ClientEffectRenderEvents { - private static final ArrayList ICONS = new ArrayList<>(); + private static final ArrayList ICONS = new ArrayList<>(); + + public static void addIcon(IDelayedRender icon) { + ICONS.add(icon); + } @SubscribeEvent public static void clientTick(ClientTickEvent.Post event) { @@ -84,18 +82,16 @@ public class ClientEffectRenderEvents { DUMMY.setupRenderState(); DUMMY.clearRenderState(); - - LevelRenderer renderer = event.getLevelRenderer(); MultiBufferSource.BufferSource buffers = Minecraft.getInstance().renderBuffers().bufferSource(); Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); PoseStack stack = event.getPoseStack(); float pTick = event.getPartialTick().getGameTimeDeltaPartialTick(true); - Map> map = new HashMap<>(); + Map> map = new HashMap<>(); for (var e : ICONS) map.computeIfAbsent(e.rl(), k -> new ArrayList<>()).add(e); for (var ent : map.entrySet()) { VertexConsumer vc = buffers.getBuffer(ICON_TYPE.apply(ent.getKey())); for (var e : ent.getValue()) { - renderIcon(stack, vc, e, pTick, camera, renderer.entityRenderDispatcher); + renderIcon(stack, vc, e, pTick, camera); } } ICONS.clear(); @@ -141,21 +137,12 @@ public class ClientEffectRenderEvents { } - private static void renderIcon(PoseStack pose, VertexConsumer vc, DelayedEntityRender icon, - float partial, Camera camera, EntityRenderDispatcher dispatcher) { - LivingEntity entity = icon.entity(); - float f = entity.getBbHeight() / 2; - double x0 = Mth.lerp(partial, icon.xo(), entity.getX()); - double y0 = Mth.lerp(partial, icon.yo(), entity.getY()); - double z0 = Mth.lerp(partial, icon.zo(), entity.getZ()); - Vec3 offset = dispatcher.getRenderer(entity).getRenderOffset(entity, partial); + private static void renderIcon(PoseStack pose, VertexConsumer vc, IDelayedRender icon, + float partial, Camera camera) { + Vec3 pos = icon.pos(partial); Vec3 cam_pos = camera.getPosition(); - double d2 = x0 - cam_pos.x + offset.x(); - double d3 = y0 - cam_pos.y + offset.y(); - double d0 = z0 - cam_pos.z + offset.z(); - pose.pushPose(); - pose.translate(d2, d3 + f, d0); + pose.translate(pos.x() - cam_pos.x, pos.y() - cam_pos.y, pos.z() - cam_pos.z); pose.mulPose(camera.rotation()); PoseStack.Pose entry = pose.last(); diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java index 9f75810..cd3a4ab 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java @@ -1,7 +1,9 @@ package dev.xkmc.l2core.init.reg.simple; import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.registries.DeferredHolder; import java.util.function.Supplier; @@ -11,16 +13,22 @@ public interface Val extends Supplier { ResourceLocation id(); - record Registrate(RegistryEntry entry) implements Val { + DeferredHolder val(); + + default ResourceKey key() { + return val().getKey(); + } + + record Registrate(RegistryEntry val) implements Val { @Override public T get() { - return entry.get(); + return val.get(); } @Override public ResourceLocation id() { - return entry.getId(); + return val.getId(); } }