1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-08-28 00:12:16 +00:00

Fix cables and turtle rendering.

This commit is contained in:
Jacob Farley 2020-09-04 14:05:56 -05:00
parent 244fd95034
commit e43dd9f7c6
16 changed files with 250 additions and 96 deletions

View File

@ -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 )
{

View File

@ -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 );
}
}

View File

@ -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);
}
}

View File

@ -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.<ContainerComputer, GuiComputer<ContainerComputer>>register(ComputerCraftRegistry.ModContainers.COMPUTER, GuiComputer::create);
ScreenRegistry.<ContainerPocketComputer, GuiComputer<ContainerPocketComputer>>register(ComputerCraftRegistry.ModContainers.POCKET_COMPUTER,
GuiComputer::createPocket);
ScreenRegistry.<ContainerPocketComputer, GuiComputer<ContainerPocketComputer>>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.<ContainerViewComputer, GuiComputer<ContainerViewComputer>>register(ComputerCraftRegistry.ModContainers.VIEW_COMPUTER,
GuiComputer::createView);
ScreenRegistry.<ContainerViewComputer, GuiComputer<ContainerViewComputer>>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",

View File

@ -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<BakedQuad> output, List<BakedQuad> input, Matrix4f transform) {
transformQuadsTo(VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, output, input, transform);
}
public static void transformQuadsTo(VertexFormat format, List<BakedQuad> output, List<BakedQuad> 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);
}
}

View File

@ -145,7 +145,7 @@ public class TileEntityTurtleRenderer extends BlockEntityRenderer<TileTurtle>
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();

View File

@ -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<SpriteIdentifier> getTextureDependencies(Function<Identifier, UnbakedModel> modelGetter, Set<Pair<String, String>> missingTextureErrors) {
return this.getModelDependencies().stream()
.flatMap(x -> modelGetter.apply(x)
.getTextureDependencies(modelGetter, missingTextureErrors)
.stream())
.collect(Collectors.toSet());
}
@Nonnull
@Override
public Collection<Identifier> getModelDependencies() {
return Arrays.asList(this.family, COLOUR_TURTLE_MODEL);
}
@Override
public BakedModel bake(@Nonnull ModelLoader loader, @Nonnull Function<SpriteIdentifier, Sprite> 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));
}
}
}

View File

@ -61,20 +61,20 @@ public class TurtleMultiModel implements BakedModel
ArrayList<BakedQuad> 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<BakedQuad> output, List<BakedQuad> 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() );
}
}
}

View File

@ -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);
}
}
}
}

View File

@ -1,4 +1,6 @@
{
"loader": "computercraft:turtle",
"model": "computercraft:block/turtle_advanced_base"
"parent": "computercraft:block/turtle_base",
"textures": {
"texture": "computercraft:block/turtle_advanced"
}
}

View File

@ -1,6 +0,0 @@
{
"parent": "computercraft:block/turtle_base",
"textures": {
"texture": "computercraft:block/turtle_advanced"
}
}

View File

@ -1,5 +1,5 @@
{
"parent": "computercraft:block/turtle_overlay",
"parent": "computercraft:block/turtle_normal_overlay",
"textures": {
"texture": "computercraft:block/turtle_elf_overlay"
}

View File

@ -1,4 +1,6 @@
{
"loader": "computercraft:turtle",
"model": "computercraft:block/turtle_normal_base"
"parent": "computercraft:block/turtle_base",
"textures": {
"texture": "computercraft:block/turtle_normal"
}
}

View File

@ -1,6 +0,0 @@
{
"parent": "computercraft:block/turtle_base",
"textures": {
"texture": "computercraft:block/turtle_normal"
}
}

View File

@ -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" }
}
}
]
}

View File

@ -16,3 +16,7 @@ accessible method net/minecraft/client/render/model/json/ModelOverrideList <init
extendable class net/minecraft/util/math/Matrix4f
accessible method net/minecraft/util/WorldSavePath <init> (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;