Rendering/Model Fixes
This commit is contained in:
@@ -25,56 +25,57 @@ import java.util.Random;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
|
||||
|
||||
import appeng.client.render.BakedModelUnwrapper;
|
||||
import appeng.client.render.model.AutoRotatingBakedModel;
|
||||
import appeng.client.render.model.DriveBakedModel;
|
||||
import appeng.tile.storage.ChestBlockEntity;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh;
|
||||
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.BlockModelRenderer;
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.model.BakedQuad;
|
||||
import net.minecraft.client.renderer.model.IBakedModel;
|
||||
import net.minecraft.client.renderer.model.ModelManager;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.render.RenderLayer;
|
||||
import net.minecraft.client.render.VertexConsumer;
|
||||
import net.minecraft.client.render.VertexConsumerProvider;
|
||||
import net.minecraft.client.render.block.BlockModelRenderer;
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
|
||||
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
|
||||
import net.minecraft.client.render.model.BakedModel;
|
||||
import net.minecraft.client.render.model.BakedModelManager;
|
||||
import net.minecraft.client.render.model.BakedQuad;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.model.data.EmptyModelData;
|
||||
import net.minecraftforge.client.model.data.IModelData;
|
||||
|
||||
import appeng.api.client.ICellModelRegistry;
|
||||
import appeng.block.storage.DriveSlotsState;
|
||||
import appeng.client.render.DelegateBakedModel;
|
||||
import appeng.client.render.FacingToRotation;
|
||||
import appeng.core.Api;
|
||||
import appeng.tile.storage.ChestTileEntity;
|
||||
|
||||
/**
|
||||
* The tile entity renderer for ME chests takes care of rendering the right
|
||||
* model for the inserted cell, as well as the LED.
|
||||
*/
|
||||
public class ChestTileEntityRenderer extends TileEntityRenderer<ChestTileEntity> {
|
||||
public class ChestTileEntityRenderer extends BlockEntityRenderer<ChestBlockEntity> {
|
||||
|
||||
private final ICellModelRegistry cellModelRegistry = Api.instance().client().cells();
|
||||
|
||||
private final ModelManager modelManager;
|
||||
private final BakedModelManager modelManager;
|
||||
|
||||
private final BlockModelRenderer blockRenderer;
|
||||
|
||||
public ChestTileEntityRenderer(TileEntityRendererDispatcher rendererDispatcherIn) {
|
||||
super(rendererDispatcherIn);
|
||||
Minecraft client = Minecraft.getInstance();
|
||||
modelManager = client.getModelManager();
|
||||
blockRenderer = client.getBlockRendererDispatcher().getBlockModelRenderer();
|
||||
public ChestTileEntityRenderer(BlockEntityRenderDispatcher renderDispatcher) {
|
||||
super(renderDispatcher);
|
||||
MinecraftClient client = MinecraftClient.getInstance();
|
||||
modelManager = client.getBakedModelManager();
|
||||
blockRenderer = client.getBlockRenderManager().getModelRenderer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(ChestTileEntity chest, float partialTicks, MatrixStack matrices, IRenderTypeBuffer buffers,
|
||||
int combinedLight, int combinedOverlay) {
|
||||
public void render(ChestBlockEntity chest, float partialTicks, MatrixStack matrices, VertexConsumerProvider buffers,
|
||||
int combinedLight, int combinedOverlay) {
|
||||
|
||||
World world = chest.getWorld();
|
||||
if (world == null) {
|
||||
@@ -88,12 +89,12 @@ public class ChestTileEntityRenderer extends TileEntityRenderer<ChestTileEntity>
|
||||
return; // No cell inserted into chest
|
||||
}
|
||||
|
||||
ResourceLocation cellModelLocation = cellModelRegistry.model(cellItem);
|
||||
if (cellModelLocation == null) {
|
||||
cellModelLocation = cellModelRegistry.getDefaultModel();
|
||||
// Try to get the right cell chassis model from the drive model since it already loads them all
|
||||
DriveBakedModel driveModel = getDriveModel();
|
||||
if (driveModel == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
IBakedModel model = modelManager.getModel(cellModelLocation);
|
||||
BakedModel cellModel = driveModel.getCellChassisModel(cellItem);
|
||||
|
||||
matrices.push();
|
||||
matrices.translate(0.5, 0.5, 0.5);
|
||||
@@ -106,45 +107,49 @@ public class ChestTileEntityRenderer extends TileEntityRenderer<ChestTileEntity>
|
||||
matrices.translate(5 / 16.0, 4 / 16.0, 0);
|
||||
|
||||
// Render the cell model as-if it was a block model
|
||||
IVertexBuilder buffer = buffers.getBuffer(RenderType.getCutout());
|
||||
VertexConsumer buffer = buffers.getBuffer(RenderLayer.getCutout());
|
||||
// We "fake" the position here to make it use the light-value in front of the
|
||||
// drive
|
||||
FaceRotatingModel rotatedModel = new FaceRotatingModel(model, rotation);
|
||||
blockRenderer.renderModel(world, rotatedModel, chest.getBlockState(), chest.getPos(), matrices, buffer, false,
|
||||
new Random(), 0L, combinedOverlay, EmptyModelData.INSTANCE);
|
||||
BakedModel rotatedModel = new FaceRotatingModel(cellModel, rotation);
|
||||
blockRenderer.render(world, rotatedModel, chest.getCachedState(), chest.getPos(), matrices, buffer, false,
|
||||
new Random(), 0L, combinedOverlay);
|
||||
|
||||
IVertexBuilder ledBuffer = buffers.getBuffer(CellLedRenderer.RENDER_LAYER);
|
||||
VertexConsumer ledBuffer = buffers.getBuffer(CellLedRenderer.RENDER_LAYER);
|
||||
CellLedRenderer.renderLed(chest, 0, ledBuffer, matrices, partialTicks);
|
||||
|
||||
matrices.pop();
|
||||
}
|
||||
|
||||
private DriveBakedModel getDriveModel() {
|
||||
BakedModel driveModel = modelManager.getBlockModels().getModel(Api.instance().definitions().blocks().drive().block().getDefaultState());
|
||||
return BakedModelUnwrapper.unwrap(driveModel, DriveBakedModel.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* The actual vertex data will be transformed using the matrix stack, but the
|
||||
* faces will not be correctly rotated so the incorrect lighting data would be
|
||||
* used to apply diffuse lighting and the lightmap texture.
|
||||
*/
|
||||
private static class FaceRotatingModel extends DelegateBakedModel {
|
||||
private static class FaceRotatingModel extends ForwardingBakedModel {
|
||||
private final FacingToRotation r;
|
||||
|
||||
protected FaceRotatingModel(IBakedModel base, FacingToRotation r) {
|
||||
super(base);
|
||||
protected FaceRotatingModel(BakedModel base, FacingToRotation r) {
|
||||
this.wrapped = base;
|
||||
this.r = r;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand,
|
||||
@Nonnull IModelData extraData) {
|
||||
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand) {
|
||||
if (side != null) {
|
||||
side = r.rotate(side); // This fixes the incorrect lightmap position
|
||||
side = r.resultingRotate(side); // This fixes the incorrect lightmap position
|
||||
}
|
||||
List<BakedQuad> quads = new ArrayList<>(super.getQuads(state, side, rand, extraData));
|
||||
List<BakedQuad> quads = new ArrayList<>(super.getQuads(state, side, rand));
|
||||
|
||||
for (int i = 0; i < quads.size(); i++) {
|
||||
BakedQuad quad = quads.get(i);
|
||||
quads.set(i, new BakedQuad(quad.getVertexData(), quad.getTintIndex(), r.rotate(quad.getFace()),
|
||||
quad.func_187508_a(), quad.shouldApplyDiffuseLighting()));
|
||||
quads.set(i, new BakedQuad(quad.getVertexData(), quad.getColorIndex(), r.rotate(quad.getFace()),
|
||||
/* FIXME FABRIC: sprite is protected but unused?? */ null, quad.hasShade()));
|
||||
}
|
||||
|
||||
return quads;
|
||||
|
||||
Reference in New Issue
Block a user