diff --git a/src/main/java/twilightforest/client/TwilightForestRenderInfo.java b/src/main/java/twilightforest/client/TwilightForestRenderInfo.java index 6404162481..77f83496cc 100644 --- a/src/main/java/twilightforest/client/TwilightForestRenderInfo.java +++ b/src/main/java/twilightforest/client/TwilightForestRenderInfo.java @@ -3,26 +3,17 @@ import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.DimensionSpecialEffects; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.state.level.LevelRenderState; import net.minecraft.client.renderer.state.level.SkyRenderState; import net.minecraft.client.renderer.state.level.WeatherRenderState; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.biome.Biome; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.client.CustomSkyboxRenderer; import net.neoforged.neoforge.client.CustomWeatherEffectRenderer; import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; import org.joml.Matrix4fc; import twilightforest.client.renderer.TFSkyRenderer; import twilightforest.client.renderer.TFWeatherRenderer; -import twilightforest.init.TFBiomes; - -import java.util.Optional; public class TwilightForestRenderInfo implements CustomSkyboxRenderer, CustomWeatherEffectRenderer { @@ -42,28 +33,6 @@ public class TwilightForestRenderInfo implements CustomSkyboxRenderer, CustomWea // return biomeFogColor.multiply(daylight * 0.94F + 0.06F, (daylight * 0.94F + 0.06F), (daylight * 0.91F + 0.09F)); // } - @Override - public boolean isFoggyAt(int x, int y) { // true = nearFog - Player player = Minecraft.getInstance().player; - - if (player != null) { - Optional> biome = player.level().getBiome(player.blockPosition()).unwrapKey(); - if (biome.isPresent()) { - boolean spooky = biome.get() == TFBiomes.SPOOKY_FOREST; - - if (player.position().y > 20 && !spooky) { - return false; // If player is above the dark forest then no need to make it so spooky. The darkwood leaves cover everything as low as y42. - } - - return spooky || biome.get() == TFBiomes.DARK_FOREST || biome.get() == TFBiomes.DARK_FOREST_CENTER; - } - } - - return false; - - //Make the fog on these biomes much much darker, maybe pitch black even. Do we keep this harsher fog underground too? - } - @Override public boolean renderSky(LevelRenderState levelRenderState, SkyRenderState skyRenderState, Matrix4fc modelViewMatrix, Runnable setupFog) { if (this.skyRenderer == null) { @@ -74,11 +43,11 @@ public boolean renderSky(LevelRenderState levelRenderState, SkyRenderState skyRe @Override public boolean renderSnowAndRain(LevelRenderState levelRenderState, WeatherRenderState weatherRenderState, MultiBufferSource bufferSource, Vec3 camPos) { - return TFWeatherRenderer.renderSnowAndRain(level, ticks, partialTick, lightTexture, new Vec3(camX, camY, camZ)); + return TFWeatherRenderer.renderSnowAndRain(Minecraft.getInstance().level, Minecraft.getInstance().levelRenderer.getTicks(), Minecraft.getInstance().getDeltaTracker().getGameTimeDeltaTicks(), camPos, bufferSource); } @Override public boolean tickRain(ClientLevel level, int ticks, Camera camera) { - return TFWeatherRenderer.tickRain(level, ticks, camera.getBlockPosition()); + return TFWeatherRenderer.tickRain(level, ticks, camera.blockPosition()); } } diff --git a/src/main/java/twilightforest/client/renderer/TFRenderPipelines.java b/src/main/java/twilightforest/client/renderer/TFRenderPipelines.java index 6d93212c1e..6f9555a86e 100644 --- a/src/main/java/twilightforest/client/renderer/TFRenderPipelines.java +++ b/src/main/java/twilightforest/client/renderer/TFRenderPipelines.java @@ -12,16 +12,20 @@ import net.minecraft.client.renderer.RenderPipelines; import twilightforest.TwilightForestMod; +import java.util.Optional; + public class TFRenderPipelines { private static final BlendFunction SHADOW = new BlendFunction(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); public static final RenderPipeline RED_THREAD = RenderPipeline.builder(RenderPipelines.MATRICES_FOG_SNIPPET) - .withLocation(TwilightForestMod.prefix("pipeline/red_thread")) + .withLocation(TwilightForestMod.prefix("core/red_thread/red_thread")) .withSampler("Sampler0") + .withVertexShader(TwilightForestMod.prefix("core/red_thread/red_thread")) + .withFragmentShader(TwilightForestMod.prefix("core/red_thread/red_thread")) .withVertexFormat(DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS) .withCull(true) - .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withDepthStencilState(Optional.of(new DepthStencilState(CompareOp.ALWAYS_PASS, false))) .build(); public static final RenderPipeline PROTECTION_BOX = RenderPipeline.builder(RenderPipelines.MATRICES_FOG_SNIPPET) diff --git a/src/main/java/twilightforest/client/renderer/TFWeatherRenderer.java b/src/main/java/twilightforest/client/renderer/TFWeatherRenderer.java index 891f6e1456..60c1eb658f 100644 --- a/src/main/java/twilightforest/client/renderer/TFWeatherRenderer.java +++ b/src/main/java/twilightforest/client/renderer/TFWeatherRenderer.java @@ -4,10 +4,12 @@ import com.mojang.blaze3d.vertex.*; import com.mojang.datafixers.util.Pair; import net.minecraft.client.Camera; +import net.minecraft.client.GraphicsPreset; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; @@ -35,6 +37,7 @@ import twilightforest.TwilightForestMod; import twilightforest.init.custom.Enforcements; import twilightforest.util.IntervalUtils; +import twilightforest.util.RenderTypeUtil; import twilightforest.util.Restriction; import java.util.ArrayList; @@ -81,42 +84,41 @@ public class TFWeatherRenderer { } } - public static boolean renderSnowAndRain(ClientLevel level, int ticks, float partialTicks, Vec3 camera) { + // [VanillaCopy] the copy of removed Minecraft.useFancyGraphics + private static boolean useFancyGraphics() { + return Minecraft.getInstance().options.graphicsPreset().get().ordinal() >= GraphicsPreset.FANCY.ordinal(); + } + + // [VanillaCopy] the copy of removed + + public static boolean renderSnowAndRain(ClientLevel level, int ticks, float partialTicks, Vec3 camera, MultiBufferSource buffer) { Minecraft mc = Minecraft.getInstance(); if (progressionEnforced && mc.player != null && !mc.player.isCreative() && !mc.player.isSpectator()) { // locked biome weather effects - renderLockedBiome(ticks, partialTicks, level, mc.player, camera); + renderLockedBiome(ticks, partialTicks, level, mc.player, camera, buffer); // locked structures - renderLockedStructure(ticks, partialTicks, camera); + renderLockedStructure(ticks, partialTicks, camera, buffer); } //render normal weather anyway return false; } - private static void renderLockedBiome(int ticks, float partialTicks, ClientLevel level, LocalPlayer player, Vec3 camera) { + private static void renderLockedBiome(int ticks, float partialTicks, ClientLevel level, LocalPlayer player, Vec3 camera, MultiBufferSource buffer) { // check nearby for locked biome if (isNearLockedBiome(level, player)) { int px = Mth.floor(camera.x()); int py = Mth.floor(camera.y()); int pz = Mth.floor(camera.z()); - RenderSystem.disableCull(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableDepthTest(); - int range = 5; - if (Minecraft.useFancyGraphics()) { + if (useFancyGraphics()) { range = 10; } - RenderSystem.depthMask(Minecraft.useShaderTransparency()); - WeatherRenderType currentType = null; float combinedTicks = ticks + partialTicks; - RenderSystem.setShader(CoreShaders.PARTICLE); BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); for (int dz = pz - range; dz <= pz + range; ++dz) { @@ -155,7 +157,6 @@ private static void renderLockedBiome(int ticks, float partialTicks, ClientLevel double zRange = (double) ((float) dz + 0.5F) - camera.z(); float distanceToPlayer = Mth.sqrt((float) (xRange * xRange + zRange * zRange)) / (float) range; float alpha = ((1.0F - distanceToPlayer * distanceToPlayer) * 0.3F + 0.5F); - int worldBrightness = LevelRenderer.getLightColor(level, pos); int fullbright = 15 << 20 | 15 << 4; switch (currentType) { @@ -163,7 +164,7 @@ private static void renderLockedBiome(int ticks, float partialTicks, ClientLevel float countFactor = ((float) (ticks & 511) + partialTicks) / 512.0F; float uFactor = random.nextFloat() + combinedTicks * 0.05F * (float) random.nextGaussian(); float vFactor = random.nextFloat() + combinedTicks * 0.0025F * (float) random.nextGaussian(); - renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{1.0F, 1.0F, 1.0F, alpha}, fullbright); + renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{1.0F, 1.0F, 1.0F, alpha}, fullbright, buffer); } case MOSQUITO -> { float countFactor = 0; @@ -172,41 +173,39 @@ private static void renderLockedBiome(int ticks, float partialTicks, ClientLevel float red = random.nextFloat() * 0.3F; float green = random.nextFloat() * 0.3F; float blue = random.nextFloat() * 0.3F; - renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{red, green, blue, 1.0F}, fullbright); + renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{red, green, blue, 1.0F}, fullbright, buffer); } case ASHES -> { float countFactor = -((float) (ticks & 1023) + partialTicks) / 1024.0F; float uFactor = random.nextFloat() + combinedTicks * 0.0025F * (float) random.nextGaussian(); float vFactor = random.nextFloat() + combinedTicks * 0.005F * (float) random.nextGaussian(); float color = random.nextFloat() * 0.2F + 0.8F; - renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{color, color, color, alpha}, fullbright); + renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{color, color, color, alpha}, fullbright, buffer); } case DARK_STREAM -> { float countFactor = -((ticks & 511) + partialTicks) / 512.0F; float uFactor = 0; //no moving horizontally float vFactor = random.nextFloat() + combinedTicks * 0.005F * (float) random.nextGaussian(); - renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{1.0F, 1.0F, 1.0F, alpha}, fullbright); + renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{1.0F, 1.0F, 1.0F, alpha}, fullbright, buffer); } case BIG_RAIN -> { float countFactor = ((float) (ticks + dx * dx * 3121 + dx * 45238971 + dz * dz * 418711 + dz * 13761 & 31) + partialTicks) / 32.0F * (3.0F + random.nextFloat()); float uFactor = random.nextFloat(); float vFactor = random.nextFloat(); - renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{1.0F, 1.0F, 1.0F, alpha}, worldBrightness); + int worldBrightness = LevelRenderer.getLightCoords(level, pos); + renderEffect(currentType.getTextureLocation(), rainX, rainZ, minY, maxY, camera, dx, dz, countFactor, uFactor, vFactor, new float[]{1.0F, 1.0F, 1.0F, alpha}, worldBrightness, buffer); } } } } } } - - RenderSystem.enableCull(); - RenderSystem.disableBlend(); } } @SuppressWarnings("ConstantConditions") - private static void renderLockedStructure(int ticks, float partialTicks, Vec3 camera) { - int range = Minecraft.useFancyGraphics() ? 10 : 5; + private static void renderLockedStructure(int ticks, float partialTicks, Vec3 camera, MultiBufferSource buffer) { + int range = useFancyGraphics() ? 10 : 5; int px = Mth.floor(camera.x()); int py = Mth.floor(camera.y()); int pz = Mth.floor(camera.z()); @@ -224,14 +223,8 @@ private static void renderLockedStructure(int ticks, float partialTicks, Vec3 ca pBoxOld = pBox; } - RenderSystem.disableCull(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableDepthTest(); - float combinedTicks = ticks + partialTicks; int drawFlag = -1; - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); for (int x = pBox.minX(); x <= pBox.maxX(); x++) { for (int z = pBox.minZ(); z <= pBox.maxZ(); z++) { @@ -244,7 +237,6 @@ private static void renderLockedStructure(int ticks, float partialTicks, Vec3 ca random.setSeed((long) x * x * 3121 + x * 45238971L ^ (long) z * z * 418711 + z * 13761L); if (drawFlag != 0) { drawFlag = 0; - RenderSystem.setShader(CoreShaders.PARTICLE); } float countFactor = ((ticks & 511) + partialTicks) / 512.0F; @@ -263,14 +255,12 @@ private static void renderLockedStructure(int ticks, float partialTicks, Vec3 ca camera, x, z, countFactor, uFactor, vFactor, new float[] {1.0F, 1.0F, 1.0F, alpha}, - (15 << 20) | (15 << 4) + (15 << 20) | (15 << 4), + buffer ); } } } - - RenderSystem.enableCull(); - RenderSystem.disableBlend(); } private static void updateRainIntervals(BoundingBox pBox) { @@ -316,8 +306,8 @@ private static List> getRainIntervals(int x, int z, Bound return intervals; } - private static void renderEffect(Identifier type, double rainX, double rainZ, int minY, int maxY, Vec3 camera, int dx, int dz, float countFactor, float uFactor, float vFactor, float[] color, int light) { - VertexConsumer consumer = Minecraft.getInstance().renderBuffers().bufferSource().getBuffer(RenderType.weather(type, Minecraft.useShaderTransparency())); + private static void renderEffect(Identifier type, double rainX, double rainZ, int minY, int maxY, Vec3 camera, int dx, int dz, float countFactor, float uFactor, float vFactor, float[] color, int light, MultiBufferSource bufferSource) { + VertexConsumer consumer = bufferSource.getBuffer(RenderTypeUtil.weather(type, Minecraft.useShaderTransparency())); consumer .addVertex((float) (dx - camera.x() - rainX + 0.5F), (float) (minY - camera.y()), (float) (dz - camera.z() - rainZ + 0.5F)) .setUv(0.0F + uFactor, minY * 0.25F + countFactor + vFactor) @@ -399,7 +389,7 @@ public Identifier getTextureLocation() { /** * [VanillaCopy]:
- * {@link net.minecraft.client.renderer.WeatherEffectRenderer#tickRainParticles(ClientLevel, Camera, int, ParticleStatus)}
+ * {@link net.minecraft.client.renderer.WeatherEffectRenderer#tickRainParticles(ClientLevel, Camera, int, ParticleStatus, int)}
*/ public static boolean tickRain(ClientLevel level, int partialTicks, BlockPos blockpos) { //TF - render rain if the Ur-Ghast is alive as well @@ -409,7 +399,7 @@ public static boolean tickRain(ClientLevel level, int partialTicks, BlockPos blo } else urGhastRain = Math.max(0.0F, urGhastRain - 0.02F); //TF - factor in the Ur-Ghast being alive when determining rain level - float rainLevel = Math.max(level.getRainLevel(1.0F), urGhastRain) / (Minecraft.useFancyGraphics() ? 1.0F : 2.0F); + float rainLevel = Math.max(level.getRainLevel(1.0F), urGhastRain) / (useFancyGraphics() ? 1.0F : 2.0F); if (rainLevel > 0.0F) { RandomSource randomsource = RandomSource.create((long) partialTicks * 312987231L); BlockPos blockpos1 = null; diff --git a/src/main/java/twilightforest/client/renderer/armor/TFArmorRenderer.java b/src/main/java/twilightforest/client/renderer/armor/TFArmorRenderer.java index 3337021a52..e2e0996903 100644 --- a/src/main/java/twilightforest/client/renderer/armor/TFArmorRenderer.java +++ b/src/main/java/twilightforest/client/renderer/armor/TFArmorRenderer.java @@ -7,7 +7,6 @@ import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.common.util.Lazy; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.HashMap; @@ -41,7 +40,7 @@ protected ModelPart getModelPart(ModelLayerLocation layerLocation) { public static final class ResourceReloadListener implements ResourceManagerReloadListener { @Override - public void onResourceManagerReload(@NotNull ResourceManager resourceManager) { + public void onResourceManagerReload(ResourceManager resourceManager) { TFArmorRenderer.resetAllModelCache(); } } diff --git a/src/main/java/twilightforest/client/renderer/armor/TFSimpleArmorRenderer.java b/src/main/java/twilightforest/client/renderer/armor/TFSimpleArmorRenderer.java index 8ff0a30d28..d7ce78ca5b 100644 --- a/src/main/java/twilightforest/client/renderer/armor/TFSimpleArmorRenderer.java +++ b/src/main/java/twilightforest/client/renderer/armor/TFSimpleArmorRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.resources.model.EquipmentClientInfo; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; import twilightforest.client.model.armor.TFArmorModel; import java.util.function.Function; diff --git a/src/main/java/twilightforest/client/renderer/entity/HydraRenderer.java b/src/main/java/twilightforest/client/renderer/entity/HydraRenderer.java index 3921e02886..d85966eae8 100644 --- a/src/main/java/twilightforest/client/renderer/entity/HydraRenderer.java +++ b/src/main/java/twilightforest/client/renderer/entity/HydraRenderer.java @@ -7,6 +7,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; import net.minecraft.world.entity.Pose; +import net.minecraft.world.phys.AABB; import twilightforest.TwilightForestMod; import twilightforest.client.model.TFModelLayers; import twilightforest.client.model.entity.HydraModel; @@ -65,4 +66,14 @@ public void extractRenderState(Hydra entity, HydraRenderState state, float parti public Identifier getTextureLocation(HydraRenderState state) { return TEXTURE; } + + @Override + protected boolean affectedByCulling(Hydra entity) { + return false; + } + + @Override + protected AABB getBoundingBoxForCulling(Hydra entity) { + return entity.getBoundingBox().inflate(16.0D, 16.0D, 16.0D); + } } diff --git a/src/main/java/twilightforest/client/renderer/entity/NagaRenderer.java b/src/main/java/twilightforest/client/renderer/entity/NagaRenderer.java index 93f13b6562..6c9742bd26 100644 --- a/src/main/java/twilightforest/client/renderer/entity/NagaRenderer.java +++ b/src/main/java/twilightforest/client/renderer/entity/NagaRenderer.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.Identifier; import net.minecraft.util.ARGB; +import net.minecraft.world.phys.AABB; import twilightforest.TwilightForestMod; import twilightforest.client.model.TFModelLayers; import twilightforest.client.model.entity.NagaModel; @@ -62,4 +63,14 @@ public Identifier getTextureLocation(NagaRenderState state) { return TEXTURE; } } + + @Override + protected boolean affectedByCulling(Naga entity) { + return false; + } + + @Override + protected AABB getBoundingBoxForCulling(Naga entity) { + return entity.getBoundingBox().inflate(16.0D, 16.0D, 16.0D); + } } diff --git a/src/main/java/twilightforest/client/renderer/entity/RedcapRenderer.java b/src/main/java/twilightforest/client/renderer/entity/RedcapRenderer.java index ba8acff8aa..61c4a13a74 100644 --- a/src/main/java/twilightforest/client/renderer/entity/RedcapRenderer.java +++ b/src/main/java/twilightforest/client/renderer/entity/RedcapRenderer.java @@ -45,15 +45,14 @@ public RedcapArmorLayer(RenderLayerParent renderer, ArmorModelSet model @Override public void submit(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, S state, float yRot, float xRot) { - //TODO Need Access Transformer - this.renderArmorPiece(poseStack, submitNodeCollector, state.chestEquipment, EquipmentSlot.CHEST, state, this.getArmorModel(state, EquipmentSlot.CHEST)); - this.renderArmorPiece(poseStack, submitNodeCollector, state.legsEquipment, EquipmentSlot.LEGS, state, this.getArmorModel(state, EquipmentSlot.LEGS)); + this.renderArmorPiece(poseStack, submitNodeCollector, state.chestEquipment, EquipmentSlot.CHEST, 0, state); + this.renderArmorPiece(poseStack, submitNodeCollector, state.legsEquipment, EquipmentSlot.LEGS, 0, state); //TF: raise boots poseStack.pushPose(); poseStack.translate(0.0D, -0.2D, 0.0D); - this.renderArmorPiece(poseStack, submitNodeCollector, state.feetEquipment, EquipmentSlot.FEET, state, this.getArmorModel(state, EquipmentSlot.FEET)); + this.renderArmorPiece(poseStack, submitNodeCollector, state.feetEquipment, EquipmentSlot.FEET, 0, state); poseStack.popPose(); - this.renderArmorPiece(poseStack, submitNodeCollector, state.headEquipment, EquipmentSlot.HEAD, state, this.getArmorModel(state, EquipmentSlot.HEAD)); + this.renderArmorPiece(poseStack, submitNodeCollector, state.headEquipment, EquipmentSlot.HEAD, 0, state); } } } diff --git a/src/main/java/twilightforest/client/renderer/entity/layers/IceLayer.java b/src/main/java/twilightforest/client/renderer/entity/layers/IceLayer.java index 96d26c0562..8cd3f294c3 100644 --- a/src/main/java/twilightforest/client/renderer/entity/layers/IceLayer.java +++ b/src/main/java/twilightforest/client/renderer/entity/layers/IceLayer.java @@ -4,16 +4,17 @@ import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.block.MovingBlockRenderState; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; -import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.util.context.ContextKey; import net.minecraft.world.level.block.Blocks; -import net.neoforged.neoforge.client.model.data.ModelData; import twilightforest.TwilightForestMod; import twilightforest.client.model.entity.DeathTomeModel; import twilightforest.potions.FrostedEffect; @@ -29,7 +30,7 @@ public IceLayer(RenderLayerParent renderer) { } @Override - public void render(PoseStack stack, MultiBufferSource buffer, int light, S state, float netHeadYaw, float headPitch) { + public void submit(PoseStack stack, SubmitNodeCollector submitNodeCollector, int light, S state, float netHeadYaw, float headPitch) { Double count = state.getRenderData(FROST_COUNT_KEY); if (count == null || count <= 0.0D) return; Integer id = state.getRenderData(FROST_ID_KEY); @@ -53,7 +54,25 @@ public void render(PoseStack stack, MultiBufferSource buffer, int light, S state stack.mulPose(Axis.ZP.rotationDegrees(this.random.nextFloat() * 360F)); stack.translate(-0.5F, -0.5F, -0.5F); - Minecraft.getInstance().getBlockRenderer().renderSingleBlock(Blocks.ICE.defaultBlockState(), stack, buffer, light, OverlayTexture.NO_OVERLAY, ModelData.EMPTY, RenderType.translucentMovingBlock()); + BlockPos entityPos = new BlockPos( + Mth.floor(state.x), + Mth.floor(state.y), + Mth.floor(state.z) + ); + + MovingBlockRenderState movingState = new MovingBlockRenderState(); + movingState.blockState = Blocks.ICE.defaultBlockState(); + movingState.blockPos = entityPos; + movingState.randomSeedPos = entityPos; + + ClientLevel level = Minecraft.getInstance().level; + if (level != null) { + movingState.biome = level.getBiome(entityPos); + movingState.lightEngine = level.getLightEngine(); + } + + submitNodeCollector.submitMovingBlock(stack, movingState); + stack.popPose(); } } diff --git a/src/main/java/twilightforest/client/renderer/entity/layers/ShieldLayer.java b/src/main/java/twilightforest/client/renderer/entity/layers/ShieldLayer.java index 44bcbd0d69..12296d900e 100644 --- a/src/main/java/twilightforest/client/renderer/entity/layers/ShieldLayer.java +++ b/src/main/java/twilightforest/client/renderer/entity/layers/ShieldLayer.java @@ -4,21 +4,20 @@ import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.block.BlockModelRenderState; +import net.minecraft.client.renderer.block.model.BlockDisplayContext; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.Direction; import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; import net.minecraft.util.context.ContextKey; import net.minecraft.world.entity.LivingEntity; -import net.neoforged.neoforge.client.model.data.ModelData; -import org.apache.commons.lang3.ArrayUtils; +import net.minecraft.world.level.block.Blocks; +import net.neoforged.neoforge.client.model.standalone.StandaloneModelKey; import twilightforest.TwilightForestMod; import twilightforest.entity.boss.Lich; import twilightforest.init.TFDataAttachments; @@ -26,7 +25,6 @@ public class ShieldLayer> extends RenderLayer { public static final Identifier LOC = TwilightForestMod.prefix("item/shield"); - private static final Direction[] DIRS = ArrayUtils.add(Direction.values(), null); public static ContextKey SHIELD_COUNT_KEY = new ContextKey<>(TwilightForestMod.prefix("shield_count")); @@ -35,10 +33,10 @@ public ShieldLayer(RenderLayerParent renderer) { } @Override - public void render(PoseStack stack, MultiBufferSource source, int light, S state, float netHeadYaw, float headPitch) { + public void submit(PoseStack stack, SubmitNodeCollector collector, int light, S state, float netHeadYaw, float headPitch) { Integer count = state.getRenderData(SHIELD_COUNT_KEY); if (count != null && count > 0) { - this.renderShields(stack, source, state, count); + this.renderShields(stack, collector, state, count, state.lightCoords, state.outlineColor); } } @@ -48,7 +46,7 @@ public static int getShieldCount(LivingEntity entity) { : entity.getData(TFDataAttachments.FORTIFICATION_SHIELDS).shieldsLeft(); } - private void renderShields(PoseStack stack, MultiBufferSource buffer, S state, int count) { + private void renderShields(PoseStack stack, SubmitNodeCollector collector, S state, int count, int lightCoords, int outlineColor) { float age = state.ageInTicks; float rotateAngleY = age / -5.0F; float rotateAngleX = Mth.sin(age / 5.0F) / 4.0F; @@ -67,15 +65,22 @@ private void renderShields(PoseStack stack, MultiBufferSource buffer, S state, i // push the shields outwards from the center of rotation stack.translate(0.0F, 0.0F, -0.7F); - BakedModel model = Minecraft.getInstance().getModelManager().getStandaloneModel(LOC); - for (Direction dir : DIRS) { - ItemRenderer.renderQuadList( + BlockModel shieldModel = Minecraft.getInstance().getModelManager().getStandaloneModel(new StandaloneModelKey<>(LOC::toDebugFileName)); + + if (shieldModel != null) { + BlockModelRenderState modelState = new BlockModelRenderState(); + shieldModel.update( + modelState, + Blocks.AIR.defaultBlockState(), + BlockDisplayContext.create(), + 42L + ); + modelState.submit( stack, - buffer.getBuffer(Sheets.translucentItemSheet()), - model.getQuads(null, dir, Minecraft.getInstance().font.random, ModelData.EMPTY, Sheets.translucentItemSheet()), - new int[0], - 0xF000F0, - OverlayTexture.NO_OVERLAY + collector, + lightCoords, + OverlayTexture.NO_OVERLAY, + outlineColor ); } diff --git a/src/main/java/twilightforest/client/renderer/map/ConqueredMapIconRenderer.java b/src/main/java/twilightforest/client/renderer/map/ConqueredMapIconRenderer.java index 5ad1017acc..95d1409b28 100644 --- a/src/main/java/twilightforest/client/renderer/map/ConqueredMapIconRenderer.java +++ b/src/main/java/twilightforest/client/renderer/map/ConqueredMapIconRenderer.java @@ -1,13 +1,12 @@ package twilightforest.client.renderer.map; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.state.MapRenderState; +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.MapDecorationTextureManager; import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapDecorationTypes; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; @@ -26,27 +25,31 @@ private boolean isConquered(MapItemSavedData data, MapDecoration decoration) { } @Override - public boolean render(MapDecoration decoration, PoseStack stack, MultiBufferSource bufferSource, MapItemSavedData mapData, MapDecorationTextureManager decorationTextures, boolean inItemFrame, int light, int index) { - if (this.isConquered(mapData, decoration)) { - stack.pushPose(); - stack.translate(0.0F + decoration.x() / 2.0F + 64.0F, 0.0F + decoration.y() / 2.0F + 64.0F, 0.0F); - stack.mulPose(Axis.ZP.rotationDegrees((decoration.rot() * 360) / 16.0F)); - stack.scale(2.0F, 2.0F, 2.0F); - stack.translate(-1.0F, -1.0F, -0.005F); - Matrix4f matrix4f = stack.last().pose(); - float depth = -0.095F; - TextureAtlasSprite xSprite = Minecraft.getInstance().getMapDecorationTextures().getSprite(MapDecorationTypes.RED_X.value().assetId()); - float f2 = xSprite.getU0(); - float f3 = xSprite.getV0(); - float f4 = xSprite.getU1(); - float f5 = xSprite.getV1(); - VertexConsumer consumer = bufferSource.getBuffer(RenderType.text(xSprite.atlasLocation())); + public boolean render(MapRenderState.MapDecorationRenderState decoration, PoseStack stack, SubmitNodeCollector submitNodeCollector, MapRenderState mapRenderState, TextureAtlas decorationSprites, boolean inItemFrame, int light, int index) { + // FIXME find a new way to get mapData +// if (!(this.isConquered(mapData, decoration))) { +// return false; +// } + + stack.pushPose(); + stack.translate(0.0F + decoration.x / 2.0F + 64.0F, 0.0F + decoration.y / 2.0F + 64.0F, 0.0F); + stack.mulPose(Axis.ZP.rotationDegrees((decoration.rot * 360) / 16.0F)); + stack.scale(2.0F, 2.0F, 2.0F); + stack.translate(-1.0F, -1.0F, -0.005F); + Matrix4f matrix4f = stack.last().pose(); + float depth = -0.095F; + TextureAtlasSprite xSprite = decorationSprites.getSprite(MapDecorationTypes.RED_X.value().assetId()); + float f2 = xSprite.getU0(); + float f3 = xSprite.getV0(); + float f4 = xSprite.getU1(); + float f5 = xSprite.getV1(); + submitNodeCollector.submitCustomGeometry(stack, RenderTypes.text(xSprite.atlasLocation()), (_, consumer) -> { consumer.addVertex(matrix4f, -1.0F, 1.0F, depth).setColor(-1).setUv(f2, f3).setLight(light); consumer.addVertex(matrix4f, 1.0F, 1.0F, depth).setColor(-1).setUv(f4, f3).setLight(light); consumer.addVertex(matrix4f, 1.0F, -1.0F, depth).setColor(-1).setUv(f4, f5).setLight(light); consumer.addVertex(matrix4f, -1.0F, -1.0F, depth).setColor(-1).setUv(f2, f5).setLight(light); - stack.popPose(); - } + }); + stack.popPose(); return false; } diff --git a/src/main/java/twilightforest/client/renderer/map/MagicMapPlayerIconRenderer.java b/src/main/java/twilightforest/client/renderer/map/MagicMapPlayerIconRenderer.java index 77ba71c95f..d0caec2093 100644 --- a/src/main/java/twilightforest/client/renderer/map/MagicMapPlayerIconRenderer.java +++ b/src/main/java/twilightforest/client/renderer/map/MagicMapPlayerIconRenderer.java @@ -1,44 +1,45 @@ package twilightforest.client.renderer.map; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.state.MapRenderState; +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.MapDecorationTextureManager; -import net.minecraft.world.level.saveddata.maps.MapDecoration; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.neoforged.neoforge.client.gui.map.IMapDecorationRenderer; import org.joml.Matrix4f; -import twilightforest.item.mapdata.TFMagicMapData; public class MagicMapPlayerIconRenderer implements IMapDecorationRenderer { //[VanillaCopy] of MapRenderer.RenderInstance.draw, but with a set depth offset instead of relying on index. //this allows the icon to render on top of everything else instead of sometimes on top, sometimes behind @Override - public boolean render(MapDecoration decoration, PoseStack stack, MultiBufferSource bufferSource, MapItemSavedData mapData, MapDecorationTextureManager decorationTextures, boolean inItemFrame, int packedLight, int index) { - if (mapData instanceof TFMagicMapData) { - stack.pushPose(); - stack.translate(0.0F + (float)decoration.x() / 2.0F + 64.0F, 0.0F + (float)decoration.y() / 2.0F + 64.0F, -0.02F); - stack.mulPose(Axis.ZP.rotationDegrees((float)(decoration.rot() * 360) / 16.0F)); - stack.scale(4.0F, 4.0F, 3.0F); - stack.translate(-0.125F, 0.125F, 0.0F); - Matrix4f matrix4f1 = stack.last().pose(); - TextureAtlasSprite textureatlassprite = decorationTextures.get(decoration); - float f2 = textureatlassprite.getU0(); - float f3 = textureatlassprite.getV0(); - float f4 = textureatlassprite.getU1(); - float f5 = textureatlassprite.getV1(); - VertexConsumer consumer = bufferSource.getBuffer(RenderType.text(textureatlassprite.atlasLocation())); + public boolean render(MapRenderState.MapDecorationRenderState decoration, PoseStack stack, SubmitNodeCollector submitNodeCollector, MapRenderState mapRenderState, TextureAtlas decorationSprites, boolean inItemFrame, int packedLight, int index) { + // FIXME find a new way to get mapData +// if (!(mapData instanceof TFMagicMapData)) { +// return false; +// } + + if (decoration.atlasSprite == null) return false; + + stack.pushPose(); + stack.translate(0.0F + (float)decoration.x / 2.0F + 64.0F, 0.0F + (float)decoration.y / 2.0F + 64.0F, -0.02F); + stack.mulPose(Axis.ZP.rotationDegrees((float)(decoration.rot * 360) / 16.0F)); + stack.scale(4.0F, 4.0F, 3.0F); + stack.translate(-0.125F, 0.125F, 0.0F); + Matrix4f matrix4f1 = stack.last().pose(); + TextureAtlasSprite textureatlassprite = decoration.atlasSprite; + float f2 = textureatlassprite.getU0(); + float f3 = textureatlassprite.getV0(); + float f4 = textureatlassprite.getU1(); + float f5 = textureatlassprite.getV1(); + submitNodeCollector.submitCustomGeometry(stack, RenderTypes.text(textureatlassprite.atlasLocation()), (_, consumer) -> { consumer.addVertex(matrix4f1, -1.0F, 1.0F, -0.3F).setColor(-1).setUv(f2, f3).setLight(packedLight); consumer.addVertex(matrix4f1, 1.0F, 1.0F, -0.3F).setColor(-1).setUv(f4, f3).setLight(packedLight); consumer.addVertex(matrix4f1, 1.0F, -1.0F, -0.3F).setColor(-1).setUv(f4, f5).setLight(packedLight); consumer.addVertex(matrix4f1, -1.0F, -1.0F, -0.3F).setColor(-1).setUv(f2, f5).setLight(packedLight); - stack.popPose(); - return true; - } - return false; + }); + return true; } } diff --git a/src/main/java/twilightforest/client/renderer/special/CandelabraSpecialRenderer.java b/src/main/java/twilightforest/client/renderer/special/CandelabraSpecialRenderer.java index 8ed60cdc9a..831f30f237 100644 --- a/src/main/java/twilightforest/client/renderer/special/CandelabraSpecialRenderer.java +++ b/src/main/java/twilightforest/client/renderer/special/CandelabraSpecialRenderer.java @@ -18,7 +18,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; import java.util.function.Consumer; public record CandelabraSpecialRenderer() implements SpecialModelRenderer> { diff --git a/src/main/java/twilightforest/client/renderer/special/CicadaSpecialRenderer.java b/src/main/java/twilightforest/client/renderer/special/CicadaSpecialRenderer.java index b012dbb8e0..962af4c418 100644 --- a/src/main/java/twilightforest/client/renderer/special/CicadaSpecialRenderer.java +++ b/src/main/java/twilightforest/client/renderer/special/CicadaSpecialRenderer.java @@ -18,7 +18,7 @@ public record CicadaSpecialRenderer(CicadaModel model) implements NoDataSpecialM @Override public void submit(PoseStack stack, SubmitNodeCollector collector, int light, int overlay, boolean hasFoil, int outlineColor) { - CicadaRenderer.submitCicada(this.model(), BugModelAnimationHelper.currentYaw, 0.0F, Direction.NORTH, stack, collector, light, overlay, null); + CicadaRenderer.submitCicada(this.model(), BugModelAnimationHelper.currentYaw, 0.0F, Direction.NORTH, stack, collector, light, overlay, outlineColor, null); } @Override diff --git a/src/main/java/twilightforest/client/renderer/special/KeepsakeCasketSpecialRenderer.java b/src/main/java/twilightforest/client/renderer/special/KeepsakeCasketSpecialRenderer.java index 73799465f0..88cf9419fe 100644 --- a/src/main/java/twilightforest/client/renderer/special/KeepsakeCasketSpecialRenderer.java +++ b/src/main/java/twilightforest/client/renderer/special/KeepsakeCasketSpecialRenderer.java @@ -4,12 +4,8 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.client.model.geom.EntityModelSet; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.special.SpecialModelRenderer; -import net.minecraft.core.Direction; -import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import org.joml.Vector3fc; import org.jspecify.annotations.Nullable; @@ -58,4 +54,4 @@ public SpecialModelRenderer bake(BakingContext context) { return new KeepsakeCasketSpecialRenderer(model, this.openness); } } -} +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/renderer/special/SkullCandleSpecialRenderer.java b/src/main/java/twilightforest/client/renderer/special/SkullCandleSpecialRenderer.java index df055a3fb9..9f9245c4ad 100644 --- a/src/main/java/twilightforest/client/renderer/special/SkullCandleSpecialRenderer.java +++ b/src/main/java/twilightforest/client/renderer/special/SkullCandleSpecialRenderer.java @@ -7,7 +7,6 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.client.Minecraft; import net.minecraft.client.model.object.skull.SkullModelBase; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.PlayerSkinRenderCache; import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.block.BlockModelRenderState; @@ -16,14 +15,11 @@ import net.minecraft.client.renderer.special.SpecialModelRenderer; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.Identifier; -import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.ResolvableProfile; -import net.minecraft.world.level.block.CandleBlock; import net.minecraft.world.level.block.SkullBlock; import org.joml.Vector3fc; import org.jspecify.annotations.Nullable; -import twilightforest.block.AbstractSkullCandleBlock; import twilightforest.client.renderer.block.SkullCandleRenderer; import twilightforest.components.item.SkullCandles; import twilightforest.init.TFDataComponents; @@ -76,8 +72,8 @@ public Unbaked(SkullBlock.Type kind) { } @Override - public MapCodec type() { - return MAP_CODEC; + public MapCodec>> type() { + return Unbaked.MAP_CODEC; } @Nullable diff --git a/src/main/java/twilightforest/client/renderer/tooltip/ItemDisplayTooltipComponent.java b/src/main/java/twilightforest/client/renderer/tooltip/ItemDisplayTooltipComponent.java index 5f6e18c1a1..2ecd0c328f 100644 --- a/src/main/java/twilightforest/client/renderer/tooltip/ItemDisplayTooltipComponent.java +++ b/src/main/java/twilightforest/client/renderer/tooltip/ItemDisplayTooltipComponent.java @@ -1,12 +1,12 @@ package twilightforest.client.renderer.tooltip; import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.core.NonNullList; import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; import twilightforest.components.item.ItemDisplayContents; import twilightforest.item.travellers_gear.TravellersGogglesItem; import twilightforest.item.travellers_gear.modifiers.display.ItemDisplayType; @@ -24,8 +24,8 @@ public ItemDisplayTooltipComponent(TravellersGogglesItem.Tooltip tooltip) { } @Override - public void renderImage(@NotNull Font font, int x, int y, GuiGraphics guiGraphics) { - guiGraphics.blitSprite(BACKGROUND_SPRITE, x, y, this.backgroundWidth(), this.backgroundHeight()); + public void extractImage(Font font, int x, int y, int w, int h, GuiGraphicsExtractor guiGraphics) { + guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, BACKGROUND_SPRITE, x, y, this.backgroundWidth(), this.backgroundHeight()); int k = 0; for (int gridY = 0; gridY < gridSizeY(); gridY++) { @@ -37,23 +37,23 @@ public void renderImage(@NotNull Font font, int x, int y, GuiGraphics guiGraphic } } - private void renderSlot(int x, int y, int itemIndex, GuiGraphics graphics, Font font) { - graphics.blitSprite(SLOT_SPRITE, x, y, 0, SLOT_WIDTH, SLOT_HEIGHT); + private void renderSlot(int x, int y, int itemIndex, GuiGraphicsExtractor graphics, Font font) { + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, SLOT_SPRITE, x, y, 0, SLOT_WIDTH, SLOT_HEIGHT); if (itemIndex < this.contents.size()) { ItemStack itemstack = this.contents.get(itemIndex); if (itemstack.isEmpty()) { this.renderBlankSlot(graphics, itemIndex, x, y); } else { - graphics.renderItem(itemstack, x + 1, y + 1, itemIndex); - graphics.renderItemDecorations(font, itemstack, x + 1, y + 1); + graphics.item(itemstack, x + 1, y + 1, itemIndex); + graphics.itemDecorations(font, itemstack, x + 1, y + 1); } } else { this.renderBlankSlot(graphics, itemIndex, x, y); } } - private void renderBlankSlot(GuiGraphics graphics, int index, int x, int y) { + private void renderBlankSlot(GuiGraphicsExtractor graphics, int index, int x, int y) { if (index < 0 || index >= ItemDisplayContents.LAYOUT.size()) return; ItemDisplayType type = ItemDisplayContents.LAYOUT.get(index).get(); type.slotTexture().ifPresent(identifier -> graphics.blit(identifier, x + 1, y + 1, 0, 0, 16, 16, 16, 16)); @@ -76,12 +76,12 @@ private int gridSizeY() { } @Override - public int getHeight() { + public int getHeight(Font font) { return this.backgroundHeight() + 4; } @Override - public int getWidth(@NotNull Font font) { + public int getWidth(Font font) { return this.backgroundWidth(); } } diff --git a/src/main/java/twilightforest/client/renderer/tooltip/PotionFlaskTooltipComponent.java b/src/main/java/twilightforest/client/renderer/tooltip/PotionFlaskTooltipComponent.java index 65fb906815..8cbec591c8 100644 --- a/src/main/java/twilightforest/client/renderer/tooltip/PotionFlaskTooltipComponent.java +++ b/src/main/java/twilightforest/client/renderer/tooltip/PotionFlaskTooltipComponent.java @@ -1,26 +1,33 @@ package twilightforest.client.renderer.tooltip; +import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Holder; +import net.minecraft.data.AtlasIds; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.material.Fluids; import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import org.joml.Matrix4f; +import org.lwjgl.opengl.GL46C; import twilightforest.TwilightForestMod; import twilightforest.components.item.PotionFlaskComponent; import twilightforest.item.PotionFlaskItem; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class PotionFlaskTooltipComponent implements ClientTooltipComponent { @@ -39,7 +46,7 @@ public PotionFlaskTooltipComponent(PotionFlaskItem.Tooltip tooltip) { } @Override - public int getHeight() { + public int getHeight(Font font) { return this.getDescriptionHeight(Minecraft.getInstance().font) + 13 + 8; } @@ -63,11 +70,24 @@ private int getDescriptionHeight(Font font) { return font.split(EMPTY_DESCRIPTION, WIDTH).size() * font.lineHeight + 1; } + // [VanillaCopy] the copy of deleted Potion.getName + private static String getName(Optional> potion, String descriptionId) { + if (potion.isPresent()) { + String s = potion.get().value().name(); + if (s != null) { + return descriptionId + s; + } + } + + String s1 = potion.flatMap(Holder::unwrapKey).map(p_331494_ -> p_331494_.identifier().getPath()).orElse("empty"); + return descriptionId + s1; + } + private List getPotionTooltips() { if (this.component.potion().potion().isPresent()) { List tooltips = new ArrayList<>(); - tooltips.add(Component.translatable(Potion.getName(this.component.potion().potion(), "item.minecraft.potion.effect."))); - this.component.potion().addPotionTooltip(tooltips::add, 1.0F, Minecraft.getInstance().level.tickRateManager().tickrate()); + tooltips.add(Component.translatable(getName(this.component.potion().potion(), "item.minecraft.potion.effect."))); + PotionContents.addPotionTooltip(this.component.potion().potion().get().value().getEffects(), tooltips::add, 1.0F, Minecraft.getInstance().level.tickRateManager().tickrate()); return tooltips; } return List.of(); @@ -78,10 +98,10 @@ private int getContentXOffset(int offs) { } @Override - public void renderImage(Font font, int x, int y, GuiGraphics graphics) { + public void extractImage(Font font, int x, int y, int w, int h, GuiGraphicsExtractor graphics) { int offs = 113; //TODO replace with 4th param in 1.21.2+ so things properly center if (this.component.potion().potion().isEmpty()) { - graphics.drawWordWrap(font, EMPTY_DESCRIPTION, x, y, WIDTH, 11184810); + graphics.textWithWordWrap(font, EMPTY_DESCRIPTION, x, y, WIDTH, 11184810); } else { int height = 0; for (var component : this.getPotionTooltips()) { @@ -89,7 +109,7 @@ public void renderImage(Font font, int x, int y, GuiGraphics graphics) { if (component.getString().isEmpty()) { height += font.lineHeight; } else { - graphics.drawWordWrap(font, component, x, y + height, WIDTH, color); + graphics.textWithWordWrap(font, component, x, y + height, WIDTH, color); } height += font.split(component, WIDTH).size() * font.lineHeight + 1; } @@ -97,76 +117,50 @@ public void renderImage(Font font, int x, int y, GuiGraphics graphics) { this.drawPotionBar(x + this.getContentXOffset(offs), y + this.getDescriptionHeight(font) + 4, font, graphics); } - private void drawPotionBar(int x, int y, Font font, GuiGraphics graphics) { + private void drawPotionBar(int x, int y, Font font, GuiGraphicsExtractor graphics) { int segmentSplit = this.getWidth(font) / this.maxDoses; if (this.component.doses() <= 0) { - graphics.drawCenteredString(font, Component.translatable("item.twilightforest.flask.empty"), x + (WIDTH / 2) + 1, y + 3, 16777215); + graphics.centeredText(font, Component.translatable("item.twilightforest.flask.empty"), x + (WIDTH / 2) + 1, y + 3, 16777215); } - this.renderPotion(graphics.pose(), x + 1, y + 13, this.component.doses() * segmentSplit - 1, 13, this.component.potion().getColor()); + this.renderPotion(graphics, x + 1, y + 13, this.component.doses() * segmentSplit - 1, 13, this.component.potion().getColor()); if (this.component.breakage() > 0) { int xPos = x + segmentSplit * (3 - this.component.breakage()); - RenderSystem.enableBlend(); graphics.fill(xPos, y, xPos + (segmentSplit * this.component.breakage()), y + 13, 0xAA434343); - RenderSystem.disableBlend(); } int widthProg = segmentSplit; for (int i = 1; i < this.maxDoses; i++) { - graphics.blitSprite(DOSE_SPRITE, x + widthProg, y, 1, 13); + graphics.blit(RenderPipelines.GUI_TEXTURED, DOSE_SPRITE, x + widthProg, y, 0, 0, 1, 13, 1, 13); widthProg += segmentSplit; } - graphics.blitSprite(BORDER_SPRITE, x, y, WIDTH, 13); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, BORDER_SPRITE, x, y, WIDTH, 13); } - private void renderPotion(PoseStack stack, int xPosition, int yPosition, int desiredWidth, int desiredHeight, int color) { - int red = (color >> 16) & 255; - int green = (color >> 8) & 255; - int blue = color & 255; - TextureAtlasSprite sprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(IClientFluidTypeExtensions.of(Fluids.WATER).getStillTexture()); - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); - int xTileCount = desiredWidth / 16; - int xRemainder = desiredWidth - (xTileCount * 16); - int yTileCount = desiredHeight / 16; - int yRemainder = desiredHeight - (yTileCount * 16); - float uMin = sprite.getU0(); - float uMax = sprite.getU1(); - float vMin = sprite.getV0(); - float vMax = sprite.getV1(); - float uDif = uMax - uMin; - float vDif = vMax - vMin; - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(red / 255.0F, green / 255.0F, blue / 255.0F, 1.0F); - BufferBuilder vertexBuffer = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); - Matrix4f matrix4f = stack.last().pose(); - for (int xTile = 0; xTile <= xTileCount; xTile++) { - int width = (xTile == xTileCount) ? xRemainder : 16; - if (width == 0) { - break; - } - int x = xPosition + (xTile * 16); - int maskRight = 16 - width; - int shiftedX = x + 16 - maskRight; - float uLocalDif = uDif * maskRight / 16; - - for (int yTile = 0; yTile <= yTileCount; yTile++) { - int height = (yTile == yTileCount) ? yRemainder : 16; - if (height == 0) { - break; - } - int y = yPosition - ((yTile + 1) * 16); - int maskTop = 16 - height; - float vLocalDif = vDif * maskTop / 16; - - vertexBuffer.addVertex(matrix4f, x, y + 16, 0).setUv(uMin + uLocalDif, vMax).setColor(color); - vertexBuffer.addVertex(matrix4f, shiftedX, y + 16, 0).setUv(uMax, vMax).setColor(color); - vertexBuffer.addVertex(matrix4f, shiftedX, y + maskTop, 0).setUv(uMax, vMin + vLocalDif).setColor(color); - vertexBuffer.addVertex(matrix4f, x, y + maskTop, 0).setUv(uMin + uLocalDif, vMin + vLocalDif).setColor(color); + private void renderPotion(GuiGraphicsExtractor guiGraphics, int xPosition, int yPosition, int desiredWidth, int desiredHeight, int color) { + if (desiredWidth <= 0 || desiredHeight <= 0) return; + + Identifier waterLocation = Identifier.withDefaultNamespace("block/water_still"); + + int startY = yPosition - desiredHeight; + + for (int x = 0; x < desiredWidth; x += 16) { + int width = Math.min(16, desiredWidth - x); + + for (int y = 0; y < desiredHeight; y += 16) { + int height = Math.min(16, desiredHeight - y); + + guiGraphics.blit( + RenderPipelines.GUI_TEXTURED, + waterLocation, + xPosition + x, + startY + y, + 0, 0, + width, height, + 16, 16, + color + ); } } - BufferUploader.drawWithShader(vertexBuffer.buildOrThrow()); - RenderSystem.disableBlend(); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); } } diff --git a/src/main/java/twilightforest/client/renderer/tooltip/TravellersBeltTooltipComponent.java b/src/main/java/twilightforest/client/renderer/tooltip/TravellersBeltTooltipComponent.java index a4273d6d2f..5d6c3382aa 100644 --- a/src/main/java/twilightforest/client/renderer/tooltip/TravellersBeltTooltipComponent.java +++ b/src/main/java/twilightforest/client/renderer/tooltip/TravellersBeltTooltipComponent.java @@ -1,12 +1,12 @@ package twilightforest.client.renderer.tooltip; import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.ItemContainerContents; -import org.jetbrains.annotations.NotNull; import twilightforest.item.travellers_gear.TravellersArmorBeltItem; import java.util.ArrayList; @@ -26,8 +26,8 @@ public TravellersBeltTooltipComponent(TravellersArmorBeltItem.Tooltip tooltip) { } @Override - public void renderImage(@NotNull Font font, int x, int y, GuiGraphics guiGraphics) { - guiGraphics.blitSprite(BACKGROUND_SPRITE, x, y, this.backgroundWidth(), this.backgroundHeight()); + public void extractImage(Font font, int x, int y, int w, int h, GuiGraphicsExtractor guiGraphics) { + guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, BACKGROUND_SPRITE, x, y, this.backgroundWidth(), this.backgroundHeight()); int k = 0; for (int gridY = 0; gridY < gridSizeY(); gridY++) { @@ -39,19 +39,19 @@ public void renderImage(@NotNull Font font, int x, int y, GuiGraphics guiGraphic } } - private void renderSlot(int x, int y, int itemIndex, GuiGraphics guiGraphics, Font font) { + private void renderSlot(int x, int y, int itemIndex, GuiGraphicsExtractor guiGraphics, Font font) { if (itemIndex >= this.contents.size()) { this.blit(guiGraphics, x, y); } else { ItemStack itemstack = this.contents.get(itemIndex); this.blit(guiGraphics, x, y); - guiGraphics.renderItem(itemstack, x + 1, y + 1, itemIndex); - guiGraphics.renderItemDecorations(font, itemstack, x + 1, y + 1); + guiGraphics.item(itemstack, x + 1, y + 1, itemIndex); + guiGraphics.itemDecorations(font, itemstack, x + 1, y + 1); } } - private void blit(GuiGraphics guiGraphics, int x, int y) { - guiGraphics.blitSprite(Texture.SLOT.sprite, x, y, 0, Texture.SLOT.w, Texture.SLOT.h); + private void blit(GuiGraphicsExtractor guiGraphics, int x, int y) { + guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, Texture.SLOT.sprite, x, y, 0, Texture.SLOT.w, Texture.SLOT.h); } private int backgroundWidth() { @@ -71,12 +71,12 @@ private int gridSizeY() { } @Override - public int getHeight() { + public int getHeight(Font font) { return this.backgroundHeight() + 4; } @Override - public int getWidth(@NotNull Font font) { + public int getWidth(Font font) { return this.backgroundWidth(); } diff --git a/src/main/java/twilightforest/util/RenderTypeUtil.java b/src/main/java/twilightforest/util/RenderTypeUtil.java new file mode 100644 index 0000000000..ddf7ad23f2 --- /dev/null +++ b/src/main/java/twilightforest/util/RenderTypeUtil.java @@ -0,0 +1,43 @@ +package twilightforest.util; + +import com.mojang.blaze3d.pipeline.RenderTarget; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.client.renderer.rendertype.OutputTarget; +import net.minecraft.client.renderer.rendertype.RenderSetup; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.resources.Identifier; +import net.minecraft.util.Util; + +import java.util.function.Function; + +// [VanillaCopy] this class contains removed methods from vanilla RenderType +public class RenderTypeUtil { + private static final Function WEATHER_DEPTH_WRITE = createWeather(true); + private static final Function WEATHER_NO_DEPTH_WRITE = createWeather(false); + + private static final OutputTarget WEATHER_TARGET = new OutputTarget("weather_target", () -> { + RenderTarget target = Minecraft.getInstance().levelRenderer.getWeatherTarget(); + if (target != null) return target; + else return Minecraft.getInstance().getMainRenderTarget(); + }); + + public static RenderType weather(Identifier texture, boolean depthWrite) { + return (depthWrite ? WEATHER_DEPTH_WRITE : WEATHER_NO_DEPTH_WRITE).apply(texture); + } + + private static Function createWeather(boolean depthWrite) { + return Util.memoize( + texture -> RenderType.create( + "weather", + RenderSetup.builder(depthWrite ? RenderPipelines.WEATHER_DEPTH_WRITE : RenderPipelines.WEATHER_NO_DEPTH_WRITE) + .bufferSize(RenderType.TRANSIENT_BUFFER_SIZE) + .setOutputTarget(WEATHER_TARGET) + .withTexture("Sampler0", texture) + .useLightmap() + .setOutline(RenderSetup.OutlineProperty.NONE) + .createRenderSetup() + ) + ); + } +}