package net.optifine.render; import java.util.ArrayList; import java.util.BitSet; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.BlockLeaves; import net.minecraft.block.state.BlockStateBase; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.BlockModelRenderer; import net.minecraft.client.renderer.RegionRenderCacheBuilder; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BreakingFour; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumWorldBlockLayer; import net.optifine.Config; import net.optifine.model.ListQuadsOverlay; public class RenderEnv { private IBlockState blockState; private BlockPos blockPos; private int blockId = -1; private int metadata = -1; private int breakingAnimation = -1; private int smartLeaves = -1; private float[] quadBounds = new float[EnumFacing._VALUES.length * 2]; private BitSet boundsFlags = new BitSet(3); private BlockModelRenderer.AmbientOcclusionFace aoFace = new BlockModelRenderer.AmbientOcclusionFace(); private BlockPos colorizerBlockPosM = null; private boolean[] borderFlags = null; private boolean[] borderFlags2 = null; private boolean[] borderFlags3 = null; private EnumFacing[] borderDirections = null; private List listQuadsCustomizer = new ArrayList(); private List listQuadsCtmMultipass = new ArrayList(); private BakedQuad[] arrayQuadsCtm1 = new BakedQuad[1]; private BakedQuad[] arrayQuadsCtm2 = new BakedQuad[2]; private BakedQuad[] arrayQuadsCtm3 = new BakedQuad[3]; private BakedQuad[] arrayQuadsCtm4 = new BakedQuad[4]; private RegionRenderCacheBuilder regionRenderCacheBuilder = null; private ListQuadsOverlay[] listsQuadsOverlay = new ListQuadsOverlay[EnumWorldBlockLayer.values().length]; private boolean overlaysRendered = false; private static final int UNKNOWN = -1; private static final int FALSE = 0; private static final int TRUE = 1; public RenderEnv(IBlockState blockState, BlockPos blockPos) { this.blockState = blockState; this.blockPos = blockPos; } public void reset(IBlockState blockStateIn, BlockPos blockPosIn) { if (this.blockState != blockStateIn || this.blockPos != blockPosIn) { this.blockState = blockStateIn; this.blockPos = blockPosIn; this.blockId = -1; this.metadata = -1; this.breakingAnimation = -1; this.smartLeaves = -1; this.boundsFlags.clear(); } } public int getBlockId() { if (this.blockId < 0) { if (this.blockState instanceof BlockStateBase) { BlockStateBase blockstatebase = (BlockStateBase) this.blockState; this.blockId = blockstatebase.getBlockId(); } else { this.blockId = Block.getIdFromBlock(this.blockState.getBlock()); } } return this.blockId; } public int getMetadata() { if (this.metadata < 0) { if (this.blockState instanceof BlockStateBase) { BlockStateBase blockstatebase = (BlockStateBase) this.blockState; this.metadata = blockstatebase.getMetadata(); } else { this.metadata = this.blockState.getBlock().getMetaFromState(this.blockState); } } return this.metadata; } public float[] getQuadBounds() { return this.quadBounds; } public BitSet getBoundsFlags() { return this.boundsFlags; } public BlockModelRenderer.AmbientOcclusionFace getAoFace() { return this.aoFace; } public boolean isBreakingAnimation(List listQuads) { if (this.breakingAnimation == -1 && listQuads.size() > 0) { if (listQuads.get(0) instanceof BreakingFour) { this.breakingAnimation = 1; } else { this.breakingAnimation = 0; } } return this.breakingAnimation == 1; } public boolean isBreakingAnimation(BakedQuad quad) { if (this.breakingAnimation < 0) { if (quad instanceof BreakingFour) { this.breakingAnimation = 1; } else { this.breakingAnimation = 0; } } return this.breakingAnimation == 1; } public boolean isBreakingAnimation() { return this.breakingAnimation == 1; } public IBlockState getBlockState() { return this.blockState; } public BlockPos getColorizerBlockPosM() { if (this.colorizerBlockPosM == null) { this.colorizerBlockPosM = new BlockPos(0, 0, 0); } return this.colorizerBlockPosM; } public boolean[] getBorderFlags() { if (this.borderFlags == null) { this.borderFlags = new boolean[4]; } return this.borderFlags; } public boolean[] getBorderFlags2() { if (this.borderFlags2 == null) { this.borderFlags2 = new boolean[4]; } return this.borderFlags2; } public boolean[] getBorderFlags3() { if (this.borderFlags3 == null) { this.borderFlags3 = new boolean[4]; } return this.borderFlags3; } public EnumFacing[] getBorderDirections() { if (this.borderDirections == null) { this.borderDirections = new EnumFacing[4]; } return this.borderDirections; } public EnumFacing[] getBorderDirections(EnumFacing dir0, EnumFacing dir1, EnumFacing dir2, EnumFacing dir3) { EnumFacing[] aenumfacing = this.getBorderDirections(); aenumfacing[0] = dir0; aenumfacing[1] = dir1; aenumfacing[2] = dir2; aenumfacing[3] = dir3; return aenumfacing; } public boolean isSmartLeaves() { if (this.smartLeaves == -1) { if (Config.isTreesSmart() && this.blockState.getBlock() instanceof BlockLeaves) { this.smartLeaves = 1; } else { this.smartLeaves = 0; } } return this.smartLeaves == 1; } public List getListQuadsCustomizer() { return this.listQuadsCustomizer; } public BakedQuad[] getArrayQuadsCtm(BakedQuad quad) { this.arrayQuadsCtm1[0] = quad; return this.arrayQuadsCtm1; } public BakedQuad[] getArrayQuadsCtm(BakedQuad quad0, BakedQuad quad1) { this.arrayQuadsCtm2[0] = quad0; this.arrayQuadsCtm2[1] = quad1; return this.arrayQuadsCtm2; } public BakedQuad[] getArrayQuadsCtm(BakedQuad quad0, BakedQuad quad1, BakedQuad quad2) { this.arrayQuadsCtm3[0] = quad0; this.arrayQuadsCtm3[1] = quad1; this.arrayQuadsCtm3[2] = quad2; return this.arrayQuadsCtm3; } public BakedQuad[] getArrayQuadsCtm(BakedQuad quad0, BakedQuad quad1, BakedQuad quad2, BakedQuad quad3) { this.arrayQuadsCtm4[0] = quad0; this.arrayQuadsCtm4[1] = quad1; this.arrayQuadsCtm4[2] = quad2; this.arrayQuadsCtm4[3] = quad3; return this.arrayQuadsCtm4; } public List getListQuadsCtmMultipass(BakedQuad[] quads) { this.listQuadsCtmMultipass.clear(); if (quads != null) { for (int i = 0; i < quads.length; ++i) { BakedQuad bakedquad = quads[i]; this.listQuadsCtmMultipass.add(bakedquad); } } return this.listQuadsCtmMultipass; } public RegionRenderCacheBuilder getRegionRenderCacheBuilder() { return this.regionRenderCacheBuilder; } public void setRegionRenderCacheBuilder(RegionRenderCacheBuilder regionRenderCacheBuilder) { this.regionRenderCacheBuilder = regionRenderCacheBuilder; } public ListQuadsOverlay getListQuadsOverlay(EnumWorldBlockLayer layer) { ListQuadsOverlay listquadsoverlay = this.listsQuadsOverlay[layer.ordinal()]; if (listquadsoverlay == null) { listquadsoverlay = new ListQuadsOverlay(); this.listsQuadsOverlay[layer.ordinal()] = listquadsoverlay; } return listquadsoverlay; } public boolean isOverlaysRendered() { return this.overlaysRendered; } public void setOverlaysRendered(boolean overlaysRendered) { this.overlaysRendered = overlaysRendered; } }