1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-07-04 02:52:56 +00:00
CC-Tweaked/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java
2023-02-14 10:19:46 +00:00

120 lines
4.6 KiB
Java

/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.client.render;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Transformation;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.client.turtle.TurtleUpgradeModellers;
import dan200.computercraft.shared.turtle.items.ItemTurtle;
import dan200.computercraft.shared.util.Holiday;
import dan200.computercraft.shared.util.HolidayUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.model.BakedModelWrapper;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TurtleSmartItemModel extends BakedModelWrapper<BakedModel>
{
private static final Transformation identity, flip;
static
{
PoseStack stack = new PoseStack();
stack.scale( 0, -1, 0 );
stack.translate( 0, 0, 1 );
identity = Transformation.identity();
flip = new Transformation( stack.last().pose() );
}
private record TurtleModelCombination(
boolean colour,
ITurtleUpgrade leftUpgrade,
ITurtleUpgrade rightUpgrade,
ResourceLocation overlay,
boolean christmas,
boolean flip
)
{
}
private final BakedModel familyModel;
private final BakedModel colourModel;
private final Map<TurtleModelCombination, List<BakedModel>> cachedModels = new HashMap<>();
public TurtleSmartItemModel( BakedModel familyModel, BakedModel colourModel )
{
super( familyModel );
this.familyModel = familyModel;
this.colourModel = colourModel;
}
@Nonnull
@Override
public BakedModel applyTransform( @Nonnull ItemTransforms.TransformType cameraTransformType, @Nonnull PoseStack poseStack, boolean applyLeftHandTransform )
{
originalModel.applyTransform( cameraTransformType, poseStack, applyLeftHandTransform );
return this;
}
@Nonnull
@Override
public List<BakedModel> getRenderPasses( ItemStack stack, boolean fabulous )
{
if ( !(stack.getItem() instanceof ItemTurtle) ) return familyModel.getRenderPasses( stack, fabulous );
ItemTurtle turtle = (ItemTurtle) stack.getItem();
int colour = turtle.getColour( stack );
ITurtleUpgrade leftUpgrade = turtle.getUpgrade( stack, TurtleSide.LEFT );
ITurtleUpgrade rightUpgrade = turtle.getUpgrade( stack, TurtleSide.RIGHT );
ResourceLocation overlay = turtle.getOverlay( stack );
boolean christmas = HolidayUtil.getCurrentHoliday() == Holiday.CHRISTMAS;
String label = turtle.getLabel( stack );
boolean flip = label != null && (label.equals( "Dinnerbone" ) || label.equals( "Grumm" ));
TurtleModelCombination combo = new TurtleModelCombination( colour != -1, leftUpgrade, rightUpgrade, overlay, christmas, flip );
return cachedModels.computeIfAbsent( combo, this::buildModel );
}
private List<BakedModel> buildModel( TurtleModelCombination combo )
{
Minecraft mc = Minecraft.getInstance();
ModelManager modelManager = mc.getItemRenderer().getItemModelShaper().getModelManager();
var transformation = combo.flip ? flip : identity;
ArrayList<BakedModel> parts = new ArrayList<>( 4 );
parts.add( new TransformedBakedModel( combo.colour() ? colourModel : familyModel, transformation ) );
ResourceLocation overlayModelLocation = TileEntityTurtleRenderer.getTurtleOverlayModel( combo.overlay(), combo.christmas() );
if( overlayModelLocation != null )
{
parts.add( new TransformedBakedModel( modelManager.getModel( overlayModelLocation ), transformation ) );
}
if( combo.leftUpgrade() != null )
{
parts.add( new TransformedBakedModel( TurtleUpgradeModellers.getModel( combo.leftUpgrade(), null, TurtleSide.LEFT ) ).composeWith( transformation ) );
}
if( combo.rightUpgrade() != null )
{
parts.add( new TransformedBakedModel( TurtleUpgradeModellers.getModel( combo.rightUpgrade(), null, TurtleSide.RIGHT ) ).composeWith( transformation ) );
}
return parts;
}
}