/* * Minecraft Forge * Copyright (c) 2016-2019. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation version 2.1 * of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package net.minecraftforge.client.model; import javax.annotation.Nullable; import java.util.List; import java.util.Random; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.TransformationMatrix; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.Direction; public class BakedItemModel implements IBakedModel { protected final ImmutableList quads; protected final TextureAtlasSprite particle; protected final ImmutableMap transforms; protected final ItemOverrideList overrides; protected final IBakedModel guiModel; public BakedItemModel(ImmutableList quads, TextureAtlasSprite particle, ImmutableMap transforms, ItemOverrideList overrides, boolean untransformed) { this.quads = quads; this.particle = particle; this.transforms = transforms; this.overrides = overrides; this.guiModel = untransformed && hasGuiIdentity(transforms) ? new BakedGuiItemModel<>(this) : null; } private static boolean hasGuiIdentity(ImmutableMap transforms) { TransformationMatrix guiTransform = transforms.get(TransformType.GUI); return guiTransform == null || guiTransform.isIdentity(); } @Override public boolean isAmbientOcclusion() { return true; } @Override public boolean isGui3d() { return false; } @Override public boolean func_230044_c_() { return false; } @Override public boolean isBuiltInRenderer() { return false; } @Override public TextureAtlasSprite getParticleTexture() { return particle; } @Override public ItemOverrideList getOverrides() { return overrides; } @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand) { if (side == null) { return quads; } return ImmutableList.of(); } @Override public IBakedModel handlePerspective(TransformType type, MatrixStack mat) { if (type == TransformType.GUI && this.guiModel != null) { return this.guiModel.handlePerspective(type, mat); } return PerspectiveMapWrapper.handlePerspective(this, transforms, type, mat); } public static class BakedGuiItemModel extends BakedModelWrapper { private final ImmutableList quads; public BakedGuiItemModel(T originalModel) { super(originalModel); ImmutableList.Builder builder = ImmutableList.builder(); for (BakedQuad quad : originalModel.quads) { if (quad.getFace() == Direction.SOUTH) { builder.add(quad); } } this.quads = builder.build(); } @Override public List getQuads (@Nullable BlockState state, @Nullable Direction side, Random rand) { if(side == null) { return quads; } return ImmutableList.of(); } @Override public boolean doesHandlePerspectives() { return true; } @Override public IBakedModel handlePerspective(TransformType type, MatrixStack mat) { if (type == TransformType.GUI) { return PerspectiveMapWrapper.handlePerspective(this, originalModel.transforms, type, mat); } return this.originalModel.handlePerspective(type, mat); } } }