From 1801302d8fc412a818c487b3d8f782c85dccb992 Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 3 Aug 2020 14:46:23 +0200 Subject: [PATCH] Fix SkyStone chest model issues that I had introduced back in 1.8. (#4542) This makes the chest 1 pixel higher to restore the look it had in 1.7. Since the skystone chest's texture is a grungy mess, only the most obvious texture problems were fixed, while for the skystone block chest, the look should be close to what it was now. Also introduces caching for the skystone chest's block shape. --- .../appeng/block/storage/SkyChestBlock.java | 49 +++++---- .../client/render/tesr/SkyChestTESR.java | 4 +- .../models/item/sky_stone_chest.json | 97 +++++++----------- .../textures/models/skyblockchest.png | Bin 4734 -> 2172 bytes .../textures/models/skychest.png | Bin 2431 -> 2773 bytes 5 files changed, 67 insertions(+), 83 deletions(-) diff --git a/src/main/java/appeng/block/storage/SkyChestBlock.java b/src/main/java/appeng/block/storage/SkyChestBlock.java index 7c3d1ebab..4a0bdf94a 100644 --- a/src/main/java/appeng/block/storage/SkyChestBlock.java +++ b/src/main/java/appeng/block/storage/SkyChestBlock.java @@ -18,6 +18,9 @@ package appeng.block.storage; +import java.util.EnumMap; +import java.util.Map; + import javax.annotation.Nullable; import net.minecraft.block.BlockRenderType; @@ -47,7 +50,18 @@ public class SkyChestBlock extends AEBaseTileBlock { private static final double AABB_OFFSET_BOTTOM = 0.00; private static final double AABB_OFFSET_SIDES = 0.06; - private static final double AABB_OFFSET_TOP = 0.125; + private static final double AABB_OFFSET_TOP = 0.0625; + + // Precomputed bounding boxes of the chest, sorted into the map by the UP + // direction + private static final Map SHAPES = new EnumMap<>(Direction.class); + + static { + for (Direction up : Direction.values()) { + AxisAlignedBB aabb = computeAABB(up); + SHAPES.put(up, VoxelShapes.create(aabb)); + } + } public enum SkyChestType { STONE, BLOCK @@ -87,37 +101,30 @@ public class SkyChestBlock extends AEBaseTileBlock { @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - // TODO Cache this! It can't be that hard! - AxisAlignedBB aabb = computeAABB(worldIn, pos); - return VoxelShapes.create(aabb); + final SkyChestTileEntity sk = this.getTileEntity(worldIn, pos); + Direction up = sk != null ? sk.getUp() : Direction.UP; + return SHAPES.get(up); } - private AxisAlignedBB computeAABB(final IBlockReader w, final BlockPos pos) { - final SkyChestTileEntity sk = this.getTileEntity(w, pos); - Direction o = Direction.UP; - - if (sk != null) { - o = sk.getUp(); - } - - final double offsetX = o.getXOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; - final double offsetY = o.getYOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; - final double offsetZ = o.getZOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; + private static AxisAlignedBB computeAABB(Direction up) { + final double offsetX = up.getXOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; + final double offsetY = up.getYOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; + final double offsetZ = up.getZOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; // for x/z top and bottom is swapped final double minX = Math.max(0.0, - offsetX + (o.getXOffset() < 0 ? AABB_OFFSET_BOTTOM : (o.getXOffset() * AABB_OFFSET_TOP))); + offsetX + (up.getXOffset() < 0 ? AABB_OFFSET_BOTTOM : (up.getXOffset() * AABB_OFFSET_TOP))); final double minY = Math.max(0.0, - offsetY + (o.getYOffset() < 0 ? AABB_OFFSET_TOP : (o.getYOffset() * AABB_OFFSET_BOTTOM))); + offsetY + (up.getYOffset() < 0 ? AABB_OFFSET_TOP : (up.getYOffset() * AABB_OFFSET_BOTTOM))); final double minZ = Math.max(0.0, - offsetZ + (o.getZOffset() < 0 ? AABB_OFFSET_BOTTOM : (o.getZOffset() * AABB_OFFSET_TOP))); + offsetZ + (up.getZOffset() < 0 ? AABB_OFFSET_BOTTOM : (up.getZOffset() * AABB_OFFSET_TOP))); final double maxX = Math.min(1.0, - 1.0 - offsetX - (o.getXOffset() < 0 ? AABB_OFFSET_TOP : (o.getXOffset() * AABB_OFFSET_BOTTOM))); + 1.0 - offsetX - (up.getXOffset() < 0 ? AABB_OFFSET_TOP : (up.getXOffset() * AABB_OFFSET_BOTTOM))); final double maxY = Math.min(1.0, - 1.0 - offsetY - (o.getYOffset() < 0 ? AABB_OFFSET_BOTTOM : (o.getYOffset() * AABB_OFFSET_TOP))); + 1.0 - offsetY - (up.getYOffset() < 0 ? AABB_OFFSET_BOTTOM : (up.getYOffset() * AABB_OFFSET_TOP))); final double maxZ = Math.min(1.0, - 1.0 - offsetZ - (o.getZOffset() < 0 ? AABB_OFFSET_TOP : (o.getZOffset() * AABB_OFFSET_BOTTOM))); + 1.0 - offsetZ - (up.getZOffset() < 0 ? AABB_OFFSET_TOP : (up.getZOffset() * AABB_OFFSET_BOTTOM))); return new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); } diff --git a/src/main/java/appeng/client/render/tesr/SkyChestTESR.java b/src/main/java/appeng/client/render/tesr/SkyChestTESR.java index da7ca30bc..6f7aab0f7 100644 --- a/src/main/java/appeng/client/render/tesr/SkyChestTESR.java +++ b/src/main/java/appeng/client/render/tesr/SkyChestTESR.java @@ -60,11 +60,11 @@ public class SkyChestTESR extends TileEntityRenderer { this.singleBottom.addBox(1.0F, 0.0F, 1.0F, 14.0F, 10.0F, 14.0F, 0.0F); this.singleLid = new ModelRenderer(64, 64, 0, 0); this.singleLid.addBox(1.0F, 0.0F, 0.0F, 14.0F, 5.0F, 14.0F, 0.0F); - this.singleLid.rotationPointY = 9.0F; + this.singleLid.rotationPointY = 10.0F; this.singleLid.rotationPointZ = 1.0F; this.singleLatch = new ModelRenderer(64, 64, 0, 0); this.singleLatch.addBox(7.0F, -1.0F, 15.0F, 2.0F, 4.0F, 1.0F, 0.0F); - this.singleLatch.rotationPointY = 8.0F; + this.singleLatch.rotationPointY = 9.0F; } @Override diff --git a/src/main/resources/assets/appliedenergistics2/models/item/sky_stone_chest.json b/src/main/resources/assets/appliedenergistics2/models/item/sky_stone_chest.json index 119e44f92..e5f75d516 100644 --- a/src/main/resources/assets/appliedenergistics2/models/item/sky_stone_chest.json +++ b/src/main/resources/assets/appliedenergistics2/models/item/sky_stone_chest.json @@ -7,94 +7,71 @@ "elements": [ { "name": "Base", - "from": [1.0, 0.0, 1.0], - "to": [15.0, 10.0, 15.0], + "from": [1, 0, 1], + "to": [15, 10, 15], "shade": false, "faces": { "north": { - "texture": "#0", - "uv": [3.5, 8.25, 7, 10.75] + "uv": [3.5, 8.25, 7, 10.75], + "rotation": 180, + "texture": "#0" }, "east": { - "texture": "#0", - "uv": [0.0, 8.25, 3.5, 10.75] + "uv": [0, 8.25, 3.5, 10.75], + "rotation": 180, + "texture": "#0" }, "south": { - "texture": "#0", - "uv": [10.5, 8.25, 14, 10.75] + "uv": [10.5, 8.25, 14, 10.75], + "rotation": 180, + "texture": "#0" }, "west": { - "texture": "#0", - "uv": [7, 8.25, 10.5, 10.75] + "uv": [7, 8.25, 10.5, 10.75], + "rotation": 180, + "texture": "#0" }, - "up": { - "texture": "#0", - "uv": [3.5, 0.0, 7, 3.5] - }, - "down": { - "texture": "#0", - "uv": [7, 0.0, 10.5, 3.5] - } + "up": { "uv": [3.5, 0, 7, 3.5], "texture": "#0" }, + "down": { "uv": [7, 0, 10.5, 3.5], "texture": "#0" } } }, { "name": "Lid", - "from": [1.0, 10.0, 1.0], - "to": [15.0, 15.0, 15.0], + "from": [1, 10, 1], + "to": [15, 15, 15], "shade": false, "faces": { "north": { - "texture": "#0", - "uv": [3.5, 3.5, 7, 4.75] - }, - "east": { - "texture": "#0", - "uv": [0.0, 3.5, 3.5, 4.75] + "uv": [3.5, 3.5, 7, 4.75], + "rotation": 180, + "texture": "#0" }, + "east": { "uv": [0, 3.5, 3.5, 4.75], "rotation": 180, "texture": "#0" }, "south": { - "texture": "#0", - "uv": [10.5, 3.5, 14, 4.75] + "uv": [10.5, 3.5, 14, 4.75], + "rotation": 180, + "texture": "#0" }, "west": { - "texture": "#0", - "uv": [7, 3.5, 10.5, 4.75] + "uv": [7, 3.5, 10.5, 4.75], + "rotation": 180, + "texture": "#0" }, - "up": { - "texture": "#0", - "uv": [3.5, 0.0, 7, 3.5] - }, - "down": { - "texture": "#0", - "uv": [7, 0.0, 10.5, 3.5] - } + "up": { "uv": [7, 0, 10.5, 3.5], "rotation": 270, "texture": "#0" }, + "down": { "uv": [7, 0, 10.5, 3.5], "texture": "#0" } } }, { "name": "Knob", - "from": [7.0, 7.0, 0.0], - "to": [9.0, 11.0, 1.0], + "from": [7, 7, 0], + "to": [9, 11, 1], "shade": false, "faces": { - "north": { - "texture": "#0", - "uv": [0.25, 0.25, 0.75, 1.25] - }, - "east": { - "texture": "#0", - "uv": [0, 0.25, 0.25, 1.25] - }, - "west": { - "texture": "#0", - "uv": [0.75, 0.25, 1.5, 1.25] - }, - "up": { - "texture": "#0", - "uv": [0.25, 0.0, 0.75, 0.25] - }, - "down": { - "texture": "#0", - "uv": [0.75, 0.0, 1.5, 0.25] - } + "north": { "uv": [0.25, 0.25, 0.75, 1.25], "texture": "#0" }, + "east": { "uv": [0, 0.25, 0.25, 1.25], "texture": "#0" }, + "west": { "uv": [0.75, 0.25, 1.5, 1.25], "texture": "#0" }, + "up": { "uv": [0.25, 0, 0.75, 0.25], "texture": "#0" }, + "down": { "uv": [0.75, 0, 1.5, 0.25], "texture": "#0" } } } ] diff --git a/src/main/resources/assets/appliedenergistics2/textures/models/skyblockchest.png b/src/main/resources/assets/appliedenergistics2/textures/models/skyblockchest.png index e6b7f80e736fb53ac5e6166775a2b71cef5dac87..1bc65a687b155c4011effcd1d188a8d6f30f6f52 100644 GIT binary patch delta 2151 zcmeyT@<(8TPW?d!2EK!gJ0@noWnkdY^K@|xskrqv>U5rnrDf@tm4_UcdzY_ef&#BB$9vp zcz1uVXK`Onme6kL*#TY$C782y4;jcvGENEN^3v=v)JwQ~=SQNmCTs56*#)~}>ep^H zIOcG5>u)=T2|-PTeTy^}tZfbADwJt9Y`c4YeqvAK8m%`uIg50>r)%lvrLcVP<2q%* zq4@6E?L9U*DUodRO7CPR^JpynV8cHp=zHDl^G+NQmz38Xjr3A%aS&kXShV8%lG)Wa z?%uU+kdEZq6IE$wEHc6H&7WV|Yql=vIlQ@EEMuOTBFixe0jE3hGRJS+yzMwGH6s3g zLm1b=FEW=_H3goE4Zm(Gk^EpzbI_{-y@B8c6oH$->GPhi8 zy5jl6&$sJ$ihQ!+KPF*tZsArpfi}IZuQtiu<&qFvv9-SX<`q#K2H7@4F~t%LIMX z0}?mXWF?X{P76h4w=bTuE9to9|DccFjG`<8P6xi%PD!o&73L5q@{aRw8S5MUrnU*o zblKJ^8yt%%4Do6-Tdmla{5{r9J0+4Wba{svxWLqWN3i>WJ9p-+W_&BGa;A9g7Ttum>AB$<_U6YLiusO7>@jHz z;&KgKaQS6J5Z5_Ni|2ghuYw#n7@at#O`CSWvi#LL(IDf^n?Fb#y?0LTkU`6oOM>Ad zuKxT5e2OfedUe~qFNxH%u{m+HB;J^=_H(^}gXU3w`#%jYUuNdy<|=v$g=}hDlcheT z=6?J0${!ydGN+}b6}-D+$)Q;A``g=nhL!UkA8O@RR&LPI(YaxBUhueK&HZ-6W1bIp ztvhI0?!6)J$=gSdl;ZZ+^-ex?cW<@$>C>l~AIsTPG#u}jKi2EXR? z$-)L+&4z7x+q+GC1E;0>KVBVIYRC8P)z#G(qMSJxHC30Tr^~Ecm%SvDYwg#@JMwDt z1RlMZdPi)9W0z3!8O`m91-ZvL4huL6D9rGftLAZ8WZ!#b4yKkw4yTUSGR?mU6HC6U&|pSc3gs4@rbDJ&dK$G9dnwExHMI5&O1xA z*?QW#?D^~Ub++k)_4faBP9Ix)^WMEFFOoK6amy z+UY%A?`!Sbo1dQ>=FHjr{QUP%Q!h1c^q*&AxrI$2JJ+OT-?78({M*CB!q_$)-gQ?` zOuSy)uxIMF^FqJ#emDHh{SYng*8Y?6`uceJ6&h>TtyA)x)YyIV)vH$<)qmYBWk^2r zR3cwSTE922{zuEIRTGx2)b`3foy9%Nkj;O--CON*d#k^@tzzka%FYutWyNzx(`WAc z7ayH##kA$xg{a+o&TiuAF+5Vp%}6ATI~fITrG(& zs;bVvnNxIZ#r+P6V-igY776osl8UR9WB%Pg%AXOu;OqC(n_9MsUA&@_lUy&IeCOuD zeAPVrm1SDI6L;?1S>O2gZ`q@&2F|y~=V~#v2r&QtohyB(e%^)k?+adWESQp%{Q3^Ed3=S7-69zrNtxjj7tRDpVe1qj z8{d!n8=|A5t?vk3c5UPq*ITeI`}*?9CayQ%T1|B3I2fY-I<(+i;m=R0dn!IYI#N*n z{_f%Xbw5*ARMakY(2m`DEx=3h#4?5Y+rd%y+q3S>3_GIY*);h`?z;8z+V>W2U9O-PmW6T1G+ zx~;ymJcai{)Z!bzSdw`b<#5dmdM7SD@A<;KU%R)8^%#~|$(HY`4%)H$`nrcVH>W!v zwJu_*lKHc}`mRxc5oSgS)%S84?UW>^$)7mz7@J9*Ygz<4vMc zXBfBEonu}0@weRFi8~MNZ#Ps+@HsG}!H_YT=@?57r-ZNpR)POFfAF`~D{VVw87;`b Pz`)??>gTe~DWM4f`Zg8p literal 4734 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE(QWTKjuBBy{?hvLGUqJakmU0qqEPb}zQ?(1vl5e?Mg>EgP<{zP$6U-ROQ zu2a7sRxi%Jw&(k^v;VeUw|lQz`~GlIyvbvLx3(rf_nY4%M1;3f6T0AWQd-kD9X5C zB7=f(YKIF$hBd>Q^I=`C3=swlB5B@7EE#U-G8lMT#JFBV&*2Bohp{DjnN#sh3w(sdU6`)JjJy| z%o3RrXF2E{s+=il)M�PV*|l=S%D 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 diff --git a/src/main/resources/assets/appliedenergistics2/textures/models/skychest.png b/src/main/resources/assets/appliedenergistics2/textures/models/skychest.png index cad859328ef768f1188f5648c805473101b6ec65..50253b6eb4875039eed0420cb7887e1b2bf4c4a0 100644 GIT binary patch delta 2748 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 T|H>E`7#KWV{an^LB{Ts51W#?Z delta 2401 zcmcaA`d?^*iWFmUkh>GZx^prw85kH?(j9#r85lP9bN@+Xov0{Y&mdLe8c`CQpH@FNsoPmMkou`XqNJZS+S((AomI7^axt*L0>^`)9 zZ1t~6{J_|DVA7NS|5bDC--@QTaCF(OTy*W<1yf_GuUme-b-ueP`PhuTReKYo*7j*m z*RD!^W9p?g`Pt*+{c00E>SvsvZ$G=)=a7ty%#6EtV~a~lQoeov?yEKRlA(2b`RViP zKYrLV-DB3=xw3*UrP>+r&rA*<8O=Ffh8JGywv z$r+P_PEI+MI{9SU*%zOJ?u&CBUzK4aXa3hw!hi3@3p?v&8*26~;6A*n*Uekxbo~iy z`)1W=n?9UAd8FibZE2D`VCSdBO1@321;P$p2G3aIaDEb#Q5>b5GxIp@TF534}_*)zuv$5K;gy}o&wp) zwG0gm?(bKdI`3F$VG|bV#E_j_draY3L2A!h%bC@-D&b4F+SD(oHxGWDRC#BmT1k$9^O-(=4ar=Qw$lh z0V`MS4!$Jx{`33$qC7&qBWw<9XY<%(i`}?bVCAlB&tpAbNb+q0*hJAy9PJ7Vl zYOD8~CP}O{Rou;7Ab;wxj7?j0cwNYnsSm8UlVx5%+EkWfxjOjXt?xDc+Afn+-u*Y* zzj}lBr1GR$YggVbO#hafl(%!m!aY|PxjmYAj8pN5@lw6pAyEt~PsGJf|8YL8c$rO# z_nKGLr;=lKU66W4)b&S)zmdLd&OB3(nVMTkQ@y>N)Gl^m_>c$L{B7 zTC6*yr@PBBa8^al#;u~PH&(fcUs~3cq|nED;+sxWrD$hl3)7{9g1olp;)`;Ej4hLo zn0Ya*+qP4Q+pgj3sr`aK-Id}eX-qp}J%7td{g0=ArCsN)tB7fhy_6>~U2$=Bbo9;o z{n^Qxxv7d8C#JD6d}y@k`0V3cTz2j9_rL!xn562Rnta5siubFGO~cL#(fe*{C*ODe znRjA-_n+d4`UjNnZ#x+w8K=Mh#7-Ier~F)uMGbf7MaXok9NQ@J?$qY>zDJ8^e7^QG zwly}YTKs~_ulU*B-J3bY96J82JNq}dF1#*eOIW?4OT>m9-)_!)#ud#_8J+BzajhxJ zzN7l^XRZG!s~kYNdMe|AMOXg5QBri-bSO7)#*NhW26=_f=TBo#I5cXoAk z{r?>K?V)!!U$dGS1onavgNn(ctD#?17nyF`eZbzne$~{6*Nwu3lpHc7wWqoNJbo=| z)j{)}+zWX0UI$-u*XX?d;MI5gC1*vo5BIw>)N`r3SG2D8?MwfpbZLKIY35pi1Fp5F zex10+I3e`fHAWSeX!Z|zJNXn!Ubw}AlXd{Rz;=*(on3BhsJ>yvP}iXHQTIAy1?O4u zQt9GMq0S!il}UZ-o{rtC=#&$i!xy7zDN^*J+)XZpxLZU4m1c)-r9sA=M=?jwyxF+UYtIlljC z6uSQS&3yjHRXPIO>(2Sd*gbcb+;{dMN3#BB`>E%}DoRboe|F!Oi+dh_g5T2Pq7_4{ zhem{G)m!!KXm*|XC-;Zeg(prA(`)^&zlHUH`3_G^(gsrqL&P%W+dtONQh#Rs_F8Sg Qz`(%Z>FVdQ&MBb@0Fd^7r2qf`