package net.slimevoid.library.render; import com.google.common.primitives.Ints; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.IBakedModel; import net.minecraft.init.Blocks; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.Vec3; import net.minecraftforge.client.model.ISmartBlockModel; import net.minecraftforge.client.model.ISmartItemModel; import net.minecraftforge.fml.client.FMLClientHandler; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; /** * Used as a base to create and register custom Smart Models * <p/> * Currently used for Camo */ public abstract class SmartModelSlimevoid implements ISmartBlockModel, ISmartItemModel { @Override public List getFaceQuads(EnumFacing facing) { return getSidedQuads(facing); } protected int[] vertexToInts(float x, float y, float z, int color, int u, int v) { return new int[]{ Float.floatToRawIntBits(x), Float.floatToRawIntBits(y), Float.floatToRawIntBits(z), color, u, v, 0 }; } protected IBakedModel getDefaultModel() { return FMLClientHandler.instance().getClient().getBlockRendererDispatcher() .getModelFromBlockState(Blocks.command_block.getDefaultState(), FMLClientHandler.instance().getClient().theWorld, new BlockPos(0, 0, 0)); } /** * Example @link {getDefaultModel()} * * @return an IBakedModel */ protected abstract IBakedModel getModel(); protected List getSidedQuads(EnumFacing face) { IBakedModel defaultModel = this.getModel(); if (defaultModel == null) return new ArrayList(); List listQuadsIn = defaultModel.getFaceQuads(face); Integer[] UVs = new Integer[8]; for (Iterator iterator = listQuadsIn.iterator(); iterator.hasNext(); ) { BakedQuad bakedquad = (BakedQuad) iterator.next(); for (int i = 0; i < 4; ++i) { UVs[(i * 2)] = bakedquad.getVertexData()[(i * 7) + 4]; UVs[(i * 2) + 1] = bakedquad.getVertexData()[(i * 7) + 5]; } } List<BakedQuad> ret = this.getBakedQuads(UVs, face); return ret; } protected List<BakedQuad> getDefaultBakedQuads(Integer[] UVs, EnumFacing face) { List<BakedQuad> ret = new ArrayList<BakedQuad>(); Vec3 v1 = rotate(new Vec3(-.5, .5, -.5), face).addVector(.5, .5, .5); Vec3 v2 = rotate(new Vec3(-.5, .5, .5), face).addVector(.5, .5, .5); Vec3 v3 = rotate(new Vec3(.5, .5, .5), face).addVector(.5, .5, .5); Vec3 v4 = rotate(new Vec3(.5, .5, -.5), face).addVector(.5, .5, .5); ret.add(new BakedQuad(Ints.concat( vertexToInts((float) v1.xCoord, (float) v1.yCoord, (float) v1.zCoord, -1, UVs[0], UVs[1]), vertexToInts((float) v2.xCoord, (float) v2.yCoord, (float) v2.zCoord, -1, UVs[2], UVs[3]), vertexToInts((float) v3.xCoord, (float) v3.yCoord, (float) v3.zCoord, -1, UVs[4], UVs[5]), vertexToInts((float) v4.xCoord, (float) v4.yCoord, (float) v4.zCoord, -1, UVs[6], UVs[7]) ), -1, face)); return ret; } /** * Example @link {getDefaultBakedQuads()} * * @param uVs * @param face * @return a list of baked quads */ protected abstract List<BakedQuad> getBakedQuads(Integer[] uVs, EnumFacing face); @Override public List getGeneralQuads() { return Collections.emptyList(); } @Override public boolean isGui3d() { return true; } @Override public boolean isAmbientOcclusion() { return true; } @Override public boolean isBuiltInRenderer() { return false; } @Override public TextureAtlasSprite getTexture() { return null; } @Override public ItemCameraTransforms getItemCameraTransforms() { return ItemCameraTransforms.DEFAULT; } private static Vec3 rotate(Vec3 vec, EnumFacing side) { switch (side) { case DOWN: return new Vec3(vec.xCoord, -vec.yCoord, -vec.zCoord); case UP: return new Vec3(vec.xCoord, vec.yCoord, vec.zCoord); case NORTH: return new Vec3(vec.xCoord, vec.zCoord, -vec.yCoord); case SOUTH: return new Vec3(vec.xCoord, -vec.zCoord, vec.yCoord); case WEST: return new Vec3(-vec.yCoord, vec.xCoord, vec.zCoord); case EAST: return new Vec3(vec.yCoord, -vec.xCoord, vec.zCoord); } return null; } }