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_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

View File

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

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 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<DelayedEntityRender> ICONS = new ArrayList<>();
private static final ArrayList<IDelayedRender> 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<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 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();

View File

@@ -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<T> extends Supplier<T> {
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
public T get() {
return entry.get();
return val.get();
}
@Override
public ResourceLocation id() {
return entry.getId();
return val.getId();
}
}