diff --git a/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java b/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java index 5a65601c9..9ca5c48e1 100644 --- a/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java +++ b/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java @@ -38,6 +38,7 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -164,7 +165,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI return new WiredNode( element ); } - @Nonnull + @Nullable @Override public IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ) { diff --git a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java index 4423bf168..3a13fbc0f 100644 --- a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java +++ b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java @@ -217,7 +217,7 @@ public final class ComputerCraftAPI * @return The element's node * @see IWiredElement#getNode() */ - @Nonnull + @Nullable public static IWiredElement getWiredElementAt(@Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ) { return getInstance().getWiredElementAt( world, pos, side ); @@ -274,7 +274,7 @@ public final class ComputerCraftAPI @Nonnull IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element ); - @Nonnull + @Nullable IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ); } } diff --git a/src/main/java/dan200/computercraft/api/client/TransformedModel.java b/src/main/java/dan200/computercraft/api/client/TransformedModel.java index e485f31ce..5a77c098b 100644 --- a/src/main/java/dan200/computercraft/api/client/TransformedModel.java +++ b/src/main/java/dan200/computercraft/api/client/TransformedModel.java @@ -12,6 +12,8 @@ import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedModelManager; import net.minecraft.client.util.ModelIdentifier; import net.minecraft.client.util.math.AffineTransformation; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.util.math.Vector3f; import net.minecraft.item.ItemStack; import javax.annotation.Nonnull; import java.util.Objects; @@ -60,4 +62,16 @@ public final class TransformedModel { return matrix; } + + public void push(MatrixStack matrixStack) { + matrixStack.push(); + + matrixStack.translate(matrix.translation.getX(), matrix.translation.getY(), matrix.translation.getZ()); + + matrixStack.multiply(matrix.getRotation2()); + + matrixStack.scale(matrix.scale.getX(), matrix.scale.getY(), matrix.scale.getZ()); + + matrixStack.multiply(matrix.rotation1); + } } diff --git a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java index 7741566f4..f1cfa4dd2 100644 --- a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java +++ b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java @@ -18,6 +18,7 @@ import dan200.computercraft.client.gui.GuiPrintout; import dan200.computercraft.client.gui.GuiTurtle; import dan200.computercraft.client.render.TileEntityMonitorRenderer; import dan200.computercraft.client.render.TileEntityTurtleRenderer; +import dan200.computercraft.client.render.TurtleModelLoader; import dan200.computercraft.client.render.TurtlePlayerRenderer; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.IColouredItem; @@ -26,21 +27,27 @@ import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.peripheral.monitor.ClientMonitor; import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; +import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.fabricmc.fabric.mixin.object.builder.ModelPredicateProviderRegistrySpecificAccessor; import net.minecraft.client.item.ModelPredicateProvider; import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.item.Item; +import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.Identifier; import net.fabricmc.api.ClientModInitializer; -@SuppressWarnings ("MethodCallSideOnly") +@Environment(EnvType.CLIENT) public final class ComputerCraftProxyClient implements ClientModInitializer { @SafeVarargs @@ -55,16 +62,14 @@ public final class ComputerCraftProxyClient implements ClientModInitializer { // My IDE doesn't think so, but we do actually need these generics. ScreenRegistry.>register(ComputerCraftRegistry.ModContainers.COMPUTER, GuiComputer::create); - ScreenRegistry.>register(ComputerCraftRegistry.ModContainers.POCKET_COMPUTER, - GuiComputer::createPocket); + ScreenRegistry.>register(ComputerCraftRegistry.ModContainers.POCKET_COMPUTER, GuiComputer::createPocket); ScreenRegistry.register(ComputerCraftRegistry.ModContainers.TURTLE, GuiTurtle::new); ScreenRegistry.register(ComputerCraftRegistry.ModContainers.PRINTER, GuiPrinter::new); ScreenRegistry.register(ComputerCraftRegistry.ModContainers.DISK_DRIVE, GuiDiskDrive::new); ScreenRegistry.register(ComputerCraftRegistry.ModContainers.PRINTOUT, GuiPrintout::new); - ScreenRegistry.>register(ComputerCraftRegistry.ModContainers.VIEW_COMPUTER, - GuiComputer::createView); + ScreenRegistry.>register(ComputerCraftRegistry.ModContainers.VIEW_COMPUTER, GuiComputer::createView); } @Override @@ -87,6 +92,13 @@ public final class ComputerCraftProxyClient implements ClientModInitializer { BlockEntityRendererRegistry.INSTANCE.register(ComputerCraftRegistry.ModTiles.TURTLE_ADVANCED, TileEntityTurtleRenderer::new); // TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() ); + ClientSpriteRegistryCallback.event(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE) + .register(ClientRegistry::onTextureStitchEvent); + ModelLoadingRegistry.INSTANCE.registerAppender(ClientRegistry::onMeodelBakeEvent); + ModelLoadingRegistry.INSTANCE.registerResourceProvider(loader -> (name, context) -> TurtleModelLoader.INSTANCE.accepts(name) ? + TurtleModelLoader.INSTANCE.loadModel( + name) : null); + EntityRendererRegistry.INSTANCE.register(ComputerCraftRegistry.ModEntities.TURTLE_PLAYER, TurtlePlayerRenderer::new); registerItemProperty("state", diff --git a/src/main/java/dan200/computercraft/client/render/ModelTransformer.java b/src/main/java/dan200/computercraft/client/render/ModelTransformer.java new file mode 100644 index 000000000..9b262c4b6 --- /dev/null +++ b/src/main/java/dan200/computercraft/client/render/ModelTransformer.java @@ -0,0 +1,95 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ + +package dan200.computercraft.client.render; + +import java.util.List; + +import javax.vecmath.Vector4f; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.VertexFormatElement; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.util.math.Matrix4f; +import net.minecraft.util.math.Quaternion; + +/** + * Transforms vertices of a model, remaining aware of winding order, and rearranging vertices if needed. + */ +@Environment(EnvType.CLIENT) +public final class ModelTransformer { + private static final Matrix4f identity; + + static { + identity = new Matrix4f(); + identity.loadIdentity(); + } + + private ModelTransformer() { + } + + public static void transformQuadsTo(List output, List input, Matrix4f transform) { + transformQuadsTo(VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, output, input, transform); + } + + public static void transformQuadsTo(VertexFormat format, List output, List input, Matrix4f transform) { + if (transform == null || transform.equals(identity)) { + output.addAll(input); + } else { + for (BakedQuad quad : input) { + output.add(doTransformQuad(format, quad, transform)); + } + } + } + + private static BakedQuad doTransformQuad(VertexFormat format, BakedQuad quad, Matrix4f transform) { + int[] vertexData = quad.getVertexData() + .clone(); + int offset = 0; + BakedQuad copy = new BakedQuad(vertexData, -1, quad.getFace(), quad.sprite, true); + for (int i = 0; i < format.getElements().size(); ++i) // For each vertex element + { + VertexFormatElement element = format.getElements().get(i); + if (element.getType() == VertexFormatElement.Type.POSITION && element.getFormat() == VertexFormatElement.Format.FLOAT && element.getSize() == 3) // When we find a position + // element + { + for (int j = 0; j < 4; ++j) // For each corner of the quad + { + int start = offset + j * format.getVertexSize(); + if ((start % 4) == 0) { + start = start / 4; + + // Extract the position + Quaternion pos = new Quaternion(Float.intBitsToFloat(vertexData[start]), + Float.intBitsToFloat(vertexData[start + 1]), + Float.intBitsToFloat(vertexData[start + 2]), + 1); + + // Transform the position + transform.multiply(pos); + + // Insert the position + vertexData[start] = Float.floatToRawIntBits(pos.getX()); + vertexData[start + 1] = Float.floatToRawIntBits(pos.getY()); + vertexData[start + 2] = Float.floatToRawIntBits(pos.getZ()); + } + } + } + offset += element.getSize(); + } + return copy; + } + + public static BakedQuad transformQuad(VertexFormat format, BakedQuad input, Matrix4f transform) { + if (transform == null || transform.equals(identity)) { + return input; + } + return doTransformQuad(format, input, transform); + } +} diff --git a/src/main/java/dan200/computercraft/client/render/TileEntityTurtleRenderer.java b/src/main/java/dan200/computercraft/client/render/TileEntityTurtleRenderer.java index f22b40e2d..b577647bf 100644 --- a/src/main/java/dan200/computercraft/client/render/TileEntityTurtleRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TileEntityTurtleRenderer.java @@ -145,7 +145,7 @@ public class TileEntityTurtleRenderer extends BlockEntityRenderer transform.translate( 0.0f, -0.5f, -0.5f ); TransformedModel model = upgrade.getModel( turtle.getAccess(), side ); - // model.getMatrix().multiply(transform); + model.push(transform); renderModel( transform, renderer, lightmapCoord, overlayLight, model.getModel(), null ); transform.pop(); diff --git a/src/main/java/dan200/computercraft/client/render/TurtleModelLoader.java b/src/main/java/dan200/computercraft/client/render/TurtleModelLoader.java new file mode 100644 index 000000000..68d228819 --- /dev/null +++ b/src/main/java/dan200/computercraft/client/render/TurtleModelLoader.java @@ -0,0 +1,91 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ + +package dan200.computercraft.client.render; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.mojang.datafixers.util.Pair; +import dan200.computercraft.ComputerCraft; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.ModelBakeSettings; +import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.UnbakedModel; +import net.minecraft.client.texture.Sprite; +import net.minecraft.client.util.SpriteIdentifier; +import net.minecraft.util.Identifier; + +@Environment(EnvType.CLIENT) +public final class TurtleModelLoader { + public static final TurtleModelLoader INSTANCE = new TurtleModelLoader(); + private static final Identifier NORMAL_TURTLE_MODEL = new Identifier(ComputerCraft.MOD_ID, "block/turtle_normal"); + private static final Identifier ADVANCED_TURTLE_MODEL = new Identifier(ComputerCraft.MOD_ID, "block/turtle_advanced"); + private static final Identifier COLOUR_TURTLE_MODEL = new Identifier(ComputerCraft.MOD_ID, "block/turtle_colour"); + + private TurtleModelLoader() { + } + + public boolean accepts(@Nonnull Identifier name) { + return name.getNamespace() + .equals(ComputerCraft.MOD_ID) && (name.getPath() + .equals("item/turtle_normal") || name.getPath() + .equals("item/turtle_advanced")); + } + + @Nonnull + public UnbakedModel loadModel(@Nonnull Identifier name) { + if (name.getNamespace() + .equals(ComputerCraft.MOD_ID)) { + switch (name.getPath()) { + case "item/turtle_normal": + return new TurtleModel(NORMAL_TURTLE_MODEL); + case "item/turtle_advanced": + return new TurtleModel(ADVANCED_TURTLE_MODEL); + } + } + + throw new IllegalStateException("Loader does not accept " + name); + } + + private static final class TurtleModel implements UnbakedModel { + private final Identifier family; + + private TurtleModel(Identifier family) {this.family = family;} + + @Override + public Collection getTextureDependencies(Function modelGetter, Set> missingTextureErrors) { + return this.getModelDependencies().stream() + .flatMap(x -> modelGetter.apply(x) + .getTextureDependencies(modelGetter, missingTextureErrors) + .stream()) + .collect(Collectors.toSet()); + } + + @Nonnull + @Override + public Collection getModelDependencies() { + return Arrays.asList(this.family, COLOUR_TURTLE_MODEL); + } + + @Override + public BakedModel bake(@Nonnull ModelLoader loader, @Nonnull Function spriteGetter, @Nonnull ModelBakeSettings state, Identifier modelId) { + return new TurtleSmartItemModel(loader.getOrLoadModel(this.family) + .bake(loader, spriteGetter, state, modelId), + loader.getOrLoadModel(COLOUR_TURTLE_MODEL) + .bake(loader, spriteGetter, state, modelId)); + } + } +} diff --git a/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java b/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java index d889fb15e..52e2860fc 100644 --- a/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java +++ b/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java @@ -61,20 +61,20 @@ public class TurtleMultiModel implements BakedModel ArrayList quads = new ArrayList<>(); - transformQuadsTo( quads, m_baseModel.getQuads( state, side, rand ), m_generalTransform ); + ModelTransformer.transformQuadsTo( quads, m_baseModel.getQuads( state, side, rand ), m_generalTransform.getMatrix() ); if( m_overlayModel != null ) { - transformQuadsTo( quads, m_overlayModel.getQuads( state, side, rand ), m_generalTransform ); + ModelTransformer.transformQuadsTo( quads, m_overlayModel.getQuads( state, side, rand ), m_generalTransform.getMatrix() ); } if( m_leftUpgradeModel != null ) { AffineTransformation upgradeTransform = m_generalTransform.multiply( m_leftUpgradeModel.getMatrix() ); - transformQuadsTo( quads, m_leftUpgradeModel.getModel().getQuads( state, side, rand ), upgradeTransform ); + ModelTransformer.transformQuadsTo( quads, m_leftUpgradeModel.getModel().getQuads( state, side, rand ), upgradeTransform.getMatrix() ); } if( m_rightUpgradeModel != null ) { AffineTransformation upgradeTransform = m_generalTransform.multiply( m_rightUpgradeModel.getMatrix() ); - transformQuadsTo( quads, m_rightUpgradeModel.getModel().getQuads( state, side, rand ), upgradeTransform ); + ModelTransformer.transformQuadsTo( quads, m_rightUpgradeModel.getModel().getQuads( state, side, rand ), upgradeTransform.getMatrix() ); } quads.trimToSize(); return quads; @@ -126,16 +126,4 @@ public class TurtleMultiModel implements BakedModel { return ModelOverrideList.EMPTY; } - - private void transformQuadsTo( List output, List quads, AffineTransformation transform ) - { - for( BakedQuad quad : quads ) - { - // TODO Figure out what the fuck to do here -// BakedQuadBuilder builder = new BakedQuadBuilder(); -// TRSRTransformer transformer = new TRSRTransformer( builder, transform ); -// quad.pipe( transformer ); -// output.add( builder.build() ); - } - } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java index dcdaeca9f..d90525d09 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java @@ -320,17 +320,17 @@ public class TileCable extends TileGeneric implements IPeripheralTile if (!world.isChunkLoaded(offset)) continue; IWiredElement element = ComputerCraftAPI.getWiredElementAt(world, offset, facing.getOpposite()); - if (element != null) continue; - - // TODO Figure out why this crashes. - IWiredNode node = element.getNode(); - if (node != null && m_node != null) { - if (BlockCable.canConnectIn(state, facing)) { - // If we can connect to it then do so - m_node.connectTo(node); - } else if (m_node.getNetwork() == node.getNetwork()) { - // Otherwise if we're on the same network then attempt to void it. - m_node.disconnectFrom(node); + if (element != null) { + // TODO Figure out why this crashes. + IWiredNode node = element.getNode(); + if (node != null && m_node != null) { + if (BlockCable.canConnectIn(state, facing)) { + // If we can connect to it then do so + m_node.connectTo(node); + } else if (m_node.getNetwork() == node.getNetwork()) { + // Otherwise if we're on the same network then attempt to void it. + m_node.disconnectFrom(node); + } } } } diff --git a/src/main/resources/assets/computercraft/models/block/turtle_advanced.json b/src/main/resources/assets/computercraft/models/block/turtle_advanced.json index 6e7ed42a5..c232c67d3 100644 --- a/src/main/resources/assets/computercraft/models/block/turtle_advanced.json +++ b/src/main/resources/assets/computercraft/models/block/turtle_advanced.json @@ -1,4 +1,6 @@ { - "loader": "computercraft:turtle", - "model": "computercraft:block/turtle_advanced_base" + "parent": "computercraft:block/turtle_base", + "textures": { + "texture": "computercraft:block/turtle_advanced" + } } diff --git a/src/main/resources/assets/computercraft/models/block/turtle_advanced_base.json b/src/main/resources/assets/computercraft/models/block/turtle_advanced_base.json deleted file mode 100644 index c232c67d3..000000000 --- a/src/main/resources/assets/computercraft/models/block/turtle_advanced_base.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "computercraft:block/turtle_base", - "textures": { - "texture": "computercraft:block/turtle_advanced" - } -} diff --git a/src/main/resources/assets/computercraft/models/block/turtle_elf_overlay.json b/src/main/resources/assets/computercraft/models/block/turtle_elf_overlay.json index 047576123..d17e4c8ec 100644 --- a/src/main/resources/assets/computercraft/models/block/turtle_elf_overlay.json +++ b/src/main/resources/assets/computercraft/models/block/turtle_elf_overlay.json @@ -1,5 +1,5 @@ { - "parent": "computercraft:block/turtle_overlay", + "parent": "computercraft:block/turtle_normal_overlay", "textures": { "texture": "computercraft:block/turtle_elf_overlay" } diff --git a/src/main/resources/assets/computercraft/models/block/turtle_normal.json b/src/main/resources/assets/computercraft/models/block/turtle_normal.json index 8d58a0b14..840517b05 100644 --- a/src/main/resources/assets/computercraft/models/block/turtle_normal.json +++ b/src/main/resources/assets/computercraft/models/block/turtle_normal.json @@ -1,4 +1,6 @@ { - "loader": "computercraft:turtle", - "model": "computercraft:block/turtle_normal_base" + "parent": "computercraft:block/turtle_base", + "textures": { + "texture": "computercraft:block/turtle_normal" + } } diff --git a/src/main/resources/assets/computercraft/models/block/turtle_normal_base.json b/src/main/resources/assets/computercraft/models/block/turtle_normal_base.json deleted file mode 100644 index 840517b05..000000000 --- a/src/main/resources/assets/computercraft/models/block/turtle_normal_base.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "computercraft:block/turtle_base", - "textures": { - "texture": "computercraft:block/turtle_normal" - } -} diff --git a/src/main/resources/assets/computercraft/models/block/turtle_overlay.json b/src/main/resources/assets/computercraft/models/block/turtle_overlay.json deleted file mode 100644 index 906b68a82..000000000 --- a/src/main/resources/assets/computercraft/models/block/turtle_overlay.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "parent": "block/block", - "textures": { - "particle": "#texture" - }, - "elements": [ - { - "from": [ 2, 2, 2 ], - "to": [ 14, 14, 13 ], - "faces": { - "down": { "uv": [ 2.75, 0, 5.75, 2.75 ], "texture": "#texture" }, - "up": { "uv": [ 5.75, 0, 8.75, 2.75 ], "texture": "#texture" }, - "north": { "uv": [ 8.5, 5.75, 11.5, 2.75 ], "texture": "#texture" }, - "south": { "uv": [ 2.75, 5.75, 5.75, 2.75 ], "texture": "#texture" }, - "west": { "uv": [ 0, 5.75, 2.75, 2.75 ], "texture": "#texture" }, - "east": { "uv": [ 5.75, 5.75, 8.5, 2.75 ], "texture": "#texture" } - } - }, - { - "from": [ 3, 6, 13 ], - "to": [ 13, 13, 15 ], - "faces": { - "down": { "uv": [ 9.25, 0, 11.75, 0.5 ], "texture": "#texture" }, - "up": { "uv": [ 11.75, 0, 14.25, 0.5 ], "texture": "#texture" }, - "south": { "uv": [ 9.25, 2.25, 11.75, 0.5 ], "texture": "#texture" }, - "west": { "uv": [ 8.75, 2.25, 9.25, 0.5 ], "texture": "#texture" }, - "east": { "uv": [ 11.75, 2.25, 12.25, 0.5 ], "texture": "#texture" } - } - }, - { - "from": [ 1.5, 1.5, 1.5 ], - "to": [ 14.5, 14.5, 13.5 ], - "faces": { - "down": { "uv": [ 2.75, 8, 5.75, 10.75 ], "texture": "#texture" }, - "up": { "uv": [ 5.75, 8, 8.75, 10.75 ], "texture": "#texture" }, - "north": { "uv": [ 8.5, 13.75, 11.5, 10.75 ], "texture": "#texture" }, - "south": { "uv": [ 2.75, 13.75, 5.75, 10.75 ], "texture": "#texture" }, - "west": { "uv": [ 0, 13.75, 2.75, 10.75 ], "texture": "#texture" }, - "east": { "uv": [ 5.75, 13.75, 8.5, 10.75 ], "texture": "#texture" } - } - } - ] -} diff --git a/src/main/resources/computercraft.accesswidener b/src/main/resources/computercraft.accesswidener index 9269a0e00..06d48a37f 100644 --- a/src/main/resources/computercraft.accesswidener +++ b/src/main/resources/computercraft.accesswidener @@ -16,3 +16,7 @@ accessible method net/minecraft/client/render/model/json/ModelOverrideList (Ljava/lang/String;)V accessible field net/minecraft/server/MinecraftServer serverResourceManager Lnet/minecraft/resource/ServerResourceManager; +accessible field net/minecraft/client/render/model/BakedQuad sprite Lnet/minecraft/client/texture/Sprite; +accessible field net/minecraft/client/util/math/AffineTransformation translation Lnet/minecraft/client/util/math/Vector3f; +accessible field net/minecraft/client/util/math/AffineTransformation scale Lnet/minecraft/client/util/math/Vector3f; +accessible field net/minecraft/client/util/math/AffineTransformation rotation1 Lnet/minecraft/util/math/Quaternion;