icon render
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user