icon render

This commit is contained in:
lcy0x1
2024-08-27 09:06:07 +08:00
parent 2142c31b81
commit 6206df0ad8
6 changed files with 87 additions and 33 deletions

View File

@@ -18,7 +18,7 @@ loader_version_range=[2,)
mod_id=l2core mod_id=l2core
mod_name=L2Core mod_name=L2Core
mod_license=LGPL-2.1 mod_license=LGPL-2.1
mod_version=3.0.7+21 mod_version=3.0.7+23
mod_group_id=dev.xkmc mod_group_id=dev.xkmc
mod_authors=lcy0x1 mod_authors=lcy0x1
mod_description=Core Library mod for all L2 mods mod_description=Core Library mod for all L2 mods

View File

@@ -1,12 +1,16 @@
package dev.xkmc.l2core.base.effects.api; package dev.xkmc.l2core.base.effects.api;
import net.minecraft.client.Minecraft;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.phys.Vec3;
public record DelayedEntityRender(LivingEntity entity, IconRenderRegion region, ResourceLocation rl, public record DelayedEntityRender(
double xo, double yo, double zo, LivingEntity entity, IconRenderRegion region, ResourceLocation rl,
float tx, float ty, float tw, float th) { double xo, double yo, double zo,
float tx, float ty, float tw, float th
) implements IDelayedRender {
public static DelayedEntityRender icon(LivingEntity entity, ResourceLocation rl) { public static DelayedEntityRender icon(LivingEntity entity, ResourceLocation rl) {
return icon(entity, IconRenderRegion.identity(), 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); 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);
}
} }

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -7,10 +7,7 @@ import com.mojang.blaze3d.vertex.VertexFormat;
import com.mojang.datafixers.util.Pair; import com.mojang.datafixers.util.Pair;
import dev.xkmc.l2core.base.effects.ClientEffectCap; import dev.xkmc.l2core.base.effects.ClientEffectCap;
import dev.xkmc.l2core.base.effects.EffectToClient; import dev.xkmc.l2core.base.effects.EffectToClient;
import dev.xkmc.l2core.base.effects.api.ClientRenderEffect; import dev.xkmc.l2core.base.effects.api.*;
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.init.L2Core; import dev.xkmc.l2core.init.L2Core;
import dev.xkmc.l2core.init.L2LibReg; import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.Proxy; import dev.xkmc.l2core.util.Proxy;
@@ -18,13 +15,10 @@ import net.minecraft.Util;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderStateShard;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.phys.Vec3; 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) @EventBusSubscriber(value = Dist.CLIENT, modid = L2Core.MODID, bus = EventBusSubscriber.Bus.GAME)
public class ClientEffectRenderEvents { public class ClientEffectRenderEvents {
private static final ArrayList<DelayedEntityRender> ICONS = new ArrayList<>(); private static final ArrayList<IDelayedRender> ICONS = new ArrayList<>();
public static void addIcon(IDelayedRender icon) {
ICONS.add(icon);
}
@SubscribeEvent @SubscribeEvent
public static void clientTick(ClientTickEvent.Post event) { public static void clientTick(ClientTickEvent.Post event) {
@@ -84,18 +82,16 @@ public class ClientEffectRenderEvents {
DUMMY.setupRenderState(); DUMMY.setupRenderState();
DUMMY.clearRenderState(); DUMMY.clearRenderState();
LevelRenderer renderer = event.getLevelRenderer();
MultiBufferSource.BufferSource buffers = Minecraft.getInstance().renderBuffers().bufferSource(); MultiBufferSource.BufferSource buffers = Minecraft.getInstance().renderBuffers().bufferSource();
Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera();
PoseStack stack = event.getPoseStack(); PoseStack stack = event.getPoseStack();
float pTick = event.getPartialTick().getGameTimeDeltaPartialTick(true); float pTick = event.getPartialTick().getGameTimeDeltaPartialTick(true);
Map<ResourceLocation, List<DelayedEntityRender>> map = new HashMap<>(); Map<ResourceLocation, List<IDelayedRender>> map = new HashMap<>();
for (var e : ICONS) map.computeIfAbsent(e.rl(), k -> new ArrayList<>()).add(e); for (var e : ICONS) map.computeIfAbsent(e.rl(), k -> new ArrayList<>()).add(e);
for (var ent : map.entrySet()) { for (var ent : map.entrySet()) {
VertexConsumer vc = buffers.getBuffer(ICON_TYPE.apply(ent.getKey())); VertexConsumer vc = buffers.getBuffer(ICON_TYPE.apply(ent.getKey()));
for (var e : ent.getValue()) { for (var e : ent.getValue()) {
renderIcon(stack, vc, e, pTick, camera, renderer.entityRenderDispatcher); renderIcon(stack, vc, e, pTick, camera);
} }
} }
ICONS.clear(); ICONS.clear();
@@ -141,21 +137,12 @@ public class ClientEffectRenderEvents {
} }
private static void renderIcon(PoseStack pose, VertexConsumer vc, DelayedEntityRender icon, private static void renderIcon(PoseStack pose, VertexConsumer vc, IDelayedRender icon,
float partial, Camera camera, EntityRenderDispatcher dispatcher) { float partial, Camera camera) {
LivingEntity entity = icon.entity(); Vec3 pos = icon.pos(partial);
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);
Vec3 cam_pos = camera.getPosition(); 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.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()); pose.mulPose(camera.rotation());
PoseStack.Pose entry = pose.last(); PoseStack.Pose entry = pose.last();

View File

@@ -1,7 +1,9 @@
package dev.xkmc.l2core.init.reg.simple; package dev.xkmc.l2core.init.reg.simple;
import com.tterrag.registrate.util.entry.RegistryEntry; import com.tterrag.registrate.util.entry.RegistryEntry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.neoforged.neoforge.registries.DeferredHolder;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -11,16 +13,22 @@ public interface Val<T> extends Supplier<T> {
ResourceLocation id(); ResourceLocation id();
record Registrate<H, T extends H>(RegistryEntry<H, T> entry) implements Val<T> { DeferredHolder<? super T, T> val();
default ResourceKey<? super T> key() {
return val().getKey();
}
record Registrate<H, T extends H>(RegistryEntry<H, T> val) implements Val<T> {
@Override @Override
public T get() { public T get() {
return entry.get(); return val.get();
} }
@Override @Override
public ResourceLocation id() { public ResourceLocation id() {
return entry.getId(); return val.getId();
} }
} }