From 6350d7083545e2725be000a1bbcdbdce2b6cf816 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 5 Jul 2018 21:33:57 +0200 Subject: [PATCH] Use CubeBuilder system instead of QuadBuilder to allow for good UV rotations. --- .../refinedstorage/render/CubeBuilder.java | 111 ++++ .../refinedstorage/render/QuadBuilder.java | 518 ------------------ .../model/baked/BakedModelCableCover.java | 195 +++---- .../render/model/baked/BakedModelCover.java | 21 +- 4 files changed, 202 insertions(+), 643 deletions(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/render/CubeBuilder.java delete mode 100644 src/main/java/com/raoulvdberge/refinedstorage/render/QuadBuilder.java diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/CubeBuilder.java b/src/main/java/com/raoulvdberge/refinedstorage/render/CubeBuilder.java new file mode 100644 index 000000000..89284c3f3 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/CubeBuilder.java @@ -0,0 +1,111 @@ +package com.raoulvdberge.refinedstorage.render; + +import net.minecraft.client.renderer.block.model.*; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.EnumFacing; +import org.lwjgl.util.vector.Vector3f; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CubeBuilder { + private class CubeFace { + private TextureAtlasSprite sprite; + private float xFrom; + private float xTo; + private float yFrom; + private float yTo; + + CubeFace(TextureAtlasSprite sprite, float xFrom, float xTo, float yFrom, float yTo) { + this.sprite = sprite; + this.xFrom = xFrom; + this.xTo = xTo; + this.yFrom = yFrom; + this.yTo = yTo; + } + } + + private static final FaceBakery BAKERY = new FaceBakery(); + + private Vector3f from; + private Vector3f to; + private Map faces = new HashMap<>(); + private ModelRotation rotation = ModelRotation.X0_Y0; + private boolean uvLocked = true; + + public CubeBuilder from(float x, float y, float z) { + this.from = new Vector3f(x, y, z); + + return this; + } + + public CubeBuilder to(float x, float y, float z) { + this.to = new Vector3f(x, y, z); + + return this; + } + + public CubeBuilder face(EnumFacing face, float xFrom, float xTo, float yFrom, float yTo, TextureAtlasSprite sprite) { + faces.put(face, new CubeFace( + sprite, + xFrom, + xTo, + yFrom, + yTo + )); + + return this; + } + + public CubeBuilder allFaces(float xFrom, float xTo, float yFrom, float yTo, TextureAtlasSprite sprite) { + for (EnumFacing facing : EnumFacing.VALUES) { + face(facing, xFrom, xTo, yFrom, yTo, sprite); + } + + return this; + } + + public CubeBuilder rotate(ModelRotation rotation) { + this.rotation = rotation; + + return this; + } + + public List bake() { + List quads = new ArrayList<>(); + + for (Map.Entry entry : faces.entrySet()) { + EnumFacing face = entry.getKey(); + + CubeFace faceData = entry.getValue(); + + BlockFaceUV uv = new BlockFaceUV(new float[]{ + faceData.xFrom, faceData.yFrom, faceData.xTo, faceData.yTo + }, 0); + + BlockPartFace part = new BlockPartFace(face, -1, null, uv); + + quads.add(BAKERY.makeBakedQuad( + from, + to, + part, + faceData.sprite, + face, + rotation, + null, + uvLocked, + true + )); + } + + return quads; + } + + public CubeBuilder setUvLocked(boolean uvLocked) { + this.uvLocked = uvLocked; + + return this; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/QuadBuilder.java b/src/main/java/com/raoulvdberge/refinedstorage/render/QuadBuilder.java deleted file mode 100644 index f1e9b90ba..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/QuadBuilder.java +++ /dev/null @@ -1,518 +0,0 @@ -package com.raoulvdberge.refinedstorage.render; - -import com.google.common.collect.Maps; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.VertexFormat; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; -import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad; - -import javax.vecmath.Vector4f; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * @link https://github.com/ArekkuusuJerii/Solar - */ -public class QuadBuilder { - private final Map facingMap = Maps.newEnumMap(EnumFacing.class); - private final VertexFormat format; - private boolean hasBrightness; - private Vector3 from; - private Vector3 to; - private EnumFacing last; - - private QuadBuilder(VertexFormat format) { - this.format = format; - } - - public static QuadBuilder withFormat(VertexFormat format) { - return new QuadBuilder(format); - } - - public QuadBuilder setFrom(double x, double y, double z) { - this.from = Vector3.create(x, y, z); - return this; - } - - public QuadBuilder setTo(double x, double y, double z) { - this.to = Vector3.create(x, y, z); - return this; - } - - public QuadBuilder setHasBrightness(boolean hasBrightness) { - this.hasBrightness = hasBrightness; - return this; - } - - public QuadBuilder addAll(TextureAtlasSprite sprite) { - for (EnumFacing facing : EnumFacing.values()) { - addFace(facing, 0F, 16F, 0F, 16F, sprite); - } - return this; - } - - public QuadBuilder addAll(float uMin, float uMax, float vMin, float vMax, TextureAtlasSprite sprite) { - for (EnumFacing facing : EnumFacing.values()) { - addFace(facing, uMin, uMax, vMin, vMax, sprite); - } - return this; - } - - public QuadBuilder addFace(EnumFacing facing, float uMin, float uMax, float vMin, float vMax, TextureAtlasSprite sprite) { - QuadHolder holder = new QuadHolder(); - - holder.uv = new Vector4f(uMin, uMax, vMin, vMax); - - Vector3 a = Vector3.create(0, 0, 0); - Vector3 b = Vector3.create(0, 0, 0); - Vector3 c = Vector3.create(0, 0, 0); - Vector3 d = Vector3.create(0, 0, 0); - - holder.sprite = sprite; - - switch (facing) { - case DOWN: - a.x = to.x; - a.y = from.y; - a.z = from.z; - - b.x = to.x; - b.y = from.y; - b.z = to.z; - - c.x = from.x; - c.y = from.y; - c.z = to.z; - - d.x = from.x; - d.y = from.y; - d.z = from.z; - break; - case UP: - a.x = from.x; - a.y = to.y; - a.z = from.z; - - b.x = from.x; - b.y = to.y; - b.z = to.z; - - c.x = to.x; - c.y = to.y; - c.z = to.z; - - d.x = to.x; - d.y = to.y; - d.z = from.z; - break; - case NORTH: - a.x = to.x; - a.y = from.y; - a.z = to.z; - - b.x = to.x; - b.y = to.y; - b.z = to.z; - - c.x = from.x; - c.y = to.y; - c.z = to.z; - - d.x = from.x; - d.y = from.y; - d.z = to.z; - break; - case SOUTH: - a.x = from.x; - a.y = from.y; - a.z = from.z; - - b.x = from.x; - b.y = to.y; - b.z = from.z; - - c.x = to.x; - c.y = to.y; - c.z = from.z; - - d.x = to.x; - d.y = from.y; - d.z = from.z; - break; - case WEST: - a.x = from.x; - a.y = from.y; - a.z = to.z; - - b.x = from.x; - b.y = to.y; - b.z = to.z; - - c.x = from.x; - c.y = to.y; - c.z = from.z; - - d.x = from.x; - d.y = from.y; - d.z = from.z; - break; - case EAST: - a.x = to.x; - a.y = from.y; - a.z = from.z; - - b.x = to.x; - b.y = to.y; - b.z = from.z; - - c.x = to.x; - c.y = to.y; - c.z = to.z; - - d.x = to.x; - d.y = from.y; - d.z = to.z; - break; - } - - holder.a = a.divide(16D); - holder.b = b.divide(16D); - holder.c = c.divide(16D); - holder.d = d.divide(16D); - - facingMap.put(facing, holder); - last = facing; - - return this; - } - - public QuadBuilder mirror() { - if (facingMap.containsKey(last)) { - Stream stream = Arrays.stream(facingMap.get(last).getVectors()); - switch (last) { - case DOWN: - case UP: - stream.forEach(vec -> vec.subtract(0.5D).rotate(EnumFacing.Axis.Y, 180).add(0.5D)); - break; - case NORTH: - case SOUTH: - stream.forEach(vec -> vec.subtract(0.5D).rotate(EnumFacing.Axis.X, 180).add(0.5D)); - break; - case EAST: - case WEST: - stream.forEach(vec -> vec.subtract(0.5D).rotate(EnumFacing.Axis.Z, 180).add(0.5D)); - break; - } - } - - return this; - } - - public QuadBuilder clear() { - facingMap.clear(); - - return this; - } - - public QuadBuilder rotate(EnumFacing facing, EnumFacing... exclude) { - if (exclude == null || !Arrays.asList(exclude).contains(facing)) { - switch (facing) { - case DOWN: - rotate(EnumFacing.Axis.X, 180F); - break; - case UP: - rotate(EnumFacing.Axis.X, 180F); - break; - default: - rotate(EnumFacing.Axis.X, 90F); - rotate(EnumFacing.Axis.Y, -facing.getHorizontalAngle()); - rotate(EnumFacing.Axis.Y, -90F); - } - } - - return this; - } - - public QuadBuilder rotate(EnumFacing.Axis axis, float angle) { - facingMap.values().forEach(holder -> { - Arrays.stream(holder.getVectors()).forEach(vec -> { - vec.subtract(0.5D).rotate(axis, angle).add(0.5D); - }); - }); - - return this; - } - - public List bake() { - return facingMap.entrySet().stream().map(e -> createQuad(e.getValue(), e.getKey())).collect(Collectors.toList()); - } - - private BakedQuad createQuad(QuadHolder holder, EnumFacing facing) { - Vector4f uv = holder.uv; - - Vector3 a = holder.a; - Vector3 b = holder.b; - Vector3 c = holder.c; - Vector3 d = holder.d; - - Vector3 normal = c.copy().subtract(b).cross(a.copy().subtract(b)).normalize(); - - UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(format); - - putVertex(builder, normal, a.x, a.y, a.z, holder.sprite, uv.y, uv.w, hasBrightness); - putVertex(builder, normal, b.x, b.y, b.z, holder.sprite, uv.y, uv.z, hasBrightness); - putVertex(builder, normal, c.x, c.y, c.z, holder.sprite, uv.x, uv.z, hasBrightness); - putVertex(builder, normal, d.x, d.y, d.z, holder.sprite, uv.x, uv.w, hasBrightness); - - builder.setQuadOrientation(facing); - builder.setTexture(holder.sprite); - - return builder.build(); - } - - private void putVertex(UnpackedBakedQuad.Builder builder, Vector3 normal, double x, double y, double z, TextureAtlasSprite sprite, float u, float v, boolean hasBrightness) { - for (int e = 0; e < format.getElementCount(); e++) { - switch (format.getElement(e).getUsage()) { - case POSITION: - builder.put(e, (float) x, (float) y, (float) z, 1F); - break; - case COLOR: - builder.put(e, 1F, 1F, 1F, 1F); - break; - case UV: - if (format.getElement(e).getIndex() == 1) { - if (hasBrightness) { - builder.put(e, 1F, 1F); - } else { - builder.put(e, 0F, 0F); - } - break; - } else if (format.getElement(e).getIndex() == 0) { - u = sprite.getInterpolatedU(u); - v = sprite.getInterpolatedV(v); - builder.put(e, u, v, 0F, 1F); - break; - } - case NORMAL: - if (hasBrightness) { - builder.put(e, 0F, 1F, 0F); - } else { - builder.put(e, (float) normal.x, (float) normal.y, (float) normal.z); - } - break; - default: - builder.put(e); - break; - } - } - } - - private class QuadHolder { - private TextureAtlasSprite sprite; - - private Vector3 a; - private Vector3 b; - private Vector3 c; - private Vector3 d; - - private Vector4f uv; - - public Vector3[] getVectors() { - return new Vector3[]{a, b, c, d}; - } - } - - private static class Vector3 { - private double x; - private double y; - private double z; - - public static Vector3 create(double x, double y, double z) { - return new Vector3(x, y, z); - } - - public static Vector3 create(Vec3d vec) { - return new Vector3(vec.x, vec.y, vec.z); - } - - private Vector3(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - } - - public Vector3 setVec(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - - return this; - } - - public Vector3 subtract(Vector3 vec) { - return subtract(vec.x, vec.y, vec.z); - } - - public Vector3 subtract(Vec3d vec) { - return subtract(vec.x, vec.y, vec.z); - } - - public Vector3 subtract(Vec3i vec) { - return subtract(vec.getX(), vec.getY(), vec.getZ()); - } - - public Vector3 subtract(double amount) { - return subtract(amount, amount, amount); - } - - public Vector3 subtract(double x, double y, double z) { - return add(-x, -y, -z); - } - - public Vector3 add(Vector3 vec) { - return add(vec.x, vec.y, vec.z); - } - - public Vector3 add(Vec3d vec) { - return add(vec.x, vec.y, vec.z); - } - - public Vector3 add(Vec3i vec) { - return add(vec.getX(), vec.getY(), vec.getZ()); - } - - public Vector3 add(double amount) { - return add(amount, amount, amount); - } - - public Vector3 add(double x, double y, double z) { - return setVec(this.x + x, this.y + y, this.z + z); - } - - public Vector3 multiply(Vector3 vec) { - return multiply(vec.x, vec.y, vec.z); - } - - public Vector3 multiply(double m) { - return multiply(m, m, m); - } - - public Vector3 multiply(double x, double y, double z) { - return setVec(this.x * x, this.y * y, this.z * z); - } - - public Vector3 divide(Vector3 vec) { - return divide(vec.x, vec.y, vec.z); - } - - public Vector3 divide(double m) { - return divide(m, m, m); - } - - public Vector3 divide(double x, double y, double z) { - return setVec(this.x / x, this.y / y, this.z / z); - } - - public Vector3 rotate(EnumFacing.Axis axis, float degrees) { - float radians = degrees * (float) (Math.PI / 180D); - switch (axis) { - case X: - rotatePitchX(radians); - break; - case Y: - rotateYaw(radians); - break; - case Z: - rotatePitchZ(radians); - break; - } - - return this; - } - - public Vector3 rotateYaw(float radians) { - float cos = MathHelper.cos(radians); - float sin = MathHelper.sin(radians); - double x = this.x * cos + this.z * sin; - double z = this.z * cos - this.x * sin; - return setVec(x, y, z); - } - - public Vector3 rotatePitchZ(float radians) { - float cos = MathHelper.cos(radians); - float sin = MathHelper.sin(radians); - double y = this.y * cos + this.z * sin; - double z = this.z * cos - this.y * sin; - return setVec(x, y, z); - } - - public Vector3 rotatePitchX(float radians) { - float cos = MathHelper.cos(radians); - float sin = MathHelper.sin(radians); - double y = this.y * cos + this.x * sin; - double x = this.x * cos - this.y * sin; - return setVec(x, y, z); - } - - public Vector3 rotate(Rotation rotation) { - switch (rotation) { - case NONE: - default: - return this; - case CLOCKWISE_90: - return setVec(-z, y, x); - case CLOCKWISE_180: - return setVec(-x, y, -z); - case COUNTERCLOCKWISE_90: - return setVec(z, y, -x); - } - } - - public Vector3 offset(EnumFacing facing, float amount) { - return setVec(x + facing.getFrontOffsetX() * amount, y + facing.getFrontOffsetY() * amount, z + facing.getFrontOffsetZ() * amount); - } - - public Vector3 normalize() { - double root = MathHelper.sqrt(x * x + y * y + z * z); - - return root < 1.0E-4D ? setVec(0, 0, 0) : setVec(x / root, y / root, z / root); - } - - public Vector3 cross(Vector3 vec) { - double x = this.y * vec.z - this.z * vec.y; - double y = this.z * vec.x - this.x * vec.z; - double z = this.x * vec.y - this.y * vec.x; - - return setVec(x, y, z); - } - - public double distanceTo(Vector3 vec) { - double xDiff = x - vec.x; - double yDiff = y - vec.y; - double zDiff = z - vec.z; - - return MathHelper.sqrt(xDiff * xDiff + yDiff * yDiff + zDiff * zDiff); - } - - public Vector3 limit(double max) { - double x = this.x > max ? max : this.x < -max ? -max : this.x; - double y = this.y > max ? max : this.y < -max ? -max : this.y; - double z = this.z > max ? max : this.z < -max ? -max : this.z; - - return setVec(x, y, z); - } - - public Vector3 copy() { - return new Vector3(x, y, z); - } - } -} - diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/BakedModelCableCover.java b/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/BakedModelCableCover.java index c230b2155..e4c79347c 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/BakedModelCableCover.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/BakedModelCableCover.java @@ -3,15 +3,11 @@ package com.raoulvdberge.refinedstorage.render.model.baked; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager; import com.raoulvdberge.refinedstorage.block.BlockCable; -import com.raoulvdberge.refinedstorage.render.QuadBuilder; +import com.raoulvdberge.refinedstorage.render.CubeBuilder; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ItemCameraTransforms; -import net.minecraft.client.renderer.block.model.ItemOverrideList; +import net.minecraft.client.renderer.block.model.*; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; @@ -27,7 +23,7 @@ import java.util.List; public class BakedModelCableCover implements IBakedModel { private IBakedModel base; - private TextureAtlasSprite genericGreyTexture; + private TextureAtlasSprite greySprite; public BakedModelCableCover(IBakedModel base) { this.base = base; @@ -72,127 +68,98 @@ public class BakedModelCableCover implements IBakedModel { boolean hasEast = CoverManager.getBlockState(state.getValue(BlockCable.COVER_EAST)) != null; boolean hasWest = CoverManager.getBlockState(state.getValue(BlockCable.COVER_WEST)) != null; - float handleAngle = 0; - EnumFacing.Axis handleAxis = EnumFacing.Axis.Y; + ModelRotation modelRotation = ModelRotation.X0_Y0; + + int xStart = 0; + int xEnd = 16; + int xTexStart = 0; + int xTexEnd = 16; + + int yStart = 0; + int yEnd = 16; + int yTexStart = 0; + int yTexEnd = 16; if (coverSide == EnumFacing.NORTH) { - quads.addAll(QuadBuilder.withFormat(DefaultVertexFormats.ITEM) - .setFrom(hasWest ? 2 : 0, hasDown ? 2 : 0, 0) - .setTo(hasEast ? 14 : 16, hasUp ? 14 : 16, 2) + if (hasWest) { + xStart = 2; + xTexEnd = 14; + } - .addFace(EnumFacing.UP, 16, 0, 2, 0, sprite) - .addFace(EnumFacing.DOWN, 0, 16, 14, 16, sprite) - .addFace(EnumFacing.EAST, 14, 16, 0, 16, sprite) - .addFace(EnumFacing.WEST, 0, 2, 0, 16, sprite) - - .addFace(EnumFacing.NORTH, hasEast ? 2 : 0, hasWest ? 14 : 16, hasUp ? 2 : 0, hasDown ? 14 : 16, sprite) - .addFace(EnumFacing.SOUTH, hasEast ? 2 : 0, hasWest ? 14 : 16, hasUp ? 2 : 0, hasDown ? 14 : 16, sprite) - - .bake() - ); + if (hasEast) { + xEnd = 14; + xTexStart = 2; + } } else if (coverSide == EnumFacing.SOUTH) { - handleAngle = 180; + modelRotation = ModelRotation.X0_Y180; - quads.addAll(QuadBuilder.withFormat(DefaultVertexFormats.ITEM) - .setFrom(hasEast ? 14 : 16, hasDown ? 2 : 0, 16) - .setTo(hasWest ? 2 : 0, hasUp ? 14 : 16, 14) + if (hasWest) { + xStart = 2; + xTexStart = 2; + } - .addFace(EnumFacing.UP, 0, 16, 14, 16, sprite) - .addFace(EnumFacing.DOWN, 16, 0, 2, 0, sprite) - .addFace(EnumFacing.EAST, 14, 16, 0, 16, sprite) - .addFace(EnumFacing.WEST, 0, 2, 0, 16, sprite) - - .addFace(EnumFacing.NORTH, hasWest ? 2 : 0, hasEast ? 14 : 16, hasUp ? 2 : 0, hasDown ? 14 : 16, sprite) - .addFace(EnumFacing.SOUTH, hasWest ? 2 : 0, hasEast ? 14 : 16, hasUp ? 2 : 0, hasDown ? 14 : 16, sprite) - - .bake() - ); + if (hasEast) { + xEnd = 14; + xTexEnd = 14; + } } else if (coverSide == EnumFacing.EAST) { - handleAngle = 270; - - quads.addAll(QuadBuilder.withFormat(DefaultVertexFormats.ITEM) - .setFrom(14, hasDown ? 2 : 0, 0) - .setTo(16, hasUp ? 14 : 16, 16) - - .addFace(EnumFacing.UP, 16, 14, 16, 0, sprite) - .addFace(EnumFacing.DOWN, 14, 16, 0, 16, sprite) - .addFace(EnumFacing.NORTH, 14, 16, 0, 16, sprite) - .addFace(EnumFacing.SOUTH, 0, 2, 0, 16, sprite) - - .addFace(EnumFacing.EAST, 0, 16, hasUp ? 2 : 0, hasDown ? 14 : 16, sprite) - .addFace(EnumFacing.WEST, 0, 16, hasUp ? 2 : 0, hasDown ? 14 : 16, sprite) - - .bake() - ); + modelRotation = ModelRotation.X0_Y90; } else if (coverSide == EnumFacing.WEST) { - handleAngle = 90; - - quads.addAll(QuadBuilder.withFormat(DefaultVertexFormats.ITEM) - .setFrom(0, hasDown ? 2 : 0, 0) - .setTo(2, hasUp ? 14 : 16, 16) - - .addFace(EnumFacing.UP, 2, 0, 16, 0, sprite) - .addFace(EnumFacing.DOWN, 0, 2, 0, 16, sprite) - .addFace(EnumFacing.NORTH, 0, 2, 0, 16, sprite) - .addFace(EnumFacing.SOUTH, 14, 16, 0, 16, sprite) - - .addFace(EnumFacing.EAST, 0, 16, hasUp ? 2 : 0, hasDown ? 14 : 16, sprite) - .addFace(EnumFacing.WEST, 0, 16, hasUp ? 2 : 0, hasDown ? 14 : 16, sprite) - - .bake() - ); + modelRotation = ModelRotation.X0_Y270; } else if (coverSide == EnumFacing.DOWN) { - handleAxis = EnumFacing.Axis.Z; - handleAngle = 90; - - quads.addAll(QuadBuilder.withFormat(DefaultVertexFormats.ITEM) - .setFrom(0, 0, 0) - .setTo(16, 2, 16) - - .addFace(EnumFacing.NORTH, 0, 16, 14, 16, sprite) - .addFace(EnumFacing.SOUTH, 0, 16, 14, 16, sprite) - .addFace(EnumFacing.EAST, 0, 16, 14, 16, sprite) - .addFace(EnumFacing.WEST, 0, 16, 14, 16, sprite) - - .addFace(EnumFacing.UP, 16, 0, 16, 0, sprite) - .addFace(EnumFacing.DOWN, 0, 16, 0, 16, sprite) - - .bake() - ); + modelRotation = ModelRotation.X90_Y0; } else if (coverSide == EnumFacing.UP) { - handleAxis = EnumFacing.Axis.Z; - handleAngle = 270; - - quads.addAll(QuadBuilder.withFormat(DefaultVertexFormats.ITEM) - .setFrom(0, 14, 0) - .setTo(16, 16, 16) - - .addFace(EnumFacing.NORTH, 0, 16, 0, 2, sprite) - .addFace(EnumFacing.SOUTH, 0, 16, 0, 2, sprite) - .addFace(EnumFacing.EAST, 0, 16, 0, 2, sprite) - .addFace(EnumFacing.WEST, 0, 16, 0, 2, sprite) - - .addFace(EnumFacing.UP, 16, 0, 16, 0, sprite) - .addFace(EnumFacing.DOWN, 0, 16, 0, 16, sprite) - - .bake() - ); + modelRotation = ModelRotation.X270_Y0; } - if (this.genericGreyTexture == null) { - this.genericGreyTexture = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(RS.ID + ":blocks/generic_grey"); + if (coverSide.getAxis() == EnumFacing.Axis.X || coverSide.getAxis() == EnumFacing.Axis.Z) { + if (hasDown) { + yStart = 2; + yTexEnd = 14; + } + + if (hasUp) { + yEnd = 14; + yTexStart = 2; + } } - quads.addAll(QuadBuilder.withFormat(DefaultVertexFormats.ITEM) - .setFrom(7, 7, 2) - .setTo(9, 9, 6) - .addFace(EnumFacing.NORTH, 0, 0, 4, 4, genericGreyTexture) - .addFace(EnumFacing.EAST, 0, 0, 2, 4, genericGreyTexture) - .addFace(EnumFacing.SOUTH, 0, 0, 4, 4, genericGreyTexture) - .addFace(EnumFacing.WEST, 0, 0, 2, 4, genericGreyTexture) - .addFace(EnumFacing.UP, 0, 0, 4, 2, genericGreyTexture) - .addFace(EnumFacing.DOWN, 0, 0, 4, 2, genericGreyTexture) - .rotate(handleAxis, handleAngle) + quads.addAll(new CubeBuilder() + .from(xStart, yStart, 0) + .to(xEnd, yEnd, 2) + + .face(EnumFacing.NORTH, xTexStart, xTexEnd, yTexStart, yTexEnd, sprite) + .face(EnumFacing.SOUTH, xTexStart, xTexEnd, yTexStart, yTexEnd, sprite) + + .face(EnumFacing.UP, 0, 16, 0, 2, sprite) + .face(EnumFacing.DOWN, 0, 16, 14, 16, sprite) + .face(EnumFacing.EAST, 14, 16, 0, 16, sprite) + .face(EnumFacing.WEST, 0, 2, 0, 16, sprite) + + .rotate(modelRotation) + + .bake() + ); + + if (this.greySprite == null) { + this.greySprite = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(RS.ID + ":blocks/generic_grey"); + } + + quads.addAll(new CubeBuilder() + .from(7, 7, 2) + .to(9, 9, 6) + + .face(EnumFacing.NORTH, 0, 0, 4, 4, greySprite) + .face(EnumFacing.EAST, 0, 0, 2, 4, greySprite) + .face(EnumFacing.SOUTH, 0, 0, 4, 4, greySprite) + .face(EnumFacing.WEST, 0, 0, 2, 4, greySprite) + .face(EnumFacing.UP, 0, 0, 4, 2, greySprite) + .face(EnumFacing.DOWN, 0, 0, 4, 2, greySprite) + + .rotate(modelRotation) + + .setUvLocked(false) + .bake() ); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/BakedModelCover.java b/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/BakedModelCover.java index 2223bf2f7..8f57e83cd 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/BakedModelCover.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/BakedModelCover.java @@ -5,7 +5,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager; import com.raoulvdberge.refinedstorage.item.ItemCover; -import com.raoulvdberge.refinedstorage.render.QuadBuilder; +import com.raoulvdberge.refinedstorage.render.CubeBuilder; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -13,7 +13,6 @@ import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.block.model.ItemOverrideList; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; @@ -84,17 +83,17 @@ public class BakedModelCover implements IBakedModel { } } - quads.addAll(QuadBuilder.withFormat(DefaultVertexFormats.ITEM) - .setFrom(0, 0, 0) - .setTo(16, 16, 2) + quads.addAll(new CubeBuilder() + .from(0, 0, 0) + .to(16, 16, 2) - .addFace(EnumFacing.UP, 16, 0, 2, 0, sprite) - .addFace(EnumFacing.DOWN, 0, 16, 14, 16, sprite) - .addFace(EnumFacing.EAST, 14, 16, 0, 16, sprite) - .addFace(EnumFacing.WEST, 0, 2, 0, 16, sprite) + .face(EnumFacing.NORTH, 0, 16, 0, 16, sprite) + .face(EnumFacing.SOUTH, 0, 16, 0, 16, sprite) - .addFace(EnumFacing.NORTH, 0, 16, 0, 16, sprite) - .addFace(EnumFacing.SOUTH, 0, 16, 0, 16, sprite) + .face(EnumFacing.UP, 0, 16, 0, 2, sprite) + .face(EnumFacing.DOWN, 0, 16, 14, 16, sprite) + .face(EnumFacing.EAST, 14, 16, 0, 16, sprite) + .face(EnumFacing.WEST, 0, 2, 0, 16, sprite) .bake() );