Multiple tweaks and fixes to the recent changes in the client refactor PR: Part 3 (#8864)

Fix weighted baked models not respecting children render types
Allow fluid container model to use base texture as particle
Fix inverted behavior in composite model building. Fixes #8871
This commit is contained in:
Néstor Amador authored and GitHub committed 2022-07-20 15:25:07 -07:00
1 parent 427b335cac
commit 8cd2c9c63f
8 files changed
+117 -26

No files matched your search

@@ -757,7 +757,7 @@ public class ForgeHooksClient
var model = blockRenderer.getBlockModel(state);
for (var renderType : model.getRenderTypes(state, RandomSource.create(state.getSeed(pos)), ModelData.EMPTY))
{
VertexConsumer vertexConsumer = bufferSource.getBuffer(renderType == RenderType.translucent() ? RenderType.translucentMovingBlock() : renderType);
VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderTypeHelper.getMovingBlockRenderType(renderType));
blockRenderer.getModelRenderer().tesselateBlock(level, model, state, pos, stack, vertexConsumer, checkSides, RandomSource.create(), state.getSeed(pos), packedOverlay, ModelData.EMPTY, renderType);
}
}
@@ -958,13 +958,9 @@ public class ForgeHooksClient
* for the input {@link RenderType}.
*/
@NotNull
public static RenderType getEntityRenderType(RenderType chunkRenderType, boolean fabulous)
public static RenderType getEntityRenderType(RenderType chunkRenderType, boolean cull)
{
if (chunkRenderType != RenderType.translucent())
return Sheets.cutoutBlockSheet();
if (!Minecraft.useShaderTransparency())
return Sheets.translucentCullBlockSheet();
return fabulous ? Sheets.translucentCullBlockSheet() : Sheets.translucentItemSheet();
return RenderTypeHelper.getEntityRenderType(chunkRenderType, cull);
}
@Mod.EventBusSubscriber(value = Dist.CLIENT, modid="forge", bus= Mod.EventBusSubscriber.Bus.MOD)
@@ -0,0 +1,76 @@
/*
* Copyright (c) Forge Development LLC and contributors
* SPDX-License-Identifier: LGPL-2.1-only
*/
package net.minecraftforge.client;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.data.ModelData;
import org.jetbrains.annotations.NotNull;
/**
* Provides helper functions replacing those in {@link ItemBlockRenderTypes}.
*/
public final class RenderTypeHelper
{
/**
* Provides a {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} for the given {@link DefaultVertexFormat#BLOCK} format.
* This should be called for each {@link RenderType} returned by {@link BakedModel#getRenderTypes(BlockState, RandomSource, ModelData)}.
* <p>
* Mimics the behavior of vanilla's {@link ItemBlockRenderTypes#getRenderType(BlockState, boolean)}.
*/
@NotNull
public static RenderType getEntityRenderType(RenderType chunkRenderType, boolean cull)
{
if (chunkRenderType != RenderType.translucent())
return Sheets.cutoutBlockSheet();
return cull || !Minecraft.useShaderTransparency() ? Sheets.translucentCullBlockSheet() : Sheets.translucentItemSheet();
}
/**
* Provides a {@link RenderType} fit for rendering moving blocks given the specified chunk render type.
* This should be called for each {@link RenderType} returned by {@link BakedModel#getRenderTypes(BlockState, RandomSource, ModelData)}.
* <p>
* Mimics the behavior of vanilla's {@link ItemBlockRenderTypes#getMovingBlockRenderType(BlockState)}.
*/
@NotNull
public static RenderType getMovingBlockRenderType(RenderType renderType)
{
if (renderType == RenderType.translucent())
return RenderType.translucentMovingBlock();
return renderType;
}
/**
* Provides a fallback {@link RenderType} for the given {@link ItemStack} in the case that none is explicitly specified.
* <p>
* Mimics the behavior of vanilla's {@link ItemBlockRenderTypes#getRenderType(ItemStack, boolean)}
* but removes the need to query the model again if the item is a {@link BlockItem}.
*/
@NotNull
public static RenderType getFallbackItemRenderType(ItemStack stack, BakedModel model, boolean cull)
{
if (stack.getItem() instanceof BlockItem blockItem)
{
var renderTypes = model.getRenderTypes(blockItem.getBlock().defaultBlockState(), RandomSource.create(42), ModelData.EMPTY);
if (renderTypes.contains(RenderType.translucent()))
return getEntityRenderType(RenderType.translucent(), cull);
return Sheets.cutoutBlockSheet();
}
return cull ? Sheets.translucentCullBlockSheet() : Sheets.translucentItemSheet();
}
private RenderTypeHelper()
{
}
}
@@ -19,6 +19,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.ChunkRenderTypeSet;
import net.minecraftforge.client.RenderTypeHelper;
import net.minecraftforge.client.model.data.ModelData;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -97,7 +98,7 @@ public interface IForgeBakedModel
*/
default List<RenderType> getRenderTypes(ItemStack itemStack, boolean fabulous)
{
return List.of(ItemBlockRenderTypes.getRenderType(itemStack, fabulous));
return List.of(RenderTypeHelper.getFallbackItemRenderType(itemStack, self(), fabulous));
}
/**
@@ -272,14 +272,14 @@ public class CompositeModel implements IUnbakedGeometry<CompositeModel>
private void addLayer(RenderTypeGroup renderTypes, List<BakedQuad> quads)
{
var modelBuilder = IModelBuilder.of(true, isSideLit, false, transforms, overrides, particle, renderTypes);
var modelBuilder = IModelBuilder.of(isAmbientOcclusion, isSideLit, isGui3d, transforms, overrides, particle, renderTypes);
quads.forEach(modelBuilder::addUnculledFace);
children.add(modelBuilder.build());
}
private void flushQuads(RenderTypeGroup renderTypes)
{
if (Objects.equals(renderTypes, lastRenderTypes))
if (!Objects.equals(renderTypes, lastRenderTypes))
{
if (quads.size() > 0)
{
@@ -128,6 +128,7 @@ public class DynamicFluidContainerModel implements IUnbakedGeometry<DynamicFluid
TextureAtlasSprite particleSprite = particleLocation != null ? spriteGetter.apply(particleLocation) : null;
if (particleSprite == null) particleSprite = fluidSprite;
if (particleSprite == null) particleSprite = baseSprite;
if (particleSprite == null && !coverIsMask) particleSprite = coverSprite;
// If the fluid is lighter than air, rotate 180deg to turn it upside down