package com.carpentersblocks.util.slope; import net.minecraftforge.common.util.ForgeDirection; import com.carpentersblocks.data.Slope; import com.carpentersblocks.util.registry.FeatureRegistry; public class SlopeUtil { /** * Return number of boxes that need to be constructed for slope per pass. */ public int getNumBoxesPerPass(Slope slope) { switch (slope.type) { case PRISM: case PRISM_1P: case PRISM_2P: case PRISM_3P: case PRISM_4P: return FeatureRegistry.slopeSmoothness / 2; default: return FeatureRegistry.slopeSmoothness; } } /** * Return number of passes required for slope box generation. */ public int getNumPasses(Slope slope) { switch (slope.type) { case OBLIQUE_EXT: return getNumBoxesPerPass(slope); case OBLIQUE_INT: return 3; case WEDGE_INT: return 2; case PRISM_WEDGE: return 2; case PRISM: case PRISM_1P: case PRISM_2P: case PRISM_3P: case PRISM_4P: return 5; default: return 1; } } /** * Will return slope boundaries for all slopes */ public float[] genBounds(Slope slope, int slice, int precision, int pass) { ++pass; // For oblique exterior corners float zeroPassOffset = (float) (pass - 1) / getNumPasses(slope); float onePassOffset = (float) pass / getNumPasses(slope); // Includes 0.0F -> 0.99_F float zeroOffset = (float) slice / (float) precision; // Includes 0.01_F -> 1.0F float oneOffset = (float) (slice + 1) / (float) precision; switch (slope.slopeID) { case Slope.ID_WEDGE_NW: return new float[] { zeroOffset, 0.0F, 1.0F - oneOffset, 1.0F, 1.0F, 1.0F }; case Slope.ID_WEDGE_SW: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, 1.0F, oneOffset }; case Slope.ID_WEDGE_NE: return new float[] { 0.0F, 0.0F, zeroOffset, oneOffset, 1.0F, 1.0F }; case Slope.ID_WEDGE_SE: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F, 1.0F - zeroOffset }; case Slope.ID_WEDGE_POS_N: return new float[] { 0.0F, 0.0F, zeroOffset, 1.0F, oneOffset, 1.0F }; case Slope.ID_WEDGE_POS_W: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, oneOffset, 1.0F }; case Slope.ID_WEDGE_POS_E: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F - zeroOffset, 1.0F }; case Slope.ID_WEDGE_POS_S: return new float[] { 0.0F, 0.0F, 0.0F, 1.0F, 1.0F - zeroOffset, oneOffset }; case Slope.ID_WEDGE_NEG_N: return new float[] { 0.0F, 1.0F - oneOffset, zeroOffset, 1.0F, 1.0F, 1.0F }; case Slope.ID_WEDGE_NEG_W: return new float[] { zeroOffset, 1.0F - oneOffset, 0.0F, 1.0F, 1.0F, 1.0F }; case Slope.ID_WEDGE_NEG_E: return new float[] { 0.0F, zeroOffset, 0.0F, oneOffset, 1.0F, 1.0F }; case Slope.ID_WEDGE_NEG_S: return new float[] { 0.0F, zeroOffset, 0.0F, 1.0F, 1.0F, oneOffset }; case Slope.ID_WEDGE_INT_POS_NW: switch (pass) { case 1: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, oneOffset, 1.0F }; case 2: return new float[] { 0.0F, 0.0F, zeroOffset, 1.0F, oneOffset, 1.0F }; } case Slope.ID_WEDGE_INT_POS_SW: switch (pass) { case 1: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, oneOffset, 1.0F }; case 2: return new float[] { 0.0F, 0.0F, 0.0F, 1.0F, 1.0F - zeroOffset, oneOffset }; } case Slope.ID_WEDGE_INT_POS_NE: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F - zeroOffset, 1.0F }; case 2: return new float[] { 0.0F, 0.0F, zeroOffset, 1.0F, oneOffset, 1.0F }; } case Slope.ID_WEDGE_INT_POS_SE: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F - zeroOffset, 1.0F }; case 2: return new float[] { 0.0F, 0.0F, 0.0F, 1.0F, 1.0F - zeroOffset, oneOffset }; } case Slope.ID_WEDGE_INT_NEG_NW: switch (pass) { case 1: return new float[] { zeroOffset, 1.0F - oneOffset, 0.0F, 1.0F, 1.0F, 1.0F }; case 2: return new float[] { 0.0F, 1.0F - oneOffset, zeroOffset, 1.0F, 1.0F, 1.0F }; } case Slope.ID_WEDGE_INT_NEG_SW: switch (pass) { case 1: return new float[] { zeroOffset, 1.0F - oneOffset, 0.0F, 1.0F, 1.0F, 1.0F }; case 2: return new float[] { 0.0F, zeroOffset, 0.0F, 1.0F, 1.0F, oneOffset }; } case Slope.ID_WEDGE_INT_NEG_NE: switch (pass) { case 1: return new float[] { 0.0F, zeroOffset, 0.0F, oneOffset, 1.0F, 1.0F }; case 2: return new float[] { 0.0F, 1.0F - oneOffset, zeroOffset, 1.0F, 1.0F, 1.0F }; } case Slope.ID_WEDGE_INT_NEG_SE: switch (pass) { case 1: return new float[] { 0.0F, zeroOffset, 0.0F, oneOffset, 1.0F, 1.0F }; case 2: return new float[] { 0.0F, zeroOffset, 0.0F, 1.0F, 1.0F, oneOffset }; } case Slope.ID_WEDGE_EXT_POS_NW: return new float[] { zeroOffset, 0.0F, zeroOffset, 1.0F, oneOffset, 1.0F }; case Slope.ID_WEDGE_EXT_POS_SW: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, oneOffset, 1.0F - zeroOffset }; case Slope.ID_WEDGE_EXT_POS_NE: return new float[] { 0.0F, 0.0F, zeroOffset, 1.0F - zeroOffset, oneOffset, 1.0F }; case Slope.ID_WEDGE_EXT_POS_SE: return new float[] { 0.0F, 0.0F, 0.0F, 1.0F - zeroOffset, oneOffset, 1.0F - zeroOffset }; case Slope.ID_WEDGE_EXT_NEG_NW: return new float[] { zeroOffset, 1.0F - oneOffset, zeroOffset, 1.0F, 1.0F, 1.0F }; case Slope.ID_WEDGE_EXT_NEG_SW: return new float[] { zeroOffset, 1.0F - oneOffset, 0.0F, 1.0F, 1.0F, 1.0F - zeroOffset }; case Slope.ID_WEDGE_EXT_NEG_NE: return new float[] { 0.0F, 1.0F - oneOffset, zeroOffset, 1.0F - zeroOffset, 1.0F, 1.0F }; case Slope.ID_WEDGE_EXT_NEG_SE: return new float[] { 0.0F, 1.0F - oneOffset, 0.0F, 1.0F - zeroOffset, 1.0F, 1.0F - zeroOffset }; case Slope.ID_OBL_EXT_POS_NW: return new float[] { zeroPassOffset + zeroOffset * (1.0F - zeroPassOffset), 0.0F, 1.0F - oneOffset * (1.0F - zeroPassOffset), 1.0F, onePassOffset, 1.0F }; case Slope.ID_OBL_EXT_POS_SW: return new float[] { zeroPassOffset + zeroOffset * (1.0F - zeroPassOffset), 0.0F, 0.0F, 1.0F, onePassOffset, oneOffset * (1.0F - zeroPassOffset) }; case Slope.ID_OBL_EXT_POS_NE: return new float[] { 0.0F, 0.0F, zeroPassOffset + zeroOffset * (1.0F - zeroPassOffset), oneOffset * (1.0F - zeroPassOffset), onePassOffset, 1.0F }; case Slope.ID_OBL_EXT_POS_SE: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset * (1.0F - zeroPassOffset), onePassOffset, 1.0F - zeroPassOffset - zeroOffset * (1.0F - zeroPassOffset), }; case Slope.ID_OBL_INT_POS_NW: switch (pass) { case 1: return new float[] { zeroOffset, 0.0F, 1.0F - oneOffset, 1.0F, 1.0F, 1.0F }; case 2: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, oneOffset, 1.0F }; case 3: return new float[] { 0.0F, 0.0F, zeroOffset, 1.0F, oneOffset, 1.0F }; } break; case Slope.ID_OBL_INT_POS_SW: switch (pass) { case 1: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, 1.0F, oneOffset }; case 2: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, oneOffset, 1.0F }; case 3: return new float[] { 0.0F, 0.0F, 0.0F, 1.0F, 1.0F - zeroOffset, oneOffset }; } break; case Slope.ID_OBL_INT_POS_NE: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, zeroOffset, oneOffset, 1.0F, 1.0F }; case 2: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F - zeroOffset, 1.0F }; case 3: return new float[] { 0.0F, 0.0F, zeroOffset, 1.0F, oneOffset, 1.0F }; } break; case Slope.ID_OBL_INT_POS_SE: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F, 1.0F - zeroOffset }; case 2: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F - zeroOffset, 1.0F }; case 3: return new float[] { 0.0F, 0.0F, 0.0F, 1.0F, 1.0F - zeroOffset, oneOffset }; } break; case Slope.ID_OBL_EXT_NEG_NW: return new float[] { zeroPassOffset + zeroOffset * (1.0F - zeroPassOffset), 1.0F - onePassOffset, 1.0F - oneOffset * (1.0F - zeroPassOffset), 1.0F, 1.0F, 1.0F }; case Slope.ID_OBL_EXT_NEG_SW: return new float[] { zeroPassOffset + zeroOffset * (1.0F - zeroPassOffset), 1.0F - onePassOffset, 0.0F, 1.0F, 1.0F, oneOffset * (1.0F - zeroPassOffset) }; case Slope.ID_OBL_EXT_NEG_NE: return new float[] { 0.0F, 1.0F - onePassOffset, zeroPassOffset + zeroOffset * (1.0F - zeroPassOffset), oneOffset * (1.0F - zeroPassOffset), 1.0F, 1.0F }; case Slope.ID_OBL_EXT_NEG_SE: return new float[] { 0.0F, 1.0F - onePassOffset, 0.0F, oneOffset * (1.0F - zeroPassOffset), 1.0F, 1.0F - zeroPassOffset - zeroOffset * (1.0F - zeroPassOffset) }; case Slope.ID_OBL_INT_NEG_NW: switch (pass) { case 1: return new float[] { zeroOffset, 0.0F, 1.0F - oneOffset, 1.0F, 1.0F, 1.0F }; case 2: return new float[] { zeroOffset, 1.0F - oneOffset, 0.0F, 1.0F, 1.0F, 1.0F }; case 3: return new float[] { 0.0F, 1.0F - oneOffset, zeroOffset, 1.0F, 1.0F, 1.0F }; } break; case Slope.ID_OBL_INT_NEG_SW: switch (pass) { case 1: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, 1.0F, oneOffset }; case 2: return new float[] { zeroOffset, 1.0F - oneOffset, 0.0F, 1.0F, 1.0F, 1.0F }; case 3: return new float[] { 0.0F, zeroOffset, 0.0F, 1.0F, 1.0F, oneOffset }; } break; case Slope.ID_OBL_INT_NEG_NE: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, zeroOffset, oneOffset, 1.0F, 1.0F }; case 2: return new float[] { 0.0F, zeroOffset, 0.0F, oneOffset, 1.0F, 1.0F }; case 3: return new float[] { 0.0F, 1.0F - oneOffset, zeroOffset, 1.0F, 1.0F, 1.0F }; } break; case Slope.ID_OBL_INT_NEG_SE: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F, 1.0F - zeroOffset }; case 2: return new float[] { 0.0F, zeroOffset, 0.0F, oneOffset, 1.0F, 1.0F }; case 3: return new float[] { 0.0F, zeroOffset, 0.0F, 1.0F, 1.0F, oneOffset }; } break; case Slope.ID_PRISM_POS: return new float[] { zeroOffset * 0.5F, 0.0F, zeroOffset * 0.5F, 1.0F - zeroOffset * 0.5F, oneOffset * 0.5F, 1.0F - zeroOffset * 0.5F }; case Slope.ID_PRISM_NEG: return new float[] { zeroOffset * 0.5F, 1.0F - oneOffset * 0.5F, zeroOffset * 0.5F, 1.0F - zeroOffset * 0.5F, 1.0F, 1.0F - zeroOffset * 0.5F }; default: { boolean renderPrism = getNumPasses(slope) / precision < 2.0F; switch (slope.slopeID) { case Slope.ID_PRISM_WEDGE_POS_N: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, zeroOffset, 1.0F, oneOffset, 1.0F }; case 2: if (renderPrism) { return new float[] { zeroOffset * 0.5F, 0.0F, 0.0F, 1.0F - zeroOffset * 0.5F, oneOffset * 0.5F, 0.5F }; } } break; case Slope.ID_PRISM_WEDGE_POS_S: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, 0.0F, 1.0F, 1.0F - zeroOffset, oneOffset }; case 2: if (renderPrism) { return new float[] { zeroOffset * 0.5F, 0.0F, 0.5F, 1.0F - zeroOffset * 0.5F, oneOffset * 0.5F, 1.0F }; } } break; case Slope.ID_PRISM_WEDGE_POS_W: switch (pass) { case 1: return new float[] { zeroOffset, 0.0F, 0.0F, 1.0F, oneOffset, 1.0F }; case 2: if (renderPrism) { return new float[] { 0.0F, 0.0F, zeroOffset * 0.5F, 0.5F, oneOffset * 0.5F, 1.0F - zeroOffset * 0.5F }; } } break; case Slope.ID_PRISM_WEDGE_POS_E: switch (pass) { case 1: return new float[] { 0.0F, 0.0F, 0.0F, oneOffset, 1.0F - zeroOffset, 1.0F }; case 2: if (renderPrism) { return new float[] { 0.5F, 0.0F, zeroOffset * 0.5F, 1.0F, oneOffset * 0.5F, 1.0F - zeroOffset * 0.5F }; } } break; default: switch (pass) { case 1: if (!slope.equals(Slope.PRISM_4P_POS)) { return genBounds(Slope.PRISM_POS, slice, precision, pass); } else { return null; } case 2: if (slope.facings.contains(ForgeDirection.NORTH)) { return new float[] { zeroOffset * 0.5F, 0.0F, 0.0F, 1.0F - zeroOffset * 0.5F, oneOffset * 0.5F, 0.5F }; } break; case 3: if (slope.facings.contains(ForgeDirection.SOUTH)) { return new float[] { zeroOffset * 0.5F, 0.0F, 0.5F, 1.0F - zeroOffset * 0.5F, oneOffset * 0.5F, 1.0F }; } break; case 4: if (slope.facings.contains(ForgeDirection.WEST)) { return new float[] { 0.0F, 0.0F, zeroOffset * 0.5F, 0.5F, oneOffset * 0.5F, 1.0F - zeroOffset * 0.5F }; } break; case 5: if (slope.facings.contains(ForgeDirection.EAST)) { return new float[] { 0.5F, 0.0F, zeroOffset * 0.5F, 1.0F, oneOffset * 0.5F, 1.0F - zeroOffset * 0.5F }; } break; } } } } return null; } }