mirror of
http://git.eaglercraft.rip/eaglercraft/eaglercraft-1.8.git
synced 2025-04-30 02:01:59 -05:00
174 lines
6.6 KiB
Java
174 lines
6.6 KiB
Java
package net.optifine.model;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
|
|
import net.lax1dude.eaglercraft.v1_8.vector.Vector3f;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
|
import net.minecraft.client.renderer.block.model.BlockFaceUV;
|
|
import net.minecraft.client.renderer.block.model.BlockPartFace;
|
|
import net.minecraft.client.renderer.block.model.BlockPartRotation;
|
|
import net.minecraft.client.renderer.block.model.BreakingFour;
|
|
import net.minecraft.client.renderer.block.model.FaceBakery;
|
|
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
|
|
import net.minecraft.client.renderer.texture.TextureMap;
|
|
import net.minecraft.client.resources.model.IBakedModel;
|
|
import net.minecraft.client.resources.model.ModelManager;
|
|
import net.minecraft.client.resources.model.ModelResourceLocation;
|
|
import net.minecraft.client.resources.model.ModelRotation;
|
|
import net.minecraft.client.resources.model.SimpleBakedModel;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.BlockPos;
|
|
import net.minecraft.util.EnumFacing;
|
|
|
|
public class BlockModelUtils {
|
|
private static final float VERTEX_COORD_ACCURACY = 1.0E-6F;
|
|
|
|
public static IBakedModel makeModelCube(String spriteName, int tintIndex) {
|
|
EaglerTextureAtlasSprite textureatlassprite = Minecraft.getMinecraft().getTextureMapBlocks()
|
|
.getAtlasSprite(spriteName);
|
|
return makeModelCube(textureatlassprite, tintIndex);
|
|
}
|
|
|
|
public static IBakedModel makeModelCube(EaglerTextureAtlasSprite sprite, int tintIndex) {
|
|
List list = new ArrayList();
|
|
EnumFacing[] aenumfacing = EnumFacing._VALUES;
|
|
List<List<BakedQuad>> list1 = new ArrayList();
|
|
|
|
for (int i = 0; i < aenumfacing.length; ++i) {
|
|
EnumFacing enumfacing = aenumfacing[i];
|
|
List list2 = new ArrayList();
|
|
list2.add(makeBakedQuad(enumfacing, sprite, tintIndex));
|
|
list1.add(list2);
|
|
}
|
|
|
|
IBakedModel ibakedmodel = new SimpleBakedModel(list, list1, true, true, sprite, ItemCameraTransforms.DEFAULT);
|
|
return ibakedmodel;
|
|
}
|
|
|
|
public static IBakedModel joinModelsCube(IBakedModel modelBase, IBakedModel modelAdd) {
|
|
List<BakedQuad> list = new ArrayList();
|
|
list.addAll(modelBase.getGeneralQuads());
|
|
list.addAll(modelAdd.getGeneralQuads());
|
|
EnumFacing[] aenumfacing = EnumFacing._VALUES;
|
|
List list1 = new ArrayList();
|
|
|
|
for (int i = 0; i < aenumfacing.length; ++i) {
|
|
EnumFacing enumfacing = aenumfacing[i];
|
|
List list2 = new ArrayList();
|
|
list2.addAll(modelBase.getFaceQuads(enumfacing));
|
|
list2.addAll(modelAdd.getFaceQuads(enumfacing));
|
|
list1.add(list2);
|
|
}
|
|
|
|
boolean flag = modelBase.isAmbientOcclusion();
|
|
boolean flag1 = modelBase.isBuiltInRenderer();
|
|
EaglerTextureAtlasSprite textureatlassprite = modelBase.getParticleTexture();
|
|
ItemCameraTransforms itemcameratransforms = modelBase.getItemCameraTransforms();
|
|
IBakedModel ibakedmodel = new SimpleBakedModel(list, list1, flag, flag1, textureatlassprite,
|
|
itemcameratransforms);
|
|
return ibakedmodel;
|
|
}
|
|
|
|
public static BakedQuad makeBakedQuad(EnumFacing facing, EaglerTextureAtlasSprite sprite, int tintIndex) {
|
|
Vector3f vector3f = new Vector3f(0.0F, 0.0F, 0.0F);
|
|
Vector3f vector3f1 = new Vector3f(16.0F, 16.0F, 16.0F);
|
|
BlockFaceUV blockfaceuv = new BlockFaceUV(new float[] { 0.0F, 0.0F, 16.0F, 16.0F }, 0);
|
|
BlockPartFace blockpartface = new BlockPartFace(facing, tintIndex, "#" + facing.getName(), blockfaceuv);
|
|
ModelRotation modelrotation = ModelRotation.X0_Y0;
|
|
BlockPartRotation blockpartrotation = null;
|
|
boolean flag = false;
|
|
boolean flag1 = true;
|
|
FaceBakery facebakery = new FaceBakery();
|
|
BakedQuad bakedquad = facebakery.makeBakedQuad(vector3f, vector3f1, blockpartface, sprite, facing,
|
|
modelrotation, blockpartrotation, flag, flag1);
|
|
return bakedquad;
|
|
}
|
|
|
|
public static IBakedModel makeModel(String modelName, String spriteOldName, String spriteNewName) {
|
|
TextureMap texturemap = Minecraft.getMinecraft().getTextureMapBlocks();
|
|
EaglerTextureAtlasSprite textureatlassprite = texturemap.getAtlasSprite(spriteOldName); // getSpriteSafe
|
|
EaglerTextureAtlasSprite textureatlassprite1 = texturemap.getAtlasSprite(spriteNewName);
|
|
return makeModel(modelName, textureatlassprite, textureatlassprite1);
|
|
}
|
|
|
|
public static IBakedModel makeModel(String modelName, EaglerTextureAtlasSprite spriteOld,
|
|
EaglerTextureAtlasSprite spriteNew) {
|
|
if (spriteOld != null && spriteNew != null) {
|
|
ModelManager modelmanager = Minecraft.getMinecraft().getModelManager();
|
|
|
|
if (modelmanager == null) {
|
|
return null;
|
|
} else {
|
|
ModelResourceLocation modelresourcelocation = new ModelResourceLocation(modelName, "normal");
|
|
IBakedModel ibakedmodel = modelmanager.getModel(modelresourcelocation);
|
|
|
|
if (ibakedmodel != null && ibakedmodel != modelmanager.getMissingModel()) {
|
|
IBakedModel ibakedmodel1 = ModelUtils.duplicateModel(ibakedmodel);
|
|
EnumFacing[] aenumfacing = EnumFacing._VALUES;
|
|
|
|
for (int i = 0; i < aenumfacing.length; ++i) {
|
|
EnumFacing enumfacing = aenumfacing[i];
|
|
List<BakedQuad> list = ibakedmodel1.getFaceQuads(enumfacing);
|
|
replaceTexture(list, spriteOld, spriteNew);
|
|
}
|
|
|
|
List<BakedQuad> list1 = ibakedmodel1.getGeneralQuads();
|
|
replaceTexture(list1, spriteOld, spriteNew);
|
|
return ibakedmodel1;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static void replaceTexture(List<BakedQuad> quads, EaglerTextureAtlasSprite spriteOld,
|
|
EaglerTextureAtlasSprite spriteNew) {
|
|
List<BakedQuad> list = new ArrayList();
|
|
|
|
for (BakedQuad bakedquad : quads) {
|
|
if (bakedquad.getSprite() == spriteOld) {
|
|
bakedquad = new BreakingFour(bakedquad, spriteNew);
|
|
}
|
|
|
|
list.add(bakedquad);
|
|
}
|
|
|
|
quads.clear();
|
|
quads.addAll(list);
|
|
}
|
|
|
|
public static void snapVertexPosition(Vector3f pos) {
|
|
pos.setX(snapVertexCoord(pos.getX()));
|
|
pos.setY(snapVertexCoord(pos.getY()));
|
|
pos.setZ(snapVertexCoord(pos.getZ()));
|
|
}
|
|
|
|
private static float snapVertexCoord(float x) {
|
|
return x > -1.0E-6F && x < 1.0E-6F ? 0.0F : (x > 0.999999F && x < 1.000001F ? 1.0F : x);
|
|
}
|
|
|
|
public static AxisAlignedBB getOffsetBoundingBox(AxisAlignedBB aabb, Block.EnumOffsetType offsetType,
|
|
BlockPos pos) {
|
|
int i = pos.getX();
|
|
int j = pos.getZ();
|
|
long k = (long) (i * 3129871) ^ (long) j * 116129781L;
|
|
k = k * k * 42317861L + k * 11L;
|
|
double d0 = ((double) ((float) (k >> 16 & 15L) / 15.0F) - 0.5D) * 0.5D;
|
|
double d1 = ((double) ((float) (k >> 24 & 15L) / 15.0F) - 0.5D) * 0.5D;
|
|
double d2 = 0.0D;
|
|
|
|
if (offsetType == Block.EnumOffsetType.XYZ) {
|
|
d2 = ((double) ((float) (k >> 20 & 15L) / 15.0F) - 1.0D) * 0.2D;
|
|
}
|
|
|
|
return aabb.offset(d0, d2, d1);
|
|
}
|
|
}
|