From 7d43bb056a66fe0689be22fec26658e93402a9db Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 4 Jan 2021 14:37:44 -0800 Subject: [PATCH 001/147] merge experimental rendering from 1.16 to 1.15 --- .../com/simibubi/create/AllBlockPartials.java | 27 +- .../com/simibubi/create/CreateClient.java | 11 +- .../contraptions/base/KineticBlock.java | 4 + .../contraptions/base/KineticTileEntity.java | 5 + .../base/KineticTileEntityRenderer.java | 39 ++- .../components/actors/DrillRenderer.java | 7 +- .../components/actors/HarvesterRenderer.java | 2 +- .../PortableStorageInterfaceRenderer.java | 2 +- .../components/clock/CuckooClockRenderer.java | 9 +- .../crafter/MechanicalCrafterRenderer.java | 2 +- .../components/crank/HandCrankRenderer.java | 2 +- .../components/deployer/DeployerRenderer.java | 12 +- .../components/fan/EncasedFanRenderer.java | 45 +-- .../components/flywheel/FlywheelRenderer.java | 7 +- .../millstone/MillstoneRenderer.java | 6 +- .../mixer/MechanicalMixerRenderer.java | 2 +- .../motor/CreativeMotorRenderer.java | 6 +- .../press/MechanicalPressRenderer.java | 2 +- .../components/saw/SawRenderer.java | 18 +- .../ContraptionRenderer.java | 8 +- .../bearing/BearingRenderer.java | 7 +- .../StabilizedBearingMovementBehaviour.java | 2 +- .../pulley/AbstractPulleyRenderer.java | 2 +- .../pulley/PulleyRenderer.java | 2 +- .../train/CouplingRenderer.java | 2 +- .../contraptions/fluids/PumpRenderer.java | 7 +- .../fluids/actors/HosePulleyRenderer.java | 2 +- .../fluids/pipes/FluidValveRenderer.java | 2 +- .../burner/BlazeBurnerRenderer.java | 2 +- .../advanced/SpeedControllerRenderer.java | 10 +- .../contraptions/relays/belt/BeltModel.java | 2 +- .../relays/belt/BeltRenderer.java | 39 ++- .../relays/encased/SplitShaftRenderer.java | 33 ++- .../relays/gauge/GaugeRenderer.java | 2 +- .../relays/gearbox/GearboxRenderer.java | 37 ++- .../belts/tunnel/BeltTunnelRenderer.java | 2 +- .../diodes/AdjustableRepeaterRenderer.java | 2 +- .../block/funnel/FunnelRenderer.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 12 +- .../block/redstone/AnalogLeverRenderer.java | 2 +- .../block/SchematicannonRenderer.java | 2 +- .../schematics/client/SchematicRenderer.java | 4 +- .../simibubi/create/events/ClientEvents.java | 5 + .../block/connected/CTSpriteShiftEntry.java | 2 +- .../ColoredOverlayTileEntityRenderer.java | 2 +- .../renderer/SafeTileEntityRenderer.java | 1 + .../utility/render/FastKineticRenderer.java | 185 ++++++++++++ .../utility/render/InstancedBuffer.java | 278 ++++++++++++++++++ .../{ => render}/ShadowRenderHelper.java | 2 +- .../utility/{ => render}/SuperByteBuffer.java | 86 +----- .../{ => render}/SuperByteBufferCache.java | 25 +- .../utility/render/TemplateBuffer.java | 107 +++++++ .../{ => render}/TileEntityRenderHelper.java | 3 +- .../utility/render/shader/Shader.java | 13 + .../utility/render/shader/ShaderCallback.java | 10 + .../utility/render/shader/ShaderHelper.java | 140 +++++++++ .../resources/META-INF/accesstransformer.cfg | 6 +- .../assets/create/shader/instanced.frag | 29 ++ .../assets/create/shader/instanced.vert | 60 ++++ 59 files changed, 1079 insertions(+), 268 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java rename src/main/java/com/simibubi/create/foundation/utility/{ => render}/ShadowRenderHelper.java (98%) rename src/main/java/com/simibubi/create/foundation/utility/{ => render}/SuperByteBuffer.java (72%) rename src/main/java/com/simibubi/create/foundation/utility/{ => render}/SuperByteBufferCache.java (86%) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java rename src/main/java/com/simibubi/create/foundation/utility/{ => render}/TileEntityRenderHelper.java (95%) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderCallback.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java create mode 100644 src/main/resources/assets/create/shader/instanced.frag create mode 100644 src/main/resources/assets/create/shader/instanced.vert diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index ddb43ea20..2d92ff390 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -11,12 +11,10 @@ import java.util.Map; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.util.Direction; @@ -218,4 +216,23 @@ public class AllBlockPartials { return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); } + public InstancedBuffer renderOnInstanced(BlockState referenceState) { + return CreateClient.kineticRenderer.renderPartialInstanced(this, referenceState); + } + + public InstancedBuffer renderOnDirectionalSouthInstanced(BlockState referenceState) { + Direction facing = referenceState.get(FACING); + return renderOnDirectionalSouthInstanced(referenceState, facing); + } + public InstancedBuffer renderOnDirectionalSouthInstanced(BlockState referenceState, Direction facing) { + MatrixStack ms = new MatrixStack(); + // TODO 1.15 find a way to cache this model matrix computation + MatrixStacker.of(ms) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .unCentre(); + return CreateClient.kineticRenderer.renderDirectionalPartialInstanced(this, referenceState, facing, ms); + } + } diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 51f5007e5..d5f9d9b0a 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,9 +16,11 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.utility.SuperByteBufferCache; +import com.simibubi.create.foundation.utility.render.FastKineticRenderer; +import com.simibubi.create.foundation.utility.render.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; +import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelShapes; @@ -42,6 +44,7 @@ public class CreateClient { public static SchematicHandler schematicHandler; public static SchematicAndQuillHandler schematicAndQuillHandler; public static SuperByteBufferCache bufferCache; + public static FastKineticRenderer kineticRenderer; public static final Outliner outliner = new Outliner(); private static CustomBlockModels customBlockModels; @@ -56,6 +59,8 @@ public class CreateClient { modEventBus.addListener(CreateClient::onModelRegistry); modEventBus.addListener(CreateClient::onTextureStitch); modEventBus.addListener(AllParticleTypes::registerFactories); + + ShaderHelper.initShaders(); } public static void clientInit(FMLClientSetupEvent event) { @@ -67,6 +72,10 @@ public class CreateClient { bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); + kineticRenderer = new FastKineticRenderer(); + kineticRenderer.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); + kineticRenderer.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); + AllKeys.register(); AllContainerTypes.registerScreenFactories(); //AllTileEntities.registerRenderers(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java index 24d713f28..24d116dbc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java @@ -1,7 +1,9 @@ package com.simibubi.create.content.contraptions.base; +import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.item.ItemDescription.Palette; +import com.simibubi.create.foundation.utility.render.SuperByteBufferCache; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.LivingEntity; @@ -14,7 +16,9 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.ToolType; +import net.minecraftforge.fml.DistExecutor; public abstract class KineticBlock extends Block implements IRotate { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 8df6884c4..9914478ad 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -8,6 +8,7 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.Create; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticNetwork; import com.simibubi.create.content.contraptions.RotationPropagator; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; @@ -31,9 +32,13 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.extensions.IForgeTileEntity; +import net.minecraftforge.fml.DistExecutor; public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 5eb1aea7a..0110b2455 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.base; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlocks; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; @@ -9,8 +8,9 @@ import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.SuperByteBuffer; -import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -35,23 +35,36 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer { + final BlockPos pos = te.getPos(); + Axis axis = ((IRotate) te.getBlockState() + .getBlock()).getRotationAxis(te.getBlockState()); + + data.setPackedLight(light) + .setRotationalSpeed(te.getSpeed()) + .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis).getUnitVector()) + .setPosition(pos); + }); } public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { @@ -116,8 +129,8 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), ms, vb, light); + KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), light); BlockState blockState = te.getBlockState(); BlockPos pos = te.getPos(); @@ -112,10 +112,10 @@ public class DeployerRenderer extends SafeTileEntityRenderer SuperByteBuffer hand = te.getHandPose() .renderOn(blockState); - transform(te.getWorld(), pole.translate(offset.x, offset.y, offset.z), blockState, pos, true).renderInto(ms, - vb); - transform(te.getWorld(), hand.translate(offset.x, offset.y, offset.z), blockState, pos, false).renderInto(ms, - vb); + transform(te.getWorld(), (SuperByteBuffer) pole.translate(offset.x, offset.y, offset.z), blockState, pos, true).renderInto(ms, + vb); + transform(te.getWorld(), (SuperByteBuffer) hand.translate(offset.x, offset.y, offset.z), blockState, pos, false).renderInto(ms, + vb); } protected Vec3d getHandOffset(DeployerTileEntity te, float partialTicks, BlockState blockState) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 957ec69e7..fc3203f19 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -3,18 +3,17 @@ package com.simibubi.create.content.contraptions.components.fan; import static net.minecraft.state.properties.BlockStateProperties.FACING; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; public class EncasedFanRenderer extends KineticTileEntityRenderer { @@ -28,27 +27,33 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { int light, int overlay) { Direction direction = te.getBlockState() .get(FACING); - IVertexBuilder vb = buffer.getBuffer(RenderType.getCutoutMipped()); int lightBehind = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction.getOpposite())); int lightInFront = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction)); - SuperByteBuffer shaftHalf = - AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); - SuperByteBuffer fanInner = - AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); - - float time = AnimationTickHolder.getRenderTick(); - float speed = te.getSpeed() * 5; - if (speed > 0) - speed = MathHelper.clamp(speed, 80, 64 * 20); - if (speed < 0) - speed = MathHelper.clamp(speed, -64 * 20, -80); - float angle = (time * speed * 3 / 10f) % 360; - angle = angle / 180f * (float) Math.PI; + InstancedBuffer shaftHalf = + AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), direction.getOpposite()); + InstancedBuffer fanInner = + AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthInstanced(te.getBlockState(), direction.getOpposite()); - standardKineticRotationTransform(shaftHalf, te, lightBehind).renderInto(ms, vb); - kineticRotationTransform(fanInner, te, direction.getAxis(), angle, lightInFront).renderInto(ms, vb); + renderRotatingBuffer(te, shaftHalf, lightBehind); + fanInner.setupInstance(data -> { + final BlockPos pos = te.getPos(); + Direction.Axis axis = ((IRotate) te.getBlockState() + .getBlock()).getRotationAxis(te.getBlockState()); + + float speed = te.getSpeed() * 5; + if (speed > 0) + speed = MathHelper.clamp(speed, 80, 64 * 20); + if (speed < 0) + speed = MathHelper.clamp(speed, -64 * 20, -80); + + data.setPackedLight(lightInFront) + .setRotationalSpeed(speed) + .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setPosition(pos); + }); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 9632779d4..59d7f81ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -9,7 +9,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -74,8 +75,8 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { } @Override - protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), te.getBlockState() + protected InstancedBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), te.getBlockState() .get(HORIZONTAL_FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index 2890f16d3..a238a2ba1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -15,8 +15,8 @@ public class MillstoneRenderer extends KineticTileEntityRenderer { } @Override - protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return CreateClient.bufferCache.renderPartial(AllBlockPartials.MILLSTONE_COG, te.getBlockState()); + protected InstancedBuffer getRotatedModel(KineticTileEntity te) { + return CreateClient.kineticRenderer.renderPartialInstanced(AllBlockPartials.MILLSTONE_COG, te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index da84d012f..5fc8e6d0f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 0993097d0..699c59186 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.motor; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -14,8 +14,8 @@ public class CreativeMotorRenderer extends KineticTileEntityRenderer { } @Override - protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState()); + protected InstancedBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index 1a721bac8..bef8ed8e7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 6ab63b12f..4ad2d204a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -10,11 +10,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -79,9 +78,8 @@ public class SawRenderer extends SafeTileEntityRenderer { ms.pop(); } - protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, - int overlay) { - KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te), ms, buffer.getBuffer(RenderType.getSolid()), light); + protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te), light); } protected void renderItems(SawTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, @@ -125,11 +123,11 @@ public class SawRenderer extends SafeTileEntityRenderer { } } - protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + protected InstancedBuffer getRotatedModel(KineticTileEntity te) { BlockState state = te.getBlockState(); if (state.get(FACING).getAxis().isHorizontal()) - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(state.rotate(Rotation.CLOCKWISE_180)); - return CreateClient.bufferCache.renderBlockIn(KineticTileEntityRenderer.KINETIC_TILE, + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); + return CreateClient.kineticRenderer.renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index 7892307d8..08307763e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -10,10 +10,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; -import com.simibubi.create.foundation.utility.SuperByteBufferCache; -import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment; -import com.simibubi.create.foundation.utility.TileEntityRenderHelper; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBufferCache; +import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; +import com.simibubi.create.foundation.utility.render.TileEntityRenderHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import net.minecraft.block.BlockRenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index e1f7978f5..fece4075f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -5,7 +5,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -43,8 +44,8 @@ public class BearingRenderer extends KineticTileEntityRenderer { } @Override - protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), te.getBlockState() + protected InstancedBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), te.getBlockState() .get(BearingBlock.FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 35df5d517..3b92c2738 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java index e93ecf899..ce1f47044 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index 0922e6ba1..ffdd25677 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java index 35041160d..ab60ed2a4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index ff887c908..372cab409 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -6,7 +6,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -51,8 +52,8 @@ public class PumpRenderer extends KineticTileEntityRenderer { } @Override - protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouth(te.getBlockState()); + protected InstancedBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthInstanced(te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java index af76354d6..565bdb3fa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.AbstractPulleyRenderer; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java index c50f78bb4..cc9d9d8d5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index e9e68a582..f2469f1c2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlo import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 0bd5d9096..dae604e77 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -4,10 +4,9 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class SpeedControllerRenderer extends SmartTileEntityRenderer { @@ -21,12 +20,11 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer { : start ? AllBlockPartials.BELT_START : end ? AllBlockPartials.BELT_END : AllBlockPartials.BELT_MIDDLE; - SuperByteBuffer beltBuffer = beltPartial.renderOn(blockState) - .light(light); - SpriteShiftEntry spriteShift = - diagonal ? AllSpriteShifts.BELT_DIAGONAL : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; + InstancedBuffer beltBuffer = beltPartial.renderOnInstanced(blockState); int cycleLength = diagonal ? 12 : 16; int cycleOffset = bottom ? 8 : 0; // UV shift - float speed = te.getSpeed(); - if (speed != 0) { - float time = renderTick * axisDirection.getOffset(); + + beltBuffer.setupInstance(data -> { + float speed = te.getSpeed(); if (diagonal && (downward ^ alongX) || !sideways && !diagonal && alongX - || sideways && axisDirection == AxisDirection.NEGATIVE) + || sideways && axisDirection == AxisDirection.NEGATIVE) speed = -speed; - int textureIndex = (int) (((speed * time / 36) + cycleOffset) % cycleLength); - if (textureIndex < 0) - textureIndex += cycleLength; - beltBuffer.shiftUVtoSheet(spriteShift, (textureIndex % 4) / 4f, (textureIndex / 4) / 4f, 4); - } - - beltBuffer.renderInto(ms, vb); + data.setPackedLight(light) + .setPosition(te.getPos()) + .setRotationalSpeed(speed) + .setRotationAxis(0, 0, 0) + .setCycleLength(cycleLength) + .setCycleOffset(cycleOffset); + }); // Diagonal belt do not have a separate bottom model if (diagonal) @@ -140,10 +138,9 @@ public class BeltRenderer extends SafeTileEntityRenderer { msr.rotateX(90); msr.unCentre(); - SuperByteBuffer superBuffer = CreateClient.bufferCache - .renderDirectionalPartial(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); - KineticTileEntityRenderer.standardKineticRotationTransform(superBuffer, te, light) - .renderInto(ms, vb); + InstancedBuffer superBuffer = CreateClient.kineticRenderer + .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + KineticTileEntityRenderer.renderRotatingBuffer(te, superBuffer, light); } renderItems(te, partialTicks, ms, buffer, light, overlay); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 96186728f..3512d9572 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,13 +5,11 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -29,28 +27,31 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTick(); for (Direction direction : Iterate.directions) { Axis axis = direction.getAxis(); if (boxAxis != axis) continue; - float offset = getRotationOffsetForPosition(te, pos, axis); - float angle = (time * te.getSpeed() * 3f / 10) % 360; - float modifier = 1; - if (te instanceof SplitShaftTileEntity) - modifier = ((SplitShaftTileEntity) te).getRotationSpeedModifier(direction); + InstancedBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), direction); - angle *= modifier; - angle += offset; - angle = angle / 180f * (float) Math.PI; + shaft.setupInstance(data -> { + float speed = te.getSpeed(); - SuperByteBuffer superByteBuffer = - AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction); - kineticRotationTransform(superByteBuffer, te, axis, angle, light); - superByteBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + float modifier = 1; + + if (te instanceof SplitShaftTileEntity) + modifier = ((SplitShaftTileEntity) te).getRotationSpeedModifier(direction); + + speed *= modifier; + + data.setPackedLight(light) + .setRotationalSpeed(speed) + .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setPosition(pos); + }); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index 8c24f63b4..4f02505a2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock.Type; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 7462e355c..b4e0c48be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -4,12 +4,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; @@ -27,31 +25,32 @@ public class GearboxRenderer extends KineticTileEntityRenderer { int light, int overlay) { final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTick(); for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); if (boxAxis == axis) continue; - SuperByteBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction); - float offset = getRotationOffsetForPosition(te, pos, axis); - float angle = (time * te.getSpeed() * 3f / 10) % 360; + InstancedBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), direction); - if (te.getSpeed() != 0 && te.hasSource()) { - BlockPos source = te.source.subtract(te.getPos()); - Direction sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); - if (sourceFacing.getAxis() == direction.getAxis()) - angle *= sourceFacing == direction ? 1 : -1; - else if (sourceFacing.getAxisDirection() == direction.getAxisDirection()) - angle *= -1; - } + shaft.setupInstance(data -> { + float speed = te.getSpeed(); - angle += offset; - angle = angle / 180f * (float) Math.PI; + if (te.getSpeed() != 0 && te.hasSource()) { + BlockPos source = te.source.subtract(te.getPos()); + Direction sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); + if (sourceFacing.getAxis() == direction.getAxis()) + speed *= sourceFacing == direction ? 1 : -1; + else if (sourceFacing.getAxisDirection() == direction.getAxisDirection()) + speed *= -1; + } - kineticRotationTransform(shaft, te, axis, angle, light); - shaft.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + data.setPackedLight(light) + .setRotationalSpeed(speed) + .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setPosition(pos); + }); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index 5b3bd9dbc..6b52d157d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRendere import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java index 86b1b43e5..72d235388 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.block.diodes; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.tileEntity.renderer.ColoredOverlayTileEntityRenderer; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index ed0f46a09..8e61a8675 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index f770012ed..bab767872 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -6,12 +6,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -118,8 +116,8 @@ public class ArmRenderer extends KineticTileEntityRenderer { } @Override - protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.ARM_COG.renderOn(te.getBlockState()); + protected InstancedBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.ARM_COG.renderOnInstanced(te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java index dcc0521c8..716cf1648 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java index 706d9d931..37898e3ff 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java @@ -8,7 +8,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.schematics.block.LaunchedItem.ForBlockState; import com.simibubi.create.content.schematics.block.LaunchedItem.ForEntity; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 21971355a..063dc873a 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -13,8 +13,8 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.SuperByteBuffer; -import com.simibubi.create.foundation.utility.TileEntityRenderHelper; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.TileEntityRenderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index e3399d191..056043cdf 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -32,6 +32,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; +import com.simibubi.create.foundation.utility.render.FastKineticRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -76,6 +77,8 @@ public class ClientEvents { if (!isGameActive()) return; + CreateClient.kineticRenderer.tick(); + CreateClient.schematicSender.tick(); CreateClient.schematicAndQuillHandler.tick(); CreateClient.schematicHandler.tick(); @@ -112,6 +115,8 @@ public class ClientEvents { @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { + CreateClient.kineticRenderer.renderInstances(event); + MatrixStack ms = event.getMatrixStack(); ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); Vec3d view = info.getProjectedView(); diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java index 41741eb5b..2d2d84506 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.block.connected; import com.simibubi.create.foundation.block.connected.CTSpriteShifter.CTType; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour.CTContext; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; public abstract class CTSpriteShiftEntry extends SpriteShiftEntry { diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java index b8bc4b733..95648409e 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.tileEntity.renderer; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java index 6c02f67f9..bc4c0de82 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.model.pipeline.LightUtil; public abstract class SafeTileEntityRenderer extends TileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java new file mode 100644 index 000000000..998c8af87 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -0,0 +1,185 @@ +package com.simibubi.create.foundation.utility.render; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.render.shader.Shader; +import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.Texture; +import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.util.Direction; +import net.minecraft.util.math.vector.Matrix4f; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.fml.common.Mod; +import org.apache.commons.lang3.tuple.Pair; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL40; + +import java.util.*; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +import static com.simibubi.create.foundation.utility.render.SuperByteBufferCache.PARTIAL; + +@Mod.EventBusSubscriber(modid = Create.ID, value = Dist.CLIENT) +public class FastKineticRenderer { + Map, Cache> cache; + + Queue runs; + + public FastKineticRenderer() { + cache = new HashMap<>(); + runs = new ConcurrentLinkedQueue<>(); + registerCompartment(SuperByteBufferCache.GENERIC_TILE); + registerCompartment(SuperByteBufferCache.PARTIAL); + registerCompartment(SuperByteBufferCache.DIRECTIONAL_PARTIAL); + } + + public void tick() { + for (Cache cache : cache.values()) { + for (InstancedBuffer renderer : cache.asMap().values()) { + renderer.clearInstanceData(); + } + } + } + + public void enqueue(Runnable run) { + runs.add(run); + } + + public void renderInstances(RenderWorldLastEvent event) { + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + + RenderSystem.enableCull(); + + GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; + LightTexture lightManager = gameRenderer.getLightmapTextureManager(); + + ShaderHelper.useShader(Shader.ROTATING_INSTANCED, shader -> { + ShaderHelper.MATRIX_BUFFER.position(0); + event.getProjectionMatrix().write(ShaderHelper.MATRIX_BUFFER); + + int projection = GlStateManager.getUniformLocation(shader, "projection"); + GlStateManager.uniformMatrix4(projection, false, ShaderHelper.MATRIX_BUFFER); + + // view matrix + Vector3d pos = gameRenderer.getActiveRenderInfo().getProjectedView(); + Matrix4f translate = Matrix4f.translate((float) -pos.x, (float) -pos.y, (float) -pos.z); + translate.multiplyBackward(event.getMatrixStack().peek().getModel()); + + ShaderHelper.MATRIX_BUFFER.position(0); + translate.write(ShaderHelper.MATRIX_BUFFER); + int view = GlStateManager.getUniformLocation(shader, "view"); + GlStateManager.uniformMatrix4(view, false, ShaderHelper.MATRIX_BUFFER); + + Texture blockAtlasTexture = Minecraft.getInstance().textureManager.getTexture(PlayerContainer.BLOCK_ATLAS_TEXTURE); + Texture lightTexture = Minecraft.getInstance().textureManager.getTexture(lightManager.resourceLocation); + + GL40.glActiveTexture(GL40.GL_TEXTURE0); + GL40.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); + + GL40.glActiveTexture(GL40.GL_TEXTURE0 + 1); + GL40.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); + RenderSystem.texParameter(3553, 10241, 9729); + RenderSystem.texParameter(3553, 10240, 9729); + RenderSystem.texParameter(3553, 10242, 10496); + RenderSystem.texParameter(3553, 10243, 10496); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.enableTexture(); + }); + + cache.values() + .stream() + .flatMap(cache -> { + ConcurrentMap map = cache.asMap(); + + return map.values().stream(); + }) + .filter(type -> !type.isEmpty()) + .forEach(InstancedBuffer::render); + + ShaderHelper.releaseShader(); + + GL40.glActiveTexture(GL40.GL_TEXTURE0 + 1); + GL40.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GL40.glActiveTexture(GL40.GL_TEXTURE0); + GL40.glBindTexture(GL11.GL_TEXTURE_2D, 0); + + RenderSystem.disableCull(); + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + + while (!runs.isEmpty()) { + runs.remove().run(); + } + } + + public void registerCompartment(SuperByteBufferCache.Compartment instance) { + cache.put(instance, CacheBuilder.newBuilder().build()); + } + + public void registerCompartment(SuperByteBufferCache.Compartment instance, long ticksUntilExpired) { + cache.put(instance, CacheBuilder.newBuilder().expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS).build()); + } + + public InstancedBuffer renderPartialInstanced(AllBlockPartials partial, BlockState referenceState) { + return getInstanced(PARTIAL, partial, () -> rotatingInstancedRenderer(partial.get(), referenceState)); + } + + public InstancedBuffer renderDirectionalPartialInstanced(AllBlockPartials partial, BlockState referenceState, Direction dir, + MatrixStack modelTransform) { + return getInstanced(SuperByteBufferCache.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> rotatingInstancedRenderer(partial.get(), referenceState, modelTransform)); + } + + public InstancedBuffer renderBlockInstanced(SuperByteBufferCache.Compartment compartment, BlockState toRender) { + return getInstanced(compartment, toRender, () -> rotatingInstancedRenderer(toRender)); + } + + public InstancedBuffer getInstanced(SuperByteBufferCache.Compartment compartment, T key, Supplier supplier) { + Cache compartmentCache = this.cache.get(compartment); + try { + return compartmentCache.get(key, supplier::get); + } catch (ExecutionException e) { + e.printStackTrace(); + return null; + } + } + + + private InstancedBuffer rotatingInstancedRenderer(BlockState renderedState) { + BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + return rotatingInstancedRenderer(dispatcher.getModelForState(renderedState), renderedState); + } + + private InstancedBuffer rotatingInstancedRenderer(IBakedModel model, BlockState renderedState) { + return rotatingInstancedRenderer(model, renderedState, new MatrixStack()); + } + + private InstancedBuffer rotatingInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { + BufferBuilder builder = SuperByteBufferCache.getBufferBuilder(model, referenceState, ms); + + return new InstancedBuffer(builder); + } + + public void invalidate() { + cache.values().forEach(cache -> { + cache.asMap().values().forEach(InstancedBuffer::invalidate); + cache.invalidateAll(); + }); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java new file mode 100644 index 000000000..a2c0b4e6c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java @@ -0,0 +1,278 @@ +package com.simibubi.create.foundation.utility.render; + + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.CreateClient; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.util.math.BlockPos; +import org.lwjgl.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.function.Consumer; + +public class InstancedBuffer extends TemplateBuffer { + + public int vao, ebo, invariantVBO, instanceVBO, instanceCount; + + private final ArrayList data = new ArrayList<>(); + private boolean shouldBuild = true; + + public InstancedBuffer(BufferBuilder buf) { + super(buf); + setupMainData(); + } + + private void setupMainData() { + int floatSize = VertexFormatElement.Type.FLOAT.getSize(); + + int stride = floatSize * 8; + int invariantSize = count * stride; + + ByteBuffer constant = GLAllocation.createDirectByteBuffer(invariantSize); + constant.order(template.order()); + ((Buffer) constant).limit(invariantSize); + + int indicesSize = count * VertexFormatElement.Type.USHORT.getSize(); + ByteBuffer indices = GLAllocation.createDirectByteBuffer(indicesSize); + indices.order(template.order()); + ((Buffer) indices).limit(indicesSize); + + int vertexCount = vertexCount(template); + for (int i = 0; i < vertexCount; i++) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); + + constant.putFloat(getNX(template, i)); + constant.putFloat(getNY(template, i)); + constant.putFloat(getNZ(template, i)); + + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); + + indices.putShort((short) i); + } + constant.rewind(); + indices.rewind(); + + vao = GL30.glGenVertexArrays(); + GL30.glBindVertexArray(vao); + + ebo = GlStateManager.genBuffers(); + invariantVBO = GlStateManager.genBuffers(); + instanceVBO = GlStateManager.genBuffers(); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, invariantVBO); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant, GL15.GL_STATIC_DRAW); + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); + + // vertex positions + GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, stride, 0); + + // vertex normals + GL20.glVertexAttribPointer(1, 3, GL11.GL_FLOAT, false, stride, floatSize * 3L); + + // uv position + GL20.glVertexAttribPointer(2, 2, GL11.GL_FLOAT, false, stride, floatSize * 6L); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + // Deselect (bind to 0) the VAO + GL30.glBindVertexArray(0); + } + + public int numInstances() { + return instanceCount; + } + + public boolean isEmpty() { + return numInstances() == 0; + } + + public void clearInstanceData() { + instanceCount = 0; + shouldBuild = true; + } + + public void invalidate() { + CreateClient.kineticRenderer.enqueue(() -> { + GL15.glDeleteBuffers(invariantVBO); + GL15.glDeleteBuffers(instanceVBO); + GL15.glDeleteBuffers(ebo); + GL30.glDeleteVertexArrays(vao); + + clearInstanceData(); + }); + } + + public void setupInstance(Consumer setup) { + if (!shouldBuild) return; + + InstanceData instanceData = new InstanceData(); + setup.accept(instanceData); + + data.add(instanceData); + instanceCount++; + } + + public void render() { + + GL30.glBindVertexArray(vao); + if (finishBuffering()) { + + for (int i = 0; i <= 8; i++) { + GL40.glEnableVertexAttribArray(i); + } + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + + GL40.glDrawElementsInstanced(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); + + for (int i = 0; i <= 8; i++) { + GL40.glDisableVertexAttribArray(i); + } + } + GL30.glBindVertexArray(0); + } + + private boolean finishBuffering() { + if (!shouldBuild) return true; + + int floatSize = VertexFormatElement.Type.FLOAT.getSize(); + int intSize = VertexFormatElement.Type.INT.getSize(); + int stride = floatSize * 10 + intSize * 2; + + int instanceSize = data.size() * stride; + + if (instanceSize == 0) return false; + + ByteBuffer buffer = GLAllocation.createDirectByteBuffer(instanceSize); + buffer.order(template.order()); + ((Buffer) buffer).limit(instanceSize); + + data.forEach(instanceData -> instanceData.buffer(buffer)); + buffer.rewind(); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); + + // the render position + GL20.glVertexAttribPointer(3, 3, GL11.GL_FLOAT, false, stride, 0); + + // vertex lighting + GL20.glVertexAttribPointer(4, 2, GL11.GL_FLOAT, false, stride, floatSize * 3L); + + // rotational speed and offset + GL20.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, stride, floatSize * 5L); + GL20.glVertexAttribPointer(6, 1, GL11.GL_FLOAT, false, stride, floatSize * 6L); + // rotation axis + GL20.glVertexAttribPointer(7, 3, GL11.GL_FLOAT, false, stride, floatSize * 7L); + // uv scrolling + GL20.glVertexAttribPointer(8, 2, GL11.GL_INT, false, stride, floatSize * 10L); + + for (int i = 3; i <= 8; i++) { + GL40.glVertexAttribDivisor(i, 1); + } + + // Deselect (bind to 0) the VBO + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + + shouldBuild = false; + data.clear(); + + return true; + } + + public static class InstanceData { + private float x; + private float y; + private float z; + private int packedLight = 0; + private float rotationalSpeed; + private float rotationOffset; + private float rotationAxisX; + private float rotationAxisY; + private float rotationAxisZ; + private int cycleLength; + private int cycleOffset; + + public InstanceData setPackedLight(int packedLight) { + this.packedLight = packedLight; + return this; + } + + public InstanceData setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return this; + } + + public InstanceData setRotationOffset(float rotationOffset) { + this.rotationOffset = rotationOffset; + return this; + } + + public InstanceData setPosition(Vector3f pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public InstanceData setPosition(BlockPos pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public InstanceData setRotationAxis(Vector3f axis) { + this.rotationAxisX = axis.getX(); + this.rotationAxisY = axis.getY(); + this.rotationAxisZ = axis.getZ(); + return this; + } + + public InstanceData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { + this.rotationAxisX = rotationAxisX; + this.rotationAxisY = rotationAxisY; + this.rotationAxisZ = rotationAxisZ; + return this; + } + + public InstanceData setCycleLength(int cycleLength) { + this.cycleLength = cycleLength; + return this; + } + + public InstanceData setCycleOffset(int cycleOffset) { + this.cycleOffset = cycleOffset; + return this; + } + + void buffer(ByteBuffer buf) { + float blockLightCoordinates = LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; + float skyLightCoordinates = LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; + + buf.putFloat(x); + buf.putFloat(y); + buf.putFloat(z); + buf.putFloat(blockLightCoordinates); + buf.putFloat(skyLightCoordinates); + buf.putFloat(rotationalSpeed); + buf.putFloat(rotationOffset); + buf.putFloat(rotationAxisX); + buf.putFloat(rotationAxisY); + buf.putFloat(rotationAxisZ); + buf.putInt(cycleLength); + buf.putInt(cycleOffset); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ShadowRenderHelper.java b/src/main/java/com/simibubi/create/foundation/utility/render/ShadowRenderHelper.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/utility/ShadowRenderHelper.java rename to src/main/java/com/simibubi/create/foundation/utility/render/ShadowRenderHelper.java index 0a8f5349a..a172cefd1 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ShadowRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ShadowRenderHelper.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility; +package com.simibubi.create.foundation.utility.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBuffer.java similarity index 72% rename from src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java rename to src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBuffer.java index d7c8b0569..25c20d11d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBuffer.java @@ -1,19 +1,16 @@ -package com.simibubi.create.foundation.utility; +package com.simibubi.create.foundation.utility.render; import java.nio.Buffer; import java.nio.ByteBuffer; -import java.nio.ByteOrder; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; -import com.mojang.datafixers.util.Pair; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import it.unimi.dsi.fastutil.longs.Long2DoubleMap; import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.BufferBuilder.DrawState; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.Vector4f; @@ -23,15 +20,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; import net.minecraft.world.World; -public class SuperByteBuffer { +public class SuperByteBuffer extends TemplateBuffer { public interface IVertexLighter { public int getPackedLight(float x, float y, float z); } - protected ByteBuffer template; - protected int formatSize; - // Vertex Position private MatrixStack transforms; @@ -51,21 +45,7 @@ public class SuperByteBuffer { private float sheetSize; public SuperByteBuffer(BufferBuilder buf) { - Pair state = buf.popData(); - ByteBuffer rendered = state.getSecond(); - rendered.order(ByteOrder.nativeOrder()); // Vanilla bug, endianness does not carry over into sliced buffers - - formatSize = buf.getVertexFormat() - .getSize(); - int size = state.getFirst() - .getCount() * formatSize; - - template = GLAllocation.createDirectByteBuffer(size); - template.order(rendered.order()); - ((Buffer) template).limit(((Buffer) rendered).limit()); - template.put(rendered); - ((Buffer) template).rewind(); - + super(buf); transforms = new MatrixStack(); } @@ -219,66 +199,6 @@ public class SuperByteBuffer { return this; } - protected int vertexCount(ByteBuffer buffer) { - return ((Buffer) buffer).limit() / formatSize; - } - - protected int getBufferPosition(int vertexIndex) { - return vertexIndex * formatSize; - } - - protected float getX(ByteBuffer buffer, int index) { - return buffer.getFloat(getBufferPosition(index)); - } - - protected float getY(ByteBuffer buffer, int index) { - return buffer.getFloat(getBufferPosition(index) + 4); - } - - protected float getZ(ByteBuffer buffer, int index) { - return buffer.getFloat(getBufferPosition(index) + 8); - } - - protected byte getR(ByteBuffer buffer, int index) { - return buffer.get(getBufferPosition(index) + 12); - } - - protected byte getG(ByteBuffer buffer, int index) { - return buffer.get(getBufferPosition(index) + 13); - } - - protected byte getB(ByteBuffer buffer, int index) { - return buffer.get(getBufferPosition(index) + 14); - } - - protected byte getA(ByteBuffer buffer, int index) { - return buffer.get(getBufferPosition(index) + 15); - } - - protected float getU(ByteBuffer buffer, int index) { - return buffer.getFloat(getBufferPosition(index) + 16); - } - - protected float getV(ByteBuffer buffer, int index) { - return buffer.getFloat(getBufferPosition(index) + 20); - } - - protected int getLight(ByteBuffer buffer, int index) { - return buffer.getInt(getBufferPosition(index) + 24); - } - - protected byte getNX(ByteBuffer buffer, int index) { - return buffer.get(getBufferPosition(index) + 28); - } - - protected byte getNY(ByteBuffer buffer, int index) { - return buffer.get(getBufferPosition(index) + 29); - } - - protected byte getNZ(ByteBuffer buffer, int index) { - return buffer.get(getBufferPosition(index) + 30); - } - private static int getLight(World world, Vector4f lightPos) { BlockPos.Mutable pos = new BlockPos.Mutable(); double sky = 0, block = 0; diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java similarity index 86% rename from src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java rename to src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java index f37b65912..db86d16fa 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java @@ -1,11 +1,15 @@ -package com.simibubi.create.foundation.utility; +package com.simibubi.create.foundation.utility.render; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; +import com.google.common.collect.Collections2; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.VirtualEmptyModelData; +import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraftforge.client.event.RenderWorldLastEvent; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; @@ -50,7 +54,6 @@ public class SuperByteBufferCache { public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState) { return get(PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState)); } - public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState, MatrixStack modelTransform) { return get(PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState, modelTransform)); @@ -108,21 +111,27 @@ public class SuperByteBufferCache { } private SuperByteBuffer standardModelRender(IBakedModel model, BlockState referenceState, MatrixStack ms) { + BufferBuilder builder = getBufferBuilder(model, referenceState, ms); + + return new SuperByteBuffer(builder); + } + + public static BufferBuilder getBufferBuilder(IBakedModel model, BlockState referenceState, MatrixStack ms) { Minecraft mc = Minecraft.getInstance(); BlockRendererDispatcher dispatcher = mc.getBlockRendererDispatcher(); BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); BufferBuilder builder = new BufferBuilder(512); builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - blockRenderer.renderModel(mc.world, model, referenceState, BlockPos.ZERO.up(255), ms, builder, true, - mc.world.rand, 42, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); + blockRenderer.renderModel(mc.world, model, referenceState, BlockPos.ZERO.up(255), ms, builder, true, mc.world.rand, 42, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); builder.finishDrawing(); - - return new SuperByteBuffer(builder); + return builder; } + public void invalidate() { cache.forEach((comp, cache) -> cache.invalidateAll()); + CreateClient.kineticRenderer.invalidate(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java new file mode 100644 index 000000000..222e24df0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java @@ -0,0 +1,107 @@ +package com.simibubi.create.foundation.utility.render; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.datafixers.util.Pair; +import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import it.unimi.dsi.fastutil.longs.Long2DoubleMap; +import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Matrix4f; +import net.minecraft.util.math.vector.Vector4f; +import net.minecraft.world.LightType; +import net.minecraft.world.World; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.time.temporal.TemporalAccessor; + +public class TemplateBuffer { + protected ByteBuffer template; + protected int formatSize; + protected int count; + + public TemplateBuffer(BufferBuilder buf) { + Pair state = buf.popData(); + ByteBuffer rendered = state.getSecond(); + rendered.order(ByteOrder.nativeOrder()); // Vanilla bug, endianness does not carry over into sliced buffers + + formatSize = buf.getVertexFormat() + .getSize(); + count = state.getFirst().getCount(); + int size = count * formatSize; + + template = GLAllocation.createDirectByteBuffer(size); + template.order(rendered.order()); + ((Buffer)template).limit(((Buffer)rendered).limit()); + template.put(rendered); + ((Buffer)template).rewind(); + } + + public boolean isEmpty() { + return ((Buffer) template).limit() == 0; + } + + protected int vertexCount(ByteBuffer buffer) { + return ((Buffer)buffer).limit() / formatSize; + } + + protected int getBufferPosition(int vertexIndex) { + return vertexIndex * formatSize; + } + + protected float getX(ByteBuffer buffer, int index) { + return buffer.getFloat(getBufferPosition(index)); + } + + protected float getY(ByteBuffer buffer, int index) { + return buffer.getFloat(getBufferPosition(index) + 4); + } + + protected float getZ(ByteBuffer buffer, int index) { + return buffer.getFloat(getBufferPosition(index) + 8); + } + + protected byte getR(ByteBuffer buffer, int index) { + return buffer.get(getBufferPosition(index) + 12); + } + + protected byte getG(ByteBuffer buffer, int index) { + return buffer.get(getBufferPosition(index) + 13); + } + + protected byte getB(ByteBuffer buffer, int index) { + return buffer.get(getBufferPosition(index) + 14); + } + + protected byte getA(ByteBuffer buffer, int index) { + return buffer.get(getBufferPosition(index) + 15); + } + + protected float getU(ByteBuffer buffer, int index) { + return buffer.getFloat(getBufferPosition(index) + 16); + } + + protected float getV(ByteBuffer buffer, int index) { + return buffer.getFloat(getBufferPosition(index) + 20); + } + + protected int getLight(ByteBuffer buffer, int index) { + return buffer.getInt(getBufferPosition(index) + 24); + } + + protected byte getNX(ByteBuffer buffer, int index) { + return buffer.get(getBufferPosition(index) + 28); + } + + protected byte getNY(ByteBuffer buffer, int index) { + return buffer.get(getBufferPosition(index) + 29); + } + + protected byte getNZ(ByteBuffer buffer, int index) { + return buffer.get(getBufferPosition(index) + 30); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java similarity index 95% rename from src/main/java/com/simibubi/create/foundation/utility/TileEntityRenderHelper.java rename to src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java index ea9e6e361..9dbab11a7 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility; +package com.simibubi.create.foundation.utility.render; import java.util.Iterator; @@ -6,6 +6,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.Matrix4f; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java new file mode 100644 index 000000000..d0d3b34c1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.utility.render.shader; + +public enum Shader { + ROTATING_INSTANCED("shader/instanced.vert", "shader/instanced.frag"); + + public final String vert; + public final String frag; + + Shader(String vert, String frag) { + this.vert = vert; + this.frag = frag; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderCallback.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderCallback.java new file mode 100644 index 000000000..5ed0dbb2d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderCallback.java @@ -0,0 +1,10 @@ +package com.simibubi.create.foundation.utility.render.shader; + +/** + * A Callback for when a shader is called. Used to define shader uniforms. + */ +@FunctionalInterface +public interface ShaderCallback { + + void call(int shader); +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java new file mode 100644 index 000000000..2a58b7a2e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java @@ -0,0 +1,140 @@ +package com.simibubi.create.foundation.utility.render.shader; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.Create; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.minecraft.client.MainWindow; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.shader.IShaderManager; +import net.minecraft.client.shader.ShaderLinkHelper; +import net.minecraft.client.shader.ShaderLoader; +import net.minecraft.resources.IReloadableResourceManager; +import net.minecraft.resources.IResourceManager; +import net.minecraft.resources.IResourceManagerReloadListener; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.lwjgl.system.MemoryUtil; + +import javax.annotation.Nullable; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.FloatBuffer; +import java.util.EnumMap; +import java.util.Locale; +import java.util.Map; + +public class ShaderHelper { + + public static final Logger log = LogManager.getLogger("shader"); + + public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); + public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); + + private static final Map PROGRAMS = new EnumMap<>(Shader.class); + + @SuppressWarnings("deprecation") + public static void initShaders() { + // Can be null when running datagenerators due to the unfortunate time we call this + if (Minecraft.getInstance() != null + && Minecraft.getInstance().getResourceManager() instanceof IReloadableResourceManager) { + ((IReloadableResourceManager) Minecraft.getInstance().getResourceManager()).addReloadListener( + (IResourceManagerReloadListener) manager -> { + PROGRAMS.values().forEach(ShaderLinkHelper::deleteShader); + PROGRAMS.clear(); + for (Shader shader : Shader.values()) { + createProgram(manager, shader); + } + }); + } + } + + public static void useShader(Shader shader) { + useShader(shader, null); + } + + public static void useShader(Shader shader, @Nullable ShaderCallback cb) { + ShaderProgram prog = PROGRAMS.get(shader); + if (prog == null) { + return; + } + + int program = prog.getProgram(); + ShaderLinkHelper.useProgram(program); + + int time = GlStateManager.getUniformLocation(program, "time"); + FLOAT_BUFFER.position(0); + FLOAT_BUFFER.put(0, AnimationTickHolder.getRenderTick()); + GlStateManager.uniform1(time, FLOAT_BUFFER); + + int ticks = GlStateManager.getUniformLocation(program, "ticks"); + GlStateManager.uniform1(ticks, AnimationTickHolder.ticks); + + if (cb != null) { + cb.call(program); + } + } + + public static void releaseShader() { + ShaderLinkHelper.useProgram(0); + } + + private static void createProgram(IResourceManager manager, Shader shader) { + try { + ShaderLoader vert = createShader(manager, shader.vert, ShaderLoader.ShaderType.VERTEX); + ShaderLoader frag = createShader(manager, shader.frag, ShaderLoader.ShaderType.FRAGMENT); + int progId = ShaderLinkHelper.createProgram(); + ShaderProgram prog = new ShaderProgram(progId, vert, frag); + ShaderLinkHelper.linkProgram(prog); + PROGRAMS.put(shader, prog); + + log.info("Loaded program {}", shader.name()); + } catch (IOException ex) { + log.error("Failed to load program {}", shader.name(), ex); + } + } + + private static ShaderLoader createShader(IResourceManager manager, String filename, ShaderLoader.ShaderType shaderType) throws IOException { + ResourceLocation loc = new ResourceLocation(Create.ID, filename); + try (InputStream is = new BufferedInputStream(manager.getResource(loc).getInputStream())) { + return ShaderLoader.func_216534_a(shaderType, loc.toString(), is, shaderType.name().toLowerCase(Locale.ROOT)); + } + } + + private static class ShaderProgram implements IShaderManager { + private final int program; + private final ShaderLoader vert; + private final ShaderLoader frag; + + private ShaderProgram(int program, ShaderLoader vert, ShaderLoader frag) { + this.program = program; + this.vert = vert; + this.frag = frag; + } + + @Override + public int getProgram() { + return program; + } + + @Override + public void markDirty() { + + } + + @Override + public ShaderLoader getVertexShaderLoader() { + return vert; + } + + @Override + public ShaderLoader getFragmentShaderLoader() { + return frag; + } + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 98de531a9..fdc144a8b 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -23,4 +23,8 @@ public net.minecraft.tileentity.BeaconTileEntity field_174909_f # beamSegments # Server Tick List (For stopping placed fluids from spilling) public net.minecraft.world.server.ServerTickList field_205374_d # pendingTickListEntriesHashSet -public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet \ No newline at end of file +public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet + +# Lightmap information for instanced rendering +public net.minecraft.client.renderer.LightTexture field_205112_c #resourceLocation +public net.minecraft.client.Minecraft field_193996_ah #renderPartialTicksPaused \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag new file mode 100644 index 000000000..81596480c --- /dev/null +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -0,0 +1,29 @@ +#version 440 core +in vec2 TexCoords; +in vec2 Light; + +out vec4 fragColor; + +layout(binding=0) uniform sampler2D BlockAtlas; +layout(binding=1) uniform sampler2D LightMap; + +float blendDarken(float base, float blend) { + return min(blend,base); +} + +vec3 blendDarken(vec3 base, vec3 blend) { + return vec3(blendDarken(base.r,blend.r),blendDarken(base.g,blend.g),blendDarken(base.b,blend.b)); +} + +vec3 blendDarken(vec3 base, vec3 blend, float opacity) { + return (blendDarken(base, blend) * opacity + base * (1.0 - opacity)); +} + +void main() +{ + vec4 tex = texture2D(BlockAtlas, TexCoords); + + vec4 light = texture2D(LightMap, Light); + + fragColor = vec4(blendDarken(tex.rgb, light.rgb, light.a), tex.a); +} \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/instanced.vert b/src/main/resources/assets/create/shader/instanced.vert new file mode 100644 index 000000000..c34947ac9 --- /dev/null +++ b/src/main/resources/assets/create/shader/instanced.vert @@ -0,0 +1,60 @@ +#version 330 core +#define PI 3.1415926538 +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aNormal; +layout (location = 2) in vec2 aTexCoords; + +layout (location = 3) in vec3 instancePos; +layout (location = 4) in vec2 light; +layout (location = 5) in float speed; +layout (location = 6) in float rotationOffset; +layout (location = 7) in vec3 rotationAxis; +layout (location = 8) in int[2] uvScroll; // uvScroll[0] <- cycleLength, uvScroll[1] <- cycleOffset + +out vec2 TexCoords; +out vec2 Light; + +uniform float time; +uniform int ticks; +uniform mat4 projection; +uniform mat4 view; + +mat4 rotationMatrix(vec3 axis, float angle) +{ + axis = normalize(axis); + float s = sin(angle); + float c = cos(angle); + float oc = 1.0 - c; + + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); +} + +void main() +{ + vec4 renderPos; + int textureIndex = 0; + if (abs(rotationAxis.x) + abs(rotationAxis.y) + abs(rotationAxis.z) < 0.2) { + renderPos = vec4(aPos + instancePos, 1f); + + textureIndex = int((speed * time / 36) + uvScroll[1]) % uvScroll[0]; + if (textureIndex < 0) { + textureIndex += uvScroll[0]; + } + + } else { + float degrees = rotationOffset + time * speed * 3./10.; + float angle = fract(-degrees / 360.) * PI * 2.; + + renderPos = rotationMatrix(rotationAxis, angle) * vec4(aPos - vec3(0.5), 1f); + + renderPos += vec4(instancePos + vec3(0.5), 0); + } + + TexCoords = aTexCoords + vec2(float(textureIndex % 4) / 4f, float(textureIndex / 4) / 4f); + + gl_Position = projection * view * renderPos; + Light = light; +} \ No newline at end of file From 102e392ab49f4c29448fa9aee31e6ef22988a468 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 4 Jan 2021 20:10:38 -0800 Subject: [PATCH 002/147] merge experimental rendering from 1.16 to 1.15 part II --- .../com/simibubi/create/AllBlockPartials.java | 19 +- .../base/KineticTileEntityRenderer.java | 7 +- .../components/actors/DrillRenderer.java | 5 +- .../components/clock/CuckooClockRenderer.java | 11 +- .../components/fan/EncasedFanRenderer.java | 9 +- .../components/flywheel/FlywheelRenderer.java | 9 +- .../millstone/MillstoneRenderer.java | 5 +- .../motor/CreativeMotorRenderer.java | 5 +- .../components/saw/SawRenderer.java | 5 +- .../bearing/BearingRenderer.java | 9 +- .../contraptions/fluids/PumpRenderer.java | 5 +- .../advanced/SpeedControllerRenderer.java | 3 +- .../relays/belt/BeltRenderer.java | 31 +-- .../relays/encased/SplitShaftRenderer.java | 3 +- .../relays/gearbox/GearboxRenderer.java | 3 +- .../block/mechanicalArm/ArmRenderer.java | 5 +- .../foundation/utility/render/BeltBuffer.java | 121 ++++++++++++ .../utility/render/FastKineticRenderer.java | 128 +++++++----- .../utility/render/InstancedBuffer.java | 183 ++++-------------- .../utility/render/RotatingBuffer.java | 143 ++++++++++++++ .../utility/render/shader/Shader.java | 3 +- .../resources/assets/create/shader/belt.vert | 35 ++++ .../shader/{instanced.vert => rotating.vert} | 29 +-- 23 files changed, 506 insertions(+), 270 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java create mode 100644 src/main/resources/assets/create/shader/belt.vert rename src/main/resources/assets/create/shader/{instanced.vert => rotating.vert} (56%) diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 2d92ff390..84f59e743 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -13,7 +13,8 @@ import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.A import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.BeltBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.IBakedModel; @@ -216,15 +217,19 @@ public class AllBlockPartials { return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); } - public InstancedBuffer renderOnInstanced(BlockState referenceState) { - return CreateClient.kineticRenderer.renderPartialInstanced(this, referenceState); + public RotatingBuffer renderOnRotating(BlockState referenceState) { + return CreateClient.kineticRenderer.renderPartialRotating(this, referenceState); } - public InstancedBuffer renderOnDirectionalSouthInstanced(BlockState referenceState) { - Direction facing = referenceState.get(FACING); - return renderOnDirectionalSouthInstanced(referenceState, facing); + public BeltBuffer renderOnBelt(BlockState referenceState) { + return CreateClient.kineticRenderer.renderPartialBelt(this, referenceState); } - public InstancedBuffer renderOnDirectionalSouthInstanced(BlockState referenceState, Direction facing) { + + public RotatingBuffer renderOnDirectionalSouthRotating(BlockState referenceState) { + Direction facing = referenceState.get(FACING); + return renderOnDirectionalSouthRotating(referenceState, facing); + } + public RotatingBuffer renderOnDirectionalSouthRotating(BlockState referenceState, Direction facing) { MatrixStack ms = new MatrixStack(); // TODO 1.15 find a way to cache this model matrix computation MatrixStacker.of(ms) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 0110b2455..2996f04d8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -9,6 +9,7 @@ import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; @@ -49,11 +50,11 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer { final BlockPos pos = te.getPos(); Axis axis = ((IRotate) te.getBlockState() @@ -129,7 +130,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 59d7f81ec..e175c5f03 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; @@ -75,10 +76,10 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { } @Override - protected InstancedBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), te.getBlockState() - .get(HORIZONTAL_FACING) - .getOpposite()); + protected RotatingBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), te.getBlockState() + .get(HORIZONTAL_FACING) + .getOpposite()); } protected SuperByteBuffer transformConnector(SuperByteBuffer buffer, boolean upper, boolean rotating, float angle, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index a238a2ba1..6481a47a1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class MillstoneRenderer extends KineticTileEntityRenderer { @@ -15,8 +16,8 @@ public class MillstoneRenderer extends KineticTileEntityRenderer { } @Override - protected InstancedBuffer getRotatedModel(KineticTileEntity te) { - return CreateClient.kineticRenderer.renderPartialInstanced(AllBlockPartials.MILLSTONE_COG, te.getBlockState()); + protected RotatingBuffer getRotatedModel(KineticTileEntity te) { + return CreateClient.kineticRenderer.renderPartialRotating(AllBlockPartials.MILLSTONE_COG, te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 699c59186..1bbd0e558 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class CreativeMotorRenderer extends KineticTileEntityRenderer { @@ -14,8 +15,8 @@ public class CreativeMotorRenderer extends KineticTileEntityRenderer { } @Override - protected InstancedBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState()); + protected RotatingBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 4ad2d204a..2a17f0849 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -13,6 +13,7 @@ import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer import com.simibubi.create.foundation.utility.*; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -123,10 +124,10 @@ public class SawRenderer extends SafeTileEntityRenderer { } } - protected InstancedBuffer getRotatedModel(KineticTileEntity te) { + protected RotatingBuffer getRotatedModel(KineticTileEntity te) { BlockState state = te.getBlockState(); if (state.get(FACING).getAxis().isHorizontal()) - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); return CreateClient.kineticRenderer.renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index fece4075f..a1ba39595 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -44,10 +45,10 @@ public class BearingRenderer extends KineticTileEntityRenderer { } @Override - protected InstancedBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), te.getBlockState() - .get(BearingBlock.FACING) - .getOpposite()); + protected RotatingBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), te.getBlockState() + .get(BearingBlock.FACING) + .getOpposite()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 372cab409..70a527779 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; @@ -52,8 +53,8 @@ public class PumpRenderer extends KineticTileEntityRenderer { } @Override - protected InstancedBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthInstanced(te.getBlockState()); + protected RotatingBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index dae604e77..1031e592f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -23,7 +24,7 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer { : start ? AllBlockPartials.BELT_START : end ? AllBlockPartials.BELT_END : AllBlockPartials.BELT_MIDDLE; - InstancedBuffer beltBuffer = beltPartial.renderOnInstanced(blockState); + BeltBuffer beltBuffer = beltPartial.renderOnBelt(blockState); + SpriteShiftEntry spriteShift = + diagonal ? AllSpriteShifts.BELT_DIAGONAL : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; + int cycleLength = diagonal ? 12 : 16; int cycleOffset = bottom ? 8 : 0; @@ -108,12 +109,16 @@ public class BeltRenderer extends SafeTileEntityRenderer { || sideways && axisDirection == AxisDirection.NEGATIVE) speed = -speed; - data.setPackedLight(light) - .setPosition(te.getPos()) - .setRotationalSpeed(speed) - .setRotationAxis(0, 0, 0) - .setCycleLength(cycleLength) - .setCycleOffset(cycleOffset); + Matrix4f m = new Matrix4f(); + m.loadIdentity(); + m.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0))); + m.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(sideways ? 90 : 0)); + m.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0)); + + data.setPosition(te.getPos()) + .setModel(m) + .setPackedLight(light) + .setRotationalSpeed(speed); }); // Diagonal belt do not have a separate bottom model @@ -138,7 +143,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { msr.rotateX(90); msr.unCentre(); - InstancedBuffer superBuffer = CreateClient.kineticRenderer + RotatingBuffer superBuffer = CreateClient.kineticRenderer .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); KineticTileEntityRenderer.renderRotatingBuffer(te, superBuffer, light); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 3512d9572..be421d744 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -34,7 +35,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { continue; - InstancedBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), direction); + RotatingBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction); shaft.setupInstance(data -> { float speed = te.getSpeed(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index b4e0c48be..52b54411f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; @@ -31,7 +32,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { if (boxAxis == axis) continue; - InstancedBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthInstanced(te.getBlockState(), direction); + RotatingBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction); shaft.setupInstance(data -> { float speed = te.getSpeed(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index bab767872..334e5317e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -9,6 +9,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.P import com.simibubi.create.foundation.utility.*; import com.simibubi.create.foundation.utility.render.InstancedBuffer; +import com.simibubi.create.foundation.utility.render.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -116,8 +117,8 @@ public class ArmRenderer extends KineticTileEntityRenderer { } @Override - protected InstancedBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.ARM_COG.renderOnInstanced(te.getBlockState()); + protected RotatingBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.ARM_COG.renderOnRotating(te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java new file mode 100644 index 000000000..a13a20f4c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java @@ -0,0 +1,121 @@ +package com.simibubi.create.foundation.utility.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.util.math.BlockPos; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL40; + +import java.nio.Buffer; +import java.nio.ByteBuffer; + +public class BeltBuffer extends InstancedBuffer { + public BeltBuffer(BufferBuilder buf) { + super(buf); + } + + @Override + protected BeltData newInstance() { + return new BeltData(); + } + + @Override + protected int numAttributes() { + return 9; + } + + @Override + protected void finishBufferingInternal() { + int floatSize = VertexFormatElement.Type.FLOAT.getSize(); + int intSize = VertexFormatElement.Type.INT.getSize(); + int stride = floatSize * 22; + + int instanceSize = instanceCount * stride; + + ByteBuffer buffer = GLAllocation.createDirectByteBuffer(instanceSize); + buffer.order(template.order()); + ((Buffer) buffer).limit(instanceSize); + + data.forEach(instanceData -> instanceData.buffer(buffer)); + buffer.rewind(); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); + + // render position + GL20.glVertexAttribPointer(3, 3, GL11.GL_FLOAT, false, stride, 0); + + // model matrix + for (int i = 0; i < 4; i++) { + GL20.glVertexAttribPointer(4 + i, 4, GL11.GL_FLOAT, false, stride, floatSize * (4 * i + 3)); + } + + // light map + GL20.glVertexAttribPointer(8, 2, GL11.GL_FLOAT, false, stride, floatSize * 16L); + + // rotational speed and offset + GL20.glVertexAttribPointer(9, 1, GL11.GL_FLOAT, false, stride, floatSize * 18L); + + for (int i = 3; i <= numAttributes(); i++) { + GL40.glVertexAttribDivisor(i, 1); + } + + // Deselect (bind to 0) the VBO + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + } + + public static class BeltData { + private float x; + private float y; + private float z; + private Matrix4f model; + private int packedLight; + private float rotationalSpeed; + + public BeltData setPosition(BlockPos pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public BeltData setModel(Matrix4f model) { + this.model = model; + return this; + } + + public BeltData setPackedLight(int packedLight) { + this.packedLight = packedLight; + return this; + } + + public BeltData setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return this; + } + + void buffer(ByteBuffer buf) { + float blockLightCoordinates = LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; + float skyLightCoordinates = LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; + + buf.putFloat(x); + buf.putFloat(y); + buf.putFloat(z); + + InstancedBuffer.MATRIX_BUF.rewind(); + model.write(InstancedBuffer.MATRIX_BUF.asFloatBuffer()); + InstancedBuffer.MATRIX_BUF.rewind(); + + buf.put(InstancedBuffer.MATRIX_BUF); + buf.putFloat(blockLightCoordinates); + buf.putFloat(skyLightCoordinates); + buf.putFloat(rotationalSpeed); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index 998c8af87..5ea1f5203 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -8,6 +8,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.render.shader.Shader; +import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -36,12 +37,14 @@ import static com.simibubi.create.foundation.utility.render.SuperByteBufferCache @Mod.EventBusSubscriber(modid = Create.ID, value = Dist.CLIENT) public class FastKineticRenderer { - Map, Cache> cache; + Map, Cache> rotating; + Map, Cache> belts; Queue runs; public FastKineticRenderer() { - cache = new HashMap<>(); + rotating = new HashMap<>(); + belts = new HashMap<>(); runs = new ConcurrentLinkedQueue<>(); registerCompartment(SuperByteBufferCache.GENERIC_TILE); registerCompartment(SuperByteBufferCache.PARTIAL); @@ -49,8 +52,14 @@ public class FastKineticRenderer { } public void tick() { - for (Cache cache : cache.values()) { - for (InstancedBuffer renderer : cache.asMap().values()) { + for (Cache cache : rotating.values()) { + for (RotatingBuffer renderer : cache.asMap().values()) { + renderer.clearInstanceData(); + } + } + + for (Cache cache : belts.values()) { + for (BeltBuffer renderer : cache.asMap().values()) { renderer.clearInstanceData(); } } @@ -69,7 +78,22 @@ public class FastKineticRenderer { GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; LightTexture lightManager = gameRenderer.getLightmapTextureManager(); - ShaderHelper.useShader(Shader.ROTATING_INSTANCED, shader -> { + Texture blockAtlasTexture = Minecraft.getInstance().textureManager.getTexture(PlayerContainer.BLOCK_ATLAS_TEXTURE); + Texture lightTexture = Minecraft.getInstance().textureManager.getTexture(lightManager.resourceLocation); + + GL40.glActiveTexture(GL40.GL_TEXTURE0); + GL40.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); + + GL40.glActiveTexture(GL40.GL_TEXTURE0 + 1); + GL40.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); + RenderSystem.texParameter(3553, 10241, 9729); + RenderSystem.texParameter(3553, 10240, 9729); + RenderSystem.texParameter(3553, 10242, 10496); + RenderSystem.texParameter(3553, 10243, 10496); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.enableTexture(); + + ShaderCallback callback = shader -> { ShaderHelper.MATRIX_BUFFER.position(0); event.getProjectionMatrix().write(ShaderHelper.MATRIX_BUFFER); @@ -85,32 +109,22 @@ public class FastKineticRenderer { translate.write(ShaderHelper.MATRIX_BUFFER); int view = GlStateManager.getUniformLocation(shader, "view"); GlStateManager.uniformMatrix4(view, false, ShaderHelper.MATRIX_BUFFER); + }; + ShaderHelper.useShader(Shader.ROTATING_INSTANCED, callback); - Texture blockAtlasTexture = Minecraft.getInstance().textureManager.getTexture(PlayerContainer.BLOCK_ATLAS_TEXTURE); - Texture lightTexture = Minecraft.getInstance().textureManager.getTexture(lightManager.resourceLocation); + rotating.values() + .stream() + .flatMap(cache -> cache.asMap().values().stream()) + .filter(type -> !type.isEmpty()) + .forEach(InstancedBuffer::render); - GL40.glActiveTexture(GL40.GL_TEXTURE0); - GL40.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); + ShaderHelper.useShader(Shader.BELT_INSTANCED, callback); - GL40.glActiveTexture(GL40.GL_TEXTURE0 + 1); - GL40.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); - RenderSystem.texParameter(3553, 10241, 9729); - RenderSystem.texParameter(3553, 10240, 9729); - RenderSystem.texParameter(3553, 10242, 10496); - RenderSystem.texParameter(3553, 10243, 10496); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.enableTexture(); - }); - - cache.values() - .stream() - .flatMap(cache -> { - ConcurrentMap map = cache.asMap(); - - return map.values().stream(); - }) - .filter(type -> !type.isEmpty()) - .forEach(InstancedBuffer::render); + belts.values() + .stream() + .flatMap(cache -> cache.asMap().values().stream()) + .filter(type -> !type.isEmpty()) + .forEach(InstancedBuffer::render); ShaderHelper.releaseShader(); @@ -129,29 +143,45 @@ public class FastKineticRenderer { } public void registerCompartment(SuperByteBufferCache.Compartment instance) { - cache.put(instance, CacheBuilder.newBuilder().build()); + rotating.put(instance, CacheBuilder.newBuilder().build()); + belts.put(instance, CacheBuilder.newBuilder().build()); } public void registerCompartment(SuperByteBufferCache.Compartment instance, long ticksUntilExpired) { - cache.put(instance, CacheBuilder.newBuilder().expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS).build()); + rotating.put(instance, CacheBuilder.newBuilder().expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS).build()); + belts.put(instance, CacheBuilder.newBuilder().expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS).build()); } - public InstancedBuffer renderPartialInstanced(AllBlockPartials partial, BlockState referenceState) { - return getInstanced(PARTIAL, partial, () -> rotatingInstancedRenderer(partial.get(), referenceState)); + public RotatingBuffer renderPartialRotating(AllBlockPartials partial, BlockState referenceState) { + return getRotating(PARTIAL, partial, () -> rotatingInstancedRenderer(partial.get(), referenceState)); } - public InstancedBuffer renderDirectionalPartialInstanced(AllBlockPartials partial, BlockState referenceState, Direction dir, + public BeltBuffer renderPartialBelt(AllBlockPartials partial, BlockState referenceState) { + return getBelt(PARTIAL, partial, () -> beltInstancedRenderer(partial.get(), referenceState)); + } + + public RotatingBuffer renderDirectionalPartialInstanced(AllBlockPartials partial, BlockState referenceState, Direction dir, MatrixStack modelTransform) { - return getInstanced(SuperByteBufferCache.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> rotatingInstancedRenderer(partial.get(), referenceState, modelTransform)); + return getRotating(SuperByteBufferCache.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> rotatingInstancedRenderer(partial.get(), referenceState, modelTransform)); } - public InstancedBuffer renderBlockInstanced(SuperByteBufferCache.Compartment compartment, BlockState toRender) { - return getInstanced(compartment, toRender, () -> rotatingInstancedRenderer(toRender)); + public RotatingBuffer renderBlockInstanced(SuperByteBufferCache.Compartment compartment, BlockState toRender) { + return getRotating(compartment, toRender, () -> rotatingInstancedRenderer(toRender)); } - public InstancedBuffer getInstanced(SuperByteBufferCache.Compartment compartment, T key, Supplier supplier) { - Cache compartmentCache = this.cache.get(compartment); + public RotatingBuffer getRotating(SuperByteBufferCache.Compartment compartment, T key, Supplier supplier) { + Cache compartmentCache = this.rotating.get(compartment); + try { + return compartmentCache.get(key, supplier::get); + } catch (ExecutionException e) { + e.printStackTrace(); + return null; + } + } + + public BeltBuffer getBelt(SuperByteBufferCache.Compartment compartment, T key, Supplier supplier) { + Cache compartmentCache = this.belts.get(compartment); try { return compartmentCache.get(key, supplier::get); } catch (ExecutionException e) { @@ -161,23 +191,33 @@ public class FastKineticRenderer { } - private InstancedBuffer rotatingInstancedRenderer(BlockState renderedState) { + private RotatingBuffer rotatingInstancedRenderer(BlockState renderedState) { BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); return rotatingInstancedRenderer(dispatcher.getModelForState(renderedState), renderedState); } - private InstancedBuffer rotatingInstancedRenderer(IBakedModel model, BlockState renderedState) { + private RotatingBuffer rotatingInstancedRenderer(IBakedModel model, BlockState renderedState) { return rotatingInstancedRenderer(model, renderedState, new MatrixStack()); } - private InstancedBuffer rotatingInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { + private BeltBuffer beltInstancedRenderer(IBakedModel model, BlockState renderedState) { + return beltInstancedRenderer(model, renderedState, new MatrixStack()); + } + + private RotatingBuffer rotatingInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { BufferBuilder builder = SuperByteBufferCache.getBufferBuilder(model, referenceState, ms); - return new InstancedBuffer(builder); + return new RotatingBuffer(builder); + } + + private BeltBuffer beltInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { + BufferBuilder builder = SuperByteBufferCache.getBufferBuilder(model, referenceState, ms); + + return new BeltBuffer(builder); } public void invalidate() { - cache.values().forEach(cache -> { + rotating.values().forEach(cache -> { cache.asMap().values().forEach(InstancedBuffer::invalidate); cache.invalidateAll(); }); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java index a2c0b4e6c..e6163226e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java @@ -5,10 +5,7 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.CreateClient; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.vertex.VertexFormatElement; -import net.minecraft.util.math.BlockPos; import org.lwjgl.opengl.*; import java.nio.Buffer; @@ -16,12 +13,14 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.function.Consumer; -public class InstancedBuffer extends TemplateBuffer { +public abstract class InstancedBuffer extends TemplateBuffer { - public int vao, ebo, invariantVBO, instanceVBO, instanceCount; + protected static ByteBuffer MATRIX_BUF = GLAllocation.createDirectByteBuffer(16 << 2); - private final ArrayList data = new ArrayList<>(); - private boolean shouldBuild = true; + protected int vao, ebo, invariantVBO, instanceVBO, instanceCount; + + protected final ArrayList data = new ArrayList<>(); + protected boolean shouldBuild = true; public InstancedBuffer(BufferBuilder buf) { super(buf); @@ -113,166 +112,52 @@ public class InstancedBuffer extends TemplateBuffer { }); } - public void setupInstance(Consumer setup) { + protected void addData(T instance) { + data.add(instance); + instanceCount++; + } + + protected abstract T newInstance(); + + protected abstract int numAttributes(); + + public void setupInstance(Consumer setup) { if (!shouldBuild) return; - InstanceData instanceData = new InstanceData(); + T instanceData = newInstance(); setup.accept(instanceData); - data.add(instanceData); - instanceCount++; + addData(instanceData); } public void render() { GL30.glBindVertexArray(vao); - if (finishBuffering()) { + finishBuffering(); - for (int i = 0; i <= 8; i++) { - GL40.glEnableVertexAttribArray(i); - } - - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - - GL40.glDrawElementsInstanced(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); - - for (int i = 0; i <= 8; i++) { - GL40.glDisableVertexAttribArray(i); - } + for (int i = 0; i <= 10; i++) { + GL40.glEnableVertexAttribArray(i); } + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + + GL40.glDrawElementsInstanced(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); + + for (int i = 0; i <= 10; i++) { + GL40.glDisableVertexAttribArray(i); + } + GL30.glBindVertexArray(0); } - private boolean finishBuffering() { - if (!shouldBuild) return true; + private void finishBuffering() { + if (!shouldBuild) return; - int floatSize = VertexFormatElement.Type.FLOAT.getSize(); - int intSize = VertexFormatElement.Type.INT.getSize(); - int stride = floatSize * 10 + intSize * 2; - - int instanceSize = data.size() * stride; - - if (instanceSize == 0) return false; - - ByteBuffer buffer = GLAllocation.createDirectByteBuffer(instanceSize); - buffer.order(template.order()); - ((Buffer) buffer).limit(instanceSize); - - data.forEach(instanceData -> instanceData.buffer(buffer)); - buffer.rewind(); - - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); - - // the render position - GL20.glVertexAttribPointer(3, 3, GL11.GL_FLOAT, false, stride, 0); - - // vertex lighting - GL20.glVertexAttribPointer(4, 2, GL11.GL_FLOAT, false, stride, floatSize * 3L); - - // rotational speed and offset - GL20.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, stride, floatSize * 5L); - GL20.glVertexAttribPointer(6, 1, GL11.GL_FLOAT, false, stride, floatSize * 6L); - // rotation axis - GL20.glVertexAttribPointer(7, 3, GL11.GL_FLOAT, false, stride, floatSize * 7L); - // uv scrolling - GL20.glVertexAttribPointer(8, 2, GL11.GL_INT, false, stride, floatSize * 10L); - - for (int i = 3; i <= 8; i++) { - GL40.glVertexAttribDivisor(i, 1); - } - - // Deselect (bind to 0) the VBO - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + finishBufferingInternal(); shouldBuild = false; data.clear(); - - return true; } - public static class InstanceData { - private float x; - private float y; - private float z; - private int packedLight = 0; - private float rotationalSpeed; - private float rotationOffset; - private float rotationAxisX; - private float rotationAxisY; - private float rotationAxisZ; - private int cycleLength; - private int cycleOffset; - - public InstanceData setPackedLight(int packedLight) { - this.packedLight = packedLight; - return this; - } - - public InstanceData setRotationalSpeed(float rotationalSpeed) { - this.rotationalSpeed = rotationalSpeed; - return this; - } - - public InstanceData setRotationOffset(float rotationOffset) { - this.rotationOffset = rotationOffset; - return this; - } - - public InstanceData setPosition(Vector3f pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return this; - } - - public InstanceData setPosition(BlockPos pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return this; - } - - public InstanceData setRotationAxis(Vector3f axis) { - this.rotationAxisX = axis.getX(); - this.rotationAxisY = axis.getY(); - this.rotationAxisZ = axis.getZ(); - return this; - } - - public InstanceData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { - this.rotationAxisX = rotationAxisX; - this.rotationAxisY = rotationAxisY; - this.rotationAxisZ = rotationAxisZ; - return this; - } - - public InstanceData setCycleLength(int cycleLength) { - this.cycleLength = cycleLength; - return this; - } - - public InstanceData setCycleOffset(int cycleOffset) { - this.cycleOffset = cycleOffset; - return this; - } - - void buffer(ByteBuffer buf) { - float blockLightCoordinates = LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; - float skyLightCoordinates = LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; - - buf.putFloat(x); - buf.putFloat(y); - buf.putFloat(z); - buf.putFloat(blockLightCoordinates); - buf.putFloat(skyLightCoordinates); - buf.putFloat(rotationalSpeed); - buf.putFloat(rotationOffset); - buf.putFloat(rotationAxisX); - buf.putFloat(rotationAxisY); - buf.putFloat(rotationAxisZ); - buf.putInt(cycleLength); - buf.putInt(cycleOffset); - } - } + protected abstract void finishBufferingInternal(); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java new file mode 100644 index 000000000..ba69f508d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java @@ -0,0 +1,143 @@ +package com.simibubi.create.foundation.utility.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3f; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL40; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.util.function.Consumer; + +public class RotatingBuffer extends InstancedBuffer { + public RotatingBuffer(BufferBuilder buf) { + super(buf); + } + + @Override + protected InstanceData newInstance() { + return new InstanceData(); + } + + @Override + protected int numAttributes() { + return 7; + } + + @Override + protected void finishBufferingInternal() { + int floatSize = VertexFormatElement.Type.FLOAT.getSize(); + int stride = floatSize * 10; + + int instanceSize = instanceCount * stride; + + ByteBuffer buffer = GLAllocation.createDirectByteBuffer(instanceSize); + buffer.order(template.order()); + ((Buffer) buffer).limit(instanceSize); + + data.forEach(instanceData -> instanceData.buffer(buffer)); + buffer.rewind(); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); + + // the render position + GL20.glVertexAttribPointer(3, 3, GL11.GL_FLOAT, false, stride, 0); + + // vertex lighting + GL20.glVertexAttribPointer(4, 2, GL11.GL_FLOAT, false, stride, floatSize * 3L); + + // rotational speed and offset + GL20.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, stride, floatSize * 5L); + GL20.glVertexAttribPointer(6, 1, GL11.GL_FLOAT, false, stride, floatSize * 6L); + // rotation axis + GL20.glVertexAttribPointer(7, 3, GL11.GL_FLOAT, false, stride, floatSize * 7L); + + for (int i = 3; i <= numAttributes(); i++) { + GL40.glVertexAttribDivisor(i, 1); + } + + // Deselect (bind to 0) the VBO + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + } + + public static class InstanceData { + private float x; + private float y; + private float z; + private int packedLight; + private float rotationalSpeed; + private float rotationOffset; + private float rotationAxisX; + private float rotationAxisY; + private float rotationAxisZ; + + public InstanceData setPackedLight(int packedLight) { + this.packedLight = packedLight; + return this; + } + + public InstanceData setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return this; + } + + public InstanceData setRotationOffset(float rotationOffset) { + this.rotationOffset = rotationOffset; + return this; + } + + public InstanceData setPosition(Vector3f pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public InstanceData setPosition(BlockPos pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public InstanceData setRotationAxis(Vector3f axis) { + this.rotationAxisX = axis.getX(); + this.rotationAxisY = axis.getY(); + this.rotationAxisZ = axis.getZ(); + return this; + } + + public InstanceData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { + this.rotationAxisX = rotationAxisX; + this.rotationAxisY = rotationAxisY; + this.rotationAxisZ = rotationAxisZ; + return this; + } + + void buffer(ByteBuffer buf) { + float blockLightCoordinates = LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; + float skyLightCoordinates = LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; + + buf.putFloat(x); + buf.putFloat(y); + buf.putFloat(z); + buf.putFloat(blockLightCoordinates); + buf.putFloat(skyLightCoordinates); + buf.putFloat(rotationalSpeed); + buf.putFloat(rotationOffset); + buf.putFloat(rotationAxisX); + buf.putFloat(rotationAxisY); + buf.putFloat(rotationAxisZ); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java index d0d3b34c1..e0b2d11ff 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java @@ -1,7 +1,8 @@ package com.simibubi.create.foundation.utility.render.shader; public enum Shader { - ROTATING_INSTANCED("shader/instanced.vert", "shader/instanced.frag"); + ROTATING_INSTANCED("shader/rotating.vert", "shader/instanced.frag"), + BELT_INSTANCED("shader/belt.vert", "shader/instanced.frag"),; public final String vert; public final String frag; diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert new file mode 100644 index 000000000..3e814cdc4 --- /dev/null +++ b/src/main/resources/assets/create/shader/belt.vert @@ -0,0 +1,35 @@ +#version 330 core +#define PI 3.1415926538 + +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aNormal; +layout (location = 2) in vec2 aTexCoords; + +layout (location = 3) in vec3 instancePos; +layout (location = 4) in mat4 model; +layout (location = 8) in vec2 light; +layout (location = 9) in float speed; + +out vec2 TexCoords; +out vec2 Light; + +uniform float time; +uniform int ticks; +uniform mat4 projection; +uniform mat4 view; + + +void main() { +// float textureIndex = fract((speed * time / 36 + cycle[1]) / cycle[0]) * cycle[0]; +// if (textureIndex < 0) { +// textureIndex += cycle[0]; +// } +// +// vec2 scrollPos = vec2(fract(textureIndex / 4), floor(textureIndex / 16)); + + vec4 renderPos = model * vec4(aPos - vec3(0.5), 1f); + renderPos += vec4(instancePos + vec3(0.5), 0); + + TexCoords = aTexCoords; + gl_Position = projection * view * renderPos; +} diff --git a/src/main/resources/assets/create/shader/instanced.vert b/src/main/resources/assets/create/shader/rotating.vert similarity index 56% rename from src/main/resources/assets/create/shader/instanced.vert rename to src/main/resources/assets/create/shader/rotating.vert index c34947ac9..2643566f2 100644 --- a/src/main/resources/assets/create/shader/instanced.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -9,7 +9,6 @@ layout (location = 4) in vec2 light; layout (location = 5) in float speed; layout (location = 6) in float rotationOffset; layout (location = 7) in vec3 rotationAxis; -layout (location = 8) in int[2] uvScroll; // uvScroll[0] <- cycleLength, uvScroll[1] <- cycleOffset out vec2 TexCoords; out vec2 Light; @@ -19,9 +18,12 @@ uniform int ticks; uniform mat4 projection; uniform mat4 view; -mat4 rotationMatrix(vec3 axis, float angle) +mat4 kineticRotation() { - axis = normalize(axis); + float degrees = rotationOffset + time * speed * -3./10.; + float angle = fract(degrees / 360.) * PI * 2.; + + vec3 axis = normalize(rotationAxis); float s = sin(angle); float c = cos(angle); float oc = 1.0 - c; @@ -34,26 +36,11 @@ mat4 rotationMatrix(vec3 axis, float angle) void main() { - vec4 renderPos; - int textureIndex = 0; - if (abs(rotationAxis.x) + abs(rotationAxis.y) + abs(rotationAxis.z) < 0.2) { - renderPos = vec4(aPos + instancePos, 1f); + vec4 renderPos = kineticRotation() * vec4(aPos - vec3(0.5), 1); - textureIndex = int((speed * time / 36) + uvScroll[1]) % uvScroll[0]; - if (textureIndex < 0) { - textureIndex += uvScroll[0]; - } + renderPos += vec4(instancePos + vec3(0.5), 0); - } else { - float degrees = rotationOffset + time * speed * 3./10.; - float angle = fract(-degrees / 360.) * PI * 2.; - - renderPos = rotationMatrix(rotationAxis, angle) * vec4(aPos - vec3(0.5), 1f); - - renderPos += vec4(instancePos + vec3(0.5), 0); - } - - TexCoords = aTexCoords + vec2(float(textureIndex % 4) / 4f, float(textureIndex / 4) / 4f); + TexCoords = aTexCoords; gl_Position = projection * view * renderPos; Light = light; From 7deb72baa195841fdddd20b29ef65529dda82a98 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Tue, 5 Jan 2021 11:02:30 +0100 Subject: [PATCH 003/147] Get stuff to compile, clean up unused imports --- .../utility/render/FastKineticRenderer.java | 6 ++---- .../foundation/utility/render/RotatingBuffer.java | 5 +---- .../utility/render/SuperByteBufferCache.java | 3 --- .../foundation/utility/render/TemplateBuffer.java | 11 ----------- .../utility/render/shader/ShaderHelper.java | 8 +------- 5 files changed, 4 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index 5ea1f5203..ebe501896 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -17,8 +17,7 @@ import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.Texture; import net.minecraft.inventory.container.PlayerContainer; import net.minecraft.util.Direction; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.Mod; @@ -28,7 +27,6 @@ import org.lwjgl.opengl.GL40; import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -101,7 +99,7 @@ public class FastKineticRenderer { GlStateManager.uniformMatrix4(projection, false, ShaderHelper.MATRIX_BUFFER); // view matrix - Vector3d pos = gameRenderer.getActiveRenderInfo().getProjectedView(); + Vec3d pos = gameRenderer.getActiveRenderInfo().getProjectedView(); Matrix4f translate = Matrix4f.translate((float) -pos.x, (float) -pos.y, (float) -pos.z); translate.multiplyBackward(event.getMatrixStack().peek().getModel()); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java index ba69f508d..e154baf8e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java @@ -1,14 +1,12 @@ package com.simibubi.create.foundation.utility.render; import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3f; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; @@ -16,7 +14,6 @@ import org.lwjgl.opengl.GL40; import java.nio.Buffer; import java.nio.ByteBuffer; -import java.util.function.Consumer; public class RotatingBuffer extends InstancedBuffer { public RotatingBuffer(BufferBuilder buf) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java index db86d16fa..296fbf3de 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java @@ -5,11 +5,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import com.google.common.collect.Collections2; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.VirtualEmptyModelData; -import net.minecraftforge.client.event.EntityViewRenderEvent; -import net.minecraftforge.client.event.RenderWorldLastEvent; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java index 222e24df0..109b1f94c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java @@ -1,23 +1,12 @@ package com.simibubi.create.foundation.utility.render; -import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.datafixers.util.Pair; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import it.unimi.dsi.fastutil.longs.Long2DoubleMap; -import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Vector4f; -import net.minecraft.world.LightType; -import net.minecraft.world.World; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.time.temporal.TemporalAccessor; public class TemplateBuffer { protected ByteBuffer template; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java index 2a58b7a2e..9bd8df36d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java @@ -2,11 +2,8 @@ package com.simibubi.create.foundation.utility.render.shader; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.Create; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.shader.IShaderManager; import net.minecraft.client.shader.ShaderLinkHelper; import net.minecraft.client.shader.ShaderLoader; @@ -14,8 +11,6 @@ import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; import net.minecraft.resources.IResourceManagerReloadListener; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.EntityViewRenderEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.system.MemoryUtil; @@ -26,7 +21,6 @@ import java.io.IOException; import java.io.InputStream; import java.nio.FloatBuffer; import java.util.EnumMap; -import java.util.Locale; import java.util.Map; public class ShaderHelper { @@ -102,7 +96,7 @@ public class ShaderHelper { private static ShaderLoader createShader(IResourceManager manager, String filename, ShaderLoader.ShaderType shaderType) throws IOException { ResourceLocation loc = new ResourceLocation(Create.ID, filename); try (InputStream is = new BufferedInputStream(manager.getResource(loc).getInputStream())) { - return ShaderLoader.func_216534_a(shaderType, loc.toString(), is, shaderType.name().toLowerCase(Locale.ROOT)); + return ShaderLoader.func_216534_a(shaderType, loc.toString(), is); // , shaderType.name().toLowerCase(Locale.ROOT)); } } From 566a370e3bbdc56052e12fe2b83fc6feb852a005 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 5 Jan 2021 01:59:32 -0800 Subject: [PATCH 004/147] smooth belts --- .../com/simibubi/create/AllSpriteShifts.java | 6 +- .../relays/belt/BeltRenderer.java | 40 +++------ .../foundation/utility/render/BeltBuffer.java | 76 ++++++++++++++---- .../utility/render/FastKineticRenderer.java | 27 ++++--- .../utility/render/InstancedBuffer.java | 10 +-- .../resources/assets/create/shader/belt.vert | 39 ++++++--- .../textures/block/belt_diagonal_scroll.png | Bin 0 -> 445 bytes .../create/textures/block/belt_scroll.png | Bin 0 -> 549 bytes 8 files changed, 120 insertions(+), 78 deletions(-) create mode 100644 src/main/resources/assets/create/textures/block/belt_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt_scroll.png diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 9d8fee9b0..8d805664f 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -55,9 +55,9 @@ public class AllSpriteShifts { CREATIVE_FLUID_TANK = getCT(CTType.CROSS, "creative_fluid_tank"); public static final SpriteShiftEntry - BELT = SpriteShifter.get("block/belt", "block/belt_animated"), - BELT_OFFSET = SpriteShifter.get("block/belt_offset", "block/belt_animated"), - BELT_DIAGONAL = SpriteShifter.get("block/belt_diagonal", "block/belt_diagonal_animated"), + BELT = SpriteShifter.get("block/belt", "block/belt_scroll"), + BELT_OFFSET = SpriteShifter.get("block/belt_offset", "block/belt_offset_scroll"), + BELT_DIAGONAL = SpriteShifter.get("block/belt_diagonal", "block/belt_diagonal_scroll"), ANDESIDE_BELT_CASING = SpriteShifter.get("block/brass_casing_belt", "block/andesite_casing_belt"), CRAFTER_THINGIES = SpriteShifter.get("block/crafter_thingies", "block/crafter_thingies"); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 9d9d7952f..b0839ffc8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -66,17 +66,6 @@ public class BeltRenderer extends SafeTileEntityRenderer { boolean sideways = beltSlope == BeltSlope.SIDEWAYS; boolean alongX = facing.getAxis() == Axis.X; - MatrixStacker msr = MatrixStacker.of(ms); - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - float renderTick = AnimationTickHolder.getRenderTick(); - - ms.push(); - msr.centre(); - msr.rotateY(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)); - msr.rotateZ(sideways ? 90 : 0); - msr.rotateX(!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0); - msr.unCentre(); - if (downward || beltSlope == BeltSlope.VERTICAL && axisDirection == AxisDirection.POSITIVE) { boolean b = start; start = end; @@ -98,34 +87,29 @@ public class BeltRenderer extends SafeTileEntityRenderer { SpriteShiftEntry spriteShift = diagonal ? AllSpriteShifts.BELT_DIAGONAL : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; - int cycleLength = diagonal ? 12 : 16; - int cycleOffset = bottom ? 8 : 0; - - // UV shift - beltBuffer.setupInstance(data -> { float speed = te.getSpeed(); if (diagonal && (downward ^ alongX) || !sideways && !diagonal && alongX || sideways && axisDirection == AxisDirection.NEGATIVE) speed = -speed; - Matrix4f m = new Matrix4f(); - m.loadIdentity(); - m.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0))); - m.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(sideways ? 90 : 0)); - m.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0)); - + float horizontalAngle = facing.getHorizontalAngle(); data.setPosition(te.getPos()) - .setModel(m) + .setRotation( + !diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0, + horizontalAngle + (upward ? 180 : 0) + (sideways ? 270 : 0), + sideways ? 90 : 0 + ) .setPackedLight(light) - .setRotationalSpeed(speed); + .setRotationalSpeed(speed) + .setScrollTexture(spriteShift) + .setScrollMult(diagonal ? 3f / 8f : 0.5f); }); // Diagonal belt do not have a separate bottom model if (diagonal) break; } - ms.pop(); if (te.hasPulley()) { // TODO 1.15 find a way to cache this model matrix computation @@ -134,7 +118,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { .rotateY(); if (sideways) dir = Direction.UP; - msr = MatrixStacker.of(modelTransform); + MatrixStacker msr = MatrixStacker.of(modelTransform); msr.centre(); if (dir.getAxis() == Axis.X) msr.rotateY(90); @@ -143,9 +127,9 @@ public class BeltRenderer extends SafeTileEntityRenderer { msr.rotateX(90); msr.unCentre(); - RotatingBuffer superBuffer = CreateClient.kineticRenderer + RotatingBuffer rotatingBuffer = CreateClient.kineticRenderer .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); - KineticTileEntityRenderer.renderRotatingBuffer(te, superBuffer, light); + KineticTileEntityRenderer.renderRotatingBuffer(te, rotatingBuffer, light); } renderItems(te, partialTicks, ms, buffer, light, overlay); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java index a13a20f4c..f28797586 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java @@ -1,10 +1,11 @@ package com.simibubi.create.foundation.utility.render; import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.util.math.BlockPos; import org.lwjgl.opengl.GL11; @@ -34,7 +35,7 @@ public class BeltBuffer extends InstancedBuffer { protected void finishBufferingInternal() { int floatSize = VertexFormatElement.Type.FLOAT.getSize(); int intSize = VertexFormatElement.Type.INT.getSize(); - int stride = floatSize * 22; + int stride = floatSize * 16; int instanceSize = instanceCount * stride; @@ -51,16 +52,21 @@ public class BeltBuffer extends InstancedBuffer { // render position GL20.glVertexAttribPointer(3, 3, GL11.GL_FLOAT, false, stride, 0); - // model matrix - for (int i = 0; i < 4; i++) { - GL20.glVertexAttribPointer(4 + i, 4, GL11.GL_FLOAT, false, stride, floatSize * (4 * i + 3)); - } + // render rotation + GL20.glVertexAttribPointer(4, 3, GL11.GL_FLOAT, false, stride, floatSize * 3L); // light map - GL20.glVertexAttribPointer(8, 2, GL11.GL_FLOAT, false, stride, floatSize * 16L); + GL20.glVertexAttribPointer(5, 2, GL11.GL_FLOAT, false, stride, floatSize * 6L); - // rotational speed and offset - GL20.glVertexAttribPointer(9, 1, GL11.GL_FLOAT, false, stride, floatSize * 18L); + // speed + GL20.glVertexAttribPointer(6, 1, GL11.GL_FLOAT, false, stride, floatSize * 8L); + + // uv data + GL20.glVertexAttribPointer(7, 2, GL11.GL_FLOAT, false, stride, floatSize * 9L); + + GL20.glVertexAttribPointer(8, 4, GL11.GL_FLOAT, false, stride, floatSize * 11L); + + GL20.glVertexAttribPointer(9, 1, GL11.GL_FLOAT, false, stride, floatSize * 15L); for (int i = 3; i <= numAttributes(); i++) { GL40.glVertexAttribDivisor(i, 1); @@ -74,9 +80,18 @@ public class BeltBuffer extends InstancedBuffer { private float x; private float y; private float z; - private Matrix4f model; + private float rotX; + private float rotY; + private float rotZ; private int packedLight; private float rotationalSpeed; + private float sourceU; + private float sourceV; + private float minU; + private float minV; + private float maxU; + private float maxV; + private float scrollMult; public BeltData setPosition(BlockPos pos) { this.x = pos.getX(); @@ -85,8 +100,10 @@ public class BeltBuffer extends InstancedBuffer { return this; } - public BeltData setModel(Matrix4f model) { - this.model = model; + public BeltData setRotation(float rotX, float rotY, float rotZ) { + this.rotX = rotX; + this.rotY = rotY; + this.rotZ = rotZ; return this; } @@ -100,6 +117,25 @@ public class BeltBuffer extends InstancedBuffer { return this; } + public BeltData setScrollTexture(SpriteShiftEntry spriteShift) { + TextureAtlasSprite source = spriteShift.getOriginal(); + TextureAtlasSprite target = spriteShift.getTarget(); + + this.sourceU = source.getMinU(); + this.sourceV = source.getMinV(); + this.minU = target.getMinU(); + this.minV = target.getMinV(); + this.maxU = target.getMaxU(); + this.maxV = target.getMaxV(); + + return this; + } + + public BeltData setScrollMult(float scrollMult) { + this.scrollMult = scrollMult; + return this; + } + void buffer(ByteBuffer buf) { float blockLightCoordinates = LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; float skyLightCoordinates = LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; @@ -108,14 +144,22 @@ public class BeltBuffer extends InstancedBuffer { buf.putFloat(y); buf.putFloat(z); - InstancedBuffer.MATRIX_BUF.rewind(); - model.write(InstancedBuffer.MATRIX_BUF.asFloatBuffer()); - InstancedBuffer.MATRIX_BUF.rewind(); + buf.putFloat(rotX); + buf.putFloat(rotY); + buf.putFloat(rotZ); - buf.put(InstancedBuffer.MATRIX_BUF); buf.putFloat(blockLightCoordinates); buf.putFloat(skyLightCoordinates); buf.putFloat(rotationalSpeed); + + buf.putFloat(sourceU); + buf.putFloat(sourceV); + buf.putFloat(minU); + buf.putFloat(minV); + buf.putFloat(maxU); + buf.putFloat(maxV); + + buf.putFloat(scrollMult); } } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index ebe501896..dfe350cb5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -50,17 +50,17 @@ public class FastKineticRenderer { } public void tick() { - for (Cache cache : rotating.values()) { - for (RotatingBuffer renderer : cache.asMap().values()) { - renderer.clearInstanceData(); - } - } - - for (Cache cache : belts.values()) { - for (BeltBuffer renderer : cache.asMap().values()) { - renderer.clearInstanceData(); - } - } +// for (Cache cache : rotating.values()) { +// for (RotatingBuffer renderer : cache.asMap().values()) { +// renderer.clearInstanceData(); +// } +// } +// +// for (Cache cache : belts.values()) { +// for (BeltBuffer renderer : cache.asMap().values()) { +// renderer.clearInstanceData(); +// } +// } } public void enqueue(Runnable run) { @@ -219,5 +219,10 @@ public class FastKineticRenderer { cache.asMap().values().forEach(InstancedBuffer::invalidate); cache.invalidateAll(); }); + + belts.values().forEach(cache -> { + cache.asMap().values().forEach(InstancedBuffer::invalidate); + cache.invalidateAll(); + }); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java index e6163226e..ad77c60a7 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java @@ -15,8 +15,6 @@ import java.util.function.Consumer; public abstract class InstancedBuffer extends TemplateBuffer { - protected static ByteBuffer MATRIX_BUF = GLAllocation.createDirectByteBuffer(16 << 2); - protected int vao, ebo, invariantVBO, instanceVBO, instanceCount; protected final ArrayList data = new ArrayList<>(); @@ -112,11 +110,6 @@ public abstract class InstancedBuffer extends TemplateBuffer { }); } - protected void addData(T instance) { - data.add(instance); - instanceCount++; - } - protected abstract T newInstance(); protected abstract int numAttributes(); @@ -127,7 +120,8 @@ public abstract class InstancedBuffer extends TemplateBuffer { T instanceData = newInstance(); setup.accept(instanceData); - addData(instanceData); + data.add(instanceData); + instanceCount++; } public void render() { diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 3e814cdc4..7e1a30b8f 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -6,9 +6,12 @@ layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; layout (location = 3) in vec3 instancePos; -layout (location = 4) in mat4 model; -layout (location = 8) in vec2 light; -layout (location = 9) in float speed; +layout (location = 4) in vec3 rotationDegrees; +layout (location = 5) in vec2 light; +layout (location = 6) in float speed; +layout (location = 7) in vec2 sourceUV; +layout (location = 8) in vec4 scrollTexture; +layout (location = 9) in float scrollMult; out vec2 TexCoords; out vec2 Light; @@ -18,18 +21,30 @@ uniform int ticks; uniform mat4 projection; uniform mat4 view; +mat4 rotate(vec3 axis, float angle) +{ + float s = sin(angle); + float c = cos(angle); + float oc = 1.0 - c; -void main() { -// float textureIndex = fract((speed * time / 36 + cycle[1]) / cycle[0]) * cycle[0]; -// if (textureIndex < 0) { -// textureIndex += cycle[0]; -// } -// -// vec2 scrollPos = vec2(fract(textureIndex / 4), floor(textureIndex / 16)); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); +} - vec4 renderPos = model * vec4(aPos - vec3(0.5), 1f); +void main() +{ + vec3 rot = fract(rotationDegrees / 360.) * PI * 2.; + + vec4 renderPos = rotate(vec3(1, 0, 0), rot.x) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(0, 1, 0), rot.y) * vec4(aPos - vec3(0.5), 1f); renderPos += vec4(instancePos + vec3(0.5), 0); - TexCoords = aTexCoords; + float scrollSize = scrollTexture.w - scrollTexture.y; + + float scroll = fract(speed * time / (36. * 16.)) * scrollSize * scrollMult; + + Light = light; + TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); gl_Position = projection * view * renderPos; } diff --git a/src/main/resources/assets/create/textures/block/belt_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..e8cdb900ef595c889fcd4e665c6125bfc365eb97 GIT binary patch literal 445 zcmV;u0Yd(XP)p3Cowq;3_ zCJ8StpJ9eOvdINmYB44z9Z#`VW348eTwtwcoR3JyQ_OJ3?DC2YxU^GJ#?%vW(ch(%Q6yUP`AzzLZGT6x~@4{ z!5%giLI{Wm(a2h|EJLfdpTIHfD?MBlfcN)m$MK*)Jk^5i0`O;yhlCJXDqkP{NDs*c zT~%z$5>-|e-g~M#0*=3a2pd1})W}-$Jg0KEbWz-wcB%z-fjrL{S^KvJ|I&hppjAf* n_d1-taQ4F43uiCH~}8BpXqq{S|AwBqn!pHxc3^P{nSH96vT zc1>vn+AOJ-HP%|zPZahT780c@b_>bHmrDX*V{$(VJB0v32$ZUtZnF#-#{>^$i7^IM z1q=rNiX5mA;t{wI0%Ht92!fp?A4`tc>gSLeANw`+sTd9hqZ^`qVog^W2hO|#x!uk{%uocD_fbKt-oE-ba z^RrW5aDH~`y_uXGcZkCIV!_YfGa%r8cFo=W0)YG3HD%d!c6alKvecBNW`28vssg6J nZkms@-3Qx!u-ym$%RcxE8+z{97@D!z00000NkvXXu0mjfZ9w|G literal 0 HcmV?d00001 From 0b1f73de892dec601774ddcc7c30ec63639dbe55 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 5 Jan 2021 13:32:50 -0800 Subject: [PATCH 005/147] missed a comment --- .../utility/render/FastKineticRenderer.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index dfe350cb5..e5285d6bc 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -50,17 +50,17 @@ public class FastKineticRenderer { } public void tick() { -// for (Cache cache : rotating.values()) { -// for (RotatingBuffer renderer : cache.asMap().values()) { -// renderer.clearInstanceData(); -// } -// } -// -// for (Cache cache : belts.values()) { -// for (BeltBuffer renderer : cache.asMap().values()) { -// renderer.clearInstanceData(); -// } -// } + for (Cache cache : rotating.values()) { + for (RotatingBuffer renderer : cache.asMap().values()) { + renderer.clearInstanceData(); + } + } + + for (Cache cache : belts.values()) { + for (BeltBuffer renderer : cache.asMap().values()) { + renderer.clearInstanceData(); + } + } } public void enqueue(Runnable run) { From c9feda18d68d81ac0e460f7ea3583a6a1fcd4ae5 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 5 Jan 2021 13:40:04 -0800 Subject: [PATCH 006/147] add missing texture --- .../create/textures/block/belt_offset_scroll.png | Bin 0 -> 531 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/create/textures/block/belt_offset_scroll.png diff --git a/src/main/resources/assets/create/textures/block/belt_offset_scroll.png b/src/main/resources/assets/create/textures/block/belt_offset_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..40e2b7f0007d6e08f2dd0a420024bd9801273f72 GIT binary patch literal 531 zcmV+u0_^>XP)fjN5Pg%_iM_i?+9I(+s#ZecP-qWuq5S_d5?r`&;mU`!A8bo9j+5aK**M#OfYy>_ zOP+b2_vUHn)ys|C-E45!Z_)J`*m=0#gNPs^NLQg1%0j{D5zp5z@bU9kWRGnNW=7X% zC`%QSRGxu|Kt#|gp8*mPm>EQbY-ug(x`r(T&JD94MI9_cWB|a-vtS~EAI2Em z`yt-bH~@1B#^{Kw@@&RkL_kC+OEqc5jK{W}C^St2qen3NC&H!NMJAfI5L8u#rM3Sk zoQl-@Atw1@obd+$=iDS>;3Oiry?Y%4KHR^HfcNj;#t+`y-pndek8O(|zxE)?aolfl zd}tveIPSM-TLyr57ZE%hc3_|5`_J8^!D_L<=6VgIM^qPAs8$x%mZ&eE!P*kmmZ&bS zU`&C!T42>&!srp3>ou0vf`Su&A9m>a3~lEk|4?=~waU@d7S0W5DuYj7zD*jW{S87D zT1AkwrOX~ik7$}^>cXF{12cnt4rBD}=M?nRfnC>4U04`{x~@^GA^IR~U2tMbC3R(% z_B4G=%TDhhF~ntQx#2N&VY)@+iIo*jRzUW{7{Ofc<696hTKPN=&hy|r5B`^V@E6nQ VX$heXfAs(W002ovPDHLkV1lHz_ul{j literal 0 HcmV?d00001 From 5144aa6e635bc96184560c5264fc928dcf0ab29a Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 5 Jan 2021 14:39:11 -0800 Subject: [PATCH 007/147] belts scroll the right way, vertical belts still aren't rotated correctly --- .../create/content/contraptions/relays/belt/BeltRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index b0839ffc8..da427d1b2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -65,6 +65,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { boolean end = part == BeltPart.END; boolean sideways = beltSlope == BeltSlope.SIDEWAYS; boolean alongX = facing.getAxis() == Axis.X; + boolean alongZ = facing.getAxis() == Axis.Z; if (downward || beltSlope == BeltSlope.VERTICAL && axisDirection == AxisDirection.POSITIVE) { boolean b = start; @@ -89,8 +90,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { beltBuffer.setupInstance(data -> { float speed = te.getSpeed(); - if (diagonal && (downward ^ alongX) || !sideways && !diagonal && alongX - || sideways && axisDirection == AxisDirection.NEGATIVE) + if (((axisDirection == AxisDirection.NEGATIVE) ^ upward) ^ ((alongX && !diagonal) || (alongZ && diagonal))) speed = -speed; float horizontalAngle = facing.getHorizontalAngle(); From a52b60620872cfee9510027b425be1b55c093726 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 5 Jan 2021 14:49:23 -0800 Subject: [PATCH 008/147] all belts render correctly --- .../contraptions/relays/belt/BeltRenderer.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index da427d1b2..db1285a9a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -64,10 +64,11 @@ public class BeltRenderer extends SafeTileEntityRenderer { boolean start = part == BeltPart.START; boolean end = part == BeltPart.END; boolean sideways = beltSlope == BeltSlope.SIDEWAYS; + boolean vertical = beltSlope == BeltSlope.VERTICAL; boolean alongX = facing.getAxis() == Axis.X; boolean alongZ = facing.getAxis() == Axis.Z; - if (downward || beltSlope == BeltSlope.VERTICAL && axisDirection == AxisDirection.POSITIVE) { + if (downward || vertical && axisDirection == AxisDirection.POSITIVE) { boolean b = start; start = end; end = b; @@ -90,16 +91,17 @@ public class BeltRenderer extends SafeTileEntityRenderer { beltBuffer.setupInstance(data -> { float speed = te.getSpeed(); - if (((axisDirection == AxisDirection.NEGATIVE) ^ upward) ^ ((alongX && !diagonal) || (alongZ && diagonal))) + if (((axisDirection == AxisDirection.NEGATIVE) ^ upward) ^ + ((alongX && !diagonal) || (alongZ && diagonal)) ^ + vertical) speed = -speed; - float horizontalAngle = facing.getHorizontalAngle(); + float rotX = !diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0; + float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 270 : 0); + float rotZ = sideways ? 90 : (vertical ? 180 : 0); + data.setPosition(te.getPos()) - .setRotation( - !diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0, - horizontalAngle + (upward ? 180 : 0) + (sideways ? 270 : 0), - sideways ? 90 : 0 - ) + .setRotation(rotX, rotY, rotZ) .setPackedLight(light) .setRotationalSpeed(speed) .setScrollTexture(spriteShift) From 91069163f81aa93bc878a00db6c062d653f4da8d Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 5 Jan 2021 14:50:36 -0800 Subject: [PATCH 009/147] clean shader code --- src/main/resources/assets/create/shader/belt.vert | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 7e1a30b8f..76abae150 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -37,12 +37,14 @@ void main() { vec3 rot = fract(rotationDegrees / 360.) * PI * 2.; - vec4 renderPos = rotate(vec3(1, 0, 0), rot.x) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(0, 1, 0), rot.y) * vec4(aPos - vec3(0.5), 1f); + mat4 rotation = rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); + + vec4 renderPos = rotation * vec4(aPos - vec3(0.5), 1f); renderPos += vec4(instancePos + vec3(0.5), 0); float scrollSize = scrollTexture.w - scrollTexture.y; - float scroll = fract(speed * time / (36. * 16.)) * scrollSize * scrollMult; + float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; Light = light; TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); From d391ed570e109934b928b9f0de3133c3642d97c9 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 6 Jan 2021 00:04:19 -0800 Subject: [PATCH 010/147] maybe fix weird rendering in front stuff --- .../contraptions/base/KineticTileEntity.java | 8 +++++--- .../utility/render/FastKineticRenderer.java | 14 +++++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 9914478ad..f740f4dbe 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -36,9 +36,6 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.extensions.IForgeTileEntity; -import net.minecraftforge.fml.DistExecutor; public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation { @@ -459,4 +456,9 @@ public abstract class KineticTileEntity extends SmartTileEntity return overStressed; } + public static AxisAlignedBB NOWHERE_AABB = new AxisAlignedBB(Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN); + @Override + public AxisAlignedBB getRenderBoundingBox() { + return super.getRenderBoundingBox(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index e5285d6bc..81773a852 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -23,6 +23,7 @@ import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.Mod; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL40; import java.util.*; @@ -71,7 +72,9 @@ public class FastKineticRenderer { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - RenderSystem.enableCull(); + RenderSystem.enableLighting(); + RenderSystem.enableDepthTest(); + GL11.glCullFace(GL11.GL_BACK); GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; LightTexture lightManager = gameRenderer.getLightmapTextureManager(); @@ -79,11 +82,11 @@ public class FastKineticRenderer { Texture blockAtlasTexture = Minecraft.getInstance().textureManager.getTexture(PlayerContainer.BLOCK_ATLAS_TEXTURE); Texture lightTexture = Minecraft.getInstance().textureManager.getTexture(lightManager.resourceLocation); - GL40.glActiveTexture(GL40.GL_TEXTURE0); - GL40.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); + GL13.glActiveTexture(GL40.GL_TEXTURE0); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); - GL40.glActiveTexture(GL40.GL_TEXTURE0 + 1); - GL40.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); + GL13.glActiveTexture(GL40.GL_TEXTURE0 + 1); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); RenderSystem.texParameter(3553, 10241, 9729); RenderSystem.texParameter(3553, 10240, 9729); RenderSystem.texParameter(3553, 10242, 10496); @@ -134,6 +137,7 @@ public class FastKineticRenderer { RenderSystem.disableCull(); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); + RenderSystem.disableDepthTest(); while (!runs.isEmpty()) { runs.remove().run(); From 029f56da57c607a120d8442c2eeb48b9a2fad61e Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 6 Jan 2021 13:02:57 -0800 Subject: [PATCH 011/147] maybe fix held item rendering --- .../foundation/utility/render/FastKineticRenderer.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index 81773a852..1ee9e3f35 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -84,6 +84,7 @@ public class FastKineticRenderer { GL13.glActiveTexture(GL40.GL_TEXTURE0); GL11.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); + blockAtlasTexture.setBlurMipmap(false, true); GL13.glActiveTexture(GL40.GL_TEXTURE0 + 1); GL11.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); @@ -129,10 +130,10 @@ public class FastKineticRenderer { ShaderHelper.releaseShader(); - GL40.glActiveTexture(GL40.GL_TEXTURE0 + 1); - GL40.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GL40.glActiveTexture(GL40.GL_TEXTURE0); - GL40.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GL13.glActiveTexture(GL40.GL_TEXTURE0 + 1); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GL13.glActiveTexture(GL40.GL_TEXTURE0); + blockAtlasTexture.restoreLastBlurMipmap(); RenderSystem.disableCull(); RenderSystem.disableBlend(); From 7beeec5e00481ce6bb02d4d3fe6b1b47dd2dc2ca Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 7 Jan 2021 02:06:40 -0800 Subject: [PATCH 012/147] maybe lighting is done starting fast contraption rendering, not safe to use yet --- .../AbstractContraptionEntityRenderer.java | 9 +- .../ContraptionRenderer.java | 24 ++-- .../ControlledContraptionEntityRenderer.java | 21 ++++ .../OrientedContraptionEntityRenderer.java | 36 +++++- .../simibubi/create/events/ClientEvents.java | 5 +- .../foundation/ResourceReloadHandler.java | 3 + .../command/ClearBufferCacheCommand.java | 3 + .../foundation/utility/render/BeltBuffer.java | 5 +- .../utility/render/ContraptionBuffer.java | 109 ++++++++++++++++++ .../utility/render/ContraptionLighter.java | 86 ++++++++++++++ .../utility/render/FastKineticRenderer.java | 96 +++++++-------- .../utility/render/InstancedBuffer.java | 5 +- .../foundation/utility/render/LightUtil.java | 13 +++ .../utility/render/RotatingBuffer.java | 4 +- .../utility/render/SuperByteBufferCache.java | 1 - .../utility/render/shader/Shader.java | 4 +- .../utility/render/shader/ShaderHelper.java | 30 +++++ .../resources/assets/create/shader/belt.vert | 8 +- .../create/shader/contraption_static.vert | 51 ++++++++ .../assets/create/shader/instanced.frag | 14 ++- .../assets/create/shader/rotating.vert | 12 +- 21 files changed, 460 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java create mode 100644 src/main/resources/assets/create/shader/contraption_static.vert diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index f6b9ad44d..8ca710438 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; @@ -9,6 +10,7 @@ import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; public abstract class AbstractContraptionEntityRenderer extends EntityRenderer { @@ -23,6 +25,9 @@ public abstract class AbstractContraptionEntityRenderer actor : c.getActors()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntityRenderer.java index 6567b0419..65c2b0d15 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntityRenderer.java @@ -5,6 +5,8 @@ import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; public class ControlledContraptionEntityRenderer extends AbstractContraptionEntityRenderer { @@ -26,4 +28,23 @@ public class ControlledContraptionEntityRenderer extends AbstractContraptionEnti .unCentre(); } + public Vec3d getPosition(ControlledContraptionEntity entity, float partialTicks) { + double x = MathHelper.lerp(partialTicks, entity.lastTickPosX, entity.getX()); + double y = MathHelper.lerp(partialTicks, entity.lastTickPosY, entity.getY()); + double z = MathHelper.lerp(partialTicks, entity.lastTickPosZ, entity.getZ()); + return new Vec3d(x, y, z); + } + + public Vec3d getRotation(ControlledContraptionEntity entity, float partialTicks) { + Axis axis = entity.getRotationAxis(); + if (axis == null) return Vec3d.ZERO; + + float angle = entity.getAngle(partialTicks); + + if (axis == Axis.X) return new Vec3d(angle, 0, 0); + if (axis == Axis.Y) return new Vec3d(0, angle, 0); + if (axis == Axis.Z) return new Vec3d(0, 0, angle); + + throw new IllegalStateException("impossible axis"); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java index 78604cfb8..8f60343af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java @@ -56,8 +56,19 @@ public class OrientedContraptionEntityRenderer extends AbstractContraptionEntity .unCentre(); } + @Override + public Vec3d getPosition(OrientedContraptionEntity entity, float partialTicks) { + + return Vec3d.ZERO; + } + + @Override + public Vec3d getRotation(OrientedContraptionEntity contraptionEntity, float partialTicks) { + return Vec3d.ZERO; + } + private void repositionOnContraption(OrientedContraptionEntity entity, float partialTicks, - MatrixStack[] matrixStacks, Entity ridingEntity) { + MatrixStack[] matrixStacks, Entity ridingEntity) { AbstractContraptionEntity parent = (AbstractContraptionEntity) ridingEntity; Vec3d passengerPosition = parent.getPassengerPosition(entity, partialTicks); double x = passengerPosition.x - MathHelper.lerp(partialTicks, entity.lastTickPosX, entity.getX()); @@ -93,4 +104,27 @@ public class OrientedContraptionEntityRenderer extends AbstractContraptionEntity } } + private Vec3d getCartPosition(float partialTicks, Entity ridingEntity) { + AbstractMinecartEntity cart = (AbstractMinecartEntity) ridingEntity; + double cartX = MathHelper.lerp(partialTicks, cart.lastTickPosX, cart.getX()); + double cartY = MathHelper.lerp(partialTicks, cart.lastTickPosY, cart.getY()); + double cartZ = MathHelper.lerp(partialTicks, cart.lastTickPosZ, cart.getZ()); + Vec3d cartPos = cart.getPos(cartX, cartY, cartZ); + + if (cartPos != null) { + Vec3d cartPosFront = cart.getPosOffset(cartX, cartY, cartZ, (double) 0.3F); + Vec3d cartPosBack = cart.getPosOffset(cartX, cartY, cartZ, (double) -0.3F); + if (cartPosFront == null) + cartPosFront = cartPos; + if (cartPosBack == null) + cartPosBack = cartPos; + + cartX = cartPos.x - cartX; + cartY = (cartPosFront.y + cartPosBack.y) / 2.0D - cartY; + cartZ = cartPos.z - cartZ; + } + + return new Vec3d(cartX, cartY, cartZ); + } + } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 056043cdf..5340cbce7 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -32,7 +32,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.render.FastKineticRenderer; +import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -111,11 +111,14 @@ public class ClientEvents { @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { CreateClient.bufferCache.invalidate(); + CreateClient.kineticRenderer.invalidate(); + FastContraptionRenderer.invalidateAll(); } @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { CreateClient.kineticRenderer.renderInstances(event); + FastContraptionRenderer.renderAll(event); MatrixStack ms = event.getMatrixStack(); ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); diff --git a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java index 9206a88c4..7809c8bc5 100644 --- a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.block.render.SpriteShifter; +import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; import net.minecraft.client.resources.ReloadListener; import net.minecraft.profiler.IProfiler; import net.minecraft.resources.IResourceManager; @@ -18,6 +19,8 @@ public class ResourceReloadHandler extends ReloadListener { protected void apply(Object $, IResourceManager resourceManagerIn, IProfiler profilerIn) { SpriteShifter.reloadUVs(); CreateClient.bufferCache.invalidate(); + CreateClient.kineticRenderer.invalidate(); + FastContraptionRenderer.invalidateAll(); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java index 2398d9406..159f96861 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.util.text.StringTextComponent; @@ -23,5 +24,7 @@ public class ClearBufferCacheCommand { @OnlyIn(Dist.CLIENT) private static void execute() { CreateClient.bufferCache.invalidate(); + CreateClient.kineticRenderer.invalidate(); + FastContraptionRenderer.invalidateAll(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java index f28797586..e17b33623 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java @@ -8,6 +8,7 @@ import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.client.model.pipeline.VertexLighterFlat; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; @@ -137,8 +138,8 @@ public class BeltBuffer extends InstancedBuffer { } void buffer(ByteBuffer buf) { - float blockLightCoordinates = LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; - float skyLightCoordinates = LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; + float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight); + float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight); buf.putFloat(x); buf.putFloat(y); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java new file mode 100644 index 000000000..d667788ca --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java @@ -0,0 +1,109 @@ +package com.simibubi.create.foundation.utility.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.CreateClient; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import org.lwjgl.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; + +public class ContraptionBuffer extends TemplateBuffer { + + protected int vao, ebo, vbo; + + public ContraptionBuffer(BufferBuilder buf) { + super(buf); + setup(); + } + + public void invalidate() { + CreateClient.kineticRenderer.enqueue(() -> { + GL15.glDeleteBuffers(vbo); + GL15.glDeleteBuffers(ebo); + GL30.glDeleteVertexArrays(vao); + }); + } + + public void render() { + + GL30.glBindVertexArray(vao); + + for (int i = 0; i <= 3; i++) { + GL40.glEnableVertexAttribArray(i); + } + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + + GL40.glDrawElements(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0); + + for (int i = 0; i <= 3; i++) { + GL40.glDisableVertexAttribArray(i); + } + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GL30.glBindVertexArray(0); + } + + private void setup() { + int floatSize = VertexFormatElement.Type.FLOAT.getSize(); + + int stride = floatSize * 8; + int invariantSize = count * stride; + + ByteBuffer constant = GLAllocation.createDirectByteBuffer(invariantSize); + constant.order(template.order()); + ((Buffer) constant).limit(invariantSize); + + int indicesSize = count * VertexFormatElement.Type.USHORT.getSize(); + ByteBuffer indices = GLAllocation.createDirectByteBuffer(indicesSize); + indices.order(template.order()); + ((Buffer) indices).limit(indicesSize); + + int vertexCount = vertexCount(template); + for (int i = 0; i < vertexCount; i++) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); + + constant.putFloat(getNX(template, i)); + constant.putFloat(getNY(template, i)); + constant.putFloat(getNZ(template, i)); + + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); + + indices.putShort((short) i); + } + constant.rewind(); + indices.rewind(); + + vao = GL30.glGenVertexArrays(); + GL30.glBindVertexArray(vao); + + ebo = GlStateManager.genBuffers(); + vbo = GlStateManager.genBuffers(); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, vbo); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant, GL15.GL_STATIC_DRAW); + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); + + // vertex positions + GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, stride, 0); + + // vertex normals + GL20.glVertexAttribPointer(1, 3, GL11.GL_FLOAT, false, stride, floatSize * 3L); + + // uv position + GL20.glVertexAttribPointer(2, 2, GL11.GL_FLOAT, false, stride, floatSize * 6L); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + // Deselect (bind to 0) the VAO + GL30.glBindVertexArray(0); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java new file mode 100644 index 000000000..3e2dd318b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java @@ -0,0 +1,86 @@ +package com.simibubi.create.foundation.utility.render; + +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; +import net.minecraft.world.World; +import net.minecraft.world.lighting.WorldLightManager; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.GL40; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.util.Set; + +public class ContraptionLighter { + + int minX; + int minY; + int minZ; + + int sizeX; + int sizeY; + int sizeZ; + + ByteBuffer lightVolume; + + int texture; + + public ContraptionLighter(Contraption contraption) { + texture = GL11.glGenTextures(); + + AxisAlignedBB bounds = contraption.bounds; + + int minX = (int) Math.floor(bounds.minX); + int minY = (int) Math.floor(bounds.minY); + int minZ = (int) Math.floor(bounds.minZ); + int maxX = (int) Math.ceil(bounds.maxX); + int maxY = (int) Math.ceil(bounds.maxY); + int maxZ = (int) Math.ceil(bounds.maxZ); + + sizeX = maxX - minX; + sizeY = maxY - minY; + sizeZ = maxZ - minZ; + + lightVolume = GLAllocation.createDirectByteBuffer(sizeX * sizeY * sizeZ * 2); + } + + public void delete() { + GL11.glDeleteTextures(texture); + } + + public void tick() { + + } + + public void addLightData(World world, BlockPos pos) { + + int contraptionX = pos.getX() - minX; + int contraptionY = pos.getY() - minY; + int contraptionZ = pos.getZ() - minZ; + + if (contraptionX < 0 || contraptionX >= sizeX || contraptionY < 0 || contraptionY >= sizeY || contraptionZ < 0 || contraptionZ >= sizeZ) + return; + + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + writeLight(contraptionX, contraptionY, contraptionZ, blockLight, skyLight); + } + + private void writeLight(int x, int y, int z, int block, int sky) { + int i = (x + y * sizeX + z * sizeX * sizeY) * 2; + + lightVolume.put(i, (byte) (block * 16)); + lightVolume.put(i + 1, (byte) (sky * 16)); + } + + public void use() { + GL12.glBindTexture(GL12.GL_TEXTURE_3D, texture); + lightVolume.rewind(); + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightVolume); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index 1ee9e3f35..1ee76a574 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -69,49 +69,12 @@ public class FastKineticRenderer { } public void renderInstances(RenderWorldLastEvent event) { - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - - RenderSystem.enableLighting(); - RenderSystem.enableDepthTest(); - GL11.glCullFace(GL11.GL_BACK); - GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; - LightTexture lightManager = gameRenderer.getLightmapTextureManager(); - Texture blockAtlasTexture = Minecraft.getInstance().textureManager.getTexture(PlayerContainer.BLOCK_ATLAS_TEXTURE); - Texture lightTexture = Minecraft.getInstance().textureManager.getTexture(lightManager.resourceLocation); + setup(gameRenderer); - GL13.glActiveTexture(GL40.GL_TEXTURE0); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); - blockAtlasTexture.setBlurMipmap(false, true); + ShaderCallback callback = ShaderHelper.getViewProjectionCallback(event); - GL13.glActiveTexture(GL40.GL_TEXTURE0 + 1); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); - RenderSystem.texParameter(3553, 10241, 9729); - RenderSystem.texParameter(3553, 10240, 9729); - RenderSystem.texParameter(3553, 10242, 10496); - RenderSystem.texParameter(3553, 10243, 10496); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.enableTexture(); - - ShaderCallback callback = shader -> { - ShaderHelper.MATRIX_BUFFER.position(0); - event.getProjectionMatrix().write(ShaderHelper.MATRIX_BUFFER); - - int projection = GlStateManager.getUniformLocation(shader, "projection"); - GlStateManager.uniformMatrix4(projection, false, ShaderHelper.MATRIX_BUFFER); - - // view matrix - Vec3d pos = gameRenderer.getActiveRenderInfo().getProjectedView(); - Matrix4f translate = Matrix4f.translate((float) -pos.x, (float) -pos.y, (float) -pos.z); - translate.multiplyBackward(event.getMatrixStack().peek().getModel()); - - ShaderHelper.MATRIX_BUFFER.position(0); - translate.write(ShaderHelper.MATRIX_BUFFER); - int view = GlStateManager.getUniformLocation(shader, "view"); - GlStateManager.uniformMatrix4(view, false, ShaderHelper.MATRIX_BUFFER); - }; ShaderHelper.useShader(Shader.ROTATING_INSTANCED, callback); rotating.values() @@ -123,26 +86,63 @@ public class FastKineticRenderer { ShaderHelper.useShader(Shader.BELT_INSTANCED, callback); belts.values() - .stream() - .flatMap(cache -> cache.asMap().values().stream()) - .filter(type -> !type.isEmpty()) - .forEach(InstancedBuffer::render); + .stream() + .flatMap(cache -> cache.asMap().values().stream()) + .filter(type -> !type.isEmpty()) + .forEach(InstancedBuffer::render); ShaderHelper.releaseShader(); + teardown(); + + while (!runs.isEmpty()) { + runs.remove().run(); + } + } + + public void setup(GameRenderer gameRenderer) { + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + + RenderSystem.enableLighting(); + RenderSystem.enableDepthTest(); + GL11.glCullFace(GL11.GL_BACK); + + LightTexture lightManager = gameRenderer.getLightmapTextureManager(); + + Texture blockAtlasTexture = Minecraft.getInstance().textureManager.getTexture(PlayerContainer.BLOCK_ATLAS_TEXTURE); + Texture lightTexture = Minecraft.getInstance().textureManager.getTexture(lightManager.resourceLocation); + + // bind the block atlas texture to 0 + GL13.glActiveTexture(GL40.GL_TEXTURE0); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); + GL40.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); + GL40.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + + // bind the light texture to 1 and setup the mysterious filtering options + GL13.glActiveTexture(GL40.GL_TEXTURE1); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, 10241, 9729); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, 10240, 9729); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, 10242, 10496); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, 10243, 10496); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.enableTexture(); + } + + public void teardown() { + GL13.glActiveTexture(GL40.GL_TEXTURE0 + 1); GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GL13.glActiveTexture(GL40.GL_TEXTURE0); - blockAtlasTexture.restoreLastBlurMipmap(); + GL40.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); + GL40.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); RenderSystem.disableCull(); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.disableDepthTest(); - - while (!runs.isEmpty()) { - runs.remove().run(); - } } public void registerCompartment(SuperByteBufferCache.Compartment instance) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java index ad77c60a7..bd7be51c8 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java @@ -129,7 +129,7 @@ public abstract class InstancedBuffer extends TemplateBuffer { GL30.glBindVertexArray(vao); finishBuffering(); - for (int i = 0; i <= 10; i++) { + for (int i = 0; i <= numAttributes(); i++) { GL40.glEnableVertexAttribArray(i); } @@ -137,10 +137,11 @@ public abstract class InstancedBuffer extends TemplateBuffer { GL40.glDrawElementsInstanced(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); - for (int i = 0; i <= 10; i++) { + for (int i = 0; i <= numAttributes(); i++) { GL40.glDisableVertexAttribArray(i); } + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); GL30.glBindVertexArray(0); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java b/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java new file mode 100644 index 000000000..278ae2c1b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.utility.render; + +import net.minecraft.client.renderer.LightTexture; + +public class LightUtil { + public static float getProperBlockLight(int packedLight) { + return ((LightTexture.getBlockLightCoordinates(packedLight) + 1) / (float) 0xF); + } + + public static float getProperSkyLight(int packedLight) { + return ((LightTexture.getSkyLightCoordinates(packedLight) + 1) / (float) 0xF); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java index e154baf8e..6d80607f0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java @@ -122,8 +122,8 @@ public class RotatingBuffer extends InstancedBuffer } void buffer(ByteBuffer buf) { - float blockLightCoordinates = LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; - float skyLightCoordinates = LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; + float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight); + float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight); buf.putFloat(x); buf.putFloat(y); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java index 296fbf3de..fbb52d014 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java @@ -128,7 +128,6 @@ public class SuperByteBufferCache { public void invalidate() { cache.forEach((comp, cache) -> cache.invalidateAll()); - CreateClient.kineticRenderer.invalidate(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java index e0b2d11ff..0820adff9 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java @@ -2,7 +2,9 @@ package com.simibubi.create.foundation.utility.render.shader; public enum Shader { ROTATING_INSTANCED("shader/rotating.vert", "shader/instanced.frag"), - BELT_INSTANCED("shader/belt.vert", "shader/instanced.frag"),; + BELT_INSTANCED("shader/belt.vert", "shader/instanced.frag"), + CONTRAPTION_STRUCTURE("shader/contraption_static.vert", "shader/instanced.frag"), + ; public final String vert; public final String frag; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java index 9bd8df36d..ae5d1d957 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.shader.IShaderManager; import net.minecraft.client.shader.ShaderLinkHelper; import net.minecraft.client.shader.ShaderLoader; @@ -11,6 +12,8 @@ import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; import net.minecraft.resources.IResourceManagerReloadListener; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.client.event.RenderWorldLastEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.system.MemoryUtil; @@ -28,6 +31,7 @@ public class ShaderHelper { public static final Logger log = LogManager.getLogger("shader"); public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); + public static final FloatBuffer VEC3_BUFFER = MemoryUtil.memAllocFloat(3); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); private static final Map PROGRAMS = new EnumMap<>(Shader.class); @@ -48,6 +52,32 @@ public class ShaderHelper { } } + public static int getShaderHandle(Shader shader) { + ShaderProgram shaderProgram = PROGRAMS.get(shader); + + return shaderProgram.getProgram(); + } + + public static ShaderCallback getViewProjectionCallback(RenderWorldLastEvent event) { + return shader -> { + ShaderHelper.MATRIX_BUFFER.position(0); + event.getProjectionMatrix().write(ShaderHelper.MATRIX_BUFFER); + + int projection = GlStateManager.getUniformLocation(shader, "projection"); + GlStateManager.uniformMatrix4(projection, false, ShaderHelper.MATRIX_BUFFER); + + // view matrix + Vec3d pos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); + Matrix4f translate = Matrix4f.translate((float) -pos.x, (float) -pos.y, (float) -pos.z); + translate.multiplyBackward(event.getMatrixStack().peek().getModel()); + + ShaderHelper.MATRIX_BUFFER.position(0); + translate.write(ShaderHelper.MATRIX_BUFFER); + int view = GlStateManager.getUniformLocation(shader, "view"); + GlStateManager.uniformMatrix4(view, false, ShaderHelper.MATRIX_BUFFER); + }; + } + public static void useShader(Shader shader) { useShader(shader, null); } diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 76abae150..afe714db0 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -13,6 +13,7 @@ layout (location = 7) in vec2 sourceUV; layout (location = 8) in vec4 scrollTexture; layout (location = 9) in float scrollMult; +out vec3 Normal; out vec2 TexCoords; out vec2 Light; @@ -21,8 +22,7 @@ uniform int ticks; uniform mat4 projection; uniform mat4 view; -mat4 rotate(vec3 axis, float angle) -{ +mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); float oc = 1.0 - c; @@ -33,8 +33,7 @@ mat4 rotate(vec3 axis, float angle) 0., 0., 0., 1.); } -void main() -{ +void main() { vec3 rot = fract(rotationDegrees / 360.) * PI * 2.; mat4 rotation = rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); @@ -46,6 +45,7 @@ void main() float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; + Normal = normalize((rotation * vec4(aNormal, 0.)).xyz); Light = light; TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); gl_Position = projection * view * renderPos; diff --git a/src/main/resources/assets/create/shader/contraption_static.vert b/src/main/resources/assets/create/shader/contraption_static.vert new file mode 100644 index 000000000..3f758039b --- /dev/null +++ b/src/main/resources/assets/create/shader/contraption_static.vert @@ -0,0 +1,51 @@ +#version 440 core +#define PI 3.1415926538 + +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aNormal; +layout (location = 2) in vec2 aTexCoords; + +out vec3 Normal; +out vec2 TexCoords; +out vec2 Light; + +layout (binding = 2) uniform sampler3D lightVolume; + +uniform vec3 cSize; +uniform vec3 cPos; +uniform vec3 cRot; + +uniform float time; +uniform int ticks; +uniform mat4 projection; +uniform mat4 view; + +mat4 rotate(vec3 axis, float angle) +{ + float s = sin(angle); + float c = cos(angle); + float oc = 1.0 - c; + + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); +} + +mat4 contraptionRotation() { + vec3 rot = -fract(cRot / 360) * PI * 2; + return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); +} + +void main() { + vec4 rotatedPos = contraptionRotation() * vec4(aPos - vec3(0.5), 1); + + vec4 worldPos = rotatedPos + vec4(cPos + vec3(0.5), 0); + + vec3 boxCoord = (worldPos.xyz - cPos - cSize * 0.5) / cSize; + + //Light = texture(lightVolume, boxCoord).rg; + Normal = aNormal; + TexCoords = aTexCoords; + gl_Position = projection * view * worldPos; +} diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index 81596480c..215f1178a 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -1,4 +1,6 @@ #version 440 core + +in vec3 Normal; in vec2 TexCoords; in vec2 Light; @@ -19,11 +21,17 @@ vec3 blendDarken(vec3 base, vec3 blend, float opacity) { return (blendDarken(base, blend) * opacity + base * (1.0 - opacity)); } -void main() -{ +float diffuse() { + float x = Normal.x; + float y = Normal.y; + float z = Normal.z; + return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); +} + +void main() { vec4 tex = texture2D(BlockAtlas, TexCoords); vec4 light = texture2D(LightMap, Light); - fragColor = vec4(blendDarken(tex.rgb, light.rgb, light.a), tex.a); + fragColor = vec4(blendDarken(tex.rgb, light.rgb, light.a) * diffuse(), tex.a); } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index 2643566f2..9c1efea5d 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -10,6 +10,7 @@ layout (location = 5) in float speed; layout (location = 6) in float rotationOffset; layout (location = 7) in vec3 rotationAxis; +out vec3 Normal; out vec2 TexCoords; out vec2 Light; @@ -18,8 +19,7 @@ uniform int ticks; uniform mat4 projection; uniform mat4 view; -mat4 kineticRotation() -{ +mat4 kineticRotation() { float degrees = rotationOffset + time * speed * -3./10.; float angle = fract(degrees / 360.) * PI * 2.; @@ -34,14 +34,14 @@ mat4 kineticRotation() 0., 0., 0., 1.); } -void main() -{ - vec4 renderPos = kineticRotation() * vec4(aPos - vec3(0.5), 1); +void main() { + mat4 rotation = kineticRotation(); + vec4 renderPos = rotation * vec4(aPos - vec3(0.5), 1); renderPos += vec4(instancePos + vec3(0.5), 0); TexCoords = aTexCoords; - + Normal = normalize((rotation * vec4(aNormal, 0.)).xyz); gl_Position = projection * view * renderPos; Light = light; } \ No newline at end of file From ba2d84e92e556f4735a742467c49fee3d3ad4e9f Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 7 Jan 2021 02:48:24 -0800 Subject: [PATCH 013/147] whoops --- .../render/FastContraptionRenderer.java | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java new file mode 100644 index 000000000..c246c854a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java @@ -0,0 +1,144 @@ +package com.simibubi.create.foundation.utility.render; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; +import com.simibubi.create.foundation.utility.render.shader.Shader; +import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.*; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL40; + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; + +public class FastContraptionRenderer extends ContraptionRenderer { + + private static final Cache renderers = CacheBuilder.newBuilder().build(); + + private ArrayList renderLayers = new ArrayList<>(); + + private ContraptionLighter lighter; + + private Contraption c; + + private Vec3d renderPos; + private Vec3d renderRot; + + public FastContraptionRenderer(World world, Contraption c) { + this.c = c; + this.lighter = new ContraptionLighter(c); + + buildLayers(); + } + + private void setRenderSettings(Vec3d position, Vec3d rotation) { + renderPos = position; + renderRot = rotation; + } + + private void render(int shader) { +// GL13.glActiveTexture(GL40.GL_TEXTURE2); +// lighter.use(); + + int cSize = GlStateManager.getUniformLocation(shader, "cSize"); + int cPos = GlStateManager.getUniformLocation(shader, "cPos"); + int cRot = GlStateManager.getUniformLocation(shader, "cRot"); + + FloatBuffer buf = ShaderHelper.VEC3_BUFFER; + + buf.put(0, (float) c.bounds.getXSize()); + buf.put(1, (float) c.bounds.getYSize()); + buf.put(2, (float) c.bounds.getZSize()); + buf.rewind(); + GlStateManager.uniform3(cSize, buf); + + buf.put(0, (float) renderPos.x); + buf.put(1, (float) renderPos.y); + buf.put(2, (float) renderPos.z); + buf.rewind(); + GlStateManager.uniform3(cPos, buf); + + buf.put(0, (float) renderRot.x); + buf.put(1, (float) renderRot.y); + buf.put(2, (float) renderRot.z); + buf.rewind(); + GlStateManager.uniform3(cRot, buf); + + for (ContraptionBuffer layer : renderLayers) { + layer.render(); + } + } + + private void buildLayers() { + invalidate(); + + List blockLayers = RenderType.getBlockLayers(); + + for (int i = 0; i < blockLayers.size(); i++) { + RenderType layer = blockLayers.get(i); + renderLayers.add(buildStructureBuffer(c, layer)); + } + } + + private void invalidate() { + for (ContraptionBuffer buffer : renderLayers) { + buffer.invalidate(); + } + + renderLayers.clear(); + } + + public static void markForRendering(World world, Contraption c, Vec3d position, Vec3d rotation) { + getRenderer(world, c).setRenderSettings(position, rotation); + } + + private static FastContraptionRenderer getRenderer(World world, Contraption c) { + try { + return renderers.get(c, () -> new FastContraptionRenderer(world, c)); + } catch (ExecutionException e) { + e.printStackTrace(); + return null; + } + } + + public static void renderAll(RenderWorldLastEvent event) { + GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; + CreateClient.kineticRenderer.setup(gameRenderer); + GlStateManager.enableCull(); + + ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, ShaderHelper.getViewProjectionCallback(event)); + int shader = ShaderHelper.getShaderHandle(Shader.CONTRAPTION_STRUCTURE); + + for (FastContraptionRenderer renderer : renderers.asMap().values()) { + renderer.render(shader); + } + + ShaderHelper.releaseShader(); + + CreateClient.kineticRenderer.teardown(); + } + + public static void invalidateAll() { + for (FastContraptionRenderer renderer : renderers.asMap().values()) { + renderer.invalidate(); + } + + renderers.invalidateAll(); + } + + private static ContraptionBuffer buildStructureBuffer(Contraption c, RenderType layer) { + BufferBuilder builder = buildStructure(c, layer); + return new ContraptionBuffer(builder); + } +} From 0b3615b50ecfee32ba3998655ee2e76858639153 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 7 Jan 2021 14:57:10 -0800 Subject: [PATCH 014/147] time for some organization pt I --- .../com/simibubi/create/AllBlockPartials.java | 4 +- .../base/KineticTileEntityRenderer.java | 3 +- .../components/actors/DrillRenderer.java | 3 +- .../components/clock/CuckooClockRenderer.java | 3 +- .../components/fan/EncasedFanRenderer.java | 3 +- .../components/flywheel/FlywheelRenderer.java | 3 +- .../millstone/MillstoneRenderer.java | 3 +- .../motor/CreativeMotorRenderer.java | 3 +- .../components/saw/SawRenderer.java | 3 +- .../bearing/BearingRenderer.java | 3 +- .../contraptions/fluids/PumpRenderer.java | 3 +- .../advanced/SpeedControllerRenderer.java | 3 +- .../relays/belt/BeltRenderer.java | 8 +- .../relays/encased/SplitShaftRenderer.java | 3 +- .../relays/gearbox/GearboxRenderer.java | 3 +- .../block/mechanicalArm/ArmRenderer.java | 3 +- .../foundation/utility/render/BeltBuffer.java | 166 ------------------ .../utility/render/FastKineticRenderer.java | 12 +- .../utility/render/RotatingBuffer.java | 140 --------------- .../utility/render/instancing/BeltBuffer.java | 107 +++++++++++ .../InstanceBuffer.java} | 49 ++++-- .../render/instancing/InstanceData.java | 30 ++++ .../InstancedTileEntityRenderer.java | 12 ++ .../render/instancing/RotatingBuffer.java | 106 +++++++++++ .../render/instancing/VertexAttribute.java | 37 ++++ .../render/instancing/VertexFormat.java | 37 ++++ 26 files changed, 389 insertions(+), 361 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java rename src/main/java/com/simibubi/create/foundation/utility/render/{InstancedBuffer.java => instancing/InstanceBuffer.java} (73%) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstancedTileEntityRenderer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 84f59e743..580b612b7 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -13,8 +13,8 @@ import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.A import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.BeltBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.IBakedModel; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 2996f04d8..b0c50866c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -8,8 +8,7 @@ import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 140c3f2d5..235d44ee4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -10,8 +10,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index 648cb310b..66d85ce92 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -7,8 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 14b06de7e..004f0e560 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -7,9 +7,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index e175c5f03..0fefa1716 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -9,8 +9,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index 6481a47a1..ee20c59b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -4,9 +4,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class MillstoneRenderer extends KineticTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 1bbd0e558..1789da7a5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -3,9 +3,8 @@ package com.simibubi.create.content.contraptions.components.motor; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class CreativeMotorRenderer extends KineticTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 2a17f0849..52c99aec9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -12,8 +12,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRe import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index a1ba39595..ea888941f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -5,8 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 70a527779..89cbb001f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -6,8 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 1031e592f..fe809092d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -4,9 +4,8 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index db1285a9a..1a28aff67 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -3,7 +3,6 @@ package com.simibubi.create.content.contraptions.relays.belt; import java.util.Random; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSpriteShifts; @@ -12,13 +11,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.BeltBuffer; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.ShadowRenderHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index be421d744..e126f3b08 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -6,9 +6,8 @@ import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 52b54411f..70f8428c5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -5,9 +5,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 334e5317e..5f22cc9fa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -8,8 +8,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.InstancedBuffer; -import com.simibubi.create.foundation.utility.render.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java deleted file mode 100644 index e17b33623..000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/render/BeltBuffer.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.simibubi.create.foundation.utility.render; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.VertexFormatElement; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.client.model.pipeline.VertexLighterFlat; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL40; - -import java.nio.Buffer; -import java.nio.ByteBuffer; - -public class BeltBuffer extends InstancedBuffer { - public BeltBuffer(BufferBuilder buf) { - super(buf); - } - - @Override - protected BeltData newInstance() { - return new BeltData(); - } - - @Override - protected int numAttributes() { - return 9; - } - - @Override - protected void finishBufferingInternal() { - int floatSize = VertexFormatElement.Type.FLOAT.getSize(); - int intSize = VertexFormatElement.Type.INT.getSize(); - int stride = floatSize * 16; - - int instanceSize = instanceCount * stride; - - ByteBuffer buffer = GLAllocation.createDirectByteBuffer(instanceSize); - buffer.order(template.order()); - ((Buffer) buffer).limit(instanceSize); - - data.forEach(instanceData -> instanceData.buffer(buffer)); - buffer.rewind(); - - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); - - // render position - GL20.glVertexAttribPointer(3, 3, GL11.GL_FLOAT, false, stride, 0); - - // render rotation - GL20.glVertexAttribPointer(4, 3, GL11.GL_FLOAT, false, stride, floatSize * 3L); - - // light map - GL20.glVertexAttribPointer(5, 2, GL11.GL_FLOAT, false, stride, floatSize * 6L); - - // speed - GL20.glVertexAttribPointer(6, 1, GL11.GL_FLOAT, false, stride, floatSize * 8L); - - // uv data - GL20.glVertexAttribPointer(7, 2, GL11.GL_FLOAT, false, stride, floatSize * 9L); - - GL20.glVertexAttribPointer(8, 4, GL11.GL_FLOAT, false, stride, floatSize * 11L); - - GL20.glVertexAttribPointer(9, 1, GL11.GL_FLOAT, false, stride, floatSize * 15L); - - for (int i = 3; i <= numAttributes(); i++) { - GL40.glVertexAttribDivisor(i, 1); - } - - // Deselect (bind to 0) the VBO - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - } - - public static class BeltData { - private float x; - private float y; - private float z; - private float rotX; - private float rotY; - private float rotZ; - private int packedLight; - private float rotationalSpeed; - private float sourceU; - private float sourceV; - private float minU; - private float minV; - private float maxU; - private float maxV; - private float scrollMult; - - public BeltData setPosition(BlockPos pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return this; - } - - public BeltData setRotation(float rotX, float rotY, float rotZ) { - this.rotX = rotX; - this.rotY = rotY; - this.rotZ = rotZ; - return this; - } - - public BeltData setPackedLight(int packedLight) { - this.packedLight = packedLight; - return this; - } - - public BeltData setRotationalSpeed(float rotationalSpeed) { - this.rotationalSpeed = rotationalSpeed; - return this; - } - - public BeltData setScrollTexture(SpriteShiftEntry spriteShift) { - TextureAtlasSprite source = spriteShift.getOriginal(); - TextureAtlasSprite target = spriteShift.getTarget(); - - this.sourceU = source.getMinU(); - this.sourceV = source.getMinV(); - this.minU = target.getMinU(); - this.minV = target.getMinV(); - this.maxU = target.getMaxU(); - this.maxV = target.getMaxV(); - - return this; - } - - public BeltData setScrollMult(float scrollMult) { - this.scrollMult = scrollMult; - return this; - } - - void buffer(ByteBuffer buf) { - float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight); - float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight); - - buf.putFloat(x); - buf.putFloat(y); - buf.putFloat(z); - - buf.putFloat(rotX); - buf.putFloat(rotY); - buf.putFloat(rotZ); - - buf.putFloat(blockLightCoordinates); - buf.putFloat(skyLightCoordinates); - buf.putFloat(rotationalSpeed); - - buf.putFloat(sourceU); - buf.putFloat(sourceV); - buf.putFloat(minU); - buf.putFloat(minV); - buf.putFloat(maxU); - buf.putFloat(maxV); - - buf.putFloat(scrollMult); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index 1ee76a574..9b70af249 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -7,6 +7,9 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.shader.Shader; import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; @@ -17,7 +20,6 @@ import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.Texture; import net.minecraft.inventory.container.PlayerContainer; import net.minecraft.util.Direction; -import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.Mod; @@ -81,7 +83,7 @@ public class FastKineticRenderer { .stream() .flatMap(cache -> cache.asMap().values().stream()) .filter(type -> !type.isEmpty()) - .forEach(InstancedBuffer::render); + .forEach(InstanceBuffer::render); ShaderHelper.useShader(Shader.BELT_INSTANCED, callback); @@ -89,7 +91,7 @@ public class FastKineticRenderer { .stream() .flatMap(cache -> cache.asMap().values().stream()) .filter(type -> !type.isEmpty()) - .forEach(InstancedBuffer::render); + .forEach(InstanceBuffer::render); ShaderHelper.releaseShader(); @@ -221,12 +223,12 @@ public class FastKineticRenderer { public void invalidate() { rotating.values().forEach(cache -> { - cache.asMap().values().forEach(InstancedBuffer::invalidate); + cache.asMap().values().forEach(InstanceBuffer::invalidate); cache.invalidateAll(); }); belts.values().forEach(cache -> { - cache.asMap().values().forEach(InstancedBuffer::invalidate); + cache.asMap().values().forEach(InstanceBuffer::invalidate); cache.invalidateAll(); }); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java deleted file mode 100644 index 6d80607f0..000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/render/RotatingBuffer.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.simibubi.create.foundation.utility.render; - -import com.mojang.blaze3d.platform.GlStateManager; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.Vector3f; -import net.minecraft.client.renderer.vertex.VertexFormatElement; -import net.minecraft.util.math.BlockPos; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL40; - -import java.nio.Buffer; -import java.nio.ByteBuffer; - -public class RotatingBuffer extends InstancedBuffer { - public RotatingBuffer(BufferBuilder buf) { - super(buf); - } - - @Override - protected InstanceData newInstance() { - return new InstanceData(); - } - - @Override - protected int numAttributes() { - return 7; - } - - @Override - protected void finishBufferingInternal() { - int floatSize = VertexFormatElement.Type.FLOAT.getSize(); - int stride = floatSize * 10; - - int instanceSize = instanceCount * stride; - - ByteBuffer buffer = GLAllocation.createDirectByteBuffer(instanceSize); - buffer.order(template.order()); - ((Buffer) buffer).limit(instanceSize); - - data.forEach(instanceData -> instanceData.buffer(buffer)); - buffer.rewind(); - - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); - - // the render position - GL20.glVertexAttribPointer(3, 3, GL11.GL_FLOAT, false, stride, 0); - - // vertex lighting - GL20.glVertexAttribPointer(4, 2, GL11.GL_FLOAT, false, stride, floatSize * 3L); - - // rotational speed and offset - GL20.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, stride, floatSize * 5L); - GL20.glVertexAttribPointer(6, 1, GL11.GL_FLOAT, false, stride, floatSize * 6L); - // rotation axis - GL20.glVertexAttribPointer(7, 3, GL11.GL_FLOAT, false, stride, floatSize * 7L); - - for (int i = 3; i <= numAttributes(); i++) { - GL40.glVertexAttribDivisor(i, 1); - } - - // Deselect (bind to 0) the VBO - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - } - - public static class InstanceData { - private float x; - private float y; - private float z; - private int packedLight; - private float rotationalSpeed; - private float rotationOffset; - private float rotationAxisX; - private float rotationAxisY; - private float rotationAxisZ; - - public InstanceData setPackedLight(int packedLight) { - this.packedLight = packedLight; - return this; - } - - public InstanceData setRotationalSpeed(float rotationalSpeed) { - this.rotationalSpeed = rotationalSpeed; - return this; - } - - public InstanceData setRotationOffset(float rotationOffset) { - this.rotationOffset = rotationOffset; - return this; - } - - public InstanceData setPosition(Vector3f pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return this; - } - - public InstanceData setPosition(BlockPos pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return this; - } - - public InstanceData setRotationAxis(Vector3f axis) { - this.rotationAxisX = axis.getX(); - this.rotationAxisY = axis.getY(); - this.rotationAxisZ = axis.getZ(); - return this; - } - - public InstanceData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { - this.rotationAxisX = rotationAxisX; - this.rotationAxisY = rotationAxisY; - this.rotationAxisZ = rotationAxisZ; - return this; - } - - void buffer(ByteBuffer buf) { - float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight); - float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight); - - buf.putFloat(x); - buf.putFloat(y); - buf.putFloat(z); - buf.putFloat(blockLightCoordinates); - buf.putFloat(skyLightCoordinates); - buf.putFloat(rotationalSpeed); - buf.putFloat(rotationOffset); - buf.putFloat(rotationAxisX); - buf.putFloat(rotationAxisY); - buf.putFloat(rotationAxisZ); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java new file mode 100644 index 000000000..b07c90d81 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java @@ -0,0 +1,107 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.utility.render.LightUtil; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.math.BlockPos; +import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; + +import java.nio.ByteBuffer; + +public class BeltBuffer extends InstanceBuffer { + public BeltBuffer(BufferBuilder buf) { + super(buf); + } + + @Override + protected BeltData newInstance() { + return new BeltData(); + } + + @Override + protected VertexFormat getInstanceFormat() { + return BeltData.FORMAT; + } + + public static class BeltData extends InstanceData { + public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC3, VEC2, FLOAT, VEC2, VEC4, FLOAT); + + private float x; + private float y; + private float z; + private float rotX; + private float rotY; + private float rotZ; + private int packedLight; + private float rotationalSpeed; + private float sourceU; + private float sourceV; + private float minU; + private float minV; + private float maxU; + private float maxV; + private float scrollMult; + + public BeltData setPosition(BlockPos pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public BeltData setRotation(float rotX, float rotY, float rotZ) { + this.rotX = rotX; + this.rotY = rotY; + this.rotZ = rotZ; + return this; + } + + public BeltData setPackedLight(int packedLight) { + this.packedLight = packedLight; + return this; + } + + public BeltData setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return this; + } + + public BeltData setScrollTexture(SpriteShiftEntry spriteShift) { + TextureAtlasSprite source = spriteShift.getOriginal(); + TextureAtlasSprite target = spriteShift.getTarget(); + + this.sourceU = source.getMinU(); + this.sourceV = source.getMinV(); + this.minU = target.getMinU(); + this.minV = target.getMinV(); + this.maxU = target.getMaxU(); + this.maxV = target.getMaxV(); + + return this; + } + + public BeltData setScrollMult(float scrollMult) { + this.scrollMult = scrollMult; + return this; + } + + @Override + public void write(ByteBuffer buf) { + float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight); + float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight); + + putVec3(buf, x, y, z); + + putVec3(buf, rotX, rotY, rotZ); + + putVec2(buf, blockLightCoordinates, skyLightCoordinates); + putFloat(buf, rotationalSpeed); + + putVec2(buf, sourceU, sourceV); + putVec4(buf, minU, minV, maxU, maxV); + + putFloat(buf, scrollMult); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java similarity index 73% rename from src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java rename to src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java index bd7be51c8..cde07b894 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/InstancedBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java @@ -1,8 +1,9 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.utility.render.instancing; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.render.TemplateBuffer; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.vertex.VertexFormatElement; @@ -13,14 +14,14 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.function.Consumer; -public abstract class InstancedBuffer extends TemplateBuffer { +public abstract class InstanceBuffer extends TemplateBuffer { protected int vao, ebo, invariantVBO, instanceVBO, instanceCount; - protected final ArrayList data = new ArrayList<>(); + protected final ArrayList data = new ArrayList<>(); protected boolean shouldBuild = true; - public InstancedBuffer(BufferBuilder buf) { + public InstanceBuffer(BufferBuilder buf) { super(buf); setupMainData(); } @@ -86,6 +87,8 @@ public abstract class InstancedBuffer extends TemplateBuffer { GL30.glBindVertexArray(0); } + protected abstract VertexFormat getInstanceFormat(); + public int numInstances() { return instanceCount; } @@ -110,14 +113,12 @@ public abstract class InstancedBuffer extends TemplateBuffer { }); } - protected abstract T newInstance(); + protected abstract D newInstance(); - protected abstract int numAttributes(); - - public void setupInstance(Consumer setup) { + public void setupInstance(Consumer setup) { if (!shouldBuild) return; - T instanceData = newInstance(); + D instanceData = newInstance(); setup.accept(instanceData); data.add(instanceData); @@ -129,7 +130,8 @@ public abstract class InstancedBuffer extends TemplateBuffer { GL30.glBindVertexArray(vao); finishBuffering(); - for (int i = 0; i <= numAttributes(); i++) { + int numAttributes = getInstanceFormat().getNumAttributes() + 3; + for (int i = 0; i <= numAttributes; i++) { GL40.glEnableVertexAttribArray(i); } @@ -137,7 +139,7 @@ public abstract class InstancedBuffer extends TemplateBuffer { GL40.glDrawElementsInstanced(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); - for (int i = 0; i <= numAttributes(); i++) { + for (int i = 0; i <= numAttributes; i++) { GL40.glDisableVertexAttribArray(i); } @@ -148,11 +150,30 @@ public abstract class InstancedBuffer extends TemplateBuffer { private void finishBuffering() { if (!shouldBuild) return; - finishBufferingInternal(); + VertexFormat instanceFormat = getInstanceFormat(); + + int instanceSize = instanceCount * instanceFormat.getStride(); + + ByteBuffer buffer = GLAllocation.createDirectByteBuffer(instanceSize); + buffer.order(template.order()); + ((Buffer) buffer).limit(instanceSize); + + data.forEach(instanceData -> instanceData.write(buffer)); + buffer.rewind(); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); + + instanceFormat.informAttributes(3); + + for (int i = 0; i < instanceFormat.getNumAttributes(); i++) { + GL40.glVertexAttribDivisor(i + 3, 1); + } + + // Deselect (bind to 0) the VBO + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); shouldBuild = false; data.clear(); } - - protected abstract void finishBufferingInternal(); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java new file mode 100644 index 000000000..22690d1fc --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java @@ -0,0 +1,30 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import java.nio.ByteBuffer; + +public abstract class InstanceData { + + public abstract void write(ByteBuffer buf); + + public void putVec4(ByteBuffer buf, float x, float y, float z, float w) { + putFloat(buf, x); + putFloat(buf, y); + putFloat(buf, z); + putFloat(buf, w); + } + + public void putVec3(ByteBuffer buf, float x, float y, float z) { + putFloat(buf, x); + putFloat(buf, y); + putFloat(buf, z); + } + + public void putVec2(ByteBuffer buf, float x, float y) { + putFloat(buf, x); + putFloat(buf, y); + } + + public void putFloat(ByteBuffer buf, float f) { + buf.putFloat(f); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstancedTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstancedTileEntityRenderer.java new file mode 100644 index 000000000..7c4ed9e8e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstancedTileEntityRenderer.java @@ -0,0 +1,12 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import net.minecraft.tileentity.TileEntity; + +import java.util.function.Supplier; + +public abstract class InstancedTileEntityRenderer { + + public abstract D getInstanceData(T te); + + public abstract InstanceBuffer getModel(T te); +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java new file mode 100644 index 000000000..7af85110e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java @@ -0,0 +1,106 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.utility.render.LightUtil; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.util.math.BlockPos; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL40; + +import java.nio.Buffer; +import java.nio.ByteBuffer; + +import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.FLOAT; + +public class RotatingBuffer extends InstanceBuffer { + public RotatingBuffer(BufferBuilder buf) { + super(buf); + } + + @Override + protected RotatingData newInstance() { + return new RotatingData(); + } + + @Override + protected VertexFormat getInstanceFormat() { + return RotatingData.FORMAT; + } + + public static class RotatingData extends InstanceData { + public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, FLOAT, FLOAT, VEC3); + + private float x; + private float y; + private float z; + private int packedLight; + private float rotationalSpeed; + private float rotationOffset; + private float rotationAxisX; + private float rotationAxisY; + private float rotationAxisZ; + + public RotatingData setPackedLight(int packedLight) { + this.packedLight = packedLight; + return this; + } + + public RotatingData setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return this; + } + + public RotatingData setRotationOffset(float rotationOffset) { + this.rotationOffset = rotationOffset; + return this; + } + + public RotatingData setPosition(Vector3f pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public RotatingData setPosition(BlockPos pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public RotatingData setRotationAxis(Vector3f axis) { + this.rotationAxisX = axis.getX(); + this.rotationAxisY = axis.getY(); + this.rotationAxisZ = axis.getZ(); + return this; + } + + public RotatingData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { + this.rotationAxisX = rotationAxisX; + this.rotationAxisY = rotationAxisY; + this.rotationAxisZ = rotationAxisZ; + return this; + } + + @Override + public void write(ByteBuffer buf) { + float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight); + float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight); + + putVec3(buf, x, y, z); + + putVec2(buf, blockLightCoordinates, skyLightCoordinates); + putFloat(buf, rotationalSpeed); + putFloat(buf, rotationOffset); + + putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java new file mode 100644 index 000000000..1a353623e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java @@ -0,0 +1,37 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import org.lwjgl.opengl.GL20; + +public class VertexAttribute { + + public static VertexAttribute MAT4 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 16); + public static VertexAttribute VEC4 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 4); + public static VertexAttribute VEC3 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 3); + public static VertexAttribute VEC2 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 2); + public static VertexAttribute FLOAT = new VertexAttribute(VertexFormatElement.Type.FLOAT, 1); + + private final VertexFormatElement.Type type; + private final int count; + private final int size; + private final int attributeCount; + + public VertexAttribute(VertexFormatElement.Type type, int count) { + this.type = type; + this.count = count; + this.size = type.getSize() * count; + this.attributeCount = (this.size + 15) / 16; // ceiling division. GLSL vertex attributes can only be 16 bytes wide + } + + public void registerForBuffer(int stride, int indexAcc, int offsetAcc) { + GL20.glVertexAttribPointer(indexAcc, count, type.getGlConstant(), false, stride, offsetAcc); + } + + public int getSize() { + return size; + } + + public int getAttributeCount() { + return attributeCount; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java new file mode 100644 index 000000000..392691e3e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java @@ -0,0 +1,37 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +public class VertexFormat { + + private final VertexAttribute[] elements; + + private final int numAttributes; + private final int stride; + + public VertexFormat(VertexAttribute... elements) { + this.elements = elements; + int numAttributes = 0, stride = 0; + for (VertexAttribute element : elements) { + numAttributes += element.getAttributeCount(); + stride += element.getSize(); + } + this.numAttributes = numAttributes; + this.stride = stride; + } + + public int getNumAttributes() { + return numAttributes; + } + + public int getStride() { + return stride; + } + + public void informAttributes(int index) { + int offset = 0; + for (VertexAttribute element : this.elements) { + element.registerForBuffer(stride, index, offset); + index += element.getAttributeCount(); + offset += element.getSize(); + } + } +} From fa1e3ea543b16644bcc0e1e0a218e0196b9f147a Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 7 Jan 2021 18:31:46 -0800 Subject: [PATCH 015/147] solve lighting --- .../foundation/utility/render/LightUtil.java | 4 +-- .../assets/create/shader/instanced.frag | 25 ++++++++----------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java b/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java index 278ae2c1b..12212d29d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java @@ -4,10 +4,10 @@ import net.minecraft.client.renderer.LightTexture; public class LightUtil { public static float getProperBlockLight(int packedLight) { - return ((LightTexture.getBlockLightCoordinates(packedLight) + 1) / (float) 0xF); + return LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; } public static float getProperSkyLight(int packedLight) { - return ((LightTexture.getSkyLightCoordinates(packedLight) + 1) / (float) 0xF); + return LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; } } diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index 215f1178a..f10008954 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -9,18 +9,6 @@ out vec4 fragColor; layout(binding=0) uniform sampler2D BlockAtlas; layout(binding=1) uniform sampler2D LightMap; -float blendDarken(float base, float blend) { - return min(blend,base); -} - -vec3 blendDarken(vec3 base, vec3 blend) { - return vec3(blendDarken(base.r,blend.r),blendDarken(base.g,blend.g),blendDarken(base.b,blend.b)); -} - -vec3 blendDarken(vec3 base, vec3 blend, float opacity) { - return (blendDarken(base, blend) * opacity + base * (1.0 - opacity)); -} - float diffuse() { float x = Normal.x; float y = Normal.y; @@ -28,10 +16,19 @@ float diffuse() { return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); } +vec4 light() { + vec2 lm = Light * 0.9375 + 0.03125; + return texture2D(LightMap, lm); +} + + void main() { vec4 tex = texture2D(BlockAtlas, TexCoords); - vec4 light = texture2D(LightMap, Light); + tex *= vec4(light().rgb, 1); - fragColor = vec4(blendDarken(tex.rgb, light.rgb, light.a) * diffuse(), tex.a); + float df = diffuse(); + tex *= vec4(df, df, df, 1); + + fragColor = tex; } \ No newline at end of file From 05ab482f701b280d04d9bf1bb971872314103280 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 8 Jan 2021 01:29:18 -0800 Subject: [PATCH 016/147] almost super fast kinetic rendering but we need to detect changes in light first (forge pr?) fast contraption rendering --- .../contraptions/base/KineticTileEntity.java | 4 +- .../base/KineticTileEntityRenderer.java | 34 ++++--- .../components/actors/DrillRenderer.java | 1 + .../components/clock/CuckooClockRenderer.java | 2 + .../components/deployer/DeployerRenderer.java | 14 ++- .../components/fan/EncasedFanRenderer.java | 25 ++++-- .../components/flywheel/FlywheelRenderer.java | 4 +- .../millstone/MillstoneRenderer.java | 2 + .../motor/CreativeMotorRenderer.java | 2 + .../components/saw/SawRenderer.java | 13 ++- .../AbstractContraptionEntityRenderer.java | 4 +- .../structureMovement/Contraption.java | 6 ++ .../bearing/BearingRenderer.java | 4 +- .../contraptions/fluids/PumpRenderer.java | 4 +- .../advanced/SpeedControllerRenderer.java | 10 ++- .../relays/belt/BeltRenderer.java | 39 +++++--- .../relays/encased/SplitShaftRenderer.java | 14 ++- .../relays/gearbox/GearboxRenderer.java | 7 +- .../block/mechanicalArm/ArmRenderer.java | 4 +- .../utility/AnimationTickHolder.java | 3 +- .../render/FastContraptionRenderer.java | 13 ++- .../utility/render/FastKineticRenderer.java | 43 +++++++-- .../foundation/utility/render/LightUtil.java | 13 --- .../utility/render/instancing/BasicData.java | 46 ++++++++++ .../utility/render/instancing/BeltBuffer.java | 89 +------------------ .../utility/render/instancing/BeltData.java | 70 +++++++++++++++ .../render/instancing/IInstanceRendered.java | 4 + .../IInstancedTileEntityRenderer.java | 13 +++ .../InstancedTileEntityRenderer.java | 12 --- .../render/instancing/RotatingBuffer.java | 88 +----------------- .../render/instancing/RotatingData.java | 51 +++++++++++ .../resources/assets/create/shader/belt.vert | 4 +- .../create/shader/contraption_static.vert | 8 +- 33 files changed, 381 insertions(+), 269 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstanceRendered.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstancedTileEntityRenderer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index f740f4dbe..89382d10e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -8,7 +8,6 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.Create; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticNetwork; import com.simibubi.create.content.contraptions.RotationPropagator; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; @@ -22,6 +21,7 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.render.instancing.IInstanceRendered; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.resources.I18n; @@ -38,7 +38,7 @@ import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; public abstract class KineticTileEntity extends SmartTileEntity - implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation { + implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation, IInstanceRendered { public @Nullable Long network; public @Nullable BlockPos source; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index b0c50866c..bfb3ce64e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; @@ -22,11 +23,12 @@ import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber(value = Dist.CLIENT) -public class KineticTileEntityRenderer extends SafeTileEntityRenderer { +public class KineticTileEntityRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { public static final Compartment KINETIC_TILE = new Compartment<>(); public static boolean rainbowMode = false; @@ -43,27 +45,35 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer { final BlockPos pos = te.getPos(); Axis axis = ((IRotate) te.getBlockState() .getBlock()).getRotationAxis(te.getBlockState()); - data.setPackedLight(light) - .setRotationalSpeed(te.getSpeed()) - .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) - .setRotationAxis(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis).getUnitVector()) - .setPosition(pos); + data + .setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos())) + .setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos())) + .setRotationalSpeed(te.getSpeed()) + .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis).getUnitVector()) + .setPosition(pos); }); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 235d44ee4..636a7f89d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -14,6 +14,7 @@ import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index 66d85ce92..d978ac439 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -7,9 +7,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 4fe26b14b..48ff5a7d4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -19,6 +19,7 @@ import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -37,7 +38,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -public class DeployerRenderer extends SafeTileEntityRenderer { +public class DeployerRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { public DeployerRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -49,10 +50,17 @@ public class DeployerRenderer extends SafeTileEntityRenderer renderItem(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); renderComponents(te, partialTicks, ms, buffer, light, overlay); + + addInstanceData(te); + } + + @Override + public void addInstanceData(DeployerTileEntity te) { + KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te)); } protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { + int light, int overlay) { BlockState deployerState = te.getBlockState(); Vec3d offset = getHandOffset(te, partialTicks, deployerState).add(VecHelper.getCenterOf(BlockPos.ZERO)); ms.push(); @@ -102,7 +110,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), light); + KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te)); BlockState blockState = te.getBlockState(); BlockPos pos = te.getPos(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 004f0e560..e26d8b77d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -15,6 +15,7 @@ import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.world.LightType; public class EncasedFanRenderer extends KineticTileEntityRenderer { @@ -25,18 +26,24 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + addInstanceData(te); + } + + @Override + public void addInstanceData(KineticTileEntity te) { Direction direction = te.getBlockState() - .get(FACING); + .get(FACING); + + BlockPos inFront = te.getPos().offset(direction); + int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, inFront); + int skyLight = te.getWorld().getLightLevel(LightType.SKY, inFront); - int lightBehind = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction.getOpposite())); - int lightInFront = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction)); - RotatingBuffer shaftHalf = - AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite()); + AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite()); RotatingBuffer fanInner = - AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite()); + AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite()); - renderRotatingBuffer(te, shaftHalf, lightBehind); + renderRotatingBuffer(te, shaftHalf); fanInner.setupInstance(data -> { final BlockPos pos = te.getPos(); Direction.Axis axis = ((IRotate) te.getBlockState() @@ -48,12 +55,12 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { if (speed < 0) speed = MathHelper.clamp(speed, -64 * 20, -80); - data.setPackedLight(lightInFront) + data.setBlockLight(blockLight) + .setSkyLight(skyLight) .setRotationalSpeed(speed) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) .setPosition(pos); }); } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 0fefa1716..563fe72b2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -9,9 +9,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index ee20c59b9..67dd39cb0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -5,7 +5,9 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class MillstoneRenderer extends KineticTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 1789da7a5..902e25c47 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -4,7 +4,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class CreativeMotorRenderer extends KineticTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 52c99aec9..05d1ba113 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -12,6 +12,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRe import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; @@ -29,7 +30,7 @@ import net.minecraft.util.Rotation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -public class SawRenderer extends SafeTileEntityRenderer { +public class SawRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { public SawRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -41,7 +42,13 @@ public class SawRenderer extends SafeTileEntityRenderer { renderBlade(te, ms, buffer, light); renderItems(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); - renderShaft(te, ms, buffer, light, overlay); + + addInstanceData(te); + } + + @Override + public void addInstanceData(SawTileEntity te) { + KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te)); } protected void renderBlade(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light){ @@ -79,7 +86,7 @@ public class SawRenderer extends SafeTileEntityRenderer { } protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te), light); + KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te)); } protected void renderItems(SawTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index 8ca710438..d9d22dc20 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -53,8 +53,8 @@ public abstract class AbstractContraptionEntityRenderer { +public class SpeedControllerRenderer extends SmartTileEntityRenderer implements IInstancedTileEntityRenderer { public SpeedControllerRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -20,7 +21,12 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer { +public class BeltRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { public BeltRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -45,6 +47,17 @@ public class BeltRenderer extends SafeTileEntityRenderer { protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + BlockState blockState = te.getBlockState(); + if (!AllBlocks.BELT.has(blockState)) + return; + + addInstanceData(te); + + renderItems(te, partialTicks, ms, buffer, light, overlay); + } + + @Override + public void addInstanceData(BeltTileEntity te) { BlockState blockState = te.getBlockState(); if (!AllBlocks.BELT.has(blockState)) return; @@ -73,13 +86,13 @@ public class BeltRenderer extends SafeTileEntityRenderer { for (boolean bottom : Iterate.trueAndFalse) { AllBlockPartials beltPartial = diagonal - ? start ? AllBlockPartials.BELT_DIAGONAL_START + ? start ? AllBlockPartials.BELT_DIAGONAL_START : end ? AllBlockPartials.BELT_DIAGONAL_END : AllBlockPartials.BELT_DIAGONAL_MIDDLE - : bottom + : bottom ? start ? AllBlockPartials.BELT_START_BOTTOM - : end ? AllBlockPartials.BELT_END_BOTTOM : AllBlockPartials.BELT_MIDDLE_BOTTOM + : end ? AllBlockPartials.BELT_END_BOTTOM : AllBlockPartials.BELT_MIDDLE_BOTTOM : start ? AllBlockPartials.BELT_START - : end ? AllBlockPartials.BELT_END : AllBlockPartials.BELT_MIDDLE; + : end ? AllBlockPartials.BELT_END : AllBlockPartials.BELT_MIDDLE; BeltBuffer beltBuffer = beltPartial.renderOnBelt(blockState); SpriteShiftEntry spriteShift = @@ -88,8 +101,8 @@ public class BeltRenderer extends SafeTileEntityRenderer { beltBuffer.setupInstance(data -> { float speed = te.getSpeed(); if (((axisDirection == AxisDirection.NEGATIVE) ^ upward) ^ - ((alongX && !diagonal) || (alongZ && diagonal)) ^ - vertical) + ((alongX && !diagonal) || (alongZ && diagonal)) ^ + vertical) speed = -speed; float rotX = !diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0; @@ -97,8 +110,9 @@ public class BeltRenderer extends SafeTileEntityRenderer { float rotZ = sideways ? 90 : (vertical ? 180 : 0); data.setPosition(te.getPos()) + .setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos())) + .setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos())) .setRotation(rotX, rotY, rotZ) - .setPackedLight(light) .setRotationalSpeed(speed) .setScrollTexture(spriteShift) .setScrollMult(diagonal ? 3f / 8f : 0.5f); @@ -113,7 +127,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { // TODO 1.15 find a way to cache this model matrix computation MatrixStack modelTransform = new MatrixStack(); Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) - .rotateY(); + .rotateY(); if (sideways) dir = Direction.UP; MatrixStacker msr = MatrixStacker.of(modelTransform); @@ -126,15 +140,14 @@ public class BeltRenderer extends SafeTileEntityRenderer { msr.unCentre(); RotatingBuffer rotatingBuffer = CreateClient.kineticRenderer - .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); - KineticTileEntityRenderer.renderRotatingBuffer(te, rotatingBuffer, light); + .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + KineticTileEntityRenderer.renderRotatingBuffer(te, rotatingBuffer); } - renderItems(te, partialTicks, ms, buffer, light, overlay); } protected void renderItems(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { + int light, int overlay) { if (!te.isController()) return; if (te.beltLength == 0) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index e126f3b08..2b9660e6a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -14,6 +14,7 @@ import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; public class SplitShaftRenderer extends KineticTileEntityRenderer { @@ -24,10 +25,19 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + + addInstanceData(te); + } + + @Override + public void addInstanceData(KineticTileEntity te) { Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final BlockPos pos = te.getPos(); + int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()); + int skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos()); + for (Direction direction : Iterate.directions) { Axis axis = direction.getAxis(); if (boxAxis != axis) @@ -46,7 +56,8 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { speed *= modifier; - data.setPackedLight(light) + data.setBlockLight(blockLight) + .setSkyLight(skyLight) .setRotationalSpeed(speed) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) @@ -54,5 +65,4 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { }); } } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 70f8428c5..94705946b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -13,6 +13,7 @@ import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; public class GearboxRenderer extends KineticTileEntityRenderer { @@ -26,6 +27,9 @@ public class GearboxRenderer extends KineticTileEntityRenderer { final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); + int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()); + int skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos()); + for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); if (boxAxis == axis) @@ -45,7 +49,8 @@ public class GearboxRenderer extends KineticTileEntityRenderer { speed *= -1; } - data.setPackedLight(light) + data.setBlockLight(blockLight) + .setSkyLight(skyLight) .setRotationalSpeed(speed) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 5f22cc9fa..a41f7a4cc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -8,8 +8,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java index 01f01de38..8e626ee6e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java @@ -11,7 +11,8 @@ public class AnimationTickHolder { } public static float getRenderTick() { - return ticks + Minecraft.getInstance().getRenderPartialTicks(); + Minecraft mc = Minecraft.getInstance(); + return ticks + (mc.isGamePaused() ? mc.renderPartialTicksPaused : mc.getRenderPartialTicks()); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java index c246c854a..99bc7dabe 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java @@ -24,7 +24,7 @@ import java.util.concurrent.ExecutionException; public class FastContraptionRenderer extends ContraptionRenderer { - private static final Cache renderers = CacheBuilder.newBuilder().build(); + private static final Cache renderers = CacheBuilder.newBuilder().build(); private ArrayList renderLayers = new ArrayList<>(); @@ -105,7 +105,7 @@ public class FastContraptionRenderer extends ContraptionRenderer { private static FastContraptionRenderer getRenderer(World world, Contraption c) { try { - return renderers.get(c, () -> new FastContraptionRenderer(world, c)); + return renderers.get(c.entity.getEntityId(), () -> new FastContraptionRenderer(world, c)); } catch (ExecutionException e) { e.printStackTrace(); return null; @@ -120,13 +120,20 @@ public class FastContraptionRenderer extends ContraptionRenderer { ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, ShaderHelper.getViewProjectionCallback(event)); int shader = ShaderHelper.getShaderHandle(Shader.CONTRAPTION_STRUCTURE); + ArrayList toRemove = new ArrayList<>(); + for (FastContraptionRenderer renderer : renderers.asMap().values()) { - renderer.render(shader); + if (renderer.c.entity.isAlive()) + renderer.render(shader); + else + toRemove.add(renderer.c.entity.getEntityId()); } ShaderHelper.releaseShader(); CreateClient.kineticRenderer.teardown(); + + renderers.invalidateAll(toRemove); } public static void invalidateAll() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index 9b70af249..804bd174c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -6,10 +6,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.*; import com.simibubi.create.foundation.utility.render.shader.Shader; import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; @@ -18,11 +15,13 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.Texture; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraftforge.api.distmarker.Dist; +import net.minecraft.world.World; import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.fml.common.Mod; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; @@ -36,13 +35,14 @@ import java.util.function.Supplier; import static com.simibubi.create.foundation.utility.render.SuperByteBufferCache.PARTIAL; -@Mod.EventBusSubscriber(modid = Create.ID, value = Dist.CLIENT) public class FastKineticRenderer { Map, Cache> rotating; Map, Cache> belts; Queue runs; + boolean rebuild; + public FastKineticRenderer() { rotating = new HashMap<>(); belts = new HashMap<>(); @@ -52,7 +52,29 @@ public class FastKineticRenderer { registerCompartment(SuperByteBufferCache.DIRECTIONAL_PARTIAL); } + public void buildTileEntityBuffers(World world) { + + List tileEntities = world.loadedTileEntityList; + + if (!tileEntities.isEmpty()) { + for (TileEntity te : tileEntities) { + if (te instanceof IInstanceRendered) { + TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(te); + + if (renderer instanceof IInstancedTileEntityRenderer) { + addInstancedData(te, (IInstancedTileEntityRenderer) renderer); + } + } + } + } + } + + private void addInstancedData(T te, IInstancedTileEntityRenderer renderer) { + renderer.addInstanceData(te); + } + public void tick() { + // TODO: (later) detect changes in lighting with a mixin to ClientChunkProvider.markLightChanged() for (Cache cache : rotating.values()) { for (RotatingBuffer renderer : cache.asMap().values()) { renderer.clearInstanceData(); @@ -64,6 +86,8 @@ public class FastKineticRenderer { renderer.clearInstanceData(); } } + +// rebuild = true; } public void enqueue(Runnable run) { @@ -72,6 +96,11 @@ public class FastKineticRenderer { public void renderInstances(RenderWorldLastEvent event) { GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; +// +// if (rebuild) { +// buildTileEntityBuffers(Minecraft.getInstance().world); +// rebuild = false; +// } setup(gameRenderer); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java b/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java deleted file mode 100644 index 12212d29d..000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/render/LightUtil.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.simibubi.create.foundation.utility.render; - -import net.minecraft.client.renderer.LightTexture; - -public class LightUtil { - public static float getProperBlockLight(int packedLight) { - return LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF; - } - - public static float getProperSkyLight(int packedLight) { - return LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java new file mode 100644 index 000000000..082d018e1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java @@ -0,0 +1,46 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.math.BlockPos; + +import java.nio.ByteBuffer; + +public class BasicData> extends InstanceData { + + private float x; + private float y; + private float z; + private float blockLight; + private float skyLight; + + public D setBlockLight(int blockLight) { + this.blockLight = blockLight / 15f; + return (D) this; + } + + public D setSkyLight(int skyLight) { + this.skyLight = skyLight / 15f; + return (D) this; + } + + public D setPosition(Vector3f pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return (D) this; + } + + public D setPosition(BlockPos pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return (D) this; + } + + @Override + public void write(ByteBuffer buf) { + putVec3(buf, x, y, z); + + putVec2(buf, blockLight, skyLight); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java index b07c90d81..d8f7839d4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java @@ -1,15 +1,8 @@ package com.simibubi.create.foundation.utility.render.instancing; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.utility.render.LightUtil; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.util.math.BlockPos; -import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; -import java.nio.ByteBuffer; - -public class BeltBuffer extends InstanceBuffer { +public class BeltBuffer extends InstanceBuffer { public BeltBuffer(BufferBuilder buf) { super(buf); } @@ -24,84 +17,4 @@ public class BeltBuffer extends InstanceBuffer { return BeltData.FORMAT; } - public static class BeltData extends InstanceData { - public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC3, VEC2, FLOAT, VEC2, VEC4, FLOAT); - - private float x; - private float y; - private float z; - private float rotX; - private float rotY; - private float rotZ; - private int packedLight; - private float rotationalSpeed; - private float sourceU; - private float sourceV; - private float minU; - private float minV; - private float maxU; - private float maxV; - private float scrollMult; - - public BeltData setPosition(BlockPos pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return this; - } - - public BeltData setRotation(float rotX, float rotY, float rotZ) { - this.rotX = rotX; - this.rotY = rotY; - this.rotZ = rotZ; - return this; - } - - public BeltData setPackedLight(int packedLight) { - this.packedLight = packedLight; - return this; - } - - public BeltData setRotationalSpeed(float rotationalSpeed) { - this.rotationalSpeed = rotationalSpeed; - return this; - } - - public BeltData setScrollTexture(SpriteShiftEntry spriteShift) { - TextureAtlasSprite source = spriteShift.getOriginal(); - TextureAtlasSprite target = spriteShift.getTarget(); - - this.sourceU = source.getMinU(); - this.sourceV = source.getMinV(); - this.minU = target.getMinU(); - this.minV = target.getMinV(); - this.maxU = target.getMaxU(); - this.maxV = target.getMaxV(); - - return this; - } - - public BeltData setScrollMult(float scrollMult) { - this.scrollMult = scrollMult; - return this; - } - - @Override - public void write(ByteBuffer buf) { - float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight); - float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight); - - putVec3(buf, x, y, z); - - putVec3(buf, rotX, rotY, rotZ); - - putVec2(buf, blockLightCoordinates, skyLightCoordinates); - putFloat(buf, rotationalSpeed); - - putVec2(buf, sourceU, sourceV); - putVec4(buf, minU, minV, maxU, maxV); - - putFloat(buf, scrollMult); - } - } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java new file mode 100644 index 000000000..079e56174 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java @@ -0,0 +1,70 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.math.BlockPos; + +import java.nio.ByteBuffer; + +import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; + +public class BeltData extends BasicData { + public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, VEC3, FLOAT, VEC2, VEC4, FLOAT); + + private float rotX; + private float rotY; + private float rotZ; + private float rotationalSpeed; + private float sourceU; + private float sourceV; + private float minU; + private float minV; + private float maxU; + private float maxV; + private float scrollMult; + + public BeltData setRotation(float rotX, float rotY, float rotZ) { + this.rotX = rotX; + this.rotY = rotY; + this.rotZ = rotZ; + return this; + } + + public BeltData setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return this; + } + + public BeltData setScrollTexture(SpriteShiftEntry spriteShift) { + TextureAtlasSprite source = spriteShift.getOriginal(); + TextureAtlasSprite target = spriteShift.getTarget(); + + this.sourceU = source.getMinU(); + this.sourceV = source.getMinV(); + this.minU = target.getMinU(); + this.minV = target.getMinV(); + this.maxU = target.getMaxU(); + this.maxV = target.getMaxV(); + + return this; + } + + public BeltData setScrollMult(float scrollMult) { + this.scrollMult = scrollMult; + return this; + } + + @Override + public void write(ByteBuffer buf) { + super.write(buf); + + putVec3(buf, rotX, rotY, rotZ); + + putFloat(buf, rotationalSpeed); + + putVec2(buf, sourceU, sourceV); + putVec4(buf, minU, minV, maxU, maxV); + + putFloat(buf, scrollMult); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstanceRendered.java new file mode 100644 index 000000000..3db9de2ae --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstanceRendered.java @@ -0,0 +1,4 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +public interface IInstanceRendered { +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java new file mode 100644 index 000000000..7b0393689 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.tileentity.TileEntity; + +import java.util.function.Supplier; + +public interface IInstancedTileEntityRenderer { + + void addInstanceData(T te); +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstancedTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstancedTileEntityRenderer.java deleted file mode 100644 index 7c4ed9e8e..000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstancedTileEntityRenderer.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.simibubi.create.foundation.utility.render.instancing; - -import net.minecraft.tileentity.TileEntity; - -import java.util.function.Supplier; - -public abstract class InstancedTileEntityRenderer { - - public abstract D getInstanceData(T te); - - public abstract InstanceBuffer getModel(T te); -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java index 7af85110e..cbed7078b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java @@ -1,24 +1,8 @@ package com.simibubi.create.foundation.utility.render.instancing; -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.foundation.utility.render.LightUtil; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.Vector3f; -import net.minecraft.client.renderer.vertex.VertexFormatElement; -import net.minecraft.util.math.BlockPos; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL40; -import java.nio.Buffer; -import java.nio.ByteBuffer; - -import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; -import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.FLOAT; - -public class RotatingBuffer extends InstanceBuffer { +public class RotatingBuffer extends InstanceBuffer { public RotatingBuffer(BufferBuilder buf) { super(buf); } @@ -33,74 +17,4 @@ public class RotatingBuffer extends InstanceBuffer return RotatingData.FORMAT; } - public static class RotatingData extends InstanceData { - public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, FLOAT, FLOAT, VEC3); - - private float x; - private float y; - private float z; - private int packedLight; - private float rotationalSpeed; - private float rotationOffset; - private float rotationAxisX; - private float rotationAxisY; - private float rotationAxisZ; - - public RotatingData setPackedLight(int packedLight) { - this.packedLight = packedLight; - return this; - } - - public RotatingData setRotationalSpeed(float rotationalSpeed) { - this.rotationalSpeed = rotationalSpeed; - return this; - } - - public RotatingData setRotationOffset(float rotationOffset) { - this.rotationOffset = rotationOffset; - return this; - } - - public RotatingData setPosition(Vector3f pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return this; - } - - public RotatingData setPosition(BlockPos pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return this; - } - - public RotatingData setRotationAxis(Vector3f axis) { - this.rotationAxisX = axis.getX(); - this.rotationAxisY = axis.getY(); - this.rotationAxisZ = axis.getZ(); - return this; - } - - public RotatingData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { - this.rotationAxisX = rotationAxisX; - this.rotationAxisY = rotationAxisY; - this.rotationAxisZ = rotationAxisZ; - return this; - } - - @Override - public void write(ByteBuffer buf) { - float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight); - float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight); - - putVec3(buf, x, y, z); - - putVec2(buf, blockLightCoordinates, skyLightCoordinates); - putFloat(buf, rotationalSpeed); - putFloat(buf, rotationOffset); - - putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); - } - } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java new file mode 100644 index 000000000..0d556af4b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java @@ -0,0 +1,51 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.math.BlockPos; + +import java.nio.ByteBuffer; + +import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; + +public class RotatingData extends BasicData { + public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, FLOAT, FLOAT, VEC3); + + private float rotationalSpeed; + private float rotationOffset; + private float rotationAxisX; + private float rotationAxisY; + private float rotationAxisZ; + + public RotatingData setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return this; + } + + public RotatingData setRotationOffset(float rotationOffset) { + this.rotationOffset = rotationOffset; + return this; + } + + public RotatingData setRotationAxis(Vector3f axis) { + this.rotationAxisX = axis.getX(); + this.rotationAxisY = axis.getY(); + this.rotationAxisZ = axis.getZ(); + return this; + } + + public RotatingData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { + this.rotationAxisX = rotationAxisX; + this.rotationAxisY = rotationAxisY; + this.rotationAxisZ = rotationAxisZ; + return this; + } + + @Override + public void write(ByteBuffer buf) { + super.write(buf); + putFloat(buf, rotationalSpeed); + putFloat(buf, rotationOffset); + + putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); + } +} diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index afe714db0..fe4188c5e 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -6,8 +6,8 @@ layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec3 rotationDegrees; -layout (location = 5) in vec2 light; +layout (location = 4) in vec2 light; +layout (location = 5) in vec3 rotationDegrees; layout (location = 6) in float speed; layout (location = 7) in vec2 sourceUV; layout (location = 8) in vec4 scrollTexture; diff --git a/src/main/resources/assets/create/shader/contraption_static.vert b/src/main/resources/assets/create/shader/contraption_static.vert index 3f758039b..673d3bdde 100644 --- a/src/main/resources/assets/create/shader/contraption_static.vert +++ b/src/main/resources/assets/create/shader/contraption_static.vert @@ -38,14 +38,16 @@ mat4 contraptionRotation() { } void main() { - vec4 rotatedPos = contraptionRotation() * vec4(aPos - vec3(0.5), 1); + mat4 rotation = contraptionRotation(); + + vec4 rotatedPos = rotation * vec4(aPos - vec3(0.5), 1); vec4 worldPos = rotatedPos + vec4(cPos + vec3(0.5), 0); vec3 boxCoord = (worldPos.xyz - cPos - cSize * 0.5) / cSize; - //Light = texture(lightVolume, boxCoord).rg; - Normal = aNormal; + Light = vec2(1.); + Normal = normalize((rotation * vec4(aNormal, 0.)).xyz); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; } From 7443ac5031fdb0d1f901b8cb935717eb018094f9 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 8 Jan 2021 14:53:22 -0800 Subject: [PATCH 017/147] start fixing structure tint --- .../utility/render/ContraptionBuffer.java | 24 +++++++++---------- .../render/FastContraptionRenderer.java | 1 + .../utility/render/FastKineticRenderer.java | 3 ++- .../utility/render/instancing/BeltData.java | 2 +- .../render/instancing/InstanceBuffer.java | 16 ++++--------- .../render/instancing/RotatingData.java | 2 +- .../render/instancing/VertexAttribute.java | 15 ++++++++---- .../resources/assets/create/shader/belt.vert | 13 ++++++++-- .../create/shader/contraption_static.vert | 22 +++++++++++++---- .../assets/create/shader/instanced.frag | 15 +++--------- .../assets/create/shader/rotating.vert | 12 ++++++++-- 11 files changed, 73 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java index d667788ca..44ac249d2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java @@ -2,15 +2,19 @@ package com.simibubi.create.foundation.utility.render; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.*; +import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; import java.nio.Buffer; import java.nio.ByteBuffer; public class ContraptionBuffer extends TemplateBuffer { + public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV, COLOR); protected int vao, ebo, vbo; @@ -39,7 +43,7 @@ public class ContraptionBuffer extends TemplateBuffer { GL40.glDrawElements(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0); - for (int i = 0; i <= 3; i++) { + for (int i = 0; i <= FORMAT.getNumAttributes(); i++) { GL40.glDisableVertexAttribArray(i); } @@ -48,9 +52,7 @@ public class ContraptionBuffer extends TemplateBuffer { } private void setup() { - int floatSize = VertexFormatElement.Type.FLOAT.getSize(); - - int stride = floatSize * 8; + int stride = FORMAT.getStride(); int invariantSize = count * stride; ByteBuffer constant = GLAllocation.createDirectByteBuffer(invariantSize); @@ -75,6 +77,11 @@ public class ContraptionBuffer extends TemplateBuffer { constant.putFloat(getU(template, i)); constant.putFloat(getV(template, i)); + constant.putFloat(getR(template, i) / 255f); + constant.putFloat(getG(template, i) / 255f); + constant.putFloat(getB(template, i) / 255f); + constant.putFloat(getA(template, i) / 255f); + indices.putShort((short) i); } constant.rewind(); @@ -92,14 +99,7 @@ public class ContraptionBuffer extends TemplateBuffer { GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); - // vertex positions - GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, stride, 0); - - // vertex normals - GL20.glVertexAttribPointer(1, 3, GL11.GL_FLOAT, false, stride, floatSize * 3L); - - // uv position - GL20.glVertexAttribPointer(2, 2, GL11.GL_FLOAT, false, stride, floatSize * 6L); + FORMAT.informAttributes(0); GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java index 99bc7dabe..7871e86de 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java @@ -10,6 +10,7 @@ import com.simibubi.create.foundation.utility.render.shader.Shader; import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.color.BlockColors; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderWorldLastEvent; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index 804bd174c..dbee28fca 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -12,6 +12,7 @@ import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.Texture; @@ -74,7 +75,7 @@ public class FastKineticRenderer { } public void tick() { - // TODO: (later) detect changes in lighting with a mixin to ClientChunkProvider.markLightChanged() + // TODO: (later) detect changes in lighting with a mixin (or forge hook) to ClientChunkProvider.markLightChanged() for (Cache cache : rotating.values()) { for (RotatingBuffer renderer : cache.asMap().values()) { renderer.clearInstanceData(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java index 079e56174..a4f717903 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java @@ -9,7 +9,7 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; public class BeltData extends BasicData { - public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, VEC3, FLOAT, VEC2, VEC4, FLOAT); + public static VertexFormat FORMAT = new VertexFormat(POSITION, LIGHT, VEC3, FLOAT, VEC2, VEC4, FLOAT); private float rotX; private float rotY; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java index cde07b894..ec46b91f6 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java @@ -14,7 +14,10 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.function.Consumer; +import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; + public abstract class InstanceBuffer extends TemplateBuffer { + public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV); protected int vao, ebo, invariantVBO, instanceVBO, instanceCount; @@ -27,9 +30,7 @@ public abstract class InstanceBuffer extends TemplateBuf } private void setupMainData() { - int floatSize = VertexFormatElement.Type.FLOAT.getSize(); - - int stride = floatSize * 8; + int stride = FORMAT.getStride(); int invariantSize = count * stride; ByteBuffer constant = GLAllocation.createDirectByteBuffer(invariantSize); @@ -72,14 +73,7 @@ public abstract class InstanceBuffer extends TemplateBuf GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); - // vertex positions - GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, stride, 0); - - // vertex normals - GL20.glVertexAttribPointer(1, 3, GL11.GL_FLOAT, false, stride, floatSize * 3L); - - // uv position - GL20.glVertexAttribPointer(2, 2, GL11.GL_FLOAT, false, stride, floatSize * 6L); + FORMAT.informAttributes(0); GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java index 0d556af4b..92e60202f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java @@ -8,7 +8,7 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; public class RotatingData extends BasicData { - public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, FLOAT, FLOAT, VEC3); + public static VertexFormat FORMAT = new VertexFormat(POSITION, LIGHT, FLOAT, FLOAT, VEC3); private float rotationalSpeed; private float rotationOffset; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java index 1a353623e..60d94311d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java @@ -4,12 +4,17 @@ import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.GL20; public class VertexAttribute { + public static final VertexAttribute MAT4 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 16); + public static final VertexAttribute VEC4 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 4); + public static final VertexAttribute VEC3 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 3); + public static final VertexAttribute VEC2 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 2); + public static final VertexAttribute FLOAT = new VertexAttribute(VertexFormatElement.Type.FLOAT, 1); - public static VertexAttribute MAT4 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 16); - public static VertexAttribute VEC4 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 4); - public static VertexAttribute VEC3 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 3); - public static VertexAttribute VEC2 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 2); - public static VertexAttribute FLOAT = new VertexAttribute(VertexFormatElement.Type.FLOAT, 1); + public static final VertexAttribute POSITION = VEC3; + public static final VertexAttribute NORMAL = VEC3; + public static final VertexAttribute COLOR = VEC4; + public static final VertexAttribute UV = VEC2; + public static final VertexAttribute LIGHT= VEC2; private final VertexFormatElement.Type type; private final int count; diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index fe4188c5e..fa9a03d32 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -13,9 +13,10 @@ layout (location = 7) in vec2 sourceUV; layout (location = 8) in vec4 scrollTexture; layout (location = 9) in float scrollMult; -out vec3 Normal; out vec2 TexCoords; out vec2 Light; +out vec4 Color; +out float Diffuse; uniform float time; uniform int ticks; @@ -33,6 +34,13 @@ mat4 rotate(vec3 axis, float angle) { 0., 0., 0., 1.); } +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); +} + void main() { vec3 rot = fract(rotationDegrees / 360.) * PI * 2.; @@ -45,7 +53,8 @@ void main() { float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; - Normal = normalize((rotation * vec4(aNormal, 0.)).xyz); + Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); + Color = vec4(1f); Light = light; TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); gl_Position = projection * view * renderPos; diff --git a/src/main/resources/assets/create/shader/contraption_static.vert b/src/main/resources/assets/create/shader/contraption_static.vert index 673d3bdde..310c82f25 100644 --- a/src/main/resources/assets/create/shader/contraption_static.vert +++ b/src/main/resources/assets/create/shader/contraption_static.vert @@ -4,10 +4,12 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; +layout (location = 3) in vec4 aColor; -out vec3 Normal; +out float Diffuse; out vec2 TexCoords; out vec2 Light; +out vec4 Color; layout (binding = 2) uniform sampler3D lightVolume; @@ -27,9 +29,9 @@ mat4 rotate(vec3 axis, float angle) float oc = 1.0 - c; return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); } mat4 contraptionRotation() { @@ -37,6 +39,13 @@ mat4 contraptionRotation() { return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); } +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); +} + void main() { mat4 rotation = contraptionRotation(); @@ -46,8 +55,11 @@ void main() { vec3 boxCoord = (worldPos.xyz - cPos - cSize * 0.5) / cSize; + float df = diffuse(normalize(aNormal)); + + Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); + Color = vec4(aColor.rgb / df, aColor.a); Light = vec2(1.); - Normal = normalize((rotation * vec4(aNormal, 0.)).xyz); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; } diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index f10008954..9ef766648 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -1,21 +1,15 @@ #version 440 core -in vec3 Normal; in vec2 TexCoords; in vec2 Light; +in vec4 Color; +in float Diffuse; out vec4 fragColor; layout(binding=0) uniform sampler2D BlockAtlas; layout(binding=1) uniform sampler2D LightMap; -float diffuse() { - float x = Normal.x; - float y = Normal.y; - float z = Normal.z; - return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); -} - vec4 light() { vec2 lm = Light * 0.9375 + 0.03125; return texture2D(LightMap, lm); @@ -25,10 +19,7 @@ vec4 light() { void main() { vec4 tex = texture2D(BlockAtlas, TexCoords); - tex *= vec4(light().rgb, 1); - - float df = diffuse(); - tex *= vec4(df, df, df, 1); + tex *= vec4(light().rgb * Diffuse, 1); fragColor = tex; } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index 9c1efea5d..c5ffa4aa2 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -10,9 +10,10 @@ layout (location = 5) in float speed; layout (location = 6) in float rotationOffset; layout (location = 7) in vec3 rotationAxis; -out vec3 Normal; out vec2 TexCoords; out vec2 Light; +out vec4 Color; +out float Diffuse; uniform float time; uniform int ticks; @@ -34,14 +35,21 @@ mat4 kineticRotation() { 0., 0., 0., 1.); } +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); +} void main() { mat4 rotation = kineticRotation(); vec4 renderPos = rotation * vec4(aPos - vec3(0.5), 1); renderPos += vec4(instancePos + vec3(0.5), 0); + Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); + Color = vec4(1f); TexCoords = aTexCoords; - Normal = normalize((rotation * vec4(aNormal, 0.)).xyz); gl_Position = projection * view * renderPos; Light = light; } \ No newline at end of file From 43be3ef8d5ed0a415b5c6095f29800816feff6bd Mon Sep 17 00:00:00 2001 From: grimmauld Date: Sat, 9 Jan 2021 13:16:05 +0100 Subject: [PATCH 018/147] Fix incomplete Render state reset, now doesn't break Journeymap waypoint overlay anymore --- .../create/foundation/utility/render/FastKineticRenderer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index dbee28fca..11a0bbf2e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -175,6 +175,7 @@ public class FastKineticRenderer { RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.disableDepthTest(); + RenderSystem.disableLighting(); } public void registerCompartment(SuperByteBufferCache.Compartment instance) { From 876ddde6602718a0f4fedacfc2a53c1d7b669d55 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 9 Jan 2021 16:34:22 -0800 Subject: [PATCH 019/147] correct contraption lighting --- .../simibubi/create/events/ClientEvents.java | 1 + .../utility/render/ContraptionLighter.java | 122 +++++++++++++----- .../render/FastContraptionRenderer.java | 69 ++++++---- .../render/instancing/InstanceBuffer.java | 2 +- .../utility/render/shader/Shader.java | 2 +- .../resources/assets/create/shader/belt.vert | 2 - .../assets/create/shader/contraption.frag | 24 ++++ ...ntraption_static.vert => contraption.vert} | 11 +- .../assets/create/shader/instanced.frag | 6 +- .../assets/create/shader/rotating.vert | 2 - 10 files changed, 173 insertions(+), 68 deletions(-) create mode 100644 src/main/resources/assets/create/shader/contraption.frag rename src/main/resources/assets/create/shader/{contraption_static.vert => contraption.vert} (91%) diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 5340cbce7..e882743a2 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -78,6 +78,7 @@ public class ClientEvents { return; CreateClient.kineticRenderer.tick(); + FastContraptionRenderer.tick(); CreateClient.schematicSender.tick(); CreateClient.schematicAndQuillHandler.tick(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java index 3e2dd318b..1f7c3169d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java @@ -1,15 +1,16 @@ package com.simibubi.create.foundation.utility.render; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; import net.minecraft.world.LightType; import net.minecraft.world.World; import net.minecraft.world.lighting.WorldLightManager; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; -import org.lwjgl.opengl.GL40; +import org.lwjgl.opengl.*; import java.nio.ByteBuffer; import java.nio.FloatBuffer; @@ -27,6 +28,8 @@ public class ContraptionLighter { ByteBuffer lightVolume; + boolean dirty; + int texture; public ContraptionLighter(Contraption contraption) { @@ -34,53 +37,114 @@ public class ContraptionLighter { AxisAlignedBB bounds = contraption.bounds; - int minX = (int) Math.floor(bounds.minX); - int minY = (int) Math.floor(bounds.minY); - int minZ = (int) Math.floor(bounds.minZ); - int maxX = (int) Math.ceil(bounds.maxX); - int maxY = (int) Math.ceil(bounds.maxY); - int maxZ = (int) Math.ceil(bounds.maxZ); + int minX = (int) Math.floor(bounds.minX) - 1; + int minY = (int) Math.floor(bounds.minY) - 1; + int minZ = (int) Math.floor(bounds.minZ) - 1; + int maxX = (int) Math.ceil(bounds.maxX) + 1; + int maxY = (int) Math.ceil(bounds.maxY) + 1; + int maxZ = (int) Math.ceil(bounds.maxZ) + 1; - sizeX = maxX - minX; - sizeY = maxY - minY; - sizeZ = maxZ - minZ; + sizeX = nextPowerOf2(maxX - minX); + sizeY = nextPowerOf2(maxY - minY); + sizeZ = nextPowerOf2(maxZ - minZ); lightVolume = GLAllocation.createDirectByteBuffer(sizeX * sizeY * sizeZ * 2); + + tick(contraption); + } + + public static int nextPowerOf2(int a) { + int h = Integer.highestOneBit(a); + return (h == a) ? h : (h << 1); + } + + public int getSizeX() { + return sizeX; + } + + public int getSizeY() { + return sizeY; + } + + public int getSizeZ() { + return sizeZ; + } + + public int getMinX() { + return minX; + } + + public int getMinY() { + return minY; + } + + public int getMinZ() { + return minZ; } public void delete() { - GL11.glDeleteTextures(texture); + CreateClient.kineticRenderer.enqueue(() -> { + GL15.glDeleteTextures(texture); + }); } - public void tick() { - + private void setupPosition(Contraption c) { + Vec3d positionVec = c.entity.getPositionVec(); + minX = (int) (Math.floor(positionVec.x) - sizeX / 2); + minY = (int) (Math.floor(positionVec.y)); + minZ = (int) (Math.floor(positionVec.z) - sizeZ / 2); } - public void addLightData(World world, BlockPos pos) { + public void tick(Contraption c) { + setupPosition(c); - int contraptionX = pos.getX() - minX; - int contraptionY = pos.getY() - minY; - int contraptionZ = pos.getZ() - minZ; + World world = c.entity.world; - if (contraptionX < 0 || contraptionX >= sizeX || contraptionY < 0 || contraptionY >= sizeY || contraptionZ < 0 || contraptionZ >= sizeZ) - return; + BlockPos.Mutable pos = new BlockPos.Mutable(); - int blockLight = world.getLightLevel(LightType.BLOCK, pos); - int skyLight = world.getLightLevel(LightType.SKY, pos); + for (int x = 0; x < sizeX; x++) { + for (int y = 0; y < sizeY; y++) { + for (int z = 0; z < sizeZ; z++) { + pos.setPos(minX + x, minY + y, minZ + z); - writeLight(contraptionX, contraptionY, contraptionZ, blockLight, skyLight); + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + writeLight(x, y, z, blockLight, skyLight); + } + } + } + + dirty = true; } private void writeLight(int x, int y, int z, int block, int sky) { - int i = (x + y * sizeX + z * sizeX * sizeY) * 2; + int i = (x + sizeX * (y + z * sizeY)) * 2; - lightVolume.put(i, (byte) (block * 16)); - lightVolume.put(i + 1, (byte) (sky * 16)); + byte b = (byte) ((block & 0xF) << 4); + byte s = (byte) ((sky & 0xF) << 4); + + lightVolume.put(i, b); + lightVolume.put(i + 1, s); } public void use() { + GL13.glEnable(GL31.GL_TEXTURE_3D); + GL13.glActiveTexture(GL40.GL_TEXTURE0 + 4); GL12.glBindTexture(GL12.GL_TEXTURE_3D, texture); - lightVolume.rewind(); - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightVolume); + if (dirty) { + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightVolume); + dirty = false; + } + GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); + GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); + GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL13.GL_CLAMP); + GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL13.GL_CLAMP); + GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL13.GL_CLAMP); + } + + public void release() { + GL13.glActiveTexture(GL40.GL_TEXTURE0 + 4); + GL12.glBindTexture(GL12.GL_TEXTURE_3D, 0); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java index 7871e86de..fe42d7368 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java @@ -14,18 +14,20 @@ import net.minecraft.client.renderer.color.BlockColors; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderWorldLastEvent; +import org.lwjgl.opengl.GL12; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL40; import java.nio.FloatBuffer; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; public class FastContraptionRenderer extends ContraptionRenderer { - private static final Cache renderers = CacheBuilder.newBuilder().build(); + private static final HashMap renderers = new HashMap<>(); private ArrayList renderLayers = new ArrayList<>(); @@ -43,33 +45,48 @@ public class FastContraptionRenderer extends ContraptionRenderer { buildLayers(); } + public static void tick() { + if (Minecraft.getInstance().isGamePaused()) return; + + CreateClient.kineticRenderer.enqueue(() -> { + for (FastContraptionRenderer renderer : renderers.values()) { + renderer.lighter.tick(renderer.c); + } + }); + } + private void setRenderSettings(Vec3d position, Vec3d rotation) { renderPos = position; renderRot = rotation; } private void render(int shader) { -// GL13.glActiveTexture(GL40.GL_TEXTURE2); -// lighter.use(); - - int cSize = GlStateManager.getUniformLocation(shader, "cSize"); - int cPos = GlStateManager.getUniformLocation(shader, "cPos"); - int cRot = GlStateManager.getUniformLocation(shader, "cRot"); + lighter.use(); FloatBuffer buf = ShaderHelper.VEC3_BUFFER; - buf.put(0, (float) c.bounds.getXSize()); - buf.put(1, (float) c.bounds.getYSize()); - buf.put(2, (float) c.bounds.getZSize()); + int lightBoxSize = GlStateManager.getUniformLocation(shader, "lightBoxSize"); + buf.put(0, (float) lighter.getSizeX()); + buf.put(1, (float) lighter.getSizeY()); + buf.put(2, (float) lighter.getSizeZ()); buf.rewind(); - GlStateManager.uniform3(cSize, buf); + GlStateManager.uniform3(lightBoxSize, buf); + int lightBoxMin = GlStateManager.getUniformLocation(shader, "lightBoxMin"); + buf.put(0, (float) lighter.getMinX()); + buf.put(1, (float) lighter.getMinY()); + buf.put(2, (float) lighter.getMinZ()); + buf.rewind(); + GlStateManager.uniform3(lightBoxMin, buf); + + int cPos = GlStateManager.getUniformLocation(shader, "cPos"); buf.put(0, (float) renderPos.x); buf.put(1, (float) renderPos.y); buf.put(2, (float) renderPos.z); buf.rewind(); GlStateManager.uniform3(cPos, buf); + int cRot = GlStateManager.getUniformLocation(shader, "cRot"); buf.put(0, (float) renderRot.x); buf.put(1, (float) renderRot.y); buf.put(2, (float) renderRot.z); @@ -79,6 +96,8 @@ public class FastContraptionRenderer extends ContraptionRenderer { for (ContraptionBuffer layer : renderLayers) { layer.render(); } + + lighter.release(); } private void buildLayers() { @@ -86,8 +105,7 @@ public class FastContraptionRenderer extends ContraptionRenderer { List blockLayers = RenderType.getBlockLayers(); - for (int i = 0; i < blockLayers.size(); i++) { - RenderType layer = blockLayers.get(i); + for (RenderType layer : blockLayers) { renderLayers.add(buildStructureBuffer(c, layer)); } } @@ -96,6 +114,7 @@ public class FastContraptionRenderer extends ContraptionRenderer { for (ContraptionBuffer buffer : renderLayers) { buffer.invalidate(); } + lighter.delete(); renderLayers.clear(); } @@ -105,12 +124,16 @@ public class FastContraptionRenderer extends ContraptionRenderer { } private static FastContraptionRenderer getRenderer(World world, Contraption c) { - try { - return renderers.get(c.entity.getEntityId(), () -> new FastContraptionRenderer(world, c)); - } catch (ExecutionException e) { - e.printStackTrace(); - return null; + FastContraptionRenderer renderer; + int entityId = c.entity.getEntityId(); + if (renderers.containsKey(entityId)) { + renderer = renderers.get(entityId); + } else { + renderer = new FastContraptionRenderer(world, c); + renderers.put(entityId, renderer); } + + return renderer; } public static void renderAll(RenderWorldLastEvent event) { @@ -123,7 +146,7 @@ public class FastContraptionRenderer extends ContraptionRenderer { ArrayList toRemove = new ArrayList<>(); - for (FastContraptionRenderer renderer : renderers.asMap().values()) { + for (FastContraptionRenderer renderer : renderers.values()) { if (renderer.c.entity.isAlive()) renderer.render(shader); else @@ -134,15 +157,17 @@ public class FastContraptionRenderer extends ContraptionRenderer { CreateClient.kineticRenderer.teardown(); - renderers.invalidateAll(toRemove); + for (Integer id : toRemove) { + renderers.remove(id); + } } public static void invalidateAll() { - for (FastContraptionRenderer renderer : renderers.asMap().values()) { + for (FastContraptionRenderer renderer : renderers.values()) { renderer.invalidate(); } - renderers.invalidateAll(); + renderers.clear(); } private static ContraptionBuffer buildStructureBuffer(Contraption c, RenderType layer) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java index ec46b91f6..e849f5dfa 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java @@ -124,7 +124,7 @@ public abstract class InstanceBuffer extends TemplateBuf GL30.glBindVertexArray(vao); finishBuffering(); - int numAttributes = getInstanceFormat().getNumAttributes() + 3; + int numAttributes = getInstanceFormat().getNumAttributes() + FORMAT.getNumAttributes(); for (int i = 0; i <= numAttributes; i++) { GL40.glEnableVertexAttribArray(i); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java index 0820adff9..e3f06bee5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.utility.render.shader; public enum Shader { ROTATING_INSTANCED("shader/rotating.vert", "shader/instanced.frag"), BELT_INSTANCED("shader/belt.vert", "shader/instanced.frag"), - CONTRAPTION_STRUCTURE("shader/contraption_static.vert", "shader/instanced.frag"), + CONTRAPTION_STRUCTURE("shader/contraption.vert", "shader/contraption.frag"), ; public final String vert; diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index fa9a03d32..c40dfd83f 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -15,7 +15,6 @@ layout (location = 9) in float scrollMult; out vec2 TexCoords; out vec2 Light; -out vec4 Color; out float Diffuse; uniform float time; @@ -54,7 +53,6 @@ void main() { float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); - Color = vec4(1f); Light = light; TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); gl_Position = projection * view * renderPos; diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag new file mode 100644 index 000000000..0d5fbe4a3 --- /dev/null +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -0,0 +1,24 @@ +#version 440 core + +in vec2 TexCoords; +in vec4 Color; +in float Diffuse; +in vec3 BoxCoord; + +out vec4 fragColor; + +layout(binding=0) uniform sampler2D BlockAtlas; +layout(binding=1) uniform sampler2D LightMap; +layout(binding=4) uniform sampler3D LightVolume; + +vec4 light() { + vec2 lm = texture(LightVolume, BoxCoord).rg * 0.9375 + 0.03125; + return texture2D(LightMap, lm); +} + + +void main() { + vec4 tex = texture2D(BlockAtlas, TexCoords); + + fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a); +} \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_static.vert b/src/main/resources/assets/create/shader/contraption.vert similarity index 91% rename from src/main/resources/assets/create/shader/contraption_static.vert rename to src/main/resources/assets/create/shader/contraption.vert index 310c82f25..44d4795c7 100644 --- a/src/main/resources/assets/create/shader/contraption_static.vert +++ b/src/main/resources/assets/create/shader/contraption.vert @@ -8,12 +8,11 @@ layout (location = 3) in vec4 aColor; out float Diffuse; out vec2 TexCoords; -out vec2 Light; out vec4 Color; +out vec3 BoxCoord; -layout (binding = 2) uniform sampler3D lightVolume; - -uniform vec3 cSize; +uniform vec3 lightBoxSize; +uniform vec3 lightBoxMin; uniform vec3 cPos; uniform vec3 cRot; @@ -53,13 +52,13 @@ void main() { vec4 worldPos = rotatedPos + vec4(cPos + vec3(0.5), 0); - vec3 boxCoord = (worldPos.xyz - cPos - cSize * 0.5) / cSize; + vec3 boxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; float df = diffuse(normalize(aNormal)); Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); Color = vec4(aColor.rgb / df, aColor.a); - Light = vec2(1.); + BoxCoord = boxCoord; TexCoords = aTexCoords; gl_Position = projection * view * worldPos; } diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index 9ef766648..8172975c0 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -2,7 +2,6 @@ in vec2 TexCoords; in vec2 Light; -in vec4 Color; in float Diffuse; out vec4 fragColor; @@ -15,11 +14,8 @@ vec4 light() { return texture2D(LightMap, lm); } - void main() { vec4 tex = texture2D(BlockAtlas, TexCoords); - tex *= vec4(light().rgb * Diffuse, 1); - - fragColor = tex; + fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a); } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index c5ffa4aa2..b1e2a4ab1 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -12,7 +12,6 @@ layout (location = 7) in vec3 rotationAxis; out vec2 TexCoords; out vec2 Light; -out vec4 Color; out float Diffuse; uniform float time; @@ -48,7 +47,6 @@ void main() { renderPos += vec4(instancePos + vec3(0.5), 0); Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); - Color = vec4(1f); TexCoords = aTexCoords; gl_Position = projection * view * renderPos; Light = light; From d2173614dcec95cf6996cc332a76299b2e46ca7e Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 9 Jan 2021 16:38:30 -0800 Subject: [PATCH 020/147] move lightvolumes down 1 to fix darkness on bottom of contraption --- .../create/foundation/utility/render/ContraptionLighter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java index 1f7c3169d..6641f528e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java @@ -91,7 +91,7 @@ public class ContraptionLighter { private void setupPosition(Contraption c) { Vec3d positionVec = c.entity.getPositionVec(); minX = (int) (Math.floor(positionVec.x) - sizeX / 2); - minY = (int) (Math.floor(positionVec.y)); + minY = (int) (Math.floor(positionVec.y) - 1); minZ = (int) (Math.floor(positionVec.z) - sizeZ / 2); } From 092a92f0953433f175f58e4dc66fcca602a4045a Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 9 Jan 2021 21:59:11 -0800 Subject: [PATCH 021/147] reorganize some stuff cart contraptions should at least be positioned correctly maybe fix a bunch of memory leaks --- .../AbstractContraptionEntityRenderer.java | 8 +- .../ControlledContraptionEntityRenderer.java | 7 -- .../OrientedContraptionEntityRenderer.java | 73 +++++++++++-------- .../simibubi/create/events/ClientEvents.java | 3 + .../utility/render/ContraptionBuffer.java | 8 +- .../utility/render/ContraptionLighter.java | 37 +++++----- .../render/FastContraptionRenderer.java | 21 +++--- .../utility/render/FastKineticRenderer.java | 17 +---- .../foundation/utility/render/RenderWork.java | 21 ++++++ .../utility/render/TemplateBuffer.java | 2 +- .../render/instancing/InstanceBuffer.java | 13 +++- 11 files changed, 119 insertions(+), 91 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/RenderWork.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index d9d22dc20..be0afe739 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -25,7 +25,13 @@ public abstract class AbstractContraptionEntityRenderer { + public void delete() { + RenderWork.enqueue(() -> { GL15.glDeleteBuffers(vbo); GL15.glDeleteBuffers(ebo); GL30.glDeleteVertexArrays(vao); @@ -95,9 +97,11 @@ public class ContraptionBuffer extends TemplateBuffer { GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, vbo); GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant, GL15.GL_STATIC_DRAW); + MemoryUtil.memFree(constant); GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); + MemoryUtil.memFree(indices); FORMAT.informAttributes(0); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java index 6641f528e..d4907f697 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java @@ -1,36 +1,32 @@ package com.simibubi.create.foundation.utility.render; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; import net.minecraft.world.LightType; import net.minecraft.world.World; -import net.minecraft.world.lighting.WorldLightManager; import org.lwjgl.opengl.*; +import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.util.Set; public class ContraptionLighter { - int minX; - int minY; - int minZ; + private int minX; + private int minY; + private int minZ; - int sizeX; - int sizeY; - int sizeZ; + private final int sizeX; + private final int sizeY; + private final int sizeZ; - ByteBuffer lightVolume; + private ByteBuffer lightVolume; - boolean dirty; + private boolean dirty; - int texture; + private int texture; public ContraptionLighter(Contraption contraption) { texture = GL11.glGenTextures(); @@ -50,7 +46,7 @@ public class ContraptionLighter { lightVolume = GLAllocation.createDirectByteBuffer(sizeX * sizeY * sizeZ * 2); - tick(contraption); + update(contraption); } public static int nextPowerOf2(int a) { @@ -83,8 +79,11 @@ public class ContraptionLighter { } public void delete() { - CreateClient.kineticRenderer.enqueue(() -> { + RenderWork.enqueue(() -> { GL15.glDeleteTextures(texture); + texture = 0; + MemoryUtil.memFree(lightVolume); + lightVolume = null; }); } @@ -95,7 +94,9 @@ public class ContraptionLighter { minZ = (int) (Math.floor(positionVec.z) - sizeZ / 2); } - public void tick(Contraption c) { + public void update(Contraption c) { + if (lightVolume == null) return; + setupPosition(c); World world = c.entity.world; @@ -129,6 +130,8 @@ public class ContraptionLighter { } public void use() { + if (texture == 0 || lightVolume == null) return; + GL13.glEnable(GL31.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE0 + 4); GL12.glBindTexture(GL12.GL_TEXTURE_3D, texture); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java index fe42d7368..8aeaa533c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java @@ -1,7 +1,5 @@ package com.simibubi.create.foundation.utility.render; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; @@ -10,20 +8,14 @@ import com.simibubi.create.foundation.utility.render.shader.Shader; import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.color.BlockColors; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderWorldLastEvent; -import org.lwjgl.opengl.GL12; -import org.lwjgl.opengl.GL13; -import org.lwjgl.opengl.GL40; import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ExecutionException; public class FastContraptionRenderer extends ContraptionRenderer { @@ -48,9 +40,9 @@ public class FastContraptionRenderer extends ContraptionRenderer { public static void tick() { if (Minecraft.getInstance().isGamePaused()) return; - CreateClient.kineticRenderer.enqueue(() -> { + RenderWork.enqueue(() -> { for (FastContraptionRenderer renderer : renderers.values()) { - renderer.lighter.tick(renderer.c); + renderer.lighter.update(renderer.c); } }); } @@ -101,7 +93,11 @@ public class FastContraptionRenderer extends ContraptionRenderer { } private void buildLayers() { - invalidate(); + for (ContraptionBuffer buffer : renderLayers) { + buffer.delete(); + } + + renderLayers.clear(); List blockLayers = RenderType.getBlockLayers(); @@ -112,8 +108,9 @@ public class FastContraptionRenderer extends ContraptionRenderer { private void invalidate() { for (ContraptionBuffer buffer : renderLayers) { - buffer.invalidate(); + buffer.delete(); } + lighter.delete(); renderLayers.clear(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index 11a0bbf2e..c014d274d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -12,7 +12,6 @@ import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.Texture; @@ -29,7 +28,6 @@ import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL40; import java.util.*; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -40,14 +38,11 @@ public class FastKineticRenderer { Map, Cache> rotating; Map, Cache> belts; - Queue runs; - boolean rebuild; public FastKineticRenderer() { rotating = new HashMap<>(); belts = new HashMap<>(); - runs = new ConcurrentLinkedQueue<>(); registerCompartment(SuperByteBufferCache.GENERIC_TILE); registerCompartment(SuperByteBufferCache.PARTIAL); registerCompartment(SuperByteBufferCache.DIRECTIONAL_PARTIAL); @@ -91,10 +86,6 @@ public class FastKineticRenderer { // rebuild = true; } - public void enqueue(Runnable run) { - runs.add(run); - } - public void renderInstances(RenderWorldLastEvent event) { GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; // @@ -126,10 +117,6 @@ public class FastKineticRenderer { ShaderHelper.releaseShader(); teardown(); - - while (!runs.isEmpty()) { - runs.remove().run(); - } } public void setup(GameRenderer gameRenderer) { @@ -254,12 +241,12 @@ public class FastKineticRenderer { public void invalidate() { rotating.values().forEach(cache -> { - cache.asMap().values().forEach(InstanceBuffer::invalidate); + cache.asMap().values().forEach(InstanceBuffer::delete); cache.invalidateAll(); }); belts.values().forEach(cache -> { - cache.asMap().values().forEach(InstanceBuffer::invalidate); + cache.asMap().values().forEach(InstanceBuffer::delete); cache.invalidateAll(); }); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/RenderWork.java b/src/main/java/com/simibubi/create/foundation/utility/render/RenderWork.java new file mode 100644 index 000000000..d11e11433 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/RenderWork.java @@ -0,0 +1,21 @@ +package com.simibubi.create.foundation.utility.render; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class RenderWork { + private static final Queue runs = new ConcurrentLinkedQueue<>(); + + public static void runAll() { + while (!runs.isEmpty()) { + runs.remove().run(); + } + } + + /** + * Queue work to be executed at the end of a frame + */ + public static void enqueue(Runnable run) { + runs.add(run); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java index 109b1f94c..e526fe3b5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java @@ -23,7 +23,7 @@ public class TemplateBuffer { count = state.getFirst().getCount(); int size = count * formatSize; - template = GLAllocation.createDirectByteBuffer(size); + template = ByteBuffer.allocate(size); template.order(rendered.order()); ((Buffer)template).limit(((Buffer)rendered).limit()); template.put(rendered); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java index e849f5dfa..5a4bd4c14 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java @@ -3,11 +3,13 @@ package com.simibubi.create.foundation.utility.render.instancing; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.render.RenderWork; import com.simibubi.create.foundation.utility.render.TemplateBuffer; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.*; +import org.lwjgl.system.MemoryUtil; import java.nio.Buffer; import java.nio.ByteBuffer; @@ -69,9 +71,11 @@ public abstract class InstanceBuffer extends TemplateBuf GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, invariantVBO); GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant, GL15.GL_STATIC_DRAW); + MemoryUtil.memFree(constant); GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); + MemoryUtil.memFree(indices); FORMAT.informAttributes(0); @@ -96,8 +100,8 @@ public abstract class InstanceBuffer extends TemplateBuf shouldBuild = true; } - public void invalidate() { - CreateClient.kineticRenderer.enqueue(() -> { + public void delete() { + RenderWork.enqueue(() -> { GL15.glDeleteBuffers(invariantVBO); GL15.glDeleteBuffers(instanceVBO); GL15.glDeleteBuffers(ebo); @@ -158,10 +162,11 @@ public abstract class InstanceBuffer extends TemplateBuf GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); - instanceFormat.informAttributes(3); + int staticAttributes = FORMAT.getNumAttributes(); + instanceFormat.informAttributes(staticAttributes); for (int i = 0; i < instanceFormat.getNumAttributes(); i++) { - GL40.glVertexAttribDivisor(i + 3, 1); + GL40.glVertexAttribDivisor(i + staticAttributes, 1); } // Deselect (bind to 0) the VBO From a56d08b78e43983acb92ec821cc49148d797d047 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 11 Jan 2021 00:29:02 -0800 Subject: [PATCH 022/147] a bunch of refactoring to make things easier later it's not any more stable but belts render on contraptions rotating things almost do actually fix a bunch of memory leaks --- .../com/simibubi/create/AllBlockPartials.java | 22 ++- .../com/simibubi/create/CreateClient.java | 8 +- .../contraptions/base/KineticTileEntity.java | 6 + .../base/KineticTileEntityRenderer.java | 42 ++--- .../components/actors/DrillRenderer.java | 7 +- .../components/clock/CuckooClockRenderer.java | 13 +- .../components/deployer/DeployerRenderer.java | 8 +- .../components/fan/EncasedFanRenderer.java | 35 ++-- .../components/flywheel/FlywheelRenderer.java | 8 +- .../millstone/MillstoneRenderer.java | 7 +- .../motor/CreativeMotorRenderer.java | 6 +- .../components/saw/SawRenderer.java | 17 +- .../bearing/BearingRenderer.java | 12 +- .../contraptions/fluids/PumpRenderer.java | 8 +- .../advanced/SpeedControllerRenderer.java | 10 +- .../relays/belt/BeltRenderer.java | 22 ++- .../relays/encased/SplitShaftRenderer.java | 23 ++- .../relays/gearbox/GearboxRenderer.java | 24 ++- .../block/mechanicalArm/ArmRenderer.java | 8 +- .../simibubi/create/events/ClientEvents.java | 19 +- .../foundation/ResourceReloadHandler.java | 4 +- .../command/ClearBufferCacheCommand.java | 4 +- .../utility/render/ContraptionBuffer.java | 81 ++++----- .../utility/render/ContraptionLighter.java | 14 +- .../render/FastContraptionRenderer.java | 141 +++++++++----- .../utility/render/FastKineticRenderer.java | 146 +++++++++------ .../utility/render/SafeDirectBuffer.java | 172 ++++++++++++++++++ .../utility/render/TemplateBuffer.java | 26 ++- .../render/TileEntityRenderHelper.java | 3 + .../utility/render/instancing/BasicData.java | 5 +- .../utility/render/instancing/BeltData.java | 6 +- .../IInstancedTileEntityRenderer.java | 8 +- .../render/instancing/InstanceBuffer.java | 122 ++++++------- .../render/instancing/InstanceContext.java | 56 ++++++ .../render/instancing/InstanceData.java | 12 +- .../render/instancing/RotatingData.java | 6 +- .../render/instancing/VertexAttribute.java | 4 +- .../utility/render/shader/Shader.java | 6 +- .../utility/render/shader/ShaderHelper.java | 22 +-- .../assets/create/shader/contraption.frag | 1 - .../assets/create/shader/contraption.vert | 18 +- .../create/shader/contraption_belt.vert | 79 ++++++++ .../create/shader/contraption_rotating.vert | 71 ++++++++ 43 files changed, 916 insertions(+), 396 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceContext.java create mode 100644 src/main/resources/assets/create/shader/contraption_belt.vert create mode 100644 src/main/resources/assets/create/shader/contraption_rotating.vert diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 580b612b7..9279194c2 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -9,12 +9,13 @@ import java.util.List; import java.util.Map; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.*; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.IBakedModel; @@ -217,19 +218,20 @@ public class AllBlockPartials { return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); } - public RotatingBuffer renderOnRotating(BlockState referenceState) { - return CreateClient.kineticRenderer.renderPartialRotating(this, referenceState); + public InstanceBuffer renderOnRotating(InstanceContext ctx, BlockState referenceState) { + return ctx.getKinetics().renderPartialRotating(this, referenceState); } - public BeltBuffer renderOnBelt(BlockState referenceState) { - return CreateClient.kineticRenderer.renderPartialBelt(this, referenceState); + public InstanceBuffer renderOnBelt(InstanceContext ctx, BlockState referenceState) { + return ctx.getKinetics().renderPartialBelt(this, referenceState); } - public RotatingBuffer renderOnDirectionalSouthRotating(BlockState referenceState) { + public InstanceBuffer renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState) { Direction facing = referenceState.get(FACING); - return renderOnDirectionalSouthRotating(referenceState, facing); + return renderOnDirectionalSouthRotating(ctx, referenceState, facing); } - public RotatingBuffer renderOnDirectionalSouthRotating(BlockState referenceState, Direction facing) { + + public InstanceBuffer renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState, Direction facing) { MatrixStack ms = new MatrixStack(); // TODO 1.15 find a way to cache this model matrix computation MatrixStacker.of(ms) @@ -237,7 +239,7 @@ public class AllBlockPartials { .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(AngleHelper.verticalAngle(facing)) .unCentre(); - return CreateClient.kineticRenderer.renderDirectionalPartialInstanced(this, referenceState, facing, ms); + return ctx.getKinetics().renderDirectionalPartialInstanced(this, referenceState, facing, ms); } } diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index d5f9d9b0a..fc635297e 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,6 +16,7 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; +import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; import com.simibubi.create.foundation.utility.render.FastKineticRenderer; import com.simibubi.create.foundation.utility.render.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; @@ -73,8 +74,6 @@ public class CreateClient { bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); kineticRenderer = new FastKineticRenderer(); - kineticRenderer.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); - kineticRenderer.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); AllKeys.register(); AllContainerTypes.registerScreenFactories(); @@ -180,4 +179,9 @@ public class CreateClient { return casingConnectivity; } + public static void invalidateRenderers() { + CreateClient.bufferCache.invalidate(); + CreateClient.kineticRenderer.invalidate(); + FastContraptionRenderer.invalidateAll(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 89382d10e..e0b1824ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -457,8 +457,14 @@ public abstract class KineticTileEntity extends SmartTileEntity } public static AxisAlignedBB NOWHERE_AABB = new AxisAlignedBB(Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN); + @Override public AxisAlignedBB getRenderBoundingBox() { return super.getRenderBoundingBox(); } + + @Override + public double getMaxRenderDistanceSquared() { + return 16384.0D; // TODO: make this a config option + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index bfb3ce64e..21d520f33 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -2,21 +2,17 @@ package com.simibubi.create.content.contraptions.base; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.*; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; @@ -48,32 +44,36 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer(te)); } @Override - public void addInstanceData(KineticTileEntity te) { - renderRotatingBuffer(te, getRotatedModel(te)); + public void addInstanceData(InstanceContext ctx) { + renderRotatingBuffer(ctx, getRotatedModel(ctx)); } - public static void renderRotatingKineticBlock(KineticTileEntity te, BlockState renderedState) { - RotatingBuffer instancedRenderer = CreateClient.kineticRenderer.renderBlockInstanced(KINETIC_TILE, renderedState); - renderRotatingBuffer(te, instancedRenderer); + public static void renderRotatingKineticBlock(InstanceContext ctx, BlockState renderedState) { + InstanceBuffer instancedRenderer = ctx.getKinetics().renderBlockInstanced(KINETIC_TILE, renderedState); + renderRotatingBuffer(ctx, instancedRenderer); } - public static void renderRotatingBuffer(KineticTileEntity te, RotatingBuffer instancer) { + public static void renderRotatingBuffer(InstanceContext ctx, InstanceBuffer instancer) { instancer.setupInstance(data -> { + T te = ctx.te; final BlockPos pos = te.getPos(); Axis axis = ((IRotate) te.getBlockState() .getBlock()).getRotationAxis(te.getBlockState()); - data - .setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos())) - .setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos())) - .setRotationalSpeed(te.getSpeed()) - .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) - .setRotationAxis(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis).getUnitVector()) - .setPosition(pos); + data.setRotationalSpeed(te.getSpeed()) + .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis).getUnitVector()) + .setPosition(pos); + + if (ctx.checkWorldLight()) { + data.setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos())) + .setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos())); + } }); } @@ -139,8 +139,8 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer getRotatedModel(InstanceContext ctx) { + return ctx.getKinetics().renderBlockInstanced(KINETIC_TILE, getRenderedBlockState(ctx.te)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 636a7f89d..b0a9324f8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -10,7 +10,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; @@ -28,8 +29,8 @@ public class DrillRenderer extends KineticTileEntityRenderer { } @Override - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(te.getBlockState()); + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); } protected static SuperByteBuffer getRotatingModel(BlockState state) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index d978ac439..a3d11138a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; @@ -93,14 +93,9 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { } @Override - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { - return transform(AllBlockPartials.SHAFT_HALF, te); - } - - private RotatingBuffer transform(AllBlockPartials partial, KineticTileEntity te) { - return partial.renderOnDirectionalSouthRotating(te.getBlockState(), te.getBlockState() - .get(CuckooClockBlock.HORIZONTAL_FACING) - .getOpposite()); + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + BlockState blockState = ctx.te.getBlockState(); + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, blockState, blockState.get(CuckooClockBlock.HORIZONTAL_FACING).getOpposite()); } private SuperByteBuffer rotateHand(SuperByteBuffer buffer, float angle, Direction facing) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 48ff5a7d4..92b4d5273 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -20,6 +20,7 @@ import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -51,12 +52,11 @@ public class DeployerRenderer extends SafeTileEntityRenderer FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); renderComponents(te, partialTicks, ms, buffer, light, overlay); - addInstanceData(te); } @Override - public void addInstanceData(DeployerTileEntity te) { - KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te)); + public void addInstanceData(InstanceContext ctx) { + KineticTileEntityRenderer.renderRotatingKineticBlock(ctx, getRenderedBlockState(ctx.te)); } protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, @@ -110,7 +110,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te)); + KineticTileEntityRenderer.renderRotatingKineticBlock(new InstanceContext.World<>(te), getRenderedBlockState(te)); BlockState blockState = te.getBlockState(); BlockPos pos = te.getPos(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index e26d8b77d..d634a5823 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -8,7 +8,10 @@ import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -26,24 +29,21 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - addInstanceData(te); + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); } @Override - public void addInstanceData(KineticTileEntity te) { + public void addInstanceData(InstanceContext ctx) { + KineticTileEntity te = ctx.te; Direction direction = te.getBlockState() .get(FACING); - BlockPos inFront = te.getPos().offset(direction); - int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, inFront); - int skyLight = te.getWorld().getLightLevel(LightType.SKY, inFront); + InstanceBuffer shaftHalf = + AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); + InstanceBuffer fanInner = + AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); - RotatingBuffer shaftHalf = - AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite()); - RotatingBuffer fanInner = - AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite()); - - renderRotatingBuffer(te, shaftHalf); + renderRotatingBuffer(ctx, shaftHalf); fanInner.setupInstance(data -> { final BlockPos pos = te.getPos(); Direction.Axis axis = ((IRotate) te.getBlockState() @@ -55,12 +55,19 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { if (speed < 0) speed = MathHelper.clamp(speed, -64 * 20, -80); - data.setBlockLight(blockLight) - .setSkyLight(skyLight) - .setRotationalSpeed(speed) + data.setRotationalSpeed(speed) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) .setPosition(pos); + + if (ctx.checkWorldLight()) { + BlockPos inFront = te.getPos().offset(direction); + int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, inFront); + int skyLight = te.getWorld().getLightLevel(LightType.SKY, inFront); + + data.setBlockLight(blockLight) + .setSkyLight(skyLight); + } }); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 563fe72b2..ae072d95d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -9,10 +9,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -77,8 +77,8 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { } @Override - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), te.getBlockState() + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState(), ctx.te.getBlockState() .get(HORIZONTAL_FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index 67dd39cb0..7a0e86232 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -1,12 +1,11 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -17,8 +16,8 @@ public class MillstoneRenderer extends KineticTileEntityRenderer { } @Override - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { - return CreateClient.kineticRenderer.renderPartialRotating(AllBlockPartials.MILLSTONE_COG, te.getBlockState()); + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + return AllBlockPartials.MILLSTONE_COG.renderOnRotating(ctx, ctx.te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 902e25c47..a52a7d586 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -16,8 +16,8 @@ public class CreativeMotorRenderer extends KineticTileEntityRenderer { } @Override - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState()); + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 05d1ba113..299173139 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -12,8 +12,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRe import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.*; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -43,12 +42,11 @@ public class SawRenderer extends SafeTileEntityRenderer implement renderItems(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); - addInstanceData(te); } @Override - public void addInstanceData(SawTileEntity te) { - KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te)); + public void addInstanceData(InstanceContext ctx) { + KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx)); } protected void renderBlade(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light){ @@ -86,7 +84,7 @@ public class SawRenderer extends SafeTileEntityRenderer implement } protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te)); + //KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te)); } protected void renderItems(SawTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, @@ -130,11 +128,12 @@ public class SawRenderer extends SafeTileEntityRenderer implement } } - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + KineticTileEntity te = ctx.te; BlockState state = te.getBlockState(); if (state.get(FACING).getAxis().isHorizontal()) - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); - return CreateClient.kineticRenderer.renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); + return ctx.getKinetics().renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index b53ea6f5f..1af98d926 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -5,11 +5,12 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -46,10 +47,9 @@ public class BearingRenderer extends KineticTileEntityRenderer { } @Override - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), te.getBlockState() - .get(BearingBlock.FACING) - .getOpposite()); + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + BlockState blockState = ctx.te.getBlockState(); + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, blockState, blockState.get(BearingBlock.FACING).getOpposite()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index fee2c8993..89c8ec4ea 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -6,10 +6,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -54,8 +54,8 @@ public class PumpRenderer extends KineticTileEntityRenderer { } @Override - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(te.getBlockState()); + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 25cf15b8f..f16a7e9a8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -5,8 +5,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.*; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -21,15 +20,14 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer ctx) { + KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx.te)); } - private RotatingBuffer getRotatedModel(SpeedControllerTileEntity te) { + private InstanceBuffer getRotatedModel(SpeedControllerTileEntity te) { return CreateClient.kineticRenderer.renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(te))); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 6e7731d36..38a7d6587 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.contraptions.relays.belt; import java.util.Random; +import java.util.function.BiFunction; +import java.util.function.Function; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; @@ -13,9 +15,9 @@ import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer; -import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; +import com.simibubi.create.foundation.utility.render.FastKineticRenderer; +import com.simibubi.create.foundation.utility.render.instancing.*; import com.simibubi.create.foundation.utility.render.ShadowRenderHelper; import net.minecraft.block.BlockState; @@ -51,13 +53,13 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme if (!AllBlocks.BELT.has(blockState)) return; - addInstanceData(te); - + addInstanceData(new InstanceContext.World<>(te)); renderItems(te, partialTicks, ms, buffer, light, overlay); } @Override - public void addInstanceData(BeltTileEntity te) { + public void addInstanceData(InstanceContext ctx) { + BeltTileEntity te = ctx.te; BlockState blockState = te.getBlockState(); if (!AllBlocks.BELT.has(blockState)) return; @@ -83,6 +85,8 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme end = b; } + FastKineticRenderer fastKineticRenderer = ctx.getKinetics(); + for (boolean bottom : Iterate.trueAndFalse) { AllBlockPartials beltPartial = diagonal @@ -94,7 +98,7 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme : start ? AllBlockPartials.BELT_START : end ? AllBlockPartials.BELT_END : AllBlockPartials.BELT_MIDDLE; - BeltBuffer beltBuffer = beltPartial.renderOnBelt(blockState); + InstanceBuffer beltBuffer = beltPartial.renderOnBelt(ctx, blockState); SpriteShiftEntry spriteShift = diagonal ? AllSpriteShifts.BELT_DIAGONAL : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; @@ -139,9 +143,9 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme msr.rotateX(90); msr.unCentre(); - RotatingBuffer rotatingBuffer = CreateClient.kineticRenderer + InstanceBuffer rotatingBuffer = fastKineticRenderer .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); - KineticTileEntityRenderer.renderRotatingBuffer(te, rotatingBuffer); + KineticTileEntityRenderer.renderRotatingBuffer(ctx, rotatingBuffer); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 2b9660e6a..6785f5660 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -7,7 +7,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -25,18 +28,26 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - - addInstanceData(te); + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); } @Override - public void addInstanceData(KineticTileEntity te) { + public void addInstanceData(InstanceContext ctx) { + KineticTileEntity te = ctx.te; Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final BlockPos pos = te.getPos(); - int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()); - int skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos()); + int blockLight; + int skyLight; + + if (ctx.checkWorldLight()) { + blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()); + skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos()); + } else { + blockLight = 0; + skyLight = 0; + } for (Direction direction : Iterate.directions) { Axis axis = direction.getAxis(); @@ -44,7 +55,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { continue; - RotatingBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction); + InstanceBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); shaft.setupInstance(data -> { float speed = te.getSpeed(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 94705946b..00b74854d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -6,7 +6,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; @@ -24,18 +27,32 @@ public class GearboxRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + } + + @Override + public void addInstanceData(InstanceContext ctx) { + KineticTileEntity te = ctx.te; final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); - int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()); - int skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos()); + int blockLight; + int skyLight; + + if (ctx.checkWorldLight()) { + blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()); + skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos()); + } else { + blockLight = 0; + skyLight = 0; + } for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); if (boxAxis == axis) continue; - RotatingBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction); + InstanceBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); shaft.setupInstance(data -> { float speed = te.getSpeed(); @@ -58,5 +75,4 @@ public class GearboxRenderer extends KineticTileEntityRenderer { }); } } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index a41f7a4cc..c89f6b956 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -118,8 +118,8 @@ public class ArmRenderer extends KineticTileEntityRenderer { } @Override - protected RotatingBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.ARM_COG.renderOnRotating(te.getBlockState()); + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + return AllBlockPartials.ARM_COG.renderOnRotating(ctx, ctx.te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 7c4aec461..2a88508ee 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -37,6 +37,7 @@ import com.simibubi.create.foundation.utility.render.RenderWork; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.IFluidState; @@ -112,21 +113,25 @@ public class ClientEvents { @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { - CreateClient.bufferCache.invalidate(); - CreateClient.kineticRenderer.invalidate(); - FastContraptionRenderer.invalidateAll(); + CreateClient.invalidateRenderers(); } @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { - CreateClient.kineticRenderer.renderInstances(event); - FastContraptionRenderer.renderAll(event); + Matrix4f projection = event.getProjectionMatrix(); + // view matrix + Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); + + Matrix4f view = Matrix4f.translate((float) -cameraPos.x, (float) -cameraPos.y, (float) -cameraPos.z); + view.multiplyBackward(event.getMatrixStack().peek().getModel()); + + CreateClient.kineticRenderer.renderInstancesAsWorld(projection, view); + FastContraptionRenderer.renderAll(projection, view); MatrixStack ms = event.getMatrixStack(); ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); - Vec3d view = info.getProjectedView(); ms.push(); - ms.translate(-view.getX(), -view.getY(), -view.getZ()); + ms.translate(-cameraPos.getX(), -cameraPos.getY(), -cameraPos.getZ()); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); CouplingRenderer.renderAll(ms, buffer); diff --git a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java index 7809c8bc5..a5ee6a1c7 100644 --- a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java @@ -18,9 +18,7 @@ public class ResourceReloadHandler extends ReloadListener { @Override protected void apply(Object $, IResourceManager resourceManagerIn, IProfiler profilerIn) { SpriteShifter.reloadUVs(); - CreateClient.bufferCache.invalidate(); - CreateClient.kineticRenderer.invalidate(); - FastContraptionRenderer.invalidateAll(); + CreateClient.invalidateRenderers(); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java index 159f96861..3dc3d23a3 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java @@ -23,8 +23,6 @@ public class ClearBufferCacheCommand { @OnlyIn(Dist.CLIENT) private static void execute() { - CreateClient.bufferCache.invalidate(); - CreateClient.kineticRenderer.invalidate(); - FastContraptionRenderer.invalidateAll(); + CreateClient.invalidateRenderers(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java index 9f4e0f697..5c2a8f2c5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java @@ -1,11 +1,9 @@ package com.simibubi.create.foundation.utility.render; import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.*; import org.lwjgl.system.MemoryUtil; @@ -43,7 +41,7 @@ public class ContraptionBuffer extends TemplateBuffer { GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GL40.glDrawElements(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0); + GL40.glDrawElements(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0); for (int i = 0; i <= FORMAT.getNumAttributes(); i++) { GL40.glDisableVertexAttribArray(i); @@ -55,55 +53,50 @@ public class ContraptionBuffer extends TemplateBuffer { private void setup() { int stride = FORMAT.getStride(); - int invariantSize = count * stride; + int invariantSize = vertexCount * stride; - ByteBuffer constant = GLAllocation.createDirectByteBuffer(invariantSize); - constant.order(template.order()); - ((Buffer) constant).limit(invariantSize); + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + // Deselect (bind to 0) the VAO + GL30.glBindVertexArray(0); - int indicesSize = count * VertexFormatElement.Type.USHORT.getSize(); - ByteBuffer indices = GLAllocation.createDirectByteBuffer(indicesSize); - indices.order(template.order()); - ((Buffer) indices).limit(indicesSize); + try (SafeDirectBuffer constant = new SafeDirectBuffer(invariantSize)) { + constant.order(template.order()); + constant.limit(invariantSize); - int vertexCount = vertexCount(template); - for (int i = 0; i < vertexCount; i++) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); + for (int i = 0; i < vertexCount; i++) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); - constant.putFloat(getNX(template, i)); - constant.putFloat(getNY(template, i)); - constant.putFloat(getNZ(template, i)); + constant.put(getNX(template, i)); + constant.put(getNY(template, i)); + constant.put(getNZ(template, i)); - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); - constant.putFloat(getR(template, i) / 255f); - constant.putFloat(getG(template, i) / 255f); - constant.putFloat(getB(template, i) / 255f); - constant.putFloat(getA(template, i) / 255f); + constant.put(getR(template, i)); + constant.put(getG(template, i)); + constant.put(getB(template, i)); + constant.put(getA(template, i)); + } + constant.rewind(); + + vao = GL30.glGenVertexArrays(); + GL30.glBindVertexArray(vao); + + ebo = GlStateManager.genBuffers(); + vbo = GlStateManager.genBuffers(); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, vbo); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant.getBacking(), GL15.GL_STATIC_DRAW); + buildEBO(ebo); + + FORMAT.informAttributes(0); + } catch (Exception e) { - indices.putShort((short) i); } - constant.rewind(); - indices.rewind(); - - vao = GL30.glGenVertexArrays(); - GL30.glBindVertexArray(vao); - - ebo = GlStateManager.genBuffers(); - vbo = GlStateManager.genBuffers(); - - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, vbo); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant, GL15.GL_STATIC_DRAW); - MemoryUtil.memFree(constant); - - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); - MemoryUtil.memFree(indices); - - FORMAT.informAttributes(0); GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java index d4907f697..083924da3 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.utility.render; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.RenderType; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -132,22 +133,19 @@ public class ContraptionLighter { public void use() { if (texture == 0 || lightVolume == null) return; - GL13.glEnable(GL31.GL_TEXTURE_3D); - GL13.glActiveTexture(GL40.GL_TEXTURE0 + 4); GL12.glBindTexture(GL12.GL_TEXTURE_3D, texture); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL13.GL_CLAMP); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL13.GL_CLAMP); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL13.GL_CLAMP); if (dirty) { GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightVolume); dirty = false; } - GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); - GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); - GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL13.GL_CLAMP); - GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL13.GL_CLAMP); - GL40.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL13.GL_CLAMP); } public void release() { - GL13.glActiveTexture(GL40.GL_TEXTURE0 + 4); GL12.glBindTexture(GL12.GL_TEXTURE_3D, 0); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java index 8aeaa533c..465946b71 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java @@ -1,16 +1,23 @@ package com.simibubi.create.foundation.utility.render; import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; +import com.simibubi.create.foundation.utility.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.utility.render.shader.Shader; +import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.client.event.RenderWorldLastEvent; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL40; import java.nio.FloatBuffer; import java.util.ArrayList; @@ -25,6 +32,8 @@ public class FastContraptionRenderer extends ContraptionRenderer { private ContraptionLighter lighter; + public final FastKineticRenderer kinetics; + private Contraption c; private Vec3d renderPos; @@ -33,18 +42,49 @@ public class FastContraptionRenderer extends ContraptionRenderer { public FastContraptionRenderer(World world, Contraption c) { this.c = c; this.lighter = new ContraptionLighter(c); + this.kinetics = new FastKineticRenderer(); - buildLayers(); + buildLayers(c); + buildInstancedTiles(c); + } + + private void buildLayers(Contraption c) { + for (ContraptionBuffer buffer : renderLayers) { + buffer.delete(); + } + + renderLayers.clear(); + + List blockLayers = RenderType.getBlockLayers(); + + for (RenderType layer : blockLayers) { + renderLayers.add(buildStructureBuffer(c, layer)); + } + } + + private void buildInstancedTiles(Contraption c) { + List tileEntities = c.renderedTileEntities; + if (!tileEntities.isEmpty()) { + for (TileEntity te : tileEntities) { + if (te instanceof IInstanceRendered) { + TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(te); + + if (renderer instanceof IInstancedTileEntityRenderer) { + kinetics.addInstancedData(this, te, (IInstancedTileEntityRenderer) renderer); + } + } + } + } + + kinetics.markAllDirty(); } public static void tick() { if (Minecraft.getInstance().isGamePaused()) return; - RenderWork.enqueue(() -> { - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.lighter.update(renderer.c); - } - }); + for (FastContraptionRenderer renderer : renderers.values()) { + renderer.lighter.update(renderer.c); + } } private void setRenderSettings(Vec3d position, Vec3d rotation) { @@ -52,9 +92,16 @@ public class FastContraptionRenderer extends ContraptionRenderer { renderRot = rotation; } - private void render(int shader) { + private void setup(int shader) { + setupShaderUniforms(shader); lighter.use(); + } + private void teardown() { + lighter.release(); + } + + private void setupShaderUniforms(int shader) { FloatBuffer buf = ShaderHelper.VEC3_BUFFER; int lightBoxSize = GlStateManager.getUniformLocation(shader, "lightBoxSize"); @@ -84,26 +131,6 @@ public class FastContraptionRenderer extends ContraptionRenderer { buf.put(2, (float) renderRot.z); buf.rewind(); GlStateManager.uniform3(cRot, buf); - - for (ContraptionBuffer layer : renderLayers) { - layer.render(); - } - - lighter.release(); - } - - private void buildLayers() { - for (ContraptionBuffer buffer : renderLayers) { - buffer.delete(); - } - - renderLayers.clear(); - - List blockLayers = RenderType.getBlockLayers(); - - for (RenderType layer : blockLayers) { - renderLayers.add(buildStructureBuffer(c, layer)); - } } private void invalidate() { @@ -113,6 +140,8 @@ public class FastContraptionRenderer extends ContraptionRenderer { lighter.delete(); + kinetics.invalidate(); + renderLayers.clear(); } @@ -133,26 +162,56 @@ public class FastContraptionRenderer extends ContraptionRenderer { return renderer; } - public static void renderAll(RenderWorldLastEvent event) { + public static void renderAll(Matrix4f projectionMat, Matrix4f viewMat) { + removeDeadContraptions(); + + if (renderers.isEmpty()) return; + GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; - CreateClient.kineticRenderer.setup(gameRenderer); - GlStateManager.enableCull(); + FastKineticRenderer.setup(gameRenderer); + GL11.glEnable(GL13.GL_TEXTURE_3D); + GL13.glActiveTexture(GL40.GL_TEXTURE4); - ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, ShaderHelper.getViewProjectionCallback(event)); - int shader = ShaderHelper.getShaderHandle(Shader.CONTRAPTION_STRUCTURE); - - ArrayList toRemove = new ArrayList<>(); + ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projectionMat, viewMat); + int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); for (FastContraptionRenderer renderer : renderers.values()) { - if (renderer.c.entity.isAlive()) - renderer.render(shader); - else - toRemove.add(renderer.c.entity.getEntityId()); + renderer.setup(structureShader); + for (ContraptionBuffer layer : renderer.renderLayers) { + layer.render(); + } + renderer.teardown(); + } + + int rotatingShader = ShaderHelper.useShader(Shader.CONTRAPTION_ROTATING, callback); + for (FastContraptionRenderer renderer : renderers.values()) { + renderer.setup(rotatingShader); + renderer.kinetics.renderRotating(); + renderer.teardown(); + } + + int beltShader = ShaderHelper.useShader(Shader.CONTRAPTION_BELT, callback); + for (FastContraptionRenderer renderer : renderers.values()) { + renderer.setup(beltShader); + renderer.kinetics.renderBelts(); + renderer.teardown(); } ShaderHelper.releaseShader(); - CreateClient.kineticRenderer.teardown(); + GL11.glDisable(GL13.GL_TEXTURE_3D); + FastKineticRenderer.teardown(); + } + + public static void removeDeadContraptions() { + ArrayList toRemove = new ArrayList<>(); + + for (FastContraptionRenderer renderer : renderers.values()) { + if (!renderer.c.entity.isAlive()) { + toRemove.add(renderer.c.entity.getEntityId()); + renderer.invalidate(); + } + } for (Integer id : toRemove) { renderers.remove(id); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java index c014d274d..d28dccf9a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java @@ -3,9 +3,9 @@ package com.simibubi.create.foundation.utility.render; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.render.instancing.*; import com.simibubi.create.foundation.utility.render.shader.Shader; import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; @@ -21,7 +21,6 @@ import net.minecraft.inventory.container.PlayerContainer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.world.World; -import net.minecraftforge.client.event.RenderWorldLastEvent; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; @@ -35,8 +34,8 @@ import java.util.function.Supplier; import static com.simibubi.create.foundation.utility.render.SuperByteBufferCache.PARTIAL; public class FastKineticRenderer { - Map, Cache> rotating; - Map, Cache> belts; + Map, Cache>> rotating; + Map, Cache>> belts; boolean rebuild; @@ -46,6 +45,7 @@ public class FastKineticRenderer { registerCompartment(SuperByteBufferCache.GENERIC_TILE); registerCompartment(SuperByteBufferCache.PARTIAL); registerCompartment(SuperByteBufferCache.DIRECTIONAL_PARTIAL); + registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); } public void buildTileEntityBuffers(World world) { @@ -65,66 +65,102 @@ public class FastKineticRenderer { } } - private void addInstancedData(T te, IInstancedTileEntityRenderer renderer) { - renderer.addInstanceData(te); + void addInstancedData(T te, IInstancedTileEntityRenderer renderer) { + renderer.addInstanceData(new InstanceContext.World<>(te)); + } + + void addInstancedData(FastContraptionRenderer c, T te, IInstancedTileEntityRenderer renderer) { + renderer.addInstanceData(new InstanceContext.Contraption<>(te, c)); + } + + /** + * This function should be called after building instances. + * It must be called either on the render thread before committing to rendering, or in a place where there are + * guaranteed to be no race conditions with the render thread, i.e. when constructing a FastContraptionRenderer. + */ + public void markAllDirty() { + for (Cache> cache : rotating.values()) { + for (InstanceBuffer renderer : cache.asMap().values()) { + renderer.markDirty(); + } + } + + for (Cache> cache : belts.values()) { + for (InstanceBuffer renderer : cache.asMap().values()) { + renderer.markDirty(); + } + } } public void tick() { // TODO: (later) detect changes in lighting with a mixin (or forge hook) to ClientChunkProvider.markLightChanged() - for (Cache cache : rotating.values()) { - for (RotatingBuffer renderer : cache.asMap().values()) { + for (Cache> cache : rotating.values()) { + for (InstanceBuffer renderer : cache.asMap().values()) { renderer.clearInstanceData(); } } - for (Cache cache : belts.values()) { - for (BeltBuffer renderer : cache.asMap().values()) { + for (Cache> cache : belts.values()) { + for (InstanceBuffer renderer : cache.asMap().values()) { renderer.clearInstanceData(); } } -// rebuild = true; + //buildTileEntityBuffers(Minecraft.getInstance().world); + + rebuild = true; } - public void renderInstances(RenderWorldLastEvent event) { + void renderBelts() { + for (Cache> cache : belts.values()) { + for (InstanceBuffer type : cache.asMap().values()) { + if (!type.isEmpty()) { + type.render(); + } + } + } + } + + void renderRotating() { + for (Cache> cache : rotating.values()) { + for (InstanceBuffer rotatingDataInstanceBuffer : cache.asMap().values()) { + if (!rotatingDataInstanceBuffer.isEmpty()) { + rotatingDataInstanceBuffer.render(); + } + } + } + } + + public void renderInstancesAsWorld(Matrix4f projection, Matrix4f view) { GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; -// -// if (rebuild) { -// buildTileEntityBuffers(Minecraft.getInstance().world); -// rebuild = false; -// } + + if (rebuild) { + markAllDirty(); + rebuild = false; + } setup(gameRenderer); - ShaderCallback callback = ShaderHelper.getViewProjectionCallback(event); + ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projection, view); - ShaderHelper.useShader(Shader.ROTATING_INSTANCED, callback); + ShaderHelper.useShader(Shader.ROTATING, callback); + renderRotating(); - rotating.values() - .stream() - .flatMap(cache -> cache.asMap().values().stream()) - .filter(type -> !type.isEmpty()) - .forEach(InstanceBuffer::render); - - ShaderHelper.useShader(Shader.BELT_INSTANCED, callback); - - belts.values() - .stream() - .flatMap(cache -> cache.asMap().values().stream()) - .filter(type -> !type.isEmpty()) - .forEach(InstanceBuffer::render); + ShaderHelper.useShader(Shader.BELT, callback); + renderBelts(); ShaderHelper.releaseShader(); teardown(); } - public void setup(GameRenderer gameRenderer) { + public static void setup(GameRenderer gameRenderer) { RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.defaultBlendFunc(); RenderSystem.enableLighting(); RenderSystem.enableDepthTest(); + RenderSystem.enableCull(); GL11.glCullFace(GL11.GL_BACK); LightTexture lightManager = gameRenderer.getLightmapTextureManager(); @@ -149,9 +185,9 @@ public class FastKineticRenderer { RenderSystem.enableTexture(); } - public void teardown() { + public static void teardown() { - GL13.glActiveTexture(GL40.GL_TEXTURE0 + 1); + GL13.glActiveTexture(GL40.GL_TEXTURE1); GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); GL13.glActiveTexture(GL40.GL_TEXTURE0); @@ -175,26 +211,26 @@ public class FastKineticRenderer { belts.put(instance, CacheBuilder.newBuilder().expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS).build()); } - public RotatingBuffer renderPartialRotating(AllBlockPartials partial, BlockState referenceState) { + public InstanceBuffer renderPartialRotating(AllBlockPartials partial, BlockState referenceState) { return getRotating(PARTIAL, partial, () -> rotatingInstancedRenderer(partial.get(), referenceState)); } - public BeltBuffer renderPartialBelt(AllBlockPartials partial, BlockState referenceState) { + public InstanceBuffer renderPartialBelt(AllBlockPartials partial, BlockState referenceState) { return getBelt(PARTIAL, partial, () -> beltInstancedRenderer(partial.get(), referenceState)); } - public RotatingBuffer renderDirectionalPartialInstanced(AllBlockPartials partial, BlockState referenceState, Direction dir, + public InstanceBuffer renderDirectionalPartialInstanced(AllBlockPartials partial, BlockState referenceState, Direction dir, MatrixStack modelTransform) { return getRotating(SuperByteBufferCache.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), () -> rotatingInstancedRenderer(partial.get(), referenceState, modelTransform)); } - public RotatingBuffer renderBlockInstanced(SuperByteBufferCache.Compartment compartment, BlockState toRender) { + public InstanceBuffer renderBlockInstanced(SuperByteBufferCache.Compartment compartment, BlockState toRender) { return getRotating(compartment, toRender, () -> rotatingInstancedRenderer(toRender)); } - public RotatingBuffer getRotating(SuperByteBufferCache.Compartment compartment, T key, Supplier supplier) { - Cache compartmentCache = this.rotating.get(compartment); + public InstanceBuffer getRotating(SuperByteBufferCache.Compartment compartment, T key, Supplier> supplier) { + Cache> compartmentCache = this.rotating.get(compartment); try { return compartmentCache.get(key, supplier::get); } catch (ExecutionException e) { @@ -203,8 +239,8 @@ public class FastKineticRenderer { } } - public BeltBuffer getBelt(SuperByteBufferCache.Compartment compartment, T key, Supplier supplier) { - Cache compartmentCache = this.belts.get(compartment); + public InstanceBuffer getBelt(SuperByteBufferCache.Compartment compartment, T key, Supplier> supplier) { + Cache> compartmentCache = this.belts.get(compartment); try { return compartmentCache.get(key, supplier::get); } catch (ExecutionException e) { @@ -214,40 +250,40 @@ public class FastKineticRenderer { } - private RotatingBuffer rotatingInstancedRenderer(BlockState renderedState) { + private InstanceBuffer rotatingInstancedRenderer(BlockState renderedState) { BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); return rotatingInstancedRenderer(dispatcher.getModelForState(renderedState), renderedState); } - private RotatingBuffer rotatingInstancedRenderer(IBakedModel model, BlockState renderedState) { + private InstanceBuffer rotatingInstancedRenderer(IBakedModel model, BlockState renderedState) { return rotatingInstancedRenderer(model, renderedState, new MatrixStack()); } - private BeltBuffer beltInstancedRenderer(IBakedModel model, BlockState renderedState) { + private InstanceBuffer beltInstancedRenderer(IBakedModel model, BlockState renderedState) { return beltInstancedRenderer(model, renderedState, new MatrixStack()); } - private RotatingBuffer rotatingInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { + private InstanceBuffer rotatingInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { BufferBuilder builder = SuperByteBufferCache.getBufferBuilder(model, referenceState, ms); return new RotatingBuffer(builder); } - private BeltBuffer beltInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { + private InstanceBuffer beltInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { BufferBuilder builder = SuperByteBufferCache.getBufferBuilder(model, referenceState, ms); return new BeltBuffer(builder); } public void invalidate() { - rotating.values().forEach(cache -> { - cache.asMap().values().forEach(InstanceBuffer::delete); - cache.invalidateAll(); - }); + for (Cache> objectInstanceBufferCache : rotating.values()) { + objectInstanceBufferCache.asMap().values().forEach(InstanceBuffer::delete); + objectInstanceBufferCache.invalidateAll(); + } - belts.values().forEach(cache -> { + for (Cache> cache : belts.values()) { cache.asMap().values().forEach(InstanceBuffer::delete); cache.invalidateAll(); - }); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java new file mode 100644 index 000000000..07316ff04 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java @@ -0,0 +1,172 @@ +package com.simibubi.create.foundation.utility.render; + +import net.minecraft.client.renderer.GLAllocation; +import org.lwjgl.system.MemoryStack; +import org.lwjgl.system.MemoryUtil; +import sun.misc.Cleaner; +import sun.nio.ch.DirectBuffer; + +import java.nio.*; + +public class SafeDirectBuffer implements AutoCloseable { + + private ByteBuffer wrapped; + + public SafeDirectBuffer(int capacity) { + this.wrapped = GLAllocation.createDirectByteBuffer(capacity); + } + + public void close() throws Exception { + if (wrapped instanceof DirectBuffer) { + Cleaner cleaner = ((DirectBuffer) wrapped).cleaner(); + if (!cleaner.isEnqueued()) { + cleaner.clean(); + cleaner.enqueue(); + } + } + } + + /** + * Only use this function to pass information to OpenGL. + */ + @Deprecated + public ByteBuffer getBacking() { + return wrapped; + } + + public void order(ByteOrder bo) { + wrapped.order(bo); + } + + public void limit(int limit) { + wrapped.limit(limit); + } + + public void rewind() { + wrapped.rewind(); + } + + public byte get() { + return wrapped.get(); + } + + public ByteBuffer put(byte b) { + return wrapped.put(b); + } + + public byte get(int index) { + return wrapped.get(); + } + + public ByteBuffer put(int index, byte b) { + return wrapped.put(index, b); + } + + public ByteBuffer compact() { + return wrapped.compact(); + } + + public boolean isReadOnly() { + return wrapped.isReadOnly(); + } + + public boolean isDirect() { + return wrapped.isDirect(); + } + + public char getChar() { + return wrapped.getChar(); + } + + public ByteBuffer putChar(char value) { + return wrapped.putChar(value); + } + + public char getChar(int index) { + return wrapped.getChar(index); + } + + public ByteBuffer putChar(int index, char value) { + return wrapped.putChar(index, value); + } + + public short getShort() { + return wrapped.getShort(); + } + + public ByteBuffer putShort(short value) { + return wrapped.putShort(value); + } + + public short getShort(int index) { + return wrapped.getShort(index); + } + + public ByteBuffer putShort(int index, short value) { + return wrapped.putShort(index, value); + } + + public int getInt() { + return wrapped.getInt(); + } + + public ByteBuffer putInt(int value) { + return wrapped.putInt(value); + } + + public int getInt(int index) { + return wrapped.getInt(index); + } + + public ByteBuffer putInt(int index, int value) { + return wrapped.putInt(index, value); + } + + public long getLong() { + return wrapped.getLong(); + } + + public ByteBuffer putLong(long value) { + return wrapped.putLong(value); + } + + public long getLong(int index) { + return wrapped.getLong(index); + } + + public ByteBuffer putLong(int index, long value) { + return wrapped.putLong(index, value); + } + + public float getFloat() { + return wrapped.getFloat(); + } + + public ByteBuffer putFloat(float value) { + return wrapped.putFloat(value); + } + + public float getFloat(int index) { + return wrapped.getFloat(index); + } + + public ByteBuffer putFloat(int index, float value) { + return wrapped.putFloat(index, value); + } + + public double getDouble() { + return wrapped.getDouble(); + } + + public ByteBuffer putDouble(double value) { + return wrapped.putDouble(value); + } + + public double getDouble(int index) { + return wrapped.getDouble(index); + } + + public ByteBuffer putDouble(int index, double value) { + return wrapped.putDouble(index, value); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java index e526fe3b5..23b5afc87 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java @@ -1,8 +1,10 @@ package com.simibubi.create.foundation.utility.render; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.datafixers.util.Pair; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import org.lwjgl.opengl.GL15; import java.nio.Buffer; import java.nio.ByteBuffer; @@ -11,7 +13,7 @@ import java.nio.ByteOrder; public class TemplateBuffer { protected ByteBuffer template; protected int formatSize; - protected int count; + protected int vertexCount; public TemplateBuffer(BufferBuilder buf) { Pair state = buf.popData(); @@ -20,8 +22,8 @@ public class TemplateBuffer { formatSize = buf.getVertexFormat() .getSize(); - count = state.getFirst().getCount(); - int size = count * formatSize; + vertexCount = state.getFirst().getCount(); + int size = vertexCount * formatSize; template = ByteBuffer.allocate(size); template.order(rendered.order()); @@ -30,6 +32,22 @@ public class TemplateBuffer { ((Buffer)template).rewind(); } + protected void buildEBO(int ebo) throws Exception { + int indicesSize = vertexCount * VertexFormatElement.Type.USHORT.getSize(); + try (SafeDirectBuffer indices = new SafeDirectBuffer(indicesSize)) { + indices.order(template.order()); + indices.limit(indicesSize); + + for (int i = 0; i < vertexCount; i++) { + indices.putShort((short) i); + } + indices.rewind(); + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices.getBacking(), GL15.GL_STATIC_DRAW); + } + } + public boolean isEmpty() { return ((Buffer) template).limit() == 0; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java index 9dbab11a7..2c4d2fcc2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java @@ -7,6 +7,7 @@ import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.render.instancing.IInstanceRendered; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.Matrix4f; @@ -30,6 +31,8 @@ public class TileEntityRenderHelper { for (Iterator iterator = customRenderTEs.iterator(); iterator.hasNext();) { TileEntity tileEntity = iterator.next(); + if (tileEntity instanceof IInstanceRendered) continue; // TODO: some things still need to render + TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(tileEntity); if (renderer == null) { iterator.remove(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java index 082d018e1..b7df264ef 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java @@ -1,10 +1,9 @@ package com.simibubi.create.foundation.utility.render.instancing; +import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; -import java.nio.ByteBuffer; - public class BasicData> extends InstanceData { private float x; @@ -38,7 +37,7 @@ public class BasicData> extends InstanceData { } @Override - public void write(ByteBuffer buf) { + public void write(SafeDirectBuffer buf) { putVec3(buf, x, y, z); putVec2(buf, blockLight, skyLight); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java index a4f717903..f1e359f9c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java @@ -1,10 +1,8 @@ package com.simibubi.create.foundation.utility.render.instancing; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.util.math.BlockPos; - -import java.nio.ByteBuffer; import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; @@ -55,7 +53,7 @@ public class BeltData extends BasicData { } @Override - public void write(ByteBuffer buf) { + public void write(SafeDirectBuffer buf) { super.write(buf); putVec3(buf, rotX, rotY, rotZ); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java index 7b0393689..ccd123237 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java @@ -1,13 +1,19 @@ package com.simibubi.create.foundation.utility.render.instancing; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; +import net.minecraft.block.BlockState; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; +import java.util.function.BiFunction; +import java.util.function.Function; import java.util.function.Supplier; public interface IInstancedTileEntityRenderer { - void addInstanceData(T te); + void addInstanceData(InstanceContext te); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java index 5a4bd4c14..0839b37b9 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java @@ -2,17 +2,12 @@ package com.simibubi.create.foundation.utility.render.instancing; import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.render.RenderWork; +import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; import com.simibubi.create.foundation.utility.render.TemplateBuffer; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.*; -import org.lwjgl.system.MemoryUtil; -import java.nio.Buffer; -import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.function.Consumer; @@ -24,60 +19,53 @@ public abstract class InstanceBuffer extends TemplateBuf protected int vao, ebo, invariantVBO, instanceVBO, instanceCount; protected final ArrayList data = new ArrayList<>(); + protected boolean rebuffer = false; protected boolean shouldBuild = true; public InstanceBuffer(BufferBuilder buf) { super(buf); - setupMainData(); + setup(); } - private void setupMainData() { + private void setup() { int stride = FORMAT.getStride(); - int invariantSize = count * stride; - ByteBuffer constant = GLAllocation.createDirectByteBuffer(invariantSize); - constant.order(template.order()); - ((Buffer) constant).limit(invariantSize); - - int indicesSize = count * VertexFormatElement.Type.USHORT.getSize(); - ByteBuffer indices = GLAllocation.createDirectByteBuffer(indicesSize); - indices.order(template.order()); - ((Buffer) indices).limit(indicesSize); - - int vertexCount = vertexCount(template); - for (int i = 0; i < vertexCount; i++) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); - - constant.putFloat(getNX(template, i)); - constant.putFloat(getNY(template, i)); - constant.putFloat(getNZ(template, i)); - - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); - - indices.putShort((short) i); - } - constant.rewind(); - indices.rewind(); + int invariantSize = vertexCount * stride; vao = GL30.glGenVertexArrays(); - GL30.glBindVertexArray(vao); - ebo = GlStateManager.genBuffers(); invariantVBO = GlStateManager.genBuffers(); instanceVBO = GlStateManager.genBuffers(); - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, invariantVBO); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant, GL15.GL_STATIC_DRAW); - MemoryUtil.memFree(constant); + try (SafeDirectBuffer constant = new SafeDirectBuffer(invariantSize)) { + constant.order(template.order()); + constant.limit(invariantSize); - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); - MemoryUtil.memFree(indices); + for (int i = 0; i < vertexCount; i++) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); - FORMAT.informAttributes(0); + constant.put(getNX(template, i)); + constant.put(getNY(template, i)); + constant.put(getNZ(template, i)); + + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); + } + constant.rewind(); + + GL30.glBindVertexArray(vao); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, invariantVBO); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant.getBacking(), GL15.GL_STATIC_DRAW); + + buildEBO(ebo); + + FORMAT.informAttributes(0); + } catch (Exception e) { + delete(); + } GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); @@ -88,7 +76,7 @@ public abstract class InstanceBuffer extends TemplateBuf protected abstract VertexFormat getInstanceFormat(); public int numInstances() { - return instanceCount; + return instanceCount + data.size(); } public boolean isEmpty() { @@ -100,14 +88,20 @@ public abstract class InstanceBuffer extends TemplateBuf shouldBuild = true; } + public void markDirty() { + rebuffer = true; + } + public void delete() { RenderWork.enqueue(() -> { GL15.glDeleteBuffers(invariantVBO); GL15.glDeleteBuffers(instanceVBO); GL15.glDeleteBuffers(ebo); GL30.glDeleteVertexArrays(vao); - - clearInstanceData(); + vao = 0; + ebo = 0; + invariantVBO = 0; + instanceVBO = 0; }); } @@ -120,10 +114,10 @@ public abstract class InstanceBuffer extends TemplateBuf setup.accept(instanceData); data.add(instanceData); - instanceCount++; } public void render() { + if (vao == 0) return; GL30.glBindVertexArray(vao); finishBuffering(); @@ -135,7 +129,7 @@ public abstract class InstanceBuffer extends TemplateBuf GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GL40.glDrawElementsInstanced(GL11.GL_QUADS, count, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); + GL40.glDrawElementsInstanced(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); for (int i = 0; i <= numAttributes; i++) { GL40.glDisableVertexAttribArray(i); @@ -146,33 +140,39 @@ public abstract class InstanceBuffer extends TemplateBuf } private void finishBuffering() { - if (!shouldBuild) return; + if (!rebuffer || isEmpty()) return; + + instanceCount = data.size(); VertexFormat instanceFormat = getInstanceFormat(); int instanceSize = instanceCount * instanceFormat.getStride(); - ByteBuffer buffer = GLAllocation.createDirectByteBuffer(instanceSize); - buffer.order(template.order()); - ((Buffer) buffer).limit(instanceSize); + try (SafeDirectBuffer buffer = new SafeDirectBuffer(instanceSize)) { + buffer.order(template.order()); + buffer.limit(instanceSize); - data.forEach(instanceData -> instanceData.write(buffer)); - buffer.rewind(); + data.forEach(instanceData -> instanceData.write(buffer)); + buffer.rewind(); - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); + GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer.getBacking(), GL15.GL_STATIC_DRAW); - int staticAttributes = FORMAT.getNumAttributes(); - instanceFormat.informAttributes(staticAttributes); + int staticAttributes = FORMAT.getNumAttributes(); + instanceFormat.informAttributes(staticAttributes); + + for (int i = 0; i < instanceFormat.getNumAttributes(); i++) { + GL40.glVertexAttribDivisor(i + staticAttributes, 1); + } + } catch (Exception e) { - for (int i = 0; i < instanceFormat.getNumAttributes(); i++) { - GL40.glVertexAttribDivisor(i + staticAttributes, 1); } // Deselect (bind to 0) the VBO GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); shouldBuild = false; + rebuffer = false; data.clear(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceContext.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceContext.java new file mode 100644 index 000000000..e1087e9c2 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceContext.java @@ -0,0 +1,56 @@ +package com.simibubi.create.foundation.utility.render.instancing; + +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; +import com.simibubi.create.foundation.utility.render.FastKineticRenderer; +import net.minecraft.tileentity.TileEntity; + +public abstract class InstanceContext { + + public final T te; + + public InstanceContext(T te) { + this.te = te; + } + + public abstract FastKineticRenderer getKinetics(); + + public abstract boolean checkWorldLight(); + + public static class Contraption extends InstanceContext { + + public final FastContraptionRenderer c; + + public Contraption(T te, FastContraptionRenderer c) { + super(te); + this.c = c; + } + + @Override + public FastKineticRenderer getKinetics() { + return c.kinetics; + } + + @Override + public boolean checkWorldLight() { + return false; + } + } + + public static class World extends InstanceContext { + + public World(T te) { + super(te); + } + + @Override + public FastKineticRenderer getKinetics() { + return CreateClient.kineticRenderer; + } + + @Override + public boolean checkWorldLight() { + return true; + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java index 22690d1fc..c7d057b4a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java @@ -1,30 +1,32 @@ package com.simibubi.create.foundation.utility.render.instancing; +import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; + import java.nio.ByteBuffer; public abstract class InstanceData { - public abstract void write(ByteBuffer buf); + public abstract void write(SafeDirectBuffer buf); - public void putVec4(ByteBuffer buf, float x, float y, float z, float w) { + public void putVec4(SafeDirectBuffer buf, float x, float y, float z, float w) { putFloat(buf, x); putFloat(buf, y); putFloat(buf, z); putFloat(buf, w); } - public void putVec3(ByteBuffer buf, float x, float y, float z) { + public void putVec3(SafeDirectBuffer buf, float x, float y, float z) { putFloat(buf, x); putFloat(buf, y); putFloat(buf, z); } - public void putVec2(ByteBuffer buf, float x, float y) { + public void putVec2(SafeDirectBuffer buf, float x, float y) { putFloat(buf, x); putFloat(buf, y); } - public void putFloat(ByteBuffer buf, float f) { + public void putFloat(SafeDirectBuffer buf, float f) { buf.putFloat(f); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java index 92e60202f..164bc7610 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java @@ -1,9 +1,7 @@ package com.simibubi.create.foundation.utility.render.instancing; +import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; import net.minecraft.client.renderer.Vector3f; -import net.minecraft.util.math.BlockPos; - -import java.nio.ByteBuffer; import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; @@ -41,7 +39,7 @@ public class RotatingData extends BasicData { } @Override - public void write(ByteBuffer buf) { + public void write(SafeDirectBuffer buf) { super.write(buf); putFloat(buf, rotationalSpeed); putFloat(buf, rotationOffset); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java index 60d94311d..885c1c9d0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java @@ -11,8 +11,8 @@ public class VertexAttribute { public static final VertexAttribute FLOAT = new VertexAttribute(VertexFormatElement.Type.FLOAT, 1); public static final VertexAttribute POSITION = VEC3; - public static final VertexAttribute NORMAL = VEC3; - public static final VertexAttribute COLOR = VEC4; + public static final VertexAttribute NORMAL = new VertexAttribute(VertexFormatElement.Type.BYTE, 3); + public static final VertexAttribute COLOR = new VertexAttribute(VertexFormatElement.Type.BYTE, 4); public static final VertexAttribute UV = VEC2; public static final VertexAttribute LIGHT= VEC2; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java index e3f06bee5..d748693f2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java @@ -1,9 +1,11 @@ package com.simibubi.create.foundation.utility.render.shader; public enum Shader { - ROTATING_INSTANCED("shader/rotating.vert", "shader/instanced.frag"), - BELT_INSTANCED("shader/belt.vert", "shader/instanced.frag"), + ROTATING("shader/rotating.vert", "shader/instanced.frag"), + BELT("shader/belt.vert", "shader/instanced.frag"), CONTRAPTION_STRUCTURE("shader/contraption.vert", "shader/contraption.frag"), + CONTRAPTION_ROTATING("shader/contraption_rotating.vert", "shader/contraption.frag"), + CONTRAPTION_BELT("shader/contraption_belt.vert", "shader/contraption.frag"), ; public final String vert; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java index ae5d1d957..8f13561c8 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java @@ -58,34 +58,28 @@ public class ShaderHelper { return shaderProgram.getProgram(); } - public static ShaderCallback getViewProjectionCallback(RenderWorldLastEvent event) { + public static ShaderCallback getViewProjectionCallback(Matrix4f projectionMat, Matrix4f viewMat) { return shader -> { ShaderHelper.MATRIX_BUFFER.position(0); - event.getProjectionMatrix().write(ShaderHelper.MATRIX_BUFFER); - + projectionMat.write(ShaderHelper.MATRIX_BUFFER); int projection = GlStateManager.getUniformLocation(shader, "projection"); GlStateManager.uniformMatrix4(projection, false, ShaderHelper.MATRIX_BUFFER); - // view matrix - Vec3d pos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); - Matrix4f translate = Matrix4f.translate((float) -pos.x, (float) -pos.y, (float) -pos.z); - translate.multiplyBackward(event.getMatrixStack().peek().getModel()); - ShaderHelper.MATRIX_BUFFER.position(0); - translate.write(ShaderHelper.MATRIX_BUFFER); + viewMat.write(ShaderHelper.MATRIX_BUFFER); int view = GlStateManager.getUniformLocation(shader, "view"); GlStateManager.uniformMatrix4(view, false, ShaderHelper.MATRIX_BUFFER); }; } - public static void useShader(Shader shader) { - useShader(shader, null); + public static int useShader(Shader shader) { + return useShader(shader, null); } - public static void useShader(Shader shader, @Nullable ShaderCallback cb) { + public static int useShader(Shader shader, @Nullable ShaderCallback cb) { ShaderProgram prog = PROGRAMS.get(shader); if (prog == null) { - return; + return -1; } int program = prog.getProgram(); @@ -102,6 +96,8 @@ public class ShaderHelper { if (cb != null) { cb.call(program); } + + return program; } public static void releaseShader() { diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index 0d5fbe4a3..80a7dec3b 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -16,7 +16,6 @@ vec4 light() { return texture2D(LightMap, lm); } - void main() { vec4 tex = texture2D(BlockAtlas, TexCoords); diff --git a/src/main/resources/assets/create/shader/contraption.vert b/src/main/resources/assets/create/shader/contraption.vert index 44d4795c7..8364cdc67 100644 --- a/src/main/resources/assets/create/shader/contraption.vert +++ b/src/main/resources/assets/create/shader/contraption.vert @@ -21,8 +21,7 @@ uniform int ticks; uniform mat4 projection; uniform mat4 view; -mat4 rotate(vec3 axis, float angle) -{ +mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); float oc = 1.0 - c; @@ -47,18 +46,11 @@ float diffuse(vec3 normal) { void main() { mat4 rotation = contraptionRotation(); + vec4 worldPos = (rotation * vec4(aPos - vec3(0.5), 1)) + vec4(cPos + vec3(0.5), 0); - vec4 rotatedPos = rotation * vec4(aPos - vec3(0.5), 1); - - vec4 worldPos = rotatedPos + vec4(cPos + vec3(0.5), 0); - - vec3 boxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - - float df = diffuse(normalize(aNormal)); - - Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); - Color = vec4(aColor.rgb / df, aColor.a); - BoxCoord = boxCoord; + BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; + Diffuse = diffuse(normalize(rotation * vec4(aNormal, 0.)).xyz); + Color = aColor; TexCoords = aTexCoords; gl_Position = projection * view * worldPos; } diff --git a/src/main/resources/assets/create/shader/contraption_belt.vert b/src/main/resources/assets/create/shader/contraption_belt.vert new file mode 100644 index 000000000..65070364b --- /dev/null +++ b/src/main/resources/assets/create/shader/contraption_belt.vert @@ -0,0 +1,79 @@ +#version 330 core +#define PI 3.1415926538 + +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aNormal; +layout (location = 2) in vec2 aTexCoords; + +layout (location = 3) in vec3 instancePos; +layout (location = 4) in vec2 light; +layout (location = 5) in vec3 rotationDegrees; +layout (location = 6) in float speed; +layout (location = 7) in vec2 sourceUV; +layout (location = 8) in vec4 scrollTexture; +layout (location = 9) in float scrollMult; + +out float Diffuse; +out vec2 TexCoords; +out vec4 Color; +out vec3 BoxCoord; + +uniform vec3 lightBoxSize; +uniform vec3 lightBoxMin; +uniform vec3 cPos; +uniform vec3 cRot; + +uniform float time; +uniform int ticks; +uniform mat4 projection; +uniform mat4 view; + +mat4 rotate(vec3 axis, float angle) +{ + float s = sin(angle); + float c = cos(angle); + float oc = 1.0 - c; + + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); +} + +mat4 rotation(vec3 rot) { + return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); +} + +mat4 contraptionRotation() { + vec3 rot = -fract(cRot / 360) * PI * 2; + return rotation(rot); +} + +mat4 localRotation() { + vec3 rot = fract(rotationDegrees / 360) * PI * 2; + return rotation(rot); +} + +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); +} + +void main() { + mat4 localRotation = localRotation(); + vec4 localPos = localRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos, 0); + + mat4 contraptionRotation = contraptionRotation(); + vec4 worldPos = contraptionRotation * localPos + vec4(cPos + 0.5, 0); + + float scrollSize = scrollTexture.w - scrollTexture.y; + float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; + + BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; + Diffuse = diffuse(normalize(contraptionRotation * localRotation * vec4(aNormal, 0.)).xyz); + Color = vec4(1.); + TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); + gl_Position = projection * view * worldPos; +} diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert new file mode 100644 index 000000000..532dc4681 --- /dev/null +++ b/src/main/resources/assets/create/shader/contraption_rotating.vert @@ -0,0 +1,71 @@ +#version 330 core +#define PI 3.1415926538 +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aNormal; +layout (location = 2) in vec2 aTexCoords; + +layout (location = 3) in vec3 instancePos; +layout (location = 4) in vec2 light; +layout (location = 5) in float speed; +layout (location = 6) in float rotationOffset; +layout (location = 7) in vec3 rotationAxis; + +out float Diffuse; +out vec2 TexCoords; +out vec4 Color; +out vec3 BoxCoord; + +uniform vec3 lightBoxSize; +uniform vec3 lightBoxMin; +uniform vec3 cPos; +uniform vec3 cRot; + +uniform float time; +uniform int ticks; +uniform mat4 projection; +uniform mat4 view; + +mat4 rotate(vec3 axis, float angle) { + float s = sin(angle); + float c = cos(angle); + float oc = 1.0 - c; + + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); +} + +mat4 kineticRotation() { + float degrees = rotationOffset + time * speed * -3./10.; + float angle = fract(degrees / 360.) * PI * 2.; + + vec3 axis = normalize(rotationAxis); + return rotate(axis, angle); +} + +mat4 contraptionRotation() { + vec3 rot = -fract(cRot / 360) * PI * 2; + return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); +} + +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); +} + +void main() { + mat4 kineticRotation = kineticRotation(); + vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos, 0); + + mat4 contraptionRotation = contraptionRotation(); + vec4 worldPos = contraptionRotation * localPos + vec4(cPos + 0.5, 0); + + BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; + Diffuse = diffuse(normalize(contraptionRotation * localRotation * vec4(aNormal, 0.)).xyz); + Color = vec4(1.); + TexCoords = aTexCoords; + gl_Position = projection * view * worldPos; +} \ No newline at end of file From 379ff9302b46c20a7de81cfe63da6556e0822be1 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 11 Jan 2021 01:04:18 -0800 Subject: [PATCH 023/147] rotating stuff renders too now --- .../resources/assets/create/shader/contraption_belt.vert | 2 +- .../resources/assets/create/shader/contraption_rotating.vert | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/create/shader/contraption_belt.vert b/src/main/resources/assets/create/shader/contraption_belt.vert index 65070364b..320cd8638 100644 --- a/src/main/resources/assets/create/shader/contraption_belt.vert +++ b/src/main/resources/assets/create/shader/contraption_belt.vert @@ -1,4 +1,4 @@ -#version 330 core +#version 420 core #define PI 3.1415926538 layout (location = 0) in vec3 aPos; diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert index 532dc4681..7315d4a67 100644 --- a/src/main/resources/assets/create/shader/contraption_rotating.vert +++ b/src/main/resources/assets/create/shader/contraption_rotating.vert @@ -40,8 +40,7 @@ mat4 kineticRotation() { float degrees = rotationOffset + time * speed * -3./10.; float angle = fract(degrees / 360.) * PI * 2.; - vec3 axis = normalize(rotationAxis); - return rotate(axis, angle); + return rotate(normalize(rotationAxis), angle); } mat4 contraptionRotation() { @@ -64,7 +63,7 @@ void main() { vec4 worldPos = contraptionRotation * localPos + vec4(cPos + 0.5, 0); BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(contraptionRotation * localRotation * vec4(aNormal, 0.)).xyz); + Diffuse = diffuse(normalize(contraptionRotation * kineticRotation * vec4(aNormal, 0.)).xyz); Color = vec4(1.); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; From 1bc99f522479c084892f9a8ce2b4185bd864e779 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 11 Jan 2021 11:15:45 -0800 Subject: [PATCH 024/147] maybe magically fix all crashes? --- .../utility/render/ContraptionLighter.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java index 083924da3..e7f65e52a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java @@ -23,7 +23,7 @@ public class ContraptionLighter { private final int sizeY; private final int sizeZ; - private ByteBuffer lightVolume; + private SafeDirectBuffer lightVolume; private boolean dirty; @@ -45,7 +45,7 @@ public class ContraptionLighter { sizeY = nextPowerOf2(maxY - minY); sizeZ = nextPowerOf2(maxZ - minZ); - lightVolume = GLAllocation.createDirectByteBuffer(sizeX * sizeY * sizeZ * 2); + lightVolume = new SafeDirectBuffer(sizeX * sizeY * sizeZ * 2); update(contraption); } @@ -83,7 +83,11 @@ public class ContraptionLighter { RenderWork.enqueue(() -> { GL15.glDeleteTextures(texture); texture = 0; - MemoryUtil.memFree(lightVolume); + try { + lightVolume.close(); + } catch (Exception e) { + e.printStackTrace(); + } lightVolume = null; }); } @@ -140,7 +144,7 @@ public class ContraptionLighter { GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL13.GL_CLAMP); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL13.GL_CLAMP); if (dirty) { - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightVolume); + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightVolume.getBacking()); dirty = false; } } From c567437ede830d2007f1b1fb927e370eb4985d11 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 11 Jan 2021 12:08:13 -0800 Subject: [PATCH 025/147] fix speed controllers not rendering shafts switch around render layers for contraptions --- .../advanced/SpeedControllerRenderer.java | 10 +++++----- .../render/FastContraptionRenderer.java | 20 ++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index f16a7e9a8..e4f72235d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -19,17 +19,17 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer(tileEntityIn)); } @Override public void addInstanceData(InstanceContext ctx) { - KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx.te)); + KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx)); } - private InstanceBuffer getRotatedModel(SpeedControllerTileEntity te) { - return CreateClient.kineticRenderer.renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, - KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(te))); + private InstanceBuffer getRotatedModel(InstanceContext ctx) { + return ctx.getKinetics().renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, + KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(ctx.te))); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java index 465946b71..dcb8a4268 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java @@ -3,6 +3,8 @@ package com.simibubi.create.foundation.utility.render; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; +import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer; +import com.simibubi.create.content.schematics.client.SchematicRenderer; import com.simibubi.create.foundation.utility.render.instancing.IInstanceRendered; import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.utility.render.shader.Shader; @@ -174,15 +176,6 @@ public class FastContraptionRenderer extends ContraptionRenderer { ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projectionMat, viewMat); - int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.setup(structureShader); - for (ContraptionBuffer layer : renderer.renderLayers) { - layer.render(); - } - renderer.teardown(); - } - int rotatingShader = ShaderHelper.useShader(Shader.CONTRAPTION_ROTATING, callback); for (FastContraptionRenderer renderer : renderers.values()) { renderer.setup(rotatingShader); @@ -197,6 +190,15 @@ public class FastContraptionRenderer extends ContraptionRenderer { renderer.teardown(); } + int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); + for (FastContraptionRenderer renderer : renderers.values()) { + renderer.setup(structureShader); + for (ContraptionBuffer layer : renderer.renderLayers) { + layer.render(); + } + renderer.teardown(); + } + ShaderHelper.releaseShader(); GL11.glDisable(GL13.GL_TEXTURE_3D); From 0ec312340f2aa5f9d3d56bc3d9a4ba6b3061a8dc Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 12 Jan 2021 01:56:30 -0800 Subject: [PATCH 026/147] rainbow debugging and almost correct tints for contraptions --- .../base/KineticTileEntityRenderer.java | 2 +- .../components/fan/EncasedFanRenderer.java | 4 +- .../AbstractContraptionEntityRenderer.java | 11 +--- .../ControlledContraptionEntityRenderer.java | 13 ----- .../OrientedContraptionEntityRenderer.java | 26 ---------- .../relays/belt/BeltRenderer.java | 6 +-- .../relays/encased/SplitShaftRenderer.java | 3 +- .../relays/gearbox/GearboxRenderer.java | 3 +- .../utility/render/ContraptionBuffer.java | 22 +++----- .../render/FastContraptionRenderer.java | 50 ++++++++----------- .../utility/render/instancing/BasicData.java | 30 ++++++++++- .../utility/render/instancing/BeltData.java | 2 +- .../render/instancing/InstanceBuffer.java | 4 +- .../render/instancing/RotatingData.java | 2 +- .../render/instancing/VertexAttribute.java | 15 ++++-- .../render/instancing/VertexFormat.java | 16 ++++++ .../utility/render/shader/ShaderHelper.java | 6 +++ .../resources/assets/create/shader/belt.vert | 23 ++++++--- .../assets/create/shader/contraption.frag | 2 +- .../assets/create/shader/contraption.vert | 16 ++---- .../create/shader/contraption_belt.vert | 34 ++++++------- .../create/shader/contraption_rotating.vert | 27 ++++------ .../assets/create/shader/instanced.frag | 3 +- .../assets/create/shader/rotating.vert | 19 +++++-- 24 files changed, 162 insertions(+), 177 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 21d520f33..0171090ee 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -68,7 +68,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer impleme float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 270 : 0); float rotZ = sideways ? 90 : (vertical ? 180 : 0); - data.setPosition(te.getPos()) + data.setTileEntity(te) .setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos())) .setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos())) .setRotation(rotX, rotY, rotZ) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 6785f5660..94f93aeb5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -9,7 +9,6 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -72,7 +71,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { .setRotationalSpeed(speed) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setPosition(pos); + .setTileEntity(te); }); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 00b74854d..1bb3f48bc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -8,7 +8,6 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer; import com.simibubi.create.foundation.utility.render.instancing.RotatingData; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -71,7 +70,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { .setRotationalSpeed(speed) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setPosition(pos); + .setTileEntity(te); }); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java index 5c2a8f2c5..4cebf58d0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java @@ -1,20 +1,15 @@ package com.simibubi.create.foundation.utility.render; import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.utility.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.*; -import org.lwjgl.system.MemoryUtil; import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; -import java.nio.Buffer; -import java.nio.ByteBuffer; - public class ContraptionBuffer extends TemplateBuffer { - public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV, COLOR); + public static final VertexFormat FORMAT = new VertexFormat(InstanceBuffer.FORMAT, RGBA); protected int vao, ebo, vbo; @@ -55,10 +50,9 @@ public class ContraptionBuffer extends TemplateBuffer { int stride = FORMAT.getStride(); int invariantSize = vertexCount * stride; - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - // Deselect (bind to 0) the VAO - GL30.glBindVertexArray(0); + vao = GL30.glGenVertexArrays(); + ebo = GlStateManager.genBuffers(); + vbo = GlStateManager.genBuffers(); try (SafeDirectBuffer constant = new SafeDirectBuffer(invariantSize)) { constant.order(template.order()); @@ -83,19 +77,15 @@ public class ContraptionBuffer extends TemplateBuffer { } constant.rewind(); - vao = GL30.glGenVertexArrays(); GL30.glBindVertexArray(vao); - ebo = GlStateManager.genBuffers(); - vbo = GlStateManager.genBuffers(); - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, vbo); GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant.getBacking(), GL15.GL_STATIC_DRAW); buildEBO(ebo); FORMAT.informAttributes(0); } catch (Exception e) { - + e.printStackTrace(); } GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java index dcb8a4268..4a49583f2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java @@ -1,6 +1,8 @@ package com.simibubi.create.foundation.utility.render; +import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer; @@ -38,8 +40,7 @@ public class FastContraptionRenderer extends ContraptionRenderer { private Contraption c; - private Vec3d renderPos; - private Vec3d renderRot; + private Matrix4f model; public FastContraptionRenderer(World world, Contraption c) { this.c = c; @@ -89,9 +90,8 @@ public class FastContraptionRenderer extends ContraptionRenderer { } } - private void setRenderSettings(Vec3d position, Vec3d rotation) { - renderPos = position; - renderRot = rotation; + private void setRenderSettings(Matrix4f model) { + this.model = model; } private void setup(int shader) { @@ -120,19 +120,10 @@ public class FastContraptionRenderer extends ContraptionRenderer { buf.rewind(); GlStateManager.uniform3(lightBoxMin, buf); - int cPos = GlStateManager.getUniformLocation(shader, "cPos"); - buf.put(0, (float) renderPos.x); - buf.put(1, (float) renderPos.y); - buf.put(2, (float) renderPos.z); - buf.rewind(); - GlStateManager.uniform3(cPos, buf); - - int cRot = GlStateManager.getUniformLocation(shader, "cRot"); - buf.put(0, (float) renderRot.x); - buf.put(1, (float) renderRot.y); - buf.put(2, (float) renderRot.z); - buf.rewind(); - GlStateManager.uniform3(cRot, buf); + int model = GlStateManager.getUniformLocation(shader, "model"); + this.model.write(ShaderHelper.MATRIX_BUFFER); + ShaderHelper.MATRIX_BUFFER.rewind(); + GlStateManager.uniformMatrix4(model, false, ShaderHelper.MATRIX_BUFFER); } private void invalidate() { @@ -147,8 +138,8 @@ public class FastContraptionRenderer extends ContraptionRenderer { renderLayers.clear(); } - public static void markForRendering(World world, Contraption c, Vec3d position, Vec3d rotation) { - getRenderer(world, c).setRenderSettings(position, rotation); + public static void markForRendering(World world, Contraption c, MatrixStack model) { + getRenderer(world, c).setRenderSettings(model.peek().getModel()); } private static FastContraptionRenderer getRenderer(World world, Contraption c) { @@ -176,6 +167,16 @@ public class FastContraptionRenderer extends ContraptionRenderer { ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projectionMat, viewMat); + + int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); + for (FastContraptionRenderer renderer : renderers.values()) { + renderer.setup(structureShader); + for (ContraptionBuffer layer : renderer.renderLayers) { + layer.render(); + } + renderer.teardown(); + } + int rotatingShader = ShaderHelper.useShader(Shader.CONTRAPTION_ROTATING, callback); for (FastContraptionRenderer renderer : renderers.values()) { renderer.setup(rotatingShader); @@ -190,15 +191,6 @@ public class FastContraptionRenderer extends ContraptionRenderer { renderer.teardown(); } - int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.setup(structureShader); - for (ContraptionBuffer layer : renderer.renderLayers) { - layer.render(); - } - renderer.teardown(); - } - ShaderHelper.releaseShader(); GL11.glDisable(GL13.GL_TEXTURE_3D); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java index b7df264ef..5698537c5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java @@ -1,11 +1,19 @@ package com.simibubi.create.foundation.utility.render.instancing; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; -public class BasicData> extends InstanceData { +import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; +public class BasicData> extends InstanceData { + public static final VertexFormat FORMAT = new VertexFormat(RGB, POSITION, LIGHT); + + private byte r; + private byte g; + private byte b; private float x; private float y; private float z; @@ -29,6 +37,22 @@ public class BasicData> extends InstanceData { return (D) this; } + public D setTileEntity(KineticTileEntity te) { + setPosition(te.getPos()); + if (te.hasSource()) { + int color = ColorHelper.colorFromLong(te.network); + r = (byte) ((color >> 16) & 0xFF); + g = (byte) ((color >> 8) & 0xFF); + b = (byte) (color & 0xFF); + } + else { + r = (byte) 0xFF; + g = (byte) 0xFF; + b = (byte) 0x00; + } + return (D) this; + } + public D setPosition(BlockPos pos) { this.x = pos.getX(); this.y = pos.getY(); @@ -38,6 +62,10 @@ public class BasicData> extends InstanceData { @Override public void write(SafeDirectBuffer buf) { + buf.put(r); + buf.put(g); + buf.put(b); + putVec3(buf, x, y, z); putVec2(buf, blockLight, skyLight); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java index f1e359f9c..12c933d05 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java @@ -7,7 +7,7 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; public class BeltData extends BasicData { - public static VertexFormat FORMAT = new VertexFormat(POSITION, LIGHT, VEC3, FLOAT, VEC2, VEC4, FLOAT); + public static VertexFormat FORMAT = new VertexFormat(BasicData.FORMAT, VEC3, FLOAT, VEC2, VEC4, FLOAT); private float rotX; private float rotY; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java index 0839b37b9..130ae5f8a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java @@ -162,10 +162,10 @@ public abstract class InstanceBuffer extends TemplateBuf instanceFormat.informAttributes(staticAttributes); for (int i = 0; i < instanceFormat.getNumAttributes(); i++) { - GL40.glVertexAttribDivisor(i + staticAttributes, 1); + GL33.glVertexAttribDivisor(i + staticAttributes, 1); } } catch (Exception e) { - + e.printStackTrace(); } // Deselect (bind to 0) the VBO diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java index 164bc7610..f0b33392a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java @@ -6,7 +6,7 @@ import net.minecraft.client.renderer.Vector3f; import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; public class RotatingData extends BasicData { - public static VertexFormat FORMAT = new VertexFormat(POSITION, LIGHT, FLOAT, FLOAT, VEC3); + public static VertexFormat FORMAT = new VertexFormat(BasicData.FORMAT, FLOAT, FLOAT, VEC3); private float rotationalSpeed; private float rotationOffset; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java index 885c1c9d0..522047cc1 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java @@ -11,25 +11,32 @@ public class VertexAttribute { public static final VertexAttribute FLOAT = new VertexAttribute(VertexFormatElement.Type.FLOAT, 1); public static final VertexAttribute POSITION = VEC3; - public static final VertexAttribute NORMAL = new VertexAttribute(VertexFormatElement.Type.BYTE, 3); - public static final VertexAttribute COLOR = new VertexAttribute(VertexFormatElement.Type.BYTE, 4); + public static final VertexAttribute NORMAL = new VertexAttribute(VertexFormatElement.Type.BYTE, 3, true); + public static final VertexAttribute RGBA = new VertexAttribute(VertexFormatElement.Type.BYTE, 4, true); + public static final VertexAttribute RGB = new VertexAttribute(VertexFormatElement.Type.BYTE, 3, true); public static final VertexAttribute UV = VEC2; - public static final VertexAttribute LIGHT= VEC2; + public static final VertexAttribute LIGHT = new VertexAttribute(VertexFormatElement.Type.FLOAT, 2); private final VertexFormatElement.Type type; private final int count; private final int size; private final int attributeCount; + private final boolean normalized; public VertexAttribute(VertexFormatElement.Type type, int count) { + this(type, count, false); + } + + public VertexAttribute(VertexFormatElement.Type type, int count, boolean normalized) { this.type = type; this.count = count; this.size = type.getSize() * count; this.attributeCount = (this.size + 15) / 16; // ceiling division. GLSL vertex attributes can only be 16 bytes wide + this.normalized = normalized; } public void registerForBuffer(int stride, int indexAcc, int offsetAcc) { - GL20.glVertexAttribPointer(indexAcc, count, type.getGlConstant(), false, stride, offsetAcc); + GL20.glVertexAttribPointer(indexAcc, count, type.getGlConstant(), normalized, stride, offsetAcc); } public int getSize() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java index 392691e3e..220e69190 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java @@ -18,6 +18,22 @@ public class VertexFormat { this.stride = stride; } + public VertexFormat(VertexFormat start, VertexAttribute... elements) { + int baseLength = start.elements.length; + int addedLength = elements.length; + this.elements = new VertexAttribute[baseLength + addedLength]; + System.arraycopy(start.elements, 0, this.elements, 0, baseLength); + System.arraycopy(elements, 0, this.elements, baseLength, addedLength); + + int numAttributes = 0, stride = 0; + for (VertexAttribute element : this.elements) { + numAttributes += element.getAttributeCount(); + stride += element.getSize(); + } + this.numAttributes = numAttributes; + this.stride = stride; + } + public int getNumAttributes() { return numAttributes; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java index 8f13561c8..aeadc3de2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java @@ -2,6 +2,9 @@ package com.simibubi.create.foundation.utility.render.shader; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.Create; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.KineticDebugger; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; @@ -93,6 +96,9 @@ public class ShaderHelper { int ticks = GlStateManager.getUniformLocation(program, "ticks"); GlStateManager.uniform1(ticks, AnimationTickHolder.ticks); + int debug = GlStateManager.getUniformLocation(program, "debug"); + GlStateManager.uniform1(debug, KineticDebugger.isActive() ? 1 : 0); + if (cb != null) { cb.call(program); } diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index c40dfd83f..125835300 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -5,22 +5,25 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 light; -layout (location = 5) in vec3 rotationDegrees; -layout (location = 6) in float speed; -layout (location = 7) in vec2 sourceUV; -layout (location = 8) in vec4 scrollTexture; -layout (location = 9) in float scrollMult; +layout (location = 3) in vec3 networkTint; +layout (location = 4) in vec3 instancePos; +layout (location = 5) in vec2 light; +layout (location = 6) in vec3 rotationDegrees; +layout (location = 7) in float speed; +layout (location = 8) in vec2 sourceUV; +layout (location = 9) in vec4 scrollTexture; +layout (location = 10) in float scrollMult; out vec2 TexCoords; out vec2 Light; out float Diffuse; +out vec4 Color; uniform float time; uniform int ticks; uniform mat4 projection; uniform mat4 view; +uniform int debug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -56,4 +59,10 @@ void main() { Light = light; TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); gl_Position = projection * view * renderPos; + + if (debug == 1) { + Color = vec4(networkTint, 1); + } else { + Color = vec4(1); + } } diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index 80a7dec3b..9ec3cc530 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -19,5 +19,5 @@ vec4 light() { void main() { vec4 tex = texture2D(BlockAtlas, TexCoords); - fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a); + fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a) * Color; } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption.vert b/src/main/resources/assets/create/shader/contraption.vert index 8364cdc67..05ee9a891 100644 --- a/src/main/resources/assets/create/shader/contraption.vert +++ b/src/main/resources/assets/create/shader/contraption.vert @@ -13,13 +13,13 @@ out vec3 BoxCoord; uniform vec3 lightBoxSize; uniform vec3 lightBoxMin; -uniform vec3 cPos; -uniform vec3 cRot; +uniform mat4 model; uniform float time; uniform int ticks; uniform mat4 projection; uniform mat4 view; +uniform int debug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -32,11 +32,6 @@ mat4 rotate(vec3 axis, float angle) { 0., 0., 0., 1.); } -mat4 contraptionRotation() { - vec3 rot = -fract(cRot / 360) * PI * 2; - return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); -} - float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; @@ -45,12 +40,11 @@ float diffuse(vec3 normal) { } void main() { - mat4 rotation = contraptionRotation(); - vec4 worldPos = (rotation * vec4(aPos - vec3(0.5), 1)) + vec4(cPos + vec3(0.5), 0); + vec4 worldPos = model * vec4(aPos, 1); BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(rotation * vec4(aNormal, 0.)).xyz); - Color = aColor; + Diffuse = diffuse(normalize(model * vec4(aNormal, 0.)).xyz); + Color = vec4(1);//aColor; TexCoords = aTexCoords; gl_Position = projection * view * worldPos; } diff --git a/src/main/resources/assets/create/shader/contraption_belt.vert b/src/main/resources/assets/create/shader/contraption_belt.vert index 320cd8638..1548200d7 100644 --- a/src/main/resources/assets/create/shader/contraption_belt.vert +++ b/src/main/resources/assets/create/shader/contraption_belt.vert @@ -5,13 +5,14 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 light; -layout (location = 5) in vec3 rotationDegrees; -layout (location = 6) in float speed; -layout (location = 7) in vec2 sourceUV; -layout (location = 8) in vec4 scrollTexture; -layout (location = 9) in float scrollMult; +layout (location = 3) in vec3 networkTint; +layout (location = 4) in vec3 instancePos; +layout (location = 5) in vec2 light; +layout (location = 6) in vec3 rotationDegrees; +layout (location = 7) in float speed; +layout (location = 8) in vec2 sourceUV; +layout (location = 9) in vec4 scrollTexture; +layout (location = 10) in float scrollMult; out float Diffuse; out vec2 TexCoords; @@ -20,16 +21,15 @@ out vec3 BoxCoord; uniform vec3 lightBoxSize; uniform vec3 lightBoxMin; -uniform vec3 cPos; -uniform vec3 cRot; +uniform mat4 model; uniform float time; uniform int ticks; uniform mat4 projection; uniform mat4 view; +uniform int debug; -mat4 rotate(vec3 axis, float angle) -{ +mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); float oc = 1.0 - c; @@ -44,11 +44,6 @@ mat4 rotation(vec3 rot) { return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); } -mat4 contraptionRotation() { - vec3 rot = -fract(cRot / 360) * PI * 2; - return rotation(rot); -} - mat4 localRotation() { vec3 rot = fract(rotationDegrees / 360) * PI * 2; return rotation(rot); @@ -63,16 +58,15 @@ float diffuse(vec3 normal) { void main() { mat4 localRotation = localRotation(); - vec4 localPos = localRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos, 0); + vec4 localPos = localRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos + 0.5, 0); - mat4 contraptionRotation = contraptionRotation(); - vec4 worldPos = contraptionRotation * localPos + vec4(cPos + 0.5, 0); + vec4 worldPos = model * localPos; float scrollSize = scrollTexture.w - scrollTexture.y; float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(contraptionRotation * localRotation * vec4(aNormal, 0.)).xyz); + Diffuse = diffuse(normalize(model * localRotation * vec4(aNormal, 0.)).xyz); Color = vec4(1.); TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); gl_Position = projection * view * worldPos; diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert index 7315d4a67..7c4ff23db 100644 --- a/src/main/resources/assets/create/shader/contraption_rotating.vert +++ b/src/main/resources/assets/create/shader/contraption_rotating.vert @@ -4,11 +4,12 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 light; -layout (location = 5) in float speed; -layout (location = 6) in float rotationOffset; -layout (location = 7) in vec3 rotationAxis; +layout (location = 3) in vec3 networkTint; +layout (location = 4) in vec3 instancePos; +layout (location = 5) in vec2 light; +layout (location = 6) in float speed; +layout (location = 7) in float rotationOffset; +layout (location = 8) in vec3 rotationAxis; out float Diffuse; out vec2 TexCoords; @@ -17,13 +18,13 @@ out vec3 BoxCoord; uniform vec3 lightBoxSize; uniform vec3 lightBoxMin; -uniform vec3 cPos; -uniform vec3 cRot; +uniform mat4 model; uniform float time; uniform int ticks; uniform mat4 projection; uniform mat4 view; +uniform int debug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -43,11 +44,6 @@ mat4 kineticRotation() { return rotate(normalize(rotationAxis), angle); } -mat4 contraptionRotation() { - vec3 rot = -fract(cRot / 360) * PI * 2; - return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); -} - float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; @@ -57,13 +53,12 @@ float diffuse(vec3 normal) { void main() { mat4 kineticRotation = kineticRotation(); - vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos, 0); + vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos + 0.5, 0); - mat4 contraptionRotation = contraptionRotation(); - vec4 worldPos = contraptionRotation * localPos + vec4(cPos + 0.5, 0); + vec4 worldPos = model * localPos; BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(contraptionRotation * kineticRotation * vec4(aNormal, 0.)).xyz); + Diffuse = diffuse(normalize(model * kineticRotation * vec4(aNormal, 0.)).xyz); Color = vec4(1.); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index 8172975c0..fae8b8494 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -3,6 +3,7 @@ in vec2 TexCoords; in vec2 Light; in float Diffuse; +in vec4 Color; out vec4 fragColor; @@ -17,5 +18,5 @@ vec4 light() { void main() { vec4 tex = texture2D(BlockAtlas, TexCoords); - fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a); + fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a) * Color; } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index b1e2a4ab1..9e7eb6573 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -4,20 +4,23 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 light; -layout (location = 5) in float speed; -layout (location = 6) in float rotationOffset; -layout (location = 7) in vec3 rotationAxis; +layout (location = 3) in vec3 networkTint; +layout (location = 4) in vec3 instancePos; +layout (location = 5) in vec2 light; +layout (location = 6) in float speed; +layout (location = 7) in float rotationOffset; +layout (location = 8) in vec3 rotationAxis; out vec2 TexCoords; out vec2 Light; out float Diffuse; +out vec4 Color; uniform float time; uniform int ticks; uniform mat4 projection; uniform mat4 view; +uniform int debug; mat4 kineticRotation() { float degrees = rotationOffset + time * speed * -3./10.; @@ -50,4 +53,10 @@ void main() { TexCoords = aTexCoords; gl_Position = projection * view * renderPos; Light = light; + + if (debug == 1) { + Color = vec4(networkTint, 1); + } else { + Color = vec4(1); + } } \ No newline at end of file From d1dccffc67db8535d90faaefe2001cbd61104379 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 12 Jan 2021 12:12:44 -0800 Subject: [PATCH 027/147] fix fan shaft lighting --- .../components/fan/EncasedFanRenderer.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index cd624dcfe..62ca3e645 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -41,7 +41,24 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { InstanceBuffer fanInner = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); - renderRotatingBuffer(ctx, shaftHalf); + shaftHalf.setupInstance(data -> { + final BlockPos pos = te.getPos(); + Direction.Axis axis = ((IRotate) te.getBlockState() + .getBlock()).getRotationAxis(te.getBlockState()); + data.setRotationalSpeed(te.getSpeed()) + .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setTileEntity(te); + + if (ctx.checkWorldLight()) { + BlockPos behind = te.getPos().offset(direction.getOpposite()); + int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, behind); + int skyLight = te.getWorld().getLightLevel(LightType.SKY, behind); + + data.setBlockLight(blockLight) + .setSkyLight(skyLight); + } + }); fanInner.setupInstance(data -> { final BlockPos pos = te.getPos(); Direction.Axis axis = ((IRotate) te.getBlockState() From e5b61891fc90afd8ec8d9c7fe47463a91f76fef3 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 12 Jan 2021 21:58:40 -0800 Subject: [PATCH 028/147] update forge and setup mixins --- build.gradle | 15 ++++++++++++- gradle.properties | 2 +- .../foundation/mixin/LightUpdateMixin.java | 18 ++++++++++++++++ .../foundation/mixin/RenderInLayerMixin.java | 21 +++++++++++++++++++ src/main/resources/create.mixins.json | 14 +++++++++++++ 5 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java create mode 100644 src/main/resources/create.mixins.json diff --git a/build.gradle b/build.gradle index b8cf8d5e0..ebb0b18ad 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,11 @@ buildscript { maven { url = 'https://files.minecraftforge.net/maven' } jcenter() mavenCentral() + maven { url='https://dist.creeper.host/Sponge/maven' } } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true + classpath group: 'org.spongepowered', name: 'mixingradle', version: '0.7-SNAPSHOT' } } plugins { @@ -35,6 +37,8 @@ minecraft { runs { client { workingDirectory project.file('run') + property 'mixin.env.disableRefMap', 'true' + arg '-mixin.config=create.mixins.json' property 'forge.logging.console.level', 'info' property 'fml.earlyprogresswindow', 'false' mods { @@ -46,6 +50,8 @@ minecraft { server { workingDirectory project.file('run/server') + property 'mixin.env.disableRefMap', 'true' + arg '-mixin.config=create.mixins.json' property 'forge.logging.console.level', 'info' mods { create { @@ -131,7 +137,8 @@ jar { "Implementation-Title": project.name, "Implementation-Version": "${version}", "Implementation-Vendor" :"simibubi", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + "MixinConfigs": "create.mixins.json" ]) } } @@ -200,3 +207,9 @@ curseforge { } } } + +apply plugin: 'org.spongepowered.mixin' + +mixin { + add sourceSets.main, "create.refmap.json" +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 1c23e4f1c..89ef1a512 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.daemon=false # mod version info mod_version=0.3c minecraft_version=1.15.2 -forge_version=31.2.31 +forge_version=31.2.47 # dependency versions registrate_version=0.0.4.18 diff --git a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java new file mode 100644 index 000000000..0db373baa --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.mixin; + +import net.minecraft.client.multiplayer.ClientChunkProvider; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.LightType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientChunkProvider.class) +public class LightUpdateMixin { + + @Inject(at = @At("HEAD"), method = "markLightChanged(Lnet/minecraft/world/LightType;Lnet/minecraft/util/math/SectionPos;)V") + private void onLightUpdate(LightType type, SectionPos pos, CallbackInfo ci) { + + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java new file mode 100644 index 000000000..9c5a2292a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -0,0 +1,21 @@ +package com.simibubi.create.foundation.mixin; + +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.client.multiplayer.ClientChunkProvider; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.LightType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(WorldRenderer.class) +public class RenderInLayerMixin { + + @Inject(at = @At("HEAD"), method = "renderLayer") + private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { + + } +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json new file mode 100644 index 000000000..c4bf6f100 --- /dev/null +++ b/src/main/resources/create.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "com.simibubi.create.foundation.mixin", + "compatibilityLevel": "JAVA_8", + "refmap": "create.refmap.json", + "client": [ + "LightUpdateMixin", + "RenderInLayerMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} \ No newline at end of file From 93a19833020e6a9f06e445c50f1ebfa0d63c8c8d Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 12 Jan 2021 22:00:24 -0800 Subject: [PATCH 029/147] maybe this actually fixes the memory leak --- .../foundation/utility/render/SafeDirectBuffer.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java index 07316ff04..ffa97f6e3 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java @@ -1,9 +1,6 @@ package com.simibubi.create.foundation.utility.render; import net.minecraft.client.renderer.GLAllocation; -import org.lwjgl.system.MemoryStack; -import org.lwjgl.system.MemoryUtil; -import sun.misc.Cleaner; import sun.nio.ch.DirectBuffer; import java.nio.*; @@ -18,11 +15,7 @@ public class SafeDirectBuffer implements AutoCloseable { public void close() throws Exception { if (wrapped instanceof DirectBuffer) { - Cleaner cleaner = ((DirectBuffer) wrapped).cleaner(); - if (!cleaner.isEnqueued()) { - cleaner.clean(); - cleaner.enqueue(); - } + ((DirectBuffer) wrapped).cleaner().clean(); } } From 2b615b68bdfa57a7702246f2c58f7335bb3453bb Mon Sep 17 00:00:00 2001 From: grimmauld Date: Wed, 13 Jan 2021 09:50:00 +0100 Subject: [PATCH 030/147] Fix mixins outside dev env --- build.gradle | 6 ++++-- .../create/foundation/mixin/LightUpdateMixin.java | 3 ++- .../create/foundation/mixin/RenderInLayerMixin.java | 8 +++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index ebb0b18ad..049422317 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,7 @@ minecraft { runs { client { workingDirectory project.file('run') - property 'mixin.env.disableRefMap', 'true' + // property 'mixin.env.disableRefMap', 'true' arg '-mixin.config=create.mixins.json' property 'forge.logging.console.level', 'info' property 'fml.earlyprogresswindow', 'false' @@ -50,7 +50,7 @@ minecraft { server { workingDirectory project.file('run/server') - property 'mixin.env.disableRefMap', 'true' + // property 'mixin.env.disableRefMap', 'true' arg '-mixin.config=create.mixins.json' property 'forge.logging.console.level', 'info' mods { @@ -125,6 +125,8 @@ dependencies { // i'll leave this here commented for easier testing //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") //runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984") + + annotationProcessor 'org.spongepowered:mixin:0.8:processor' } jar { diff --git a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java index 0db373baa..c19a3018b 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java @@ -4,13 +4,14 @@ import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.util.math.SectionPos; import net.minecraft.world.LightType; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ClientChunkProvider.class) public class LightUpdateMixin { - + @Shadow @Inject(at = @At("HEAD"), method = "markLightChanged(Lnet/minecraft/world/LightType;Lnet/minecraft/util/math/SectionPos;)V") private void onLightUpdate(LightType type, SectionPos pos, CallbackInfo ci) { diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index 9c5a2292a..b008ba822 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -1,20 +1,18 @@ package com.simibubi.create.foundation.mixin; import com.mojang.blaze3d.matrix.MatrixStack; -import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; -import net.minecraft.util.math.SectionPos; -import net.minecraft.world.LightType; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(WorldRenderer.class) public class RenderInLayerMixin { - - @Inject(at = @At("HEAD"), method = "renderLayer") + @Shadow + @Inject(at = @At("HEAD"), method = "renderLayer") // (Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/matrix/MatrixStack;DDD)V") private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { } From 03205c277b96deb0dc62460a054647d6d3ee1d48 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 13 Jan 2021 12:14:01 -0800 Subject: [PATCH 031/147] move render package up one level --- .../com/simibubi/create/AllBlockPartials.java | 4 ++-- .../com/simibubi/create/CreateClient.java | 8 ++++---- .../contraptions/base/KineticBlock.java | 4 ---- .../contraptions/base/KineticTileEntity.java | 2 +- .../base/KineticTileEntityRenderer.java | 6 +++--- .../components/actors/DrillRenderer.java | 8 ++++---- .../components/actors/HarvesterRenderer.java | 2 +- .../PortableStorageInterfaceRenderer.java | 2 +- .../components/clock/CuckooClockRenderer.java | 8 ++++---- .../crafter/MechanicalCrafterRenderer.java | 2 +- .../components/crank/HandCrankRenderer.java | 2 +- .../components/deployer/DeployerRenderer.java | 6 +++--- .../components/fan/EncasedFanRenderer.java | 6 +++--- .../components/flywheel/FlywheelRenderer.java | 8 ++++---- .../millstone/MillstoneRenderer.java | 6 +++--- .../mixer/MechanicalMixerRenderer.java | 2 +- .../motor/CreativeMotorRenderer.java | 6 +++--- .../press/MechanicalPressRenderer.java | 2 +- .../components/saw/SawRenderer.java | 5 ++--- .../AbstractContraptionEntityRenderer.java | 3 +-- .../structureMovement/Contraption.java | 6 ------ .../ContraptionRenderer.java | 8 ++++---- .../bearing/BearingRenderer.java | 8 ++++---- .../StabilizedBearingMovementBehaviour.java | 2 +- .../pulley/AbstractPulleyRenderer.java | 2 +- .../pulley/PulleyRenderer.java | 2 +- .../train/CouplingRenderer.java | 2 +- .../contraptions/fluids/PumpRenderer.java | 8 ++++---- .../fluids/actors/HosePulleyRenderer.java | 2 +- .../fluids/pipes/FluidValveRenderer.java | 2 +- .../burner/BlazeBurnerRenderer.java | 2 +- .../advanced/SpeedControllerRenderer.java | 3 +-- .../contraptions/relays/belt/BeltModel.java | 2 +- .../relays/belt/BeltRenderer.java | 6 +++--- .../relays/encased/SplitShaftRenderer.java | 6 +++--- .../relays/gauge/GaugeRenderer.java | 2 +- .../relays/gearbox/GearboxRenderer.java | 6 +++--- .../belts/tunnel/BeltTunnelRenderer.java | 2 +- .../diodes/AdjustableRepeaterRenderer.java | 2 +- .../block/funnel/FunnelRenderer.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 8 ++++---- .../block/redstone/AnalogLeverRenderer.java | 2 +- .../block/SchematicannonRenderer.java | 2 +- .../schematics/client/SchematicRenderer.java | 4 ++-- .../simibubi/create/events/ClientEvents.java | 4 ++-- .../foundation/ResourceReloadHandler.java | 1 - .../block/connected/CTSpriteShiftEntry.java | 2 +- .../command/ClearBufferCacheCommand.java | 1 - .../render/ContraptionBuffer.java | 8 ++++---- .../render/ContraptionLighter.java | 7 +------ .../render/FastContraptionRenderer.java | 16 ++++++---------- .../render/FastKineticRenderer.java | 12 ++++++------ .../{utility => }/render/RenderWork.java | 2 +- .../render/SafeDirectBuffer.java | 2 +- .../render/ShadowRenderHelper.java | 2 +- .../{utility => }/render/SuperByteBuffer.java | 3 +-- .../render/SuperByteBufferCache.java | 3 +-- .../{utility => }/render/TemplateBuffer.java | 2 +- .../render/TileEntityRenderHelper.java | 4 ++-- .../render/instancing/BasicData.java | 6 +++--- .../render/instancing/BeltBuffer.java | 2 +- .../render/instancing/BeltData.java | 6 +++--- .../render/instancing/IInstanceRendered.java | 4 ++++ .../IInstancedTileEntityRenderer.java | 8 ++++++++ .../render/instancing/InstanceBuffer.java | 10 +++++----- .../render/instancing/InstanceContext.java | 6 +++--- .../render/instancing/InstanceData.java | 6 ++---- .../render/instancing/RotatingBuffer.java | 2 +- .../render/instancing/RotatingData.java | 6 +++--- .../render/instancing/VertexAttribute.java | 2 +- .../render/instancing/VertexFormat.java | 2 +- .../{utility => }/render/shader/Shader.java | 2 +- .../render/shader/ShaderCallback.java | 2 +- .../render/shader/ShaderHelper.java | 6 +----- .../ColoredOverlayTileEntityRenderer.java | 2 +- .../render/instancing/IInstanceRendered.java | 4 ---- .../IInstancedTileEntityRenderer.java | 19 ------------------- 77 files changed, 152 insertions(+), 195 deletions(-) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/ContraptionBuffer.java (90%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/ContraptionLighter.java (95%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/FastContraptionRenderer.java (90%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/FastKineticRenderer.java (96%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/RenderWork.java (89%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/SafeDirectBuffer.java (98%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/ShadowRenderHelper.java (98%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/SuperByteBuffer.java (98%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/SuperByteBufferCache.java (98%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/TemplateBuffer.java (98%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/TileEntityRenderHelper.java (94%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/BasicData.java (88%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/BeltBuffer.java (85%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/BeltData.java (88%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/InstanceBuffer.java (93%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/InstanceContext.java (84%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/InstanceData.java (80%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/RotatingBuffer.java (85%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/RotatingData.java (85%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/VertexAttribute.java (97%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/instancing/VertexFormat.java (96%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/shader/Shader.java (90%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/shader/ShaderCallback.java (73%) rename src/main/java/com/simibubi/create/foundation/{utility => }/render/shader/ShaderHelper.java (95%) delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstanceRendered.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 9279194c2..2635a4a21 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlo import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.instancing.*; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index fc635297e..26f17f91c 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,12 +16,12 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; -import com.simibubi.create.foundation.utility.render.FastKineticRenderer; -import com.simibubi.create.foundation.utility.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.FastContraptionRenderer; +import com.simibubi.create.foundation.render.FastKineticRenderer; +import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; -import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; +import com.simibubi.create.foundation.render.shader.ShaderHelper; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelShapes; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java index 24d116dbc..24d713f28 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java @@ -1,9 +1,7 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.item.ItemDescription.Palette; -import com.simibubi.create.foundation.utility.render.SuperByteBufferCache; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.LivingEntity; @@ -16,9 +14,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.ToolType; -import net.minecraftforge.fml.DistExecutor; public abstract class KineticBlock extends Block implements IRotate { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index e0b1824ab..f4271e366 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -21,7 +21,7 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.resources.I18n; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 0171090ee..0b2eee618 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.render.instancing.*; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; +import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBufferCache.Compartment; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index b0a9324f8..a54f8ff93 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -10,12 +10,12 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 7f8a291f9..f3933f0c8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java index 15cddc518..83f29fb32 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -10,7 +10,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index a3d11138a..9b2406d28 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -7,11 +7,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java index cf4803a3d..f5068e880 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java index c20439331..ea2fbbda4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java @@ -6,7 +6,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.Block; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 92b4d5273..3525f6c3c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -16,11 +16,11 @@ import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 62ca3e645..5ab2bbd49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index ae072d95d..89508a0cd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -9,11 +9,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index 7a0e86232..26316a422 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -4,9 +4,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class MillstoneRenderer extends KineticTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 5fc8e6d0f..04231f98d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index a52a7d586..96d02d5b2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -4,9 +4,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class CreativeMotorRenderer extends KineticTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index bef8ed8e7..58a7a6c83 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 299173139..2bd9b9a10 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -4,7 +4,6 @@ import static net.minecraft.state.properties.BlockStateProperties.FACING; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; @@ -12,8 +11,8 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRe import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.instancing.*; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index 8a3864f49..c81b4ef13 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; +import com.simibubi.create.foundation.render.FastContraptionRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; @@ -10,7 +10,6 @@ import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; public abstract class AbstractContraptionEntityRenderer extends EntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 33ed3de37..bf4a6124f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -18,12 +18,6 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; -import com.simibubi.create.foundation.utility.render.FastKineticRenderer; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.DistExecutor; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index cea15c01a..c5c5f0ad4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -10,10 +10,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.SuperByteBufferCache; -import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; -import com.simibubi.create.foundation.utility.render.TileEntityRenderHelper; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.SuperByteBufferCache.Compartment; +import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import net.minecraft.block.BlockRenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index 1af98d926..6c6bc65fc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -5,11 +5,11 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 3b92c2738..d6b4c99e8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java index ce1f47044..3e1b87452 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index ffdd25677..182e063bb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java index ab60ed2a4..0a8cb17b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 89c8ec4ea..fed7f4b04 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -6,11 +6,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java index 565bdb3fa..c0d4091c6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.AbstractPulleyRenderer; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java index cc9d9d8d5..bf16148fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index f2469f1c2..e4110a16b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlo import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index e4f72235d..65f440f1a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -1,11 +1,10 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.*; +import com.simibubi.create.foundation.render.instancing.*; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java index 5bcec7066..976a39d7d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltModel.java @@ -10,7 +10,7 @@ import java.util.Random; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity.CasingType; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.BakedQuad; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 9832bae56..fe0388464 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -12,9 +12,9 @@ import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.FastKineticRenderer; -import com.simibubi.create.foundation.utility.render.instancing.*; -import com.simibubi.create.foundation.utility.render.ShadowRenderHelper; +import com.simibubi.create.foundation.render.FastKineticRenderer; +import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.ShadowRenderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 94f93aeb5..72f258b8d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index 4f02505a2..c8d81bfe9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock.Type; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 1bb3f48bc..f4c7b33ba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index 6b52d157d..3eaacfa51 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRendere import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java index 72d235388..17053fed5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.block.diodes; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.tileEntity.renderer.ColoredOverlayTileEntityRenderer; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index 8e61a8675..df3ef9e55 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index c89f6b956..ece88eec1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -8,10 +8,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.utility.*; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.InstanceContext; -import com.simibubi.create.foundation.utility.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java index 716cf1648..72a11a15a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java index 37898e3ff..0fe84ba4a 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java @@ -8,7 +8,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.schematics.block.LaunchedItem.ForBlockState; import com.simibubi.create.content.schematics.block.LaunchedItem.ForEntity; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 063dc873a..8796b451b 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -13,8 +13,8 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.render.TileEntityRenderHelper; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.TileEntityRenderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 2a88508ee..30385556d 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -32,8 +32,8 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; -import com.simibubi.create.foundation.utility.render.RenderWork; +import com.simibubi.create.foundation.render.FastContraptionRenderer; +import com.simibubi.create.foundation.render.RenderWork; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java index a5ee6a1c7..6342594b9 100644 --- a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java @@ -3,7 +3,6 @@ package com.simibubi.create.foundation; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.block.render.SpriteShifter; -import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; import net.minecraft.client.resources.ReloadListener; import net.minecraft.profiler.IProfiler; import net.minecraft.resources.IResourceManager; diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java index 2d2d84506..fa99114c3 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.block.connected; import com.simibubi.create.foundation.block.connected.CTSpriteShifter.CTType; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour.CTContext; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; public abstract class CTSpriteShiftEntry extends SpriteShiftEntry { diff --git a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java index 3dc3d23a3..7d9a6cb74 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java @@ -3,7 +3,6 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.util.text.StringTextComponent; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java index 4cebf58d0..c5f37849a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java @@ -1,12 +1,12 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.utility.render.instancing.VertexFormat; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.*; -import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class ContraptionBuffer extends TemplateBuffer { public static final VertexFormat FORMAT = new VertexFormat(InstanceBuffer.FORMAT, RGBA); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java similarity index 95% rename from src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java rename to src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java index e7f65e52a..950fa03f8 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java @@ -1,17 +1,12 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.RenderType; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.LightType; import net.minecraft.world.World; import org.lwjgl.opengl.*; -import org.lwjgl.system.MemoryUtil; - -import java.nio.ByteBuffer; public class ContraptionLighter { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java rename to src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java index 4a49583f2..2625da228 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java @@ -1,23 +1,19 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; -import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer; -import com.simibubi.create.content.schematics.client.SchematicRenderer; -import com.simibubi.create.foundation.utility.render.instancing.IInstanceRendered; -import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.shader.Shader; -import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; -import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; +import com.simibubi.create.foundation.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.shader.Shader; +import com.simibubi.create.foundation.render.shader.ShaderCallback; +import com.simibubi.create.foundation.render.shader.ShaderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java similarity index 96% rename from src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java rename to src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java index d28dccf9a..c3ec9e269 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -6,10 +6,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.instancing.*; -import com.simibubi.create.foundation.utility.render.shader.Shader; -import com.simibubi.create.foundation.utility.render.shader.ShaderCallback; -import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; +import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.shader.Shader; +import com.simibubi.create.foundation.render.shader.ShaderCallback; +import com.simibubi.create.foundation.render.shader.ShaderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; @@ -31,7 +31,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import static com.simibubi.create.foundation.utility.render.SuperByteBufferCache.PARTIAL; +import static com.simibubi.create.foundation.render.SuperByteBufferCache.PARTIAL; public class FastKineticRenderer { Map, Cache>> rotating; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/RenderWork.java b/src/main/java/com/simibubi/create/foundation/render/RenderWork.java similarity index 89% rename from src/main/java/com/simibubi/create/foundation/utility/render/RenderWork.java rename to src/main/java/com/simibubi/create/foundation/render/RenderWork.java index d11e11433..6fc1fd6cb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/RenderWork.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderWork.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SafeDirectBuffer.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/SafeDirectBuffer.java index ffa97f6e3..cb6a47172 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/SafeDirectBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SafeDirectBuffer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import net.minecraft.client.renderer.GLAllocation; import sun.nio.ch.DirectBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/ShadowRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/ShadowRenderHelper.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/utility/render/ShadowRenderHelper.java rename to src/main/java/com/simibubi/create/foundation/render/ShadowRenderHelper.java index a172cefd1..c42a78ae0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/ShadowRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/ShadowRenderHelper.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index 25c20d11d..dde2c5a9d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import java.nio.Buffer; import java.nio.ByteBuffer; @@ -11,7 +11,6 @@ import it.unimi.dsi.fastutil.longs.Long2DoubleMap; import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.Vector4f; import net.minecraft.client.renderer.texture.TextureAtlasSprite; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java rename to src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java index fbb52d014..39c8e33de 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java @@ -1,11 +1,10 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.VirtualEmptyModelData; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java index 23b5afc87..f83e512ca 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.datafixers.util.Pair; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java similarity index 94% rename from src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java rename to src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index 2c4d2fcc2..d457bb8e0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render; +package com.simibubi.create.foundation.render; import java.util.Iterator; @@ -7,7 +7,7 @@ import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.Matrix4f; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java similarity index 88% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java index 5698537c5..c5be438cc 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BasicData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java @@ -1,12 +1,12 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; +import com.simibubi.create.foundation.render.SafeDirectBuffer; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; -import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class BasicData> extends InstanceData { public static final VertexFormat FORMAT = new VertexFormat(RGB, POSITION, LIGHT); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltBuffer.java similarity index 85% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/BeltBuffer.java index d8f7839d4..7007d30ec 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltBuffer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java similarity index 88% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java index 12c933d05..de87e604f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java @@ -1,10 +1,10 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; +import com.simibubi.create.foundation.render.SafeDirectBuffer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class BeltData extends BasicData { public static VertexFormat FORMAT = new VertexFormat(BasicData.FORMAT, VEC3, FLOAT, VEC2, VEC4, FLOAT); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java new file mode 100644 index 000000000..bd825757b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java @@ -0,0 +1,4 @@ +package com.simibubi.create.foundation.render.instancing; + +public interface IInstanceRendered { +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java new file mode 100644 index 000000000..176acb724 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java @@ -0,0 +1,8 @@ +package com.simibubi.create.foundation.render.instancing; + +import net.minecraft.tileentity.TileEntity; + +public interface IInstancedTileEntityRenderer { + + void addInstanceData(InstanceContext te); +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java similarity index 93% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java index 130ae5f8a..74d90d8d1 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java @@ -1,17 +1,17 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.foundation.utility.render.RenderWork; -import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; -import com.simibubi.create.foundation.utility.render.TemplateBuffer; +import com.simibubi.create.foundation.render.RenderWork; +import com.simibubi.create.foundation.render.SafeDirectBuffer; +import com.simibubi.create.foundation.render.TemplateBuffer; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.*; import java.util.ArrayList; import java.util.function.Consumer; -import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public abstract class InstanceBuffer extends TemplateBuffer { public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceContext.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java similarity index 84% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceContext.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java index e1087e9c2..4ec2fbd64 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceContext.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; -import com.simibubi.create.foundation.utility.render.FastKineticRenderer; +import com.simibubi.create.foundation.render.FastContraptionRenderer; +import com.simibubi.create.foundation.render.FastKineticRenderer; import net.minecraft.tileentity.TileEntity; public abstract class InstanceContext { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java similarity index 80% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java index c7d057b4a..b86be8f53 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/InstanceData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java @@ -1,8 +1,6 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; - -import java.nio.ByteBuffer; +import com.simibubi.create.foundation.render.SafeDirectBuffer; public abstract class InstanceData { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingBuffer.java similarity index 85% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/RotatingBuffer.java index cbed7078b..7a7b24f4e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingBuffer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java similarity index 85% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java index f0b33392a..ddcc0eb6d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java @@ -1,9 +1,9 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.utility.render.SafeDirectBuffer; +import com.simibubi.create.foundation.render.SafeDirectBuffer; import net.minecraft.client.renderer.Vector3f; -import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class RotatingData extends BasicData { public static VertexFormat FORMAT = new VertexFormat(BasicData.FORMAT, FLOAT, FLOAT, VEC3); diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java similarity index 97% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java index 522047cc1..99aec4579 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java similarity index 96% rename from src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java index 220e69190..856fcdd7f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render.instancing; +package com.simibubi.create.foundation.render.instancing; public class VertexFormat { diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java rename to src/main/java/com/simibubi/create/foundation/render/shader/Shader.java index d748693f2..2be9e5c96 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render.shader; +package com.simibubi.create.foundation.render.shader; public enum Shader { ROTATING("shader/rotating.vert", "shader/instanced.frag"), diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderCallback.java b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java similarity index 73% rename from src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderCallback.java rename to src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java index 5ed0dbb2d..0474da770 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderCallback.java +++ b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.render.shader; +package com.simibubi.create.foundation.render.shader; /** * A Callback for when a shader is called. Used to define shader uniforms. diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java similarity index 95% rename from src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java rename to src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java index aeadc3de2..4b6de432a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/render/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java @@ -1,10 +1,8 @@ -package com.simibubi.create.foundation.utility.render.shader; +package com.simibubi.create.foundation.render.shader; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.Create; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; -import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; @@ -15,8 +13,6 @@ import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; import net.minecraft.resources.IResourceManagerReloadListener; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.Vec3d; -import net.minecraftforge.client.event.RenderWorldLastEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.system.MemoryUtil; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java index 95648409e..23df51f8f 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.tileEntity.renderer; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.utility.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstanceRendered.java deleted file mode 100644 index 3db9de2ae..000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstanceRendered.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.simibubi.create.foundation.utility.render.instancing; - -public interface IInstanceRendered { -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java deleted file mode 100644 index ccd123237..000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/render/instancing/IInstancedTileEntityRenderer.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.simibubi.create.foundation.utility.render.instancing; - -import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.render.FastContraptionRenderer; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.tileentity.TileEntity; - -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; - -public interface IInstancedTileEntityRenderer { - - void addInstanceData(InstanceContext te); -} From 64b5683ac4b0538e5a8ac147a8478964c92a12ea Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 13 Jan 2021 13:24:45 -0800 Subject: [PATCH 032/147] things actually pause when paused --- .../create/foundation/utility/AnimationTickHolder.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java index 8e626ee6e..f8c654658 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java @@ -7,12 +7,16 @@ public class AnimationTickHolder { public static int ticks; public static void tick() { - ticks++; + if (!Minecraft.getInstance().isGamePaused()) ticks++; } public static float getRenderTick() { + return ticks + getPartialTicks(); + } + + public static float getPartialTicks() { Minecraft mc = Minecraft.getInstance(); - return ticks + (mc.isGamePaused() ? mc.renderPartialTicksPaused : mc.getRenderPartialTicks()); + return (mc.isGamePaused() ? mc.renderPartialTicksPaused : mc.getRenderPartialTicks()); } } From 0bc6b11c5b9fbc8ce411d7c9176861bb53676676 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 14 Jan 2021 13:59:26 -0800 Subject: [PATCH 033/147] be smart about rebuilding things not smart enough about contraptions yet things mostly render in the correct layers --- .../content/contraptions/KineticNetwork.java | 8 +- .../contraptions/base/KineticTileEntity.java | 20 +-- .../base/KineticTileEntityRenderer.java | 21 +++- .../clock/CuckooClockTileEntity.java | 11 +- .../crafter/MechanicalCrafterTileEntity.java | 23 ++-- .../components/crank/HandCrankTileEntity.java | 5 +- .../components/deployer/DeployerRenderer.java | 25 ++-- .../deployer/DeployerTileEntity.java | 23 ++-- .../components/fan/EncasedFanRenderer.java | 20 ++- .../flywheel/FlywheelTileEntity.java | 5 +- .../mixer/MechanicalMixerRenderer.java | 13 +- .../components/saw/SawRenderer.java | 21 +++- .../components/saw/SawTileEntity.java | 28 ++--- .../contraptions/fluids/PumpTileEntity.java | 29 ++--- .../fluids/actors/HosePulleyTileEntity.java | 9 +- .../processing/BasinOperatingTileEntity.java | 13 +- .../advanced/SpeedControllerRenderer.java | 13 +- .../relays/belt/BeltRenderer.java | 90 +++++++++++-- .../relays/belt/BeltTileEntity.java | 35 +++--- .../relays/encased/SplitShaftRenderer.java | 19 ++- .../relays/gauge/GaugeTileEntity.java | 9 +- .../relays/gearbox/GearboxRenderer.java | 47 +++++-- .../block/mechanicalArm/ArmTileEntity.java | 14 ++- .../simibubi/create/events/ClientEvents.java | 20 +-- .../mixin/CancelTileEntityRenderMixin.java | 44 +++++++ .../foundation/mixin/LightUpdateMixin.java | 20 ++- .../foundation/mixin/OnRemoveTileMixin.java | 28 +++++ .../foundation/mixin/RenderInLayerMixin.java | 16 ++- .../render/FastContraptionRenderer.java | 57 +++++---- .../render/FastKineticRenderer.java | 51 +++----- .../render/FastRenderDispatcher.java | 118 ++++++++++++++++++ .../render/TileEntityRenderHelper.java | 8 +- .../render/instancing/IInstanceRendered.java | 3 + .../IInstancedTileEntityRenderer.java | 4 +- .../render/instancing/InstanceBuffer.java | 5 +- .../resources/META-INF/accesstransformer.cfg | 7 +- .../assets/create/shader/contraption.frag | 2 +- .../assets/create/shader/instanced.frag | 2 +- src/main/resources/create.mixins.json | 5 +- 39 files changed, 618 insertions(+), 273 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java b/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java index bbbe8e585..60ca8abb3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java +++ b/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java @@ -1,13 +1,13 @@ package com.simibubi.create.content.contraptions; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + public class KineticNetwork { public Long id; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index f4271e366..90b76469d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -1,12 +1,5 @@ package com.simibubi.create.content.contraptions.base; -import static net.minecraft.util.text.TextFormatting.GOLD; -import static net.minecraft.util.text.TextFormatting.GRAY; - -import java.util.List; - -import javax.annotation.Nullable; - import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.KineticNetwork; import com.simibubi.create.content.contraptions.RotationPropagator; @@ -17,11 +10,11 @@ import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Lang; - -import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.resources.I18n; @@ -37,6 +30,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; +import javax.annotation.Nullable; +import java.util.List; + +import static net.minecraft.util.text.TextFormatting.GOLD; +import static net.minecraft.util.text.TextFormatting.GRAY; + public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation, IInstanceRendered { @@ -245,6 +244,9 @@ public abstract class KineticTileEntity extends SmartTileEntity if (clientPacket && overStressedBefore != overStressed && speed != 0) effects.triggerOverStressedEffect(); + + if (clientPacket) + FastRenderDispatcher.markForRebuild(this); } public float getGeneratedSpeed() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 0b2eee618..c064f762e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -4,13 +4,15 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBufferCache.Compartment; +import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.render.instancing.*; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.SuperByteBufferCache.Compartment; - import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -45,7 +47,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer(te)); +// addInstanceData(new InstanceContext.World<>(te)); } @Override @@ -53,11 +55,20 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer ctx) { + getRotatedModel(ctx).clearInstanceData(); + } + public static void renderRotatingKineticBlock(InstanceContext ctx, BlockState renderedState) { InstanceBuffer instancedRenderer = ctx.getKinetics().renderBlockInstanced(KINETIC_TILE, renderedState); renderRotatingBuffer(ctx, instancedRenderer); } + public static void markForRebuild(InstanceContext ctx, BlockState renderedState) { + ctx.getKinetics().renderBlockInstanced(KINETIC_TILE, renderedState).clearInstanceData(); + } + public static void renderRotatingBuffer(InstanceContext ctx, InstanceBuffer instancer) { instancer.setupInstance(data -> { T te = ctx.te; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java index dad7b19ce..2d0a4c1ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java @@ -1,9 +1,5 @@ package com.simibubi.create.content.contraptions.components.clock; -import static com.simibubi.create.foundation.utility.AngleHelper.deg; -import static com.simibubi.create.foundation.utility.AngleHelper.getShortestAngleDiff; -import static com.simibubi.create.foundation.utility.AngleHelper.rad; - import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; @@ -11,7 +7,6 @@ import com.simibubi.create.foundation.gui.widgets.InterpolatedValue; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; @@ -22,6 +17,8 @@ import net.minecraft.util.SoundEvents; import net.minecraft.util.math.Vec3d; import net.minecraft.world.Explosion; +import static com.simibubi.create.foundation.utility.AngleHelper.*; + public class CuckooClockTileEntity extends KineticTileEntity { public static DamageSource CUCKOO_SURPRISE = new DamageSource("create.cuckoo_clock_explosion").setExplosion(); @@ -172,4 +169,8 @@ public class CuckooClockTileEntity extends KineticTileEntity { world.playSound(vec.x, vec.y, vec.z, sound, SoundCategory.BLOCKS, volume, pitch, false); } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java index 457611032..67dee0db5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java @@ -1,14 +1,5 @@ package com.simibubi.create.content.contraptions.components.crafter; -import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map.Entry; - -import org.apache.commons.lang3.tuple.Pair; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -22,7 +13,6 @@ import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipula import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Pointing; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.block.BlockState; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; @@ -39,6 +29,14 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; + +import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; public class MechanicalCrafterTileEntity extends KineticTileEntity { @@ -490,4 +488,9 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { return inventory; } + @Override + public boolean shouldRenderAsTE() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java index d861d3cac..2a7b0a1d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.crank; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; - import net.minecraft.block.Block; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; @@ -73,4 +72,8 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { return AllBlocks.HAND_CRANK.get(); } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 3525f6c3c..a95b8ccbc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -1,8 +1,5 @@ package com.simibubi.create.content.contraptions.components.deployer; -import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; -import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -11,24 +8,18 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; - -import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Vector3f; -import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.item.BlockItem; @@ -39,6 +30,9 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; +import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; + public class DeployerRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { public DeployerRenderer(TileEntityRendererDispatcher dispatcher) { @@ -59,6 +53,11 @@ public class DeployerRenderer extends SafeTileEntityRenderer KineticTileEntityRenderer.renderRotatingKineticBlock(ctx, getRenderedBlockState(ctx.te)); } + @Override + public void markForRebuild(InstanceContext ctx) { + KineticTileEntityRenderer.markForRebuild(ctx, getRenderedBlockState(ctx.te)); + } + protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { BlockState deployerState = te.getBlockState(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 65beab8e3..d0d0ea8cf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -1,10 +1,5 @@ package com.simibubi.create.content.contraptions.components.deployer; -import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; - -import java.util.ArrayList; -import java.util.List; - import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -15,7 +10,6 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -24,20 +18,20 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.*; import net.minecraft.util.math.RayTraceContext.BlockMode; import net.minecraft.util.math.RayTraceContext.FluidMode; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandlerModifiable; +import java.util.ArrayList; +import java.util.List; + +import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; + public class DeployerTileEntity extends KineticTileEntity { protected State state; @@ -383,4 +377,9 @@ public class DeployerTileEntity extends KineticTileEntity { return true; } + @Override + public boolean shouldRenderAsTE() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 5ab2bbd49..4fbce8fb9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -1,13 +1,10 @@ package com.simibubi.create.content.contraptions.components.fan; -import static net.minecraft.state.properties.BlockStateProperties.FACING; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; - import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.RotatingData; @@ -18,6 +15,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.LightType; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + public class EncasedFanRenderer extends KineticTileEntityRenderer { public EncasedFanRenderer(TileEntityRendererDispatcher dispatcher) { @@ -85,4 +84,19 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { } }); } + + @Override + public void markForRebuild(InstanceContext ctx) { + KineticTileEntity te = ctx.te; + Direction direction = te.getBlockState() + .get(FACING); + + InstanceBuffer shaftHalf = + AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); + InstanceBuffer fanInner = + AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); + + shaftHalf.clearInstanceData(); + fanInner.clearInstanceData(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index 05283aebd..b55c81d63 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.flywheel; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; - import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.AxisAlignedBB; @@ -101,4 +100,8 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { } } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 04231f98d..2ab2d8e75 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -5,9 +5,11 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.render.SuperByteBuffer; - +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -31,9 +33,6 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState); - standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); - int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); float speed = mixer.getRenderedHeadRotationSpeed(partialTicks); @@ -52,4 +51,8 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { .renderInto(ms, vb); } + @Override + protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + return AllBlockPartials.SHAFTLESS_COGWHEEL.renderOnRotating(ctx, ctx.te.getBlockState()); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 2bd9b9a10..75536539d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -1,18 +1,20 @@ package com.simibubi.create.content.contraptions.components.saw; -import static net.minecraft.state.properties.BlockStateProperties.FACING; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.*; - -import com.simibubi.create.foundation.render.instancing.*; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -28,6 +30,8 @@ import net.minecraft.util.Rotation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + public class SawRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { public SawRenderer(TileEntityRendererDispatcher dispatcher) { @@ -48,6 +52,11 @@ public class SawRenderer extends SafeTileEntityRenderer implement KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx)); } + @Override + public void markForRebuild(InstanceContext ctx) { + getRotatedModel(ctx).clearInstanceData(); + } + protected void renderBlade(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light){ BlockState blockState = te.getBlockState(); SuperByteBuffer superBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java index 64a448598..2cf10642d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java @@ -1,11 +1,5 @@ package com.simibubi.create.content.contraptions.components.saw; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; -import java.util.stream.Collectors; - import com.google.common.base.Predicate; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.actors.BlockBreakingKineticTileEntity; @@ -21,16 +15,7 @@ import com.simibubi.create.foundation.utility.TreeCutter.Tree; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.recipe.RecipeConditions; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; - -import net.minecraft.block.BambooBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CactusBlock; -import net.minecraft.block.ChorusPlantBlock; -import net.minecraft.block.KelpBlock; -import net.minecraft.block.KelpTopBlock; -import net.minecraft.block.StemGrownBlock; -import net.minecraft.block.SugarCaneBlock; +import net.minecraft.block.*; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; @@ -53,6 +38,12 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + public class SawTileEntity extends BlockBreakingKineticTileEntity { private static final Object cuttingRecipesKey = new Object(); @@ -393,4 +384,9 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { return false; } + @Override + public boolean shouldRenderAsTE() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java index 901059d71..ff0bad252 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java @@ -1,28 +1,10 @@ package com.simibubi.create.content.contraptions.fluids; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import javax.annotation.Nullable; - -import org.apache.commons.lang3.mutable.MutableBoolean; - import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.*; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; -import com.simibubi.create.foundation.utility.Pair; - import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; @@ -34,6 +16,11 @@ import net.minecraft.world.IWorld; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; +import org.apache.commons.lang3.mutable.MutableBoolean; + +import javax.annotation.Nullable; +import java.util.*; +import java.util.Map.Entry; public class PumpTileEntity extends KineticTileEntity { @@ -374,4 +361,8 @@ public class PumpTileEntity extends KineticTileEntity { } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java index 436b111f9..698f36e3f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java @@ -1,14 +1,11 @@ package com.simibubi.create.content.contraptions.fluids.actors; -import java.util.List; - import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.ServerSpeedProvider; - import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; @@ -20,6 +17,8 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; +import java.util.List; + public class HosePulleyTileEntity extends KineticTileEntity { LerpedFloat offset; @@ -191,4 +190,8 @@ public class HosePulleyTileEntity extends KineticTileEntity { return super.getCapability(cap, side); } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java index 20383e4f4..7c711358f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java @@ -1,21 +1,20 @@ package com.simibubi.create.content.contraptions.processing; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.ITriggerable; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.simple.DeferralBehaviour; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; - import net.minecraft.inventory.IInventory; import net.minecraft.item.crafting.IRecipe; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + public abstract class BasinOperatingTileEntity extends KineticTileEntity { public DeferralBehaviour basinChecker; @@ -144,4 +143,8 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { protected abstract Object getRecipeCacheKey(); + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 65f440f1a..073a6a792 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -2,9 +2,11 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; - -import com.simibubi.create.foundation.render.instancing.*; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -18,7 +20,7 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer(tileEntityIn)); +// addInstanceData(new InstanceContext.World<>(tileEntityIn)); } @Override @@ -26,6 +28,11 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer ctx) { + getRotatedModel(ctx).clearInstanceData(); + } + private InstanceBuffer getRotatedModel(InstanceContext ctx) { return ctx.getKinetics().renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(ctx.te))); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index fe0388464..bc8628880 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -1,7 +1,5 @@ package com.simibubi.create.content.contraptions.relays.belt; -import java.util.Random; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; @@ -9,16 +7,17 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.render.FastKineticRenderer; +import com.simibubi.create.foundation.render.ShadowRenderHelper; +import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.FastKineticRenderer; -import com.simibubi.create.foundation.render.instancing.*; -import com.simibubi.create.foundation.render.ShadowRenderHelper; - import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.entity.Entity; @@ -30,6 +29,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.world.LightType; +import java.util.Random; + public class BeltRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { public BeltRenderer(TileEntityRendererDispatcher dispatcher) { @@ -49,7 +50,7 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme if (!AllBlocks.BELT.has(blockState)) return; - addInstanceData(new InstanceContext.World<>(te)); +// addInstanceData(new InstanceContext.World<>(te)); renderItems(te, partialTicks, ms, buffer, light, overlay); } @@ -105,8 +106,11 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme vertical) speed = -speed; + if (sideways && (facing == Direction.SOUTH || facing == Direction.WEST)) + speed = -speed; + float rotX = !diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0; - float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 270 : 0); + float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 90 : 0); float rotZ = sideways ? 90 : (vertical ? 180 : 0); data.setTileEntity(te) @@ -143,7 +147,75 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); KineticTileEntityRenderer.renderRotatingBuffer(ctx, rotatingBuffer); } + } + @Override + public void markForRebuild(InstanceContext ctx) { + BeltTileEntity te = ctx.te; + FastKineticRenderer fastKineticRenderer = ctx.getKinetics(); + + BlockState blockState = te.getBlockState(); + if (!AllBlocks.BELT.has(blockState)) + return; + + BeltSlope beltSlope = blockState.get(BeltBlock.SLOPE); + BeltPart part = blockState.get(BeltBlock.PART); + Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); + AxisDirection axisDirection = facing.getAxisDirection(); + + boolean downward = beltSlope == BeltSlope.DOWNWARD; + boolean upward = beltSlope == BeltSlope.UPWARD; + boolean diagonal = downward || upward; + boolean start = part == BeltPart.START; + boolean end = part == BeltPart.END; + boolean sideways = beltSlope == BeltSlope.SIDEWAYS; + boolean vertical = beltSlope == BeltSlope.VERTICAL; + + if (downward || vertical && axisDirection == AxisDirection.POSITIVE) { + boolean b = start; + start = end; + end = b; + } + + for (boolean bottom : Iterate.trueAndFalse) { + + AllBlockPartials beltPartial = diagonal + ? start ? AllBlockPartials.BELT_DIAGONAL_START + : end ? AllBlockPartials.BELT_DIAGONAL_END : AllBlockPartials.BELT_DIAGONAL_MIDDLE + : bottom + ? start ? AllBlockPartials.BELT_START_BOTTOM + : end ? AllBlockPartials.BELT_END_BOTTOM : AllBlockPartials.BELT_MIDDLE_BOTTOM + : start ? AllBlockPartials.BELT_START + : end ? AllBlockPartials.BELT_END : AllBlockPartials.BELT_MIDDLE; + + InstanceBuffer beltBuffer = beltPartial.renderOnBelt(ctx, blockState); + + beltBuffer.clearInstanceData(); + + // Diagonal belt do not have a separate bottom model + if (diagonal) + break; + } + + // TODO 1.15 find a way to cache this model matrix computation + MatrixStack modelTransform = new MatrixStack(); + Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) + .rotateY(); + if (sideways) + dir = Direction.UP; + MatrixStacker msr = MatrixStacker.of(modelTransform); + msr.centre(); + if (dir.getAxis() == Axis.X) + msr.rotateY(90); + if (dir.getAxis() == Axis.Y) + msr.rotateX(90); + msr.rotateX(90); + msr.unCentre(); + + InstanceBuffer rotatingBuffer = fastKineticRenderer + .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + + rotatingBuffer.clearInstanceData(); } protected void renderItems(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index c84217cd8..c3ee377bf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -1,24 +1,9 @@ package com.simibubi.create.content.contraptions.relays.belt; -import static com.simibubi.create.content.contraptions.relays.belt.BeltPart.MIDDLE; -import static com.simibubi.create.content.contraptions.relays.belt.BeltSlope.HORIZONTAL; -import static net.minecraft.util.Direction.AxisDirection.NEGATIVE; -import static net.minecraft.util.Direction.AxisDirection.POSITIVE; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory; -import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler; +import com.simibubi.create.content.contraptions.relays.belt.transport.*; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo; -import com.simibubi.create.content.contraptions.relays.belt.transport.BeltTunnelInteractionHandler; -import com.simibubi.create.content.contraptions.relays.belt.transport.ItemHandlerBeltSegment; -import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; @@ -26,7 +11,6 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemS import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.NBTHelper; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -51,6 +35,17 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import static com.simibubi.create.content.contraptions.relays.belt.BeltPart.MIDDLE; +import static com.simibubi.create.content.contraptions.relays.belt.BeltSlope.HORIZONTAL; +import static net.minecraft.util.Direction.AxisDirection.NEGATIVE; +import static net.minecraft.util.Direction.AxisDirection.POSITIVE; + public class BeltTileEntity extends KineticTileEntity { public Map passengers; @@ -471,4 +466,10 @@ public class BeltTileEntity extends KineticTileEntity { .build(); } + @Override + public boolean shouldRenderAsTE() { + // Since only the controller does the item rendering, we potentially + // save a *lot* of time by not processing the other belts. + return isController(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 72f258b8d..cf0affbfc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,11 +5,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.Iterate; - import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -53,7 +52,6 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { if (boxAxis != axis) continue; - InstanceBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); shaft.setupInstance(data -> { @@ -75,4 +73,19 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { }); } } + + @Override + public void markForRebuild(InstanceContext ctx) { + KineticTileEntity te = ctx.te; + Block block = te.getBlockState().getBlock(); + final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); + + for (Direction direction : Iterate.directions) { + Axis axis = direction.getAxis(); + if (boxAxis != axis) continue; + + InstanceBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); + shaft.clearInstanceData(); + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java index 3969af754..ac4e4664a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java @@ -1,14 +1,13 @@ package com.simibubi.create.content.contraptions.relays.gauge; -import java.util.List; - import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.utility.Lang; - import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; +import java.util.List; + public class GaugeTileEntity extends KineticTileEntity implements IHaveGoggleInformation { public float dialTarget; @@ -50,4 +49,8 @@ public class GaugeTileEntity extends KineticTileEntity implements IHaveGoggleInf return true; } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index f4c7b33ba..0a01c1bd6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -1,14 +1,15 @@ package com.simibubi.create.content.contraptions.relays.gearbox; +import com.google.common.collect.Lists; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.Iterate; - import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Pair; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; @@ -17,6 +18,8 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; +import java.util.List; + public class GearboxRenderer extends KineticTileEntityRenderer { public GearboxRenderer(TileEntityRendererDispatcher dispatcher) { @@ -32,7 +35,6 @@ public class GearboxRenderer extends KineticTileEntityRenderer { @Override public void addInstanceData(InstanceContext ctx) { KineticTileEntity te = ctx.te; - final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); int blockLight; @@ -46,20 +48,16 @@ public class GearboxRenderer extends KineticTileEntityRenderer { skyLight = 0; } - for (Direction direction : Iterate.directions) { - final Axis axis = direction.getAxis(); - if (boxAxis == axis) - continue; - - InstanceBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); - - shaft.setupInstance(data -> { + for (Pair> shaft : getBuffers(ctx)) { + shaft.getSecond().setupInstance(data -> { float speed = te.getSpeed(); + Direction direction = shaft.getFirst(); + Axis axis = direction.getAxis(); if (te.getSpeed() != 0 && te.hasSource()) { BlockPos source = te.source.subtract(te.getPos()); Direction sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); - if (sourceFacing.getAxis() == direction.getAxis()) + if (sourceFacing.getAxis() == axis) speed *= sourceFacing == direction ? 1 : -1; else if (sourceFacing.getAxisDirection() == direction.getAxisDirection()) speed *= -1; @@ -74,4 +72,29 @@ public class GearboxRenderer extends KineticTileEntityRenderer { }); } } + + @Override + public void markForRebuild(InstanceContext ctx) { + getBuffers(ctx).stream().map(Pair::getSecond).forEach(InstanceBuffer::clearInstanceData); + } + + private List>> getBuffers(InstanceContext ctx) { + KineticTileEntity te = ctx.te; + final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); + + List>> buffers = Lists.newArrayListWithCapacity(4); + + for (Direction direction : Iterate.directions) { + final Axis axis = direction.getAxis(); + if (boxAxis == axis) + continue; + + InstanceBuffer buffer = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); + Pair> pair = Pair.of(direction, buffer); + + buffers.add(pair); + } + + return buffers; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index 7d72c4ff1..0c56559d3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -1,10 +1,5 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nullable; - import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Jukebox; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Mode; @@ -21,7 +16,6 @@ import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.block.BlockState; import net.minecraft.block.JukeboxBlock; import net.minecraft.item.ItemStack; @@ -37,6 +31,10 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants.NBT; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + public class ArmTileEntity extends KineticTileEntity { // Server @@ -515,4 +513,8 @@ public class ArmTileEntity extends KineticTileEntity { } } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 30385556d..45858e93d 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -24,6 +24,8 @@ import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; +import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.RenderWork; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -32,12 +34,9 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.render.FastContraptionRenderer; -import com.simibubi.create.foundation.render.RenderWork; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.IFluidState; @@ -74,13 +73,10 @@ public class ClientEvents { if (event.phase == Phase.START) return; - AnimationTickHolder.tick(); - if (!isGameActive()) return; - CreateClient.kineticRenderer.tick(); - FastContraptionRenderer.tick(); + AnimationTickHolder.tick(); CreateClient.schematicSender.tick(); CreateClient.schematicAndQuillHandler.tick(); @@ -114,20 +110,13 @@ public class ClientEvents { @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { CreateClient.invalidateRenderers(); + AnimationTickHolder.ticks = 0; } @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { - Matrix4f projection = event.getProjectionMatrix(); - // view matrix Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); - Matrix4f view = Matrix4f.translate((float) -cameraPos.x, (float) -cameraPos.y, (float) -cameraPos.z); - view.multiplyBackward(event.getMatrixStack().peek().getModel()); - - CreateClient.kineticRenderer.renderInstancesAsWorld(projection, view); - FastContraptionRenderer.renderAll(projection, view); - MatrixStack ms = event.getMatrixStack(); ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); ms.push(); @@ -143,6 +132,7 @@ public class ClientEvents { ms.pop(); RenderWork.runAll(); + FastRenderDispatcher.endFrame(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java new file mode 100644 index 000000000..6b9c41924 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java @@ -0,0 +1,44 @@ +package com.simibubi.create.foundation.mixin; + +import com.simibubi.create.foundation.render.instancing.IInstanceRendered; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.ArrayList; +import java.util.List; + +@OnlyIn(Dist.CLIENT) +@Mixin(ChunkRenderDispatcher.CompiledChunk.class) +public class CancelTileEntityRenderMixin { + + /** + * JUSTIFICATION: when instanced rendering is enabled, many tile entities no longer need + * to be processed by the normal game renderer. This method is only called to retrieve the + * list of tile entities to render. By filtering the output here, we prevent the game from + * doing unnecessary light lookups and frustum checks. + */ + @Inject(at = @At("RETURN"), method = "getTileEntities", cancellable = true) + private void noRenderInstancedTiles(CallbackInfoReturnable> cir) { + List tiles = cir.getReturnValue(); + + List out = new ArrayList<>(tiles.size()); + + for (TileEntity tile : tiles) { + if (tile instanceof IInstanceRendered) { + IInstanceRendered instanceRendered = (IInstanceRendered) tile; + + if (!instanceRendered.shouldRenderAsTE()) continue; + } + + out.add(tile); + } + + cir.setReturnValue(out); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java index c19a3018b..38e2053d2 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java @@ -1,19 +1,29 @@ package com.simibubi.create.foundation.mixin; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.util.math.SectionPos; import net.minecraft.world.LightType; +import net.minecraft.world.chunk.AbstractChunkProvider; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +@OnlyIn(Dist.CLIENT) @Mixin(ClientChunkProvider.class) -public class LightUpdateMixin { - @Shadow - @Inject(at = @At("HEAD"), method = "markLightChanged(Lnet/minecraft/world/LightType;Lnet/minecraft/util/math/SectionPos;)V") - private void onLightUpdate(LightType type, SectionPos pos, CallbackInfo ci) { +public abstract class LightUpdateMixin extends AbstractChunkProvider { + /** + * JUSTIFICATION: This method is called after a lighting tick once per subchunk where a + * lighting change occurred that tick. On the client, Minecraft uses this method to inform + * the rendering system that it needs to redraw a chunk. It does all that work asynchronously, + * and we should too. + */ + @Inject(at = @At("HEAD"), method = "markLightChanged") + private void onLightUpdate(LightType type, SectionPos pos, CallbackInfo ci) { + FastRenderDispatcher.notifyLightUpdate(((ClientChunkProvider) (Object) this), type, pos); } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java new file mode 100644 index 000000000..3c838af98 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java @@ -0,0 +1,28 @@ +package com.simibubi.create.foundation.mixin; + +import com.simibubi.create.foundation.render.FastRenderDispatcher; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@OnlyIn(Dist.CLIENT) +@Mixin(World.class) +public class OnRemoveTileMixin { + + /** + * JUSTIFICATION: This method is called whenever a tile entity is removed due + * to a change in block state, even on the client. By hooking into this method, + * we gain easy access to the information while having no impact on performance. + */ + @Inject(at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/World;getTileEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/tileentity/TileEntity;"), method = "removeTileEntity", locals = LocalCapture.CAPTURE_FAILHARD) + private void onRemoveTile(BlockPos pos, CallbackInfo ci, TileEntity te) { + FastRenderDispatcher.markForRebuild(te); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index b008ba822..5c019b01e 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -1,19 +1,27 @@ package com.simibubi.create.foundation.mixin; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +@OnlyIn(Dist.CLIENT) @Mixin(WorldRenderer.class) public class RenderInLayerMixin { - @Shadow - @Inject(at = @At("HEAD"), method = "renderLayer") // (Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/matrix/MatrixStack;DDD)V") - private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { + /** + * JUSTIFICATION: This method is called once per layer per frame. It allows us to perform + * layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects. + * This should probably be a forge event. + */ + @Inject(at = @At("HEAD"), method = "renderLayer") + private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { + FastRenderDispatcher.renderLayer(type, stack, cameraX, cameraY, cameraZ); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java index 2625da228..05589b6b4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java @@ -10,7 +10,9 @@ import com.simibubi.create.foundation.render.shader.Shader; import com.simibubi.create.foundation.render.shader.ShaderCallback; import com.simibubi.create.foundation.render.shader.ShaderHelper; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; @@ -28,7 +30,7 @@ public class FastContraptionRenderer extends ContraptionRenderer { private static final HashMap renderers = new HashMap<>(); - private ArrayList renderLayers = new ArrayList<>(); + private HashMap renderLayers = new HashMap<>(); private ContraptionLighter lighter; @@ -48,7 +50,7 @@ public class FastContraptionRenderer extends ContraptionRenderer { } private void buildLayers(Contraption c) { - for (ContraptionBuffer buffer : renderLayers) { + for (ContraptionBuffer buffer : renderLayers.values()) { buffer.delete(); } @@ -57,7 +59,7 @@ public class FastContraptionRenderer extends ContraptionRenderer { List blockLayers = RenderType.getBlockLayers(); for (RenderType layer : blockLayers) { - renderLayers.add(buildStructureBuffer(c, layer)); + renderLayers.put(layer, buildStructureBuffer(c, layer)); } } @@ -123,15 +125,14 @@ public class FastContraptionRenderer extends ContraptionRenderer { } private void invalidate() { - for (ContraptionBuffer buffer : renderLayers) { + for (ContraptionBuffer buffer : renderLayers.values()) { buffer.delete(); } + renderLayers.clear(); lighter.delete(); kinetics.invalidate(); - - renderLayers.clear(); } public static void markForRendering(World world, Contraption c, MatrixStack model) { @@ -151,46 +152,48 @@ public class FastContraptionRenderer extends ContraptionRenderer { return renderer; } - public static void renderAll(Matrix4f projectionMat, Matrix4f viewMat) { + public static void renderLayer(RenderType renderType, Matrix4f projectionMat, Matrix4f viewMat) { removeDeadContraptions(); if (renderers.isEmpty()) return; - GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; - FastKineticRenderer.setup(gameRenderer); + FastKineticRenderer.setup(Minecraft.getInstance().gameRenderer); GL11.glEnable(GL13.GL_TEXTURE_3D); - GL13.glActiveTexture(GL40.GL_TEXTURE4); + GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projectionMat, viewMat); - int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); for (FastContraptionRenderer renderer : renderers.values()) { - renderer.setup(structureShader); - for (ContraptionBuffer layer : renderer.renderLayers) { - layer.render(); + ContraptionBuffer buffer = renderer.renderLayers.get(renderType); + if (buffer != null) { + renderer.setup(structureShader); + buffer.render(); + renderer.teardown(); } - renderer.teardown(); } - int rotatingShader = ShaderHelper.useShader(Shader.CONTRAPTION_ROTATING, callback); - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.setup(rotatingShader); - renderer.kinetics.renderRotating(); - renderer.teardown(); - } + if (renderType == FastKineticRenderer.getKineticRenderLayer()) { + int rotatingShader = ShaderHelper.useShader(Shader.CONTRAPTION_ROTATING, callback); + for (FastContraptionRenderer renderer : renderers.values()) { + renderer.setup(rotatingShader); + renderer.kinetics.renderRotating(); + renderer.teardown(); + } - int beltShader = ShaderHelper.useShader(Shader.CONTRAPTION_BELT, callback); - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.setup(beltShader); - renderer.kinetics.renderBelts(); - renderer.teardown(); + int beltShader = ShaderHelper.useShader(Shader.CONTRAPTION_BELT, callback); + for (FastContraptionRenderer renderer : renderers.values()) { + renderer.setup(beltShader); + renderer.kinetics.renderBelts(); + renderer.teardown(); + } } ShaderHelper.releaseShader(); GL11.glDisable(GL13.GL_TEXTURE_3D); FastKineticRenderer.teardown(); + GL13.glActiveTexture(GL40.GL_TEXTURE0); } public static void removeDeadContraptions() { diff --git a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java index c3ec9e269..c485f6ed5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java @@ -26,9 +26,10 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL40; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; import java.util.function.Supplier; import static com.simibubi.create.foundation.render.SuperByteBufferCache.PARTIAL; @@ -37,12 +38,11 @@ public class FastKineticRenderer { Map, Cache>> rotating; Map, Cache>> belts; - boolean rebuild; + public boolean dirty = false; public FastKineticRenderer() { rotating = new HashMap<>(); belts = new HashMap<>(); - registerCompartment(SuperByteBufferCache.GENERIC_TILE); registerCompartment(SuperByteBufferCache.PARTIAL); registerCompartment(SuperByteBufferCache.DIRECTIONAL_PARTIAL); registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); @@ -92,25 +92,6 @@ public class FastKineticRenderer { } } - public void tick() { - // TODO: (later) detect changes in lighting with a mixin (or forge hook) to ClientChunkProvider.markLightChanged() - for (Cache> cache : rotating.values()) { - for (InstanceBuffer renderer : cache.asMap().values()) { - renderer.clearInstanceData(); - } - } - - for (Cache> cache : belts.values()) { - for (InstanceBuffer renderer : cache.asMap().values()) { - renderer.clearInstanceData(); - } - } - - //buildTileEntityBuffers(Minecraft.getInstance().world); - - rebuild = true; - } - void renderBelts() { for (Cache> cache : belts.values()) { for (InstanceBuffer type : cache.asMap().values()) { @@ -131,15 +112,15 @@ public class FastKineticRenderer { } } - public void renderInstancesAsWorld(Matrix4f projection, Matrix4f view) { - GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; - - if (rebuild) { + public void renderInstancesAsWorld(RenderType layer, Matrix4f projection, Matrix4f view) { + if (dirty) { + buildTileEntityBuffers(Minecraft.getInstance().world); markAllDirty(); - rebuild = false; + + dirty = false; } - setup(gameRenderer); + layer.startDrawing(); ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projection, view); @@ -151,7 +132,7 @@ public class FastKineticRenderer { ShaderHelper.releaseShader(); - teardown(); + layer.endDrawing(); } public static void setup(GameRenderer gameRenderer) { @@ -206,11 +187,6 @@ public class FastKineticRenderer { belts.put(instance, CacheBuilder.newBuilder().build()); } - public void registerCompartment(SuperByteBufferCache.Compartment instance, long ticksUntilExpired) { - rotating.put(instance, CacheBuilder.newBuilder().expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS).build()); - belts.put(instance, CacheBuilder.newBuilder().expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS).build()); - } - public InstanceBuffer renderPartialRotating(AllBlockPartials partial, BlockState referenceState) { return getRotating(PARTIAL, partial, () -> rotatingInstancedRenderer(partial.get(), referenceState)); } @@ -249,7 +225,6 @@ public class FastKineticRenderer { } } - private InstanceBuffer rotatingInstancedRenderer(BlockState renderedState) { BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); return rotatingInstancedRenderer(dispatcher.getModelForState(renderedState), renderedState); @@ -286,4 +261,8 @@ public class FastKineticRenderer { cache.invalidateAll(); } } + + public static RenderType getKineticRenderLayer() { + return RenderType.getCutoutMipped(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java new file mode 100644 index 000000000..fca350101 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -0,0 +1,118 @@ +package com.simibubi.create.foundation.render; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.multiplayer.ClientChunkProvider; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.potion.Effects; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.LightType; +import net.minecraft.world.chunk.Chunk; + +import java.util.Map; + +public class FastRenderDispatcher { + + private static Matrix4f projectionMatrixThisFrame = null; + + public static void endFrame() { + projectionMatrixThisFrame = null; + } + + public static void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ) { + Matrix4f view = Matrix4f.translate((float) -cameraX, (float) -cameraY, (float) -cameraZ); + view.multiplyBackward(stack.peek().getModel()); + + Matrix4f projection = getProjectionMatrix(); + + if (type == FastKineticRenderer.getKineticRenderLayer()) { + CreateClient.kineticRenderer.renderInstancesAsWorld(type, projection, view); + } + + FastContraptionRenderer.renderLayer(type, projection, view); + } + + public static void notifyLightUpdate(ClientChunkProvider world, LightType type, SectionPos pos) { + FastContraptionRenderer.tick(); + + Chunk chunk = world.getChunk(pos.getSectionX(), pos.getSectionZ(), false); + + int sectionY = pos.getSectionY(); + + if (chunk != null) { + chunk.getTileEntityMap() + .entrySet() + .stream() + .filter(entry -> SectionPos.toChunk(entry.getKey().getY()) == sectionY) + .map(Map.Entry::getValue) + .forEach(FastRenderDispatcher::markForRebuild); + } + } + + public static void markForRebuild(TileEntity te) { + if (te instanceof IInstanceRendered) { + TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(te); + + if (renderer instanceof IInstancedTileEntityRenderer) { + markForRebuild(te, (IInstancedTileEntityRenderer) renderer); + } + } + } + + private static void markForRebuild(T te, IInstancedTileEntityRenderer renderer) { + CreateClient.kineticRenderer.dirty = true; + renderer.markForRebuild(new InstanceContext.World<>(te)); + } + + // copied from GameRenderer.renderWorld + private static Matrix4f getProjectionMatrix() { + if (projectionMatrixThisFrame != null) return projectionMatrixThisFrame; + + float partialTicks = AnimationTickHolder.getPartialTicks(); + Minecraft mc = Minecraft.getInstance(); + GameRenderer gameRenderer = mc.gameRenderer; + ClientPlayerEntity player = mc.player; + + MatrixStack matrixstack = new MatrixStack(); + matrixstack.peek().getModel().multiply(gameRenderer.func_228382_a_(gameRenderer.getActiveRenderInfo(), partialTicks, true)); + gameRenderer.bobViewWhenHurt(matrixstack, partialTicks); + if (mc.gameSettings.viewBobbing) { + gameRenderer.bobView(matrixstack, partialTicks); + } + + float portalTime = MathHelper.lerp(partialTicks, player.prevTimeInPortal, player.timeInPortal); + if (portalTime > 0.0F) { + int i = 20; + if (player.isPotionActive(Effects.NAUSEA)) { + i = 7; + } + + float f1 = 5.0F / (portalTime * portalTime + 5.0F) - portalTime * 0.04F; + f1 = f1 * f1; + Vector3f vector3f = new Vector3f(0.0F, MathHelper.SQRT_2 / 2.0F, MathHelper.SQRT_2 / 2.0F); + matrixstack.multiply(vector3f.getDegreesQuaternion(((float)gameRenderer.rendererUpdateCount + partialTicks) * (float)i)); + matrixstack.scale(1.0F / f1, 1.0F, 1.0F); + float f2 = -((float)gameRenderer.rendererUpdateCount + partialTicks) * (float)i; + matrixstack.multiply(vector3f.getDegreesQuaternion(f2)); + } + + Matrix4f matrix4f = matrixstack.peek().getModel(); + gameRenderer.func_228379_a_(matrix4f); + + projectionMatrixThisFrame = matrix4f; + return projectionMatrixThisFrame; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index d457bb8e0..d52ccf02b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -1,13 +1,9 @@ package com.simibubi.create.foundation.render; -import java.util.Iterator; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; - import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.Matrix4f; @@ -20,6 +16,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import java.util.Iterator; + public class TileEntityRenderHelper { public static void renderTileEntities(World world, Iterable customRenderTEs, MatrixStack ms, @@ -31,7 +29,7 @@ public class TileEntityRenderHelper { for (Iterator iterator = customRenderTEs.iterator(); iterator.hasNext();) { TileEntity tileEntity = iterator.next(); - if (tileEntity instanceof IInstanceRendered) continue; // TODO: some things still need to render + //if (tileEntity instanceof IInstanceRendered) continue; // TODO: some things still need to render TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(tileEntity); if (renderer == null) { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java index bd825757b..e169de311 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java @@ -1,4 +1,7 @@ package com.simibubi.create.foundation.render.instancing; public interface IInstanceRendered { + default boolean shouldRenderAsTE() { + return false; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java index 176acb724..4b9ccaa1b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java @@ -4,5 +4,7 @@ import net.minecraft.tileentity.TileEntity; public interface IInstancedTileEntityRenderer { - void addInstanceData(InstanceContext te); + void addInstanceData(InstanceContext ctx); + + void markForRebuild(InstanceContext ctx); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java index 74d90d8d1..54bca6390 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java @@ -84,12 +84,11 @@ public abstract class InstanceBuffer extends TemplateBuf } public void clearInstanceData() { - instanceCount = 0; shouldBuild = true; } public void markDirty() { - rebuffer = true; + if (shouldBuild) rebuffer = true; } public void delete() { @@ -140,7 +139,7 @@ public abstract class InstanceBuffer extends TemplateBuf } private void finishBuffering() { - if (!rebuffer || isEmpty()) return; + if (!rebuffer || data.isEmpty()) return; instanceCount = data.size(); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index fdc144a8b..440395e69 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -27,4 +27,9 @@ public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickLis # Lightmap information for instanced rendering public net.minecraft.client.renderer.LightTexture field_205112_c #resourceLocation -public net.minecraft.client.Minecraft field_193996_ah #renderPartialTicksPaused \ No newline at end of file +public net.minecraft.client.Minecraft field_193996_ah #renderPartialTicksPaused + +# Functions needed to setup a projection matrix +public net.minecraft.client.renderer.GameRenderer field_78529_t #rendererUpdateCount +public net.minecraft.client.renderer.GameRenderer func_228380_a_(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V #bobViewWhenHurt +public net.minecraft.client.renderer.GameRenderer func_228383_b_(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V #bobView \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index 9ec3cc530..c493e4c4e 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -8,7 +8,7 @@ in vec3 BoxCoord; out vec4 fragColor; layout(binding=0) uniform sampler2D BlockAtlas; -layout(binding=1) uniform sampler2D LightMap; +layout(binding=2) uniform sampler2D LightMap; layout(binding=4) uniform sampler3D LightVolume; vec4 light() { diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index fae8b8494..1dc3b376b 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -8,7 +8,7 @@ in vec4 Color; out vec4 fragColor; layout(binding=0) uniform sampler2D BlockAtlas; -layout(binding=1) uniform sampler2D LightMap; +layout(binding=2) uniform sampler2D LightMap; vec4 light() { vec2 lm = Light * 0.9375 + 0.03125; diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index c4bf6f100..f674ecc82 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -3,10 +3,7 @@ "package": "com.simibubi.create.foundation.mixin", "compatibilityLevel": "JAVA_8", "refmap": "create.refmap.json", - "client": [ - "LightUpdateMixin", - "RenderInLayerMixin" - ], + "client": ["CancelTileEntityRenderMixin", "LightUpdateMixin", "OnRemoveTileMixin", "RenderInLayerMixin"], "injectors": { "defaultRequire": 1 }, From 5ea0fa788f7ee0f29e48049357c9df183f1523c0 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 15 Jan 2021 14:26:27 -0800 Subject: [PATCH 034/147] Make the last tile of its kind disappear --- .../render/FastKineticRenderer.java | 27 +++++++++---------- .../render/instancing/InstanceBuffer.java | 1 + 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java index c485f6ed5..c9de28113 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; import java.util.function.Supplier; import static com.simibubi.create.foundation.render.SuperByteBufferCache.PARTIAL; @@ -79,15 +80,25 @@ public class FastKineticRenderer { * guaranteed to be no race conditions with the render thread, i.e. when constructing a FastContraptionRenderer. */ public void markAllDirty() { + runOnAll(InstanceBuffer::markDirty); + } + + public void invalidate() { + runOnAll(InstanceBuffer::delete); + belts.values().forEach(Cache::invalidateAll); + rotating.values().forEach(Cache::invalidateAll); + } + + private void runOnAll(Consumer> f) { for (Cache> cache : rotating.values()) { for (InstanceBuffer renderer : cache.asMap().values()) { - renderer.markDirty(); + f.accept(renderer); } } for (Cache> cache : belts.values()) { for (InstanceBuffer renderer : cache.asMap().values()) { - renderer.markDirty(); + f.accept(renderer); } } } @@ -250,18 +261,6 @@ public class FastKineticRenderer { return new BeltBuffer(builder); } - public void invalidate() { - for (Cache> objectInstanceBufferCache : rotating.values()) { - objectInstanceBufferCache.asMap().values().forEach(InstanceBuffer::delete); - objectInstanceBufferCache.invalidateAll(); - } - - for (Cache> cache : belts.values()) { - cache.asMap().values().forEach(InstanceBuffer::delete); - cache.invalidateAll(); - } - } - public static RenderType getKineticRenderLayer() { return RenderType.getCutoutMipped(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java index 54bca6390..17953fedd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java @@ -84,6 +84,7 @@ public abstract class InstanceBuffer extends TemplateBuf } public void clearInstanceData() { + instanceCount = 0; shouldBuild = true; } From 37e64e4c1d64f8e139cb926684a10202ef78afcb Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 15 Jan 2021 16:17:13 -0800 Subject: [PATCH 035/147] fix vertex attribute data types blockcolors and ao now work in contraptions be smarter about allocating buffers use gl buffer mapping, more to come --- build.gradle | 2 +- .../foundation/mixin/OnRemoveTileMixin.java | 6 +- .../foundation/render/ContraptionBuffer.java | 69 ++++++------ .../foundation/render/ContraptionLighter.java | 9 +- .../create/foundation/render/RenderMath.java | 8 ++ .../foundation/render/TemplateBuffer.java | 20 ++-- .../render/instancing/BasicData.java | 17 ++- .../render/instancing/BeltData.java | 9 +- .../render/instancing/InstanceBuffer.java | 104 +++++++++--------- .../render/instancing/InstanceData.java | 45 +++++--- .../render/instancing/RotatingData.java | 9 +- .../render/instancing/VertexAttribute.java | 6 +- .../assets/create/shader/contraption.vert | 4 +- .../assets/create/shader/rotating.vert | 6 +- 14 files changed, 177 insertions(+), 137 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/RenderMath.java diff --git a/build.gradle b/build.gradle index 049422317..818b0f530 100644 --- a/build.gradle +++ b/build.gradle @@ -126,7 +126,7 @@ dependencies { //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") //runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984") - annotationProcessor 'org.spongepowered:mixin:0.8:processor' + //annotationProcessor 'org.spongepowered:mixin:0.8:processor' } jar { diff --git a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java index 3c838af98..5fe04753a 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java @@ -6,7 +6,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -16,6 +18,8 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(World.class) public class OnRemoveTileMixin { + @Shadow @Final public boolean isRemote; + /** * JUSTIFICATION: This method is called whenever a tile entity is removed due * to a change in block state, even on the client. By hooking into this method, @@ -23,6 +27,6 @@ public class OnRemoveTileMixin { */ @Inject(at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/World;getTileEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/tileentity/TileEntity;"), method = "removeTileEntity", locals = LocalCapture.CAPTURE_FAILHARD) private void onRemoveTile(BlockPos pos, CallbackInfo ci, TileEntity te) { - FastRenderDispatcher.markForRebuild(te); + if (isRemote) FastRenderDispatcher.markForRebuild(te); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java index c5f37849a..d3c77a3a5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java @@ -6,6 +6,8 @@ import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.*; +import java.nio.ByteBuffer; + import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class ContraptionBuffer extends TemplateBuffer { @@ -15,19 +17,21 @@ public class ContraptionBuffer extends TemplateBuffer { public ContraptionBuffer(BufferBuilder buf) { super(buf); - setup(); + if (vertexCount > 0) setup(); } public void delete() { - RenderWork.enqueue(() -> { - GL15.glDeleteBuffers(vbo); - GL15.glDeleteBuffers(ebo); - GL30.glDeleteVertexArrays(vao); - }); + if (vertexCount > 0) { + RenderWork.enqueue(() -> { + GL15.glDeleteBuffers(vbo); + GL15.glDeleteBuffers(ebo); + GL30.glDeleteVertexArrays(vao); + }); + } } public void render() { - + if (vertexCount == 0) return; GL30.glBindVertexArray(vao); for (int i = 0; i <= 3; i++) { @@ -54,39 +58,38 @@ public class ContraptionBuffer extends TemplateBuffer { ebo = GlStateManager.genBuffers(); vbo = GlStateManager.genBuffers(); - try (SafeDirectBuffer constant = new SafeDirectBuffer(invariantSize)) { - constant.order(template.order()); - constant.limit(invariantSize); + GL30.glBindVertexArray(vao); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - for (int i = 0; i < vertexCount; i++) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); + // allocate the buffer on the gpu + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); - constant.put(getNX(template, i)); - constant.put(getNY(template, i)); - constant.put(getNZ(template, i)); + // mirror it in system memory so we can write to it + ByteBuffer constant = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); + for (int i = 0; i < vertexCount; i++) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); - constant.put(getR(template, i)); - constant.put(getG(template, i)); - constant.put(getB(template, i)); - constant.put(getA(template, i)); - } - constant.rewind(); + constant.put(getNX(template, i)); + constant.put(getNY(template, i)); + constant.put(getNZ(template, i)); - GL30.glBindVertexArray(vao); + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, vbo); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant.getBacking(), GL15.GL_STATIC_DRAW); - buildEBO(ebo); - - FORMAT.informAttributes(0); - } catch (Exception e) { - e.printStackTrace(); + constant.put(getR(template, i)); + constant.put(getG(template, i)); + constant.put(getB(template, i)); + constant.put(getA(template, i)); } + constant.rewind(); + GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); + + buildEBO(ebo); + + FORMAT.informAttributes(0); GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java index 950fa03f8..ec824b8c0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java @@ -8,6 +8,10 @@ import net.minecraft.world.LightType; import net.minecraft.world.World; import org.lwjgl.opengl.*; +import java.nio.ByteBuffer; + +import static com.simibubi.create.foundation.render.RenderMath.nextPowerOf2; + public class ContraptionLighter { private int minX; @@ -45,11 +49,6 @@ public class ContraptionLighter { update(contraption); } - public static int nextPowerOf2(int a) { - int h = Integer.highestOneBit(a); - return (h == a) ? h : (h << 1); - } - public int getSizeX() { return sizeX; } diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java new file mode 100644 index 000000000..7d143e4f7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java @@ -0,0 +1,8 @@ +package com.simibubi.create.foundation.render; + +public class RenderMath { + public static int nextPowerOf2(int a) { + int h = Integer.highestOneBit(a); + return (h == a) ? h : (h << 1); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java index f83e512ca..c24e7261e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java @@ -32,20 +32,20 @@ public class TemplateBuffer { ((Buffer)template).rewind(); } - protected void buildEBO(int ebo) throws Exception { + protected void buildEBO(int ebo){ int indicesSize = vertexCount * VertexFormatElement.Type.USHORT.getSize(); - try (SafeDirectBuffer indices = new SafeDirectBuffer(indicesSize)) { - indices.order(template.order()); - indices.limit(indicesSize); - for (int i = 0; i < vertexCount; i++) { - indices.putShort((short) i); - } - indices.rewind(); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GlStateManager.bufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices.getBacking(), GL15.GL_STATIC_DRAW); + ByteBuffer indices = GL15.glMapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); + + for (int i = 0; i < vertexCount; i++) { + indices.putShort((short) i); } + indices.rewind(); + + GL15.glUnmapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER); } public boolean isEmpty() { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java index c5be438cc..d2d6bc94c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java @@ -2,10 +2,11 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.render.SafeDirectBuffer; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; +import java.nio.ByteBuffer; + import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class BasicData> extends InstanceData { @@ -17,16 +18,16 @@ public class BasicData> extends InstanceData { private float x; private float y; private float z; - private float blockLight; - private float skyLight; + private byte blockLight; + private byte skyLight; public D setBlockLight(int blockLight) { - this.blockLight = blockLight / 15f; + this.blockLight = (byte) ((blockLight & 0xF) << 4); return (D) this; } public D setSkyLight(int skyLight) { - this.skyLight = skyLight / 15f; + this.skyLight = (byte) ((skyLight & 0xF) << 4); return (D) this; } @@ -61,10 +62,8 @@ public class BasicData> extends InstanceData { } @Override - public void write(SafeDirectBuffer buf) { - buf.put(r); - buf.put(g); - buf.put(b); + public void write(ByteBuffer buf) { + putVec3(buf, r, g, b); putVec3(buf, x, y, z); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java index de87e604f..b103a282e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java @@ -1,9 +1,10 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.render.SafeDirectBuffer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import java.nio.ByteBuffer; + import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class BeltData extends BasicData { @@ -53,16 +54,16 @@ public class BeltData extends BasicData { } @Override - public void write(SafeDirectBuffer buf) { + public void write(ByteBuffer buf) { super.write(buf); putVec3(buf, rotX, rotY, rotZ); - putFloat(buf, rotationalSpeed); + put(buf, rotationalSpeed); putVec2(buf, sourceU, sourceV); putVec4(buf, minU, minV, maxU, maxV); - putFloat(buf, scrollMult); + put(buf, scrollMult); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java index 17953fedd..371d7e5ca 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java @@ -2,12 +2,14 @@ package com.simibubi.create.foundation.render.instancing; import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.render.RenderMath; import com.simibubi.create.foundation.render.RenderWork; import com.simibubi.create.foundation.render.SafeDirectBuffer; import com.simibubi.create.foundation.render.TemplateBuffer; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.*; +import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.function.Consumer; @@ -18,13 +20,15 @@ public abstract class InstanceBuffer extends TemplateBuf protected int vao, ebo, invariantVBO, instanceVBO, instanceCount; + protected int bufferSize = -1; + protected final ArrayList data = new ArrayList<>(); protected boolean rebuffer = false; protected boolean shouldBuild = true; public InstanceBuffer(BufferBuilder buf) { super(buf); - setup(); + if (vertexCount > 0) setup(); } private void setup() { @@ -37,35 +41,33 @@ public abstract class InstanceBuffer extends TemplateBuf invariantVBO = GlStateManager.genBuffers(); instanceVBO = GlStateManager.genBuffers(); - try (SafeDirectBuffer constant = new SafeDirectBuffer(invariantSize)) { - constant.order(template.order()); - constant.limit(invariantSize); + GL30.glBindVertexArray(vao); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, invariantVBO); - for (int i = 0; i < vertexCount; i++) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); + // allocate the buffer on the gpu + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); - constant.put(getNX(template, i)); - constant.put(getNY(template, i)); - constant.put(getNZ(template, i)); + // mirror it in system memory so we can write to it + ByteBuffer constant = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); - } - constant.rewind(); + for (int i = 0; i < vertexCount; i++) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); - GL30.glBindVertexArray(vao); + constant.put(getNX(template, i)); + constant.put(getNY(template, i)); + constant.put(getNZ(template, i)); - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, invariantVBO); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, constant.getBacking(), GL15.GL_STATIC_DRAW); - - buildEBO(ebo); - - FORMAT.informAttributes(0); - } catch (Exception e) { - delete(); + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); } + constant.rewind(); + GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); + + buildEBO(ebo); + + FORMAT.informAttributes(0); GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); @@ -93,16 +95,19 @@ public abstract class InstanceBuffer extends TemplateBuf } public void delete() { - RenderWork.enqueue(() -> { - GL15.glDeleteBuffers(invariantVBO); - GL15.glDeleteBuffers(instanceVBO); - GL15.glDeleteBuffers(ebo); - GL30.glDeleteVertexArrays(vao); - vao = 0; - ebo = 0; - invariantVBO = 0; - instanceVBO = 0; - }); + if (vertexCount > 0) { + RenderWork.enqueue(() -> { + GL15.glDeleteBuffers(invariantVBO); + GL15.glDeleteBuffers(instanceVBO); + GL15.glDeleteBuffers(ebo); + GL30.glDeleteVertexArrays(vao); + vao = 0; + ebo = 0; + invariantVBO = 0; + instanceVBO = 0; + bufferSize = -1; + }); + } } protected abstract D newInstance(); @@ -146,26 +151,27 @@ public abstract class InstanceBuffer extends TemplateBuf VertexFormat instanceFormat = getInstanceFormat(); - int instanceSize = instanceCount * instanceFormat.getStride(); + int instanceSize = RenderMath.nextPowerOf2(instanceCount * instanceFormat.getStride()); - try (SafeDirectBuffer buffer = new SafeDirectBuffer(instanceSize)) { - buffer.order(template.order()); - buffer.limit(instanceSize); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVBO); - data.forEach(instanceData -> instanceData.write(buffer)); - buffer.rewind(); + // this changes enough that it's not worth reallocating the entire buffer every time. + if (instanceSize > bufferSize) { + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, instanceSize, GL15.GL_STATIC_DRAW); + bufferSize = instanceSize; + } - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, instanceVBO); - GlStateManager.bufferData(GL15.GL_ARRAY_BUFFER, buffer.getBacking(), GL15.GL_STATIC_DRAW); + ByteBuffer buffer = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); - int staticAttributes = FORMAT.getNumAttributes(); - instanceFormat.informAttributes(staticAttributes); + data.forEach(instanceData -> instanceData.write(buffer)); + buffer.rewind(); + GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); - for (int i = 0; i < instanceFormat.getNumAttributes(); i++) { - GL33.glVertexAttribDivisor(i + staticAttributes, 1); - } - } catch (Exception e) { - e.printStackTrace(); + int staticAttributes = FORMAT.getNumAttributes(); + instanceFormat.informAttributes(staticAttributes); + + for (int i = 0; i < instanceFormat.getNumAttributes(); i++) { + GL33.glVertexAttribDivisor(i + staticAttributes, 1); } // Deselect (bind to 0) the VBO diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java index b86be8f53..d656ba948 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java @@ -1,30 +1,45 @@ package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.render.SafeDirectBuffer; +import java.nio.ByteBuffer; public abstract class InstanceData { - public abstract void write(SafeDirectBuffer buf); + public abstract void write(ByteBuffer buf); - public void putVec4(SafeDirectBuffer buf, float x, float y, float z, float w) { - putFloat(buf, x); - putFloat(buf, y); - putFloat(buf, z); - putFloat(buf, w); + public void putVec4(ByteBuffer buf, float x, float y, float z, float w) { + put(buf, x); + put(buf, y); + put(buf, z); + put(buf, w); } - public void putVec3(SafeDirectBuffer buf, float x, float y, float z) { - putFloat(buf, x); - putFloat(buf, y); - putFloat(buf, z); + public void putVec3(ByteBuffer buf, float x, float y, float z) { + put(buf, x); + put(buf, y); + put(buf, z); } - public void putVec2(SafeDirectBuffer buf, float x, float y) { - putFloat(buf, x); - putFloat(buf, y); + public void putVec2(ByteBuffer buf, float x, float y) { + put(buf, x); + put(buf, y); } - public void putFloat(SafeDirectBuffer buf, float f) { + public void putVec3(ByteBuffer buf, byte x, byte y, byte z) { + put(buf, x); + put(buf, y); + put(buf, z); + } + + public void putVec2(ByteBuffer buf, byte x, byte y) { + put(buf, x); + put(buf, y); + } + + public void put(ByteBuffer buf, byte b) { + buf.put(b); + } + + public void put(ByteBuffer buf, float f) { buf.putFloat(f); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java index ddcc0eb6d..1aa62c4a5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java @@ -1,8 +1,9 @@ package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.render.SafeDirectBuffer; import net.minecraft.client.renderer.Vector3f; +import java.nio.ByteBuffer; + import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class RotatingData extends BasicData { @@ -39,10 +40,10 @@ public class RotatingData extends BasicData { } @Override - public void write(SafeDirectBuffer buf) { + public void write(ByteBuffer buf) { super.write(buf); - putFloat(buf, rotationalSpeed); - putFloat(buf, rotationOffset); + put(buf, rotationalSpeed); + put(buf, rotationOffset); putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java index 99aec4579..d4921bfba 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java @@ -12,10 +12,10 @@ public class VertexAttribute { public static final VertexAttribute POSITION = VEC3; public static final VertexAttribute NORMAL = new VertexAttribute(VertexFormatElement.Type.BYTE, 3, true); - public static final VertexAttribute RGBA = new VertexAttribute(VertexFormatElement.Type.BYTE, 4, true); - public static final VertexAttribute RGB = new VertexAttribute(VertexFormatElement.Type.BYTE, 3, true); + public static final VertexAttribute RGBA = new VertexAttribute(VertexFormatElement.Type.UBYTE, 4, true); + public static final VertexAttribute RGB = new VertexAttribute(VertexFormatElement.Type.UBYTE, 3, true); public static final VertexAttribute UV = VEC2; - public static final VertexAttribute LIGHT = new VertexAttribute(VertexFormatElement.Type.FLOAT, 2); + public static final VertexAttribute LIGHT = new VertexAttribute(VertexFormatElement.Type.UBYTE, 2, true); private final VertexFormatElement.Type type; private final int count; diff --git a/src/main/resources/assets/create/shader/contraption.vert b/src/main/resources/assets/create/shader/contraption.vert index 05ee9a891..e68ed3c54 100644 --- a/src/main/resources/assets/create/shader/contraption.vert +++ b/src/main/resources/assets/create/shader/contraption.vert @@ -43,8 +43,8 @@ void main() { vec4 worldPos = model * vec4(aPos, 1); BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(model * vec4(aNormal, 0.)).xyz); - Color = vec4(1);//aColor; + Diffuse = diffuse((model * vec4(aNormal, 0.)).xyz); + Color = aColor / diffuse(aNormal); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; } diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index 9e7eb6573..da40a8935 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -49,13 +49,17 @@ void main() { renderPos += vec4(instancePos + vec3(0.5), 0); - Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); + vec3 norm = (rotation * vec4(aNormal, 0.)).xyz; + + Diffuse = diffuse(norm); TexCoords = aTexCoords; gl_Position = projection * view * renderPos; Light = light; if (debug == 1) { Color = vec4(networkTint, 1); + } else if (debug == 2) { + Color = vec4(norm, 1); } else { Color = vec4(1); } From 0cb18c532db5b955b151f8a3c46523c338d7436c Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 15 Jan 2021 20:07:04 -0800 Subject: [PATCH 036/147] uncomment the mixin annotation processor whoops --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 818b0f530..049422317 100644 --- a/build.gradle +++ b/build.gradle @@ -126,7 +126,7 @@ dependencies { //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") //runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984") - //annotationProcessor 'org.spongepowered:mixin:0.8:processor' + annotationProcessor 'org.spongepowered:mixin:0.8:processor' } jar { From 22a90c8e5d3f8f9ff8ba8aae82f952a78a73c10a Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sun, 17 Jan 2021 22:18:31 -0800 Subject: [PATCH 037/147] on our way to super fancy contraption lighting --- .../com/simibubi/create/CreateClient.java | 5 +- .../AbstractContraptionEntityRenderer.java | 6 +- .../structureMovement/Contraption.java | 9 + .../ContraptionRenderer.java | 2 +- .../bearing/BearingContraption.java | 8 + .../bearing/BearingLighter.java | 19 ++ .../simibubi/create/events/ClientEvents.java | 3 +- .../foundation/render/ContraptionLighter.java | 149 ------------ .../render/ContraptionRenderDispatcher.java | 111 +++++++++ .../render/FastContraptionRenderer.java | 226 ------------------ .../render/FastKineticRenderer.java | 3 +- .../render/FastRenderDispatcher.java | 5 +- .../create/foundation/render/RenderMath.java | 5 + .../render/RenderedContraption.java | 152 ++++++++++++ .../render/instancing/InstanceContext.java | 6 +- .../render/light/ContraptionLighter.java | 27 +++ .../render/light/CoordinateConsumer.java | 6 + .../foundation/render/light/EmptyLighter.java | 15 ++ .../render/light/GridAlignedBB.java | 203 ++++++++++++++++ .../foundation/render/light/LightVolume.java | 204 ++++++++++++++++ .../render/light/LightVolumeDebugger.java | 18 ++ .../render/shader/ShaderHelper.java | 14 +- src/main/resources/META-INF/mods.toml | 2 +- .../resources/assets/create/shader/belt.vert | 6 +- 24 files changed, 810 insertions(+), 394 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/RenderedContraption.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/light/CoordinateConsumer.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/light/EmptyLighter.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 26f17f91c..ca349a611 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,7 +16,8 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.render.FastContraptionRenderer; +import com.simibubi.create.foundation.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.RenderedContraption; import com.simibubi.create.foundation.render.FastKineticRenderer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; @@ -182,6 +183,6 @@ public class CreateClient { public static void invalidateRenderers() { CreateClient.bufferCache.invalidate(); CreateClient.kineticRenderer.invalidate(); - FastContraptionRenderer.invalidateAll(); + ContraptionRenderDispatcher.invalidateAll(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index c81b4ef13..2634d9f64 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -2,7 +2,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.FastContraptionRenderer; +import com.simibubi.create.foundation.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.RenderedContraption; +import net.java.games.input.Controller; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; @@ -50,7 +52,7 @@ public abstract class AbstractContraptionEntityRenderer makeLighter() { + return new EmptyLighter(this); + } + } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index c5c5f0ad4..9b00b8f6e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -84,7 +84,7 @@ public class ContraptionRenderer { return new SuperByteBuffer(builder); } - protected static BufferBuilder buildStructure(Contraption c, RenderType layer) { + public static BufferBuilder buildStructure(Contraption c, RenderType layer) { if (renderWorld == null || renderWorld.getWorld() != Minecraft.getInstance().world) renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java index 76db5bd8b..37ea55934 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java @@ -1,5 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import com.simibubi.create.foundation.render.light.ContraptionLighter; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllTags.AllBlockTags; @@ -88,4 +91,9 @@ public class BearingContraption extends Contraption { return axis == facing.getAxis(); } + @OnlyIn(Dist.CLIENT) + @Override + public ContraptionLighter makeLighter() { + return new BearingLighter(this); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java new file mode 100644 index 000000000..de960b40d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java @@ -0,0 +1,19 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.bearing; + +import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.foundation.render.light.GridAlignedBB; +import net.minecraft.util.math.AxisAlignedBB; + +public class BearingLighter extends ContraptionLighter { + + public BearingLighter(BearingContraption contraption) { + super(contraption); + } + + @Override + public GridAlignedBB getContraptionBounds() { + GridAlignedBB localBounds = GridAlignedBB.fromAABB(contraption.bounds); + localBounds.translate(contraption.anchor); + return localBounds; + } +} diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 45858e93d..d0b8fce07 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -26,6 +26,7 @@ import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.RenderWork; +import com.simibubi.create.foundation.render.light.LightVolumeDebugger; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -118,7 +119,6 @@ public class ClientEvents { Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); MatrixStack ms = event.getMatrixStack(); - ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); ms.push(); ms.translate(-cameraPos.getX(), -cameraPos.getY(), -cameraPos.getZ()); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); @@ -126,6 +126,7 @@ public class ClientEvents { CouplingRenderer.renderAll(ms, buffer); CreateClient.schematicHandler.render(ms, buffer); CreateClient.outliner.renderOutlines(ms, buffer); + LightVolumeDebugger.render(ms, buffer); // CollisionDebugger.render(ms, buffer); buffer.draw(); diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java deleted file mode 100644 index ec824b8c0..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/ContraptionLighter.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.simibubi.create.foundation.render; - -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.LightType; -import net.minecraft.world.World; -import org.lwjgl.opengl.*; - -import java.nio.ByteBuffer; - -import static com.simibubi.create.foundation.render.RenderMath.nextPowerOf2; - -public class ContraptionLighter { - - private int minX; - private int minY; - private int minZ; - - private final int sizeX; - private final int sizeY; - private final int sizeZ; - - private SafeDirectBuffer lightVolume; - - private boolean dirty; - - private int texture; - - public ContraptionLighter(Contraption contraption) { - texture = GL11.glGenTextures(); - - AxisAlignedBB bounds = contraption.bounds; - - int minX = (int) Math.floor(bounds.minX) - 1; - int minY = (int) Math.floor(bounds.minY) - 1; - int minZ = (int) Math.floor(bounds.minZ) - 1; - int maxX = (int) Math.ceil(bounds.maxX) + 1; - int maxY = (int) Math.ceil(bounds.maxY) + 1; - int maxZ = (int) Math.ceil(bounds.maxZ) + 1; - - sizeX = nextPowerOf2(maxX - minX); - sizeY = nextPowerOf2(maxY - minY); - sizeZ = nextPowerOf2(maxZ - minZ); - - lightVolume = new SafeDirectBuffer(sizeX * sizeY * sizeZ * 2); - - update(contraption); - } - - public int getSizeX() { - return sizeX; - } - - public int getSizeY() { - return sizeY; - } - - public int getSizeZ() { - return sizeZ; - } - - public int getMinX() { - return minX; - } - - public int getMinY() { - return minY; - } - - public int getMinZ() { - return minZ; - } - - public void delete() { - RenderWork.enqueue(() -> { - GL15.glDeleteTextures(texture); - texture = 0; - try { - lightVolume.close(); - } catch (Exception e) { - e.printStackTrace(); - } - lightVolume = null; - }); - } - - private void setupPosition(Contraption c) { - Vec3d positionVec = c.entity.getPositionVec(); - minX = (int) (Math.floor(positionVec.x) - sizeX / 2); - minY = (int) (Math.floor(positionVec.y) - 1); - minZ = (int) (Math.floor(positionVec.z) - sizeZ / 2); - } - - public void update(Contraption c) { - if (lightVolume == null) return; - - setupPosition(c); - - World world = c.entity.world; - - BlockPos.Mutable pos = new BlockPos.Mutable(); - - for (int x = 0; x < sizeX; x++) { - for (int y = 0; y < sizeY; y++) { - for (int z = 0; z < sizeZ; z++) { - pos.setPos(minX + x, minY + y, minZ + z); - - int blockLight = world.getLightLevel(LightType.BLOCK, pos); - int skyLight = world.getLightLevel(LightType.SKY, pos); - - writeLight(x, y, z, blockLight, skyLight); - } - } - } - - dirty = true; - } - - private void writeLight(int x, int y, int z, int block, int sky) { - int i = (x + sizeX * (y + z * sizeY)) * 2; - - byte b = (byte) ((block & 0xF) << 4); - byte s = (byte) ((sky & 0xF) << 4); - - lightVolume.put(i, b); - lightVolume.put(i + 1, s); - } - - public void use() { - if (texture == 0 || lightVolume == null) return; - - GL12.glBindTexture(GL12.GL_TEXTURE_3D, texture); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL13.GL_CLAMP); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL13.GL_CLAMP); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL13.GL_CLAMP); - if (dirty) { - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightVolume.getBacking()); - dirty = false; - } - } - - public void release() { - GL12.glBindTexture(GL12.GL_TEXTURE_3D, 0); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java new file mode 100644 index 000000000..c06c4ee2d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java @@ -0,0 +1,111 @@ +package com.simibubi.create.foundation.render; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.render.light.LightVolume; +import com.simibubi.create.foundation.render.shader.Shader; +import com.simibubi.create.foundation.render.shader.ShaderCallback; +import com.simibubi.create.foundation.render.shader.ShaderHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.ILightReader; +import net.minecraft.world.LightType; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL40; + +import java.util.ArrayList; +import java.util.HashMap; + +public class ContraptionRenderDispatcher { + public static final HashMap renderers = new HashMap<>(); + + public static void markForRendering(World world, Contraption c, MatrixStack model) { + getRenderer(world, c).setRenderSettings(model.peek().getModel()); + } + + public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) { + for (RenderedContraption renderer : renderers.values()) { + renderer.getLighter().lightVolume.notifyLightUpdate(world, type, pos); + } + } + + private static RenderedContraption getRenderer(World world, Contraption c) { + RenderedContraption renderer; + int entityId = c.entity.getEntityId(); + if (renderers.containsKey(entityId)) { + renderer = renderers.get(entityId); + } else { + renderer = new RenderedContraption(world, c); + renderers.put(entityId, renderer); + } + + return renderer; + } + + public static void renderLayer(RenderType renderType, Matrix4f projectionMat, Matrix4f viewMat) { + removeDeadContraptions(); + + if (renderers.isEmpty()) return; + + FastKineticRenderer.setup(Minecraft.getInstance().gameRenderer); + GL11.glEnable(GL13.GL_TEXTURE_3D); + GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 + + ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projectionMat, viewMat); + + int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); + for (RenderedContraption renderer : renderers.values()) { + renderer.doRenderLayer(renderType, structureShader); + } + + if (renderType == FastKineticRenderer.getKineticRenderLayer()) { + int rotatingShader = ShaderHelper.useShader(Shader.CONTRAPTION_ROTATING, callback); + for (RenderedContraption renderer : renderers.values()) { + renderer.setup(rotatingShader); + renderer.kinetics.renderRotating(); + renderer.teardown(); + } + + int beltShader = ShaderHelper.useShader(Shader.CONTRAPTION_BELT, callback); + for (RenderedContraption renderer : renderers.values()) { + renderer.setup(beltShader); + renderer.kinetics.renderBelts(); + renderer.teardown(); + } + } + + ShaderHelper.releaseShader(); + + GL11.glDisable(GL13.GL_TEXTURE_3D); + FastKineticRenderer.teardown(); + GL13.glActiveTexture(GL40.GL_TEXTURE0); + } + + public static void removeDeadContraptions() { + ArrayList toRemove = new ArrayList<>(); + + for (RenderedContraption renderer : renderers.values()) { + if (renderer.isDead()) { + toRemove.add(renderer.getEntityId()); + renderer.invalidate(); + } + } + + for (Integer id : toRemove) { + renderers.remove(id); + } + } + + public static void invalidateAll() { + for (RenderedContraption renderer : renderers.values()) { + renderer.invalidate(); + } + + renderers.clear(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java deleted file mode 100644 index 05589b6b4..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/FastContraptionRenderer.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.simibubi.create.foundation.render; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; -import com.simibubi.create.foundation.render.instancing.IInstanceRendered; -import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.render.shader.Shader; -import com.simibubi.create.foundation.render.shader.ShaderCallback; -import com.simibubi.create.foundation.render.shader.ShaderHelper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL13; -import org.lwjgl.opengl.GL40; - -import java.nio.FloatBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class FastContraptionRenderer extends ContraptionRenderer { - - private static final HashMap renderers = new HashMap<>(); - - private HashMap renderLayers = new HashMap<>(); - - private ContraptionLighter lighter; - - public final FastKineticRenderer kinetics; - - private Contraption c; - - private Matrix4f model; - - public FastContraptionRenderer(World world, Contraption c) { - this.c = c; - this.lighter = new ContraptionLighter(c); - this.kinetics = new FastKineticRenderer(); - - buildLayers(c); - buildInstancedTiles(c); - } - - private void buildLayers(Contraption c) { - for (ContraptionBuffer buffer : renderLayers.values()) { - buffer.delete(); - } - - renderLayers.clear(); - - List blockLayers = RenderType.getBlockLayers(); - - for (RenderType layer : blockLayers) { - renderLayers.put(layer, buildStructureBuffer(c, layer)); - } - } - - private void buildInstancedTiles(Contraption c) { - List tileEntities = c.renderedTileEntities; - if (!tileEntities.isEmpty()) { - for (TileEntity te : tileEntities) { - if (te instanceof IInstanceRendered) { - TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(te); - - if (renderer instanceof IInstancedTileEntityRenderer) { - kinetics.addInstancedData(this, te, (IInstancedTileEntityRenderer) renderer); - } - } - } - } - - kinetics.markAllDirty(); - } - - public static void tick() { - if (Minecraft.getInstance().isGamePaused()) return; - - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.lighter.update(renderer.c); - } - } - - private void setRenderSettings(Matrix4f model) { - this.model = model; - } - - private void setup(int shader) { - setupShaderUniforms(shader); - lighter.use(); - } - - private void teardown() { - lighter.release(); - } - - private void setupShaderUniforms(int shader) { - FloatBuffer buf = ShaderHelper.VEC3_BUFFER; - - int lightBoxSize = GlStateManager.getUniformLocation(shader, "lightBoxSize"); - buf.put(0, (float) lighter.getSizeX()); - buf.put(1, (float) lighter.getSizeY()); - buf.put(2, (float) lighter.getSizeZ()); - buf.rewind(); - GlStateManager.uniform3(lightBoxSize, buf); - - int lightBoxMin = GlStateManager.getUniformLocation(shader, "lightBoxMin"); - buf.put(0, (float) lighter.getMinX()); - buf.put(1, (float) lighter.getMinY()); - buf.put(2, (float) lighter.getMinZ()); - buf.rewind(); - GlStateManager.uniform3(lightBoxMin, buf); - - int model = GlStateManager.getUniformLocation(shader, "model"); - this.model.write(ShaderHelper.MATRIX_BUFFER); - ShaderHelper.MATRIX_BUFFER.rewind(); - GlStateManager.uniformMatrix4(model, false, ShaderHelper.MATRIX_BUFFER); - } - - private void invalidate() { - for (ContraptionBuffer buffer : renderLayers.values()) { - buffer.delete(); - } - renderLayers.clear(); - - lighter.delete(); - - kinetics.invalidate(); - } - - public static void markForRendering(World world, Contraption c, MatrixStack model) { - getRenderer(world, c).setRenderSettings(model.peek().getModel()); - } - - private static FastContraptionRenderer getRenderer(World world, Contraption c) { - FastContraptionRenderer renderer; - int entityId = c.entity.getEntityId(); - if (renderers.containsKey(entityId)) { - renderer = renderers.get(entityId); - } else { - renderer = new FastContraptionRenderer(world, c); - renderers.put(entityId, renderer); - } - - return renderer; - } - - public static void renderLayer(RenderType renderType, Matrix4f projectionMat, Matrix4f viewMat) { - removeDeadContraptions(); - - if (renderers.isEmpty()) return; - - FastKineticRenderer.setup(Minecraft.getInstance().gameRenderer); - GL11.glEnable(GL13.GL_TEXTURE_3D); - GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 - - ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projectionMat, viewMat); - - int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); - for (FastContraptionRenderer renderer : renderers.values()) { - ContraptionBuffer buffer = renderer.renderLayers.get(renderType); - if (buffer != null) { - renderer.setup(structureShader); - buffer.render(); - renderer.teardown(); - } - } - - if (renderType == FastKineticRenderer.getKineticRenderLayer()) { - int rotatingShader = ShaderHelper.useShader(Shader.CONTRAPTION_ROTATING, callback); - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.setup(rotatingShader); - renderer.kinetics.renderRotating(); - renderer.teardown(); - } - - int beltShader = ShaderHelper.useShader(Shader.CONTRAPTION_BELT, callback); - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.setup(beltShader); - renderer.kinetics.renderBelts(); - renderer.teardown(); - } - } - - ShaderHelper.releaseShader(); - - GL11.glDisable(GL13.GL_TEXTURE_3D); - FastKineticRenderer.teardown(); - GL13.glActiveTexture(GL40.GL_TEXTURE0); - } - - public static void removeDeadContraptions() { - ArrayList toRemove = new ArrayList<>(); - - for (FastContraptionRenderer renderer : renderers.values()) { - if (!renderer.c.entity.isAlive()) { - toRemove.add(renderer.c.entity.getEntityId()); - renderer.invalidate(); - } - } - - for (Integer id : toRemove) { - renderers.remove(id); - } - } - - public static void invalidateAll() { - for (FastContraptionRenderer renderer : renderers.values()) { - renderer.invalidate(); - } - - renderers.clear(); - } - - private static ContraptionBuffer buildStructureBuffer(Contraption c, RenderType layer) { - BufferBuilder builder = buildStructure(c, layer); - return new ContraptionBuffer(builder); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java index c9de28113..437bf1387 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java @@ -70,7 +70,7 @@ public class FastKineticRenderer { renderer.addInstanceData(new InstanceContext.World<>(te)); } - void addInstancedData(FastContraptionRenderer c, T te, IInstancedTileEntityRenderer renderer) { + void addInstancedData(RenderedContraption c, T te, IInstancedTileEntityRenderer renderer) { renderer.addInstanceData(new InstanceContext.Contraption<>(te, c)); } @@ -87,6 +87,7 @@ public class FastKineticRenderer { runOnAll(InstanceBuffer::delete); belts.values().forEach(Cache::invalidateAll); rotating.values().forEach(Cache::invalidateAll); + dirty = true; } private void runOnAll(Consumer> f) { diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index fca350101..6054e1b00 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -19,6 +19,7 @@ import net.minecraft.potion.Effects; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.SectionPos; +import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; import net.minecraft.world.chunk.Chunk; @@ -42,11 +43,11 @@ public class FastRenderDispatcher { CreateClient.kineticRenderer.renderInstancesAsWorld(type, projection, view); } - FastContraptionRenderer.renderLayer(type, projection, view); + ContraptionRenderDispatcher.renderLayer(type, projection, view); } public static void notifyLightUpdate(ClientChunkProvider world, LightType type, SectionPos pos) { - FastContraptionRenderer.tick(); + ContraptionRenderDispatcher.notifyLightUpdate((ILightReader) world.getWorld(), type, pos); Chunk chunk = world.getChunk(pos.getSectionX(), pos.getSectionZ(), false); diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java index 7d143e4f7..3839ff718 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java @@ -5,4 +5,9 @@ public class RenderMath { int h = Integer.highestOneBit(a); return (h == a) ? h : (h << 1); } + + public static boolean isPowerOf2(int n) { + int b = n & (n - 1); + return b == 0 && n != 0; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/RenderedContraption.java new file mode 100644 index 000000000..07f87978c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/RenderedContraption.java @@ -0,0 +1,152 @@ +package com.simibubi.create.foundation.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; +import com.simibubi.create.foundation.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.foundation.render.light.LightVolume; +import com.simibubi.create.foundation.render.shader.ShaderHelper; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.ILightReader; +import net.minecraft.world.LightType; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL20; + +import java.nio.FloatBuffer; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +public class RenderedContraption { + private HashMap renderLayers = new HashMap<>(); + + private final ContraptionLighter lighter; + + public final FastKineticRenderer kinetics; + + private Contraption contraption; + + private Matrix4f model; + + public RenderedContraption(World world, Contraption contraption) { + this.contraption = contraption; + this.lighter = contraption.makeLighter(); + this.kinetics = new FastKineticRenderer(); + + buildLayers(contraption); + buildInstancedTiles(contraption); + } + + public int getEntityId() { + return contraption.entity.getEntityId(); + } + + public boolean isDead() { + return !contraption.entity.isAlive(); + } + + public ContraptionLighter getLighter() { + return lighter; + } + + public void doRenderLayer(RenderType layer, int shader) { + ContraptionBuffer buffer = renderLayers.get(layer); + if (buffer != null) { + setup(shader); + buffer.render(); + teardown(); + } + } + + private void buildLayers(Contraption c) { + for (ContraptionBuffer buffer : renderLayers.values()) { + buffer.delete(); + } + + renderLayers.clear(); + + List blockLayers = RenderType.getBlockLayers(); + + for (RenderType layer : blockLayers) { + renderLayers.put(layer, buildStructureBuffer(c, layer)); + } + } + + private void buildInstancedTiles(Contraption c) { + List tileEntities = c.renderedTileEntities; + if (!tileEntities.isEmpty()) { + for (TileEntity te : tileEntities) { + if (te instanceof IInstanceRendered) { + TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(te); + + if (renderer instanceof IInstancedTileEntityRenderer) { + kinetics.addInstancedData(this, te, (IInstancedTileEntityRenderer) renderer); + } + } + } + } + + kinetics.markAllDirty(); + } + + void setRenderSettings(Matrix4f model) { + this.model = model; + } + + void setup(int shader) { + setupShaderUniforms(shader); + lighter.lightVolume.use(); + } + + void teardown() { + lighter.lightVolume.release(); + } + + void setupShaderUniforms(int shader) { + FloatBuffer buf = ShaderHelper.VEC3_BUFFER; + + int lightBoxSize = GlStateManager.getUniformLocation(shader, "lightBoxSize"); + buf.put(0, (float) lighter.lightVolume.getSizeX()); + buf.put(1, (float) lighter.lightVolume.getSizeY()); + buf.put(2, (float) lighter.lightVolume.getSizeZ()); + buf.rewind(); + GlStateManager.uniform3(lightBoxSize, buf); + + int lightBoxMin = GlStateManager.getUniformLocation(shader, "lightBoxMin"); + buf.put(0, (float) lighter.lightVolume.getMinX()); + buf.put(1, (float) lighter.lightVolume.getMinY()); + buf.put(2, (float) lighter.lightVolume.getMinZ()); + buf.rewind(); + GlStateManager.uniform3(lightBoxMin, buf); + + int model = GlStateManager.getUniformLocation(shader, "model"); + this.model.write(ShaderHelper.MATRIX_BUFFER); + ShaderHelper.MATRIX_BUFFER.rewind(); + GlStateManager.uniformMatrix4(model, false, ShaderHelper.MATRIX_BUFFER); + } + + void invalidate() { + for (ContraptionBuffer buffer : renderLayers.values()) { + buffer.delete(); + } + renderLayers.clear(); + + lighter.lightVolume.delete(); + + kinetics.invalidate(); + } + + private static ContraptionBuffer buildStructureBuffer(Contraption c, RenderType layer) { + BufferBuilder builder = ContraptionRenderer.buildStructure(c, layer); + return new ContraptionBuffer(builder); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java index 4ec2fbd64..354c149b4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.render.FastContraptionRenderer; +import com.simibubi.create.foundation.render.RenderedContraption; import com.simibubi.create.foundation.render.FastKineticRenderer; import net.minecraft.tileentity.TileEntity; @@ -19,9 +19,9 @@ public abstract class InstanceContext { public static class Contraption extends InstanceContext { - public final FastContraptionRenderer c; + public final RenderedContraption c; - public Contraption(T te, FastContraptionRenderer c) { + public Contraption(T te, RenderedContraption c) { super(te); this.c = c; } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java new file mode 100644 index 000000000..648055de4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java @@ -0,0 +1,27 @@ +package com.simibubi.create.foundation.render.light; + +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.ILightReader; +import net.minecraft.world.LightType; + +import static com.simibubi.create.foundation.render.RenderMath.nextPowerOf2; + +public abstract class ContraptionLighter { + protected final C contraption; + public final LightVolume lightVolume; + + protected ContraptionLighter(C contraption) { + this.contraption = contraption; + + GridAlignedBB bounds = getContraptionBounds(); + bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts + bounds.nextPowerOf2Centered(); + + lightVolume = new LightVolume(bounds); + + lightVolume.initialize(contraption.entity.world); + } + + public abstract GridAlignedBB getContraptionBounds(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/light/CoordinateConsumer.java b/src/main/java/com/simibubi/create/foundation/render/light/CoordinateConsumer.java new file mode 100644 index 000000000..ff9ee492b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/light/CoordinateConsumer.java @@ -0,0 +1,6 @@ +package com.simibubi.create.foundation.render.light; + +@FunctionalInterface +public interface CoordinateConsumer { + void consume(int x, int y, int z); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/light/EmptyLighter.java b/src/main/java/com/simibubi/create/foundation/render/light/EmptyLighter.java new file mode 100644 index 000000000..e942664c7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/light/EmptyLighter.java @@ -0,0 +1,15 @@ +package com.simibubi.create.foundation.render.light; + +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; + +// so other contraptions don't crash before they have a lighter +public class EmptyLighter extends ContraptionLighter { + public EmptyLighter(Contraption contraption) { + super(contraption); + } + + @Override + public GridAlignedBB getContraptionBounds() { + return new GridAlignedBB(0, 0, 0, 1, 1, 1); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java new file mode 100644 index 000000000..03eb94efd --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java @@ -0,0 +1,203 @@ +package com.simibubi.create.foundation.render.light; + +import com.simibubi.create.foundation.render.RenderMath; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.SectionPos; +import net.minecraft.util.math.Vec3i; +import net.minecraft.world.LightType; + +import java.util.function.IntFunction; + +import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2; + +public class GridAlignedBB { + public int minX; + public int minY; + public int minZ; + public int maxX; + public int maxY; + public int maxZ; + + public GridAlignedBB(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + this.minX = minX; + this.minY = minY; + this.minZ = minZ; + this.maxX = maxX; + this.maxY = maxY; + this.maxZ = maxZ; + } + + public static GridAlignedBB copy(GridAlignedBB bb) { + return new GridAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); + } + + public static GridAlignedBB fromAABB(AxisAlignedBB aabb) { + int minX = (int) Math.floor(aabb.minX); + int minY = (int) Math.floor(aabb.minY); + int minZ = (int) Math.floor(aabb.minZ); + int maxX = (int) Math.ceil(aabb.maxX); + int maxY = (int) Math.ceil(aabb.maxY); + int maxZ = (int) Math.ceil(aabb.maxZ); + return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); + } + + public static GridAlignedBB fromSection(SectionPos pos) { + return new GridAlignedBB(pos.getWorldStartX(), + pos.getWorldStartY(), + pos.getWorldStartZ(), + pos.getWorldEndX() + 1, + pos.getWorldEndY() + 1, + pos.getWorldEndZ() + 1); + } + + public static AxisAlignedBB toAABB(GridAlignedBB bb) { + return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); + } + + public int sizeX() { + return maxX - minX; + } + + public int sizeY() { + return maxY - minY; + } + + public int sizeZ() { + return maxZ - minZ; + } + + public int volume() { + return sizeX() * sizeY() * sizeZ(); + } + + public boolean empty() { + // if any dimension has side length 0 this box contains no volume + return minX == maxX || + minY == maxY || + minZ == maxZ; + } + + public void translate(Vec3i by) { + this.minX += by.getX(); + this.minY += by.getY(); + this.minZ += by.getZ(); + this.maxX += by.getX(); + this.maxY += by.getY(); + this.maxZ += by.getZ(); + } + + /** + * Grow this bounding box to have power of 2 side length, scaling from the center. + */ + public void nextPowerOf2Centered() { + int sizeX = sizeX(); + int sizeY = sizeY(); + int sizeZ = sizeZ(); + + int newSizeX = RenderMath.nextPowerOf2(sizeX); + int newSizeY = RenderMath.nextPowerOf2(sizeY); + int newSizeZ = RenderMath.nextPowerOf2(sizeZ); + + int diffX = newSizeX - sizeX; + int diffY = newSizeY - sizeY; + int diffZ = newSizeZ - sizeZ; + + this.minX -= diffX / 2; // floor division for the minimums + this.minY -= diffY / 2; + this.minZ -= diffZ / 2; + this.maxX += (diffX + 1) / 2; // ceiling divison for the maximums + this.maxY += (diffY + 1) / 2; + this.maxZ += (diffZ + 1) / 2; + } + + /** + * Grow this bounding box to have power of 2 side lengths, scaling from the minimum coords. + */ + public void nextPowerOf2() { + int sizeX = RenderMath.nextPowerOf2(sizeX()); + int sizeY = RenderMath.nextPowerOf2(sizeY()); + int sizeZ = RenderMath.nextPowerOf2(sizeZ()); + + this.maxX = this.minX + sizeX; + this.maxY = this.minY + sizeY; + this.maxZ = this.minZ + sizeZ; + } + + public boolean hasPowerOf2Sides() { + // this is only true if all individual side lengths are powers of 2 + return isPowerOf2(volume()); + } + + public void grow(int s) { + this.grow(s, s, s); + } + + public void grow(int x, int y, int z) { + this.minX -= x; + this.minY -= y; + this.minZ -= z; + this.maxX += x; + this.maxY += y; + this.maxZ += z; + } + + public GridAlignedBB intersect(GridAlignedBB other) { + int minX = Math.max(this.minX, other.minX); + int minY = Math.max(this.minY, other.minY); + int minZ = Math.max(this.minZ, other.minZ); + int maxX = Math.min(this.maxX, other.maxX); + int maxY = Math.min(this.maxY, other.maxY); + int maxZ = Math.min(this.maxZ, other.maxZ); + return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); + } + + public void intersectAssign(GridAlignedBB other) { + this.minX = Math.max(this.minX, other.minX); + this.minY = Math.max(this.minY, other.minY); + this.minZ = Math.max(this.minZ, other.minZ); + this.maxX = Math.min(this.maxX, other.maxX); + this.maxY = Math.min(this.maxY, other.maxY); + this.maxZ = Math.min(this.maxZ, other.maxZ); + } + + public GridAlignedBB union(GridAlignedBB other) { + int minX = Math.min(this.minX, other.minX); + int minY = Math.min(this.minY, other.minY); + int minZ = Math.min(this.minZ, other.minZ); + int maxX = Math.max(this.maxX, other.maxX); + int maxY = Math.max(this.maxY, other.maxY); + int maxZ = Math.max(this.maxZ, other.maxZ); + return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); + } + + public void unionAssign(GridAlignedBB other) { + this.minX = Math.min(this.minX, other.minX); + this.minY = Math.min(this.minY, other.minY); + this.minZ = Math.min(this.minZ, other.minZ); + this.maxX = Math.max(this.maxX, other.maxX); + this.maxY = Math.max(this.maxY, other.maxY); + this.maxZ = Math.max(this.maxZ, other.maxZ); + } + + public boolean intersects(GridAlignedBB other) { + return this.intersects(other.minX, other.minY, other.minZ, other.maxX, other.maxY, other.maxZ); + } + + public boolean intersects(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + return this.minX < maxX && this.maxX > minX && this.minY < maxY && this.maxY > minY && this.minZ < maxZ && this.maxZ > minZ; + } + + public void forEachContained(CoordinateConsumer func) { + if (empty()) return; + + for (int x = minX; x < maxX; x++) { + for (int y = Math.max(minY, 0); y < Math.min(maxY, 255); y++) { // clamp to world height limits + for (int z = minZ; z < maxZ; z++) { + func.consume(x, y, z); + } + } + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java new file mode 100644 index 000000000..7ab56ccd8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -0,0 +1,204 @@ +package com.simibubi.create.foundation.render.light; + +import com.simibubi.create.foundation.render.RenderWork; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.ILightReader; +import net.minecraft.world.LightType; +import org.lwjgl.opengl.*; +import org.lwjgl.system.MemoryUtil; + +import java.nio.ByteBuffer; + +public class LightVolume { + + private final GridAlignedBB volume; + private ByteBuffer lightData; + + private boolean bufferDirty; + + private int glTexture; + + public LightVolume(GridAlignedBB volume) { + // the gpu requires that all textures have power of 2 side lengths + if (!volume.hasPowerOf2Sides()) + throw new IllegalArgumentException("LightVolume must have power of 2 side lengths"); + + this.volume = volume; + + this.glTexture = GL11.glGenTextures(); + this.lightData = MemoryUtil.memAlloc(this.volume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte + } + + public GridAlignedBB getBox() { + return GridAlignedBB.copy(volume); + } + + public int getMinX() { + return volume.minX; + } + + public int getMinY() { + return volume.minY; + } + + public int getMinZ() { + return volume.minZ; + } + + public int getMaxX() { + return volume.maxX; + } + + public int getMaxY() { + return volume.maxY; + } + + public int getMaxZ() { + return volume.maxZ; + } + + public int getSizeX() { + return volume.sizeX(); + } + + public int getSizeY() { + return volume.sizeY(); + } + + public int getSizeZ() { + return volume.sizeZ(); + } + + + public void notifyLightUpdate(ILightReader world, LightType type, SectionPos location) { + GridAlignedBB changedVolume = GridAlignedBB.fromSection(location); + changedVolume.intersectAssign(volume); // compute the region contained by us that has dirty lighting data. + + if (!changedVolume.empty()) { + if (type == LightType.BLOCK) copyBlock(world, changedVolume); + else if (type == LightType.SKY) copySky(world, changedVolume); + } + } + + /** + * Completely (re)populate this volume with block and sky lighting data. + * This is expensive and should be avoided. + */ + public void initialize(ILightReader world) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + + int shiftX = volume.minX; + int shiftY = volume.minY; + int shiftZ = volume.minZ; + + volume.forEachContained((x, y, z) -> { + pos.setPos(x, y, z); + + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + writeLight(x - shiftX, y - shiftY, z - shiftZ, blockLight, skyLight); + }); + + bufferDirty = true; + } + + /** + * Copy block light from the world into this volume. + * @param worldVolume the region in the world to copy data from. + */ + public void copyBlock(ILightReader world, GridAlignedBB worldVolume) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + + int xShift = volume.minX; + int yShift = volume.minY; + int zShift = volume.minZ; + + worldVolume.forEachContained((x, y, z) -> { + pos.setPos(x, y, z); + + int light = world.getLightLevel(LightType.BLOCK, pos); + + writeBlock(x - xShift, y - yShift, z - zShift, light); + }); + + bufferDirty = true; + } + + /** + * Copy sky light from the world into this volume. + * @param worldVolume the region in the world to copy data from. + */ + public void copySky(ILightReader world, GridAlignedBB worldVolume) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + + int xShift = volume.minX; + int yShift = volume.minY; + int zShift = volume.minZ; + + worldVolume.forEachContained((x, y, z) -> { + pos.setPos(x, y, z); + + int light = world.getLightLevel(LightType.SKY, pos); + + writeSky(x - xShift, y - yShift, z - zShift, light); + }); + + bufferDirty = true; + } + + public void use() { + // just in case something goes wrong or we accidentally call this before this volume is properly disposed of. + if (glTexture == 0 || lightData == null) return; + + GL12.glBindTexture(GL12.GL_TEXTURE_3D, glTexture); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL20.GL_MIRRORED_REPEAT); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL20.GL_MIRRORED_REPEAT); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); + if (bufferDirty) { + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, volume.sizeX(), volume.sizeY(), volume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + bufferDirty = false; + } + } + + public void release() { + GL12.glBindTexture(GL12.GL_TEXTURE_3D, 0); + } + + public void delete() { + RenderWork.enqueue(() -> { + GL15.glDeleteTextures(glTexture); + glTexture = 0; + MemoryUtil.memFree(lightData); + lightData = null; + }); + } + + private void writeLight(int x, int y, int z, int block, int sky) { + byte b = (byte) ((block & 0xF) << 4); + byte s = (byte) ((sky & 0xF) << 4); + + int i = index(x, y, z); + lightData.put(i, b); + lightData.put(i + 1, s); + } + + private void writeBlock(int x, int y, int z, int block) { + byte b = (byte) ((block & 0xF) << 4); + + lightData.put(index(x, y, z), b); + } + + private void writeSky(int x, int y, int z, int sky) { + byte b = (byte) ((sky & 0xF) << 4); + + lightData.put(index(x, y, z) + 1, b); + } + + private int index(int x, int y, int z) { + return (x + volume.sizeX() * (y + z * volume.sizeY())) * 2; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java new file mode 100644 index 000000000..11991177c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.render.light; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.RenderedContraption; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.outliner.AABBOutline; +import com.simibubi.create.foundation.utility.outliner.Outline; + +public class LightVolumeDebugger { + public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { + ContraptionRenderDispatcher.renderers.values() + .stream() + .map(r -> r.getLighter().lightVolume.getBox()) + .map(volume -> new AABBOutline(GridAlignedBB.toAABB(volume))) + .forEach(outline -> outline.render(ms, buffer)); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java index 4b6de432a..63e79bcf4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java @@ -13,6 +13,8 @@ import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; import net.minecraft.resources.IResourceManagerReloadListener; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.resource.ISelectiveResourceReloadListener; +import net.minecraftforge.resource.VanillaResourceType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.system.MemoryUtil; @@ -41,11 +43,13 @@ public class ShaderHelper { if (Minecraft.getInstance() != null && Minecraft.getInstance().getResourceManager() instanceof IReloadableResourceManager) { ((IReloadableResourceManager) Minecraft.getInstance().getResourceManager()).addReloadListener( - (IResourceManagerReloadListener) manager -> { - PROGRAMS.values().forEach(ShaderLinkHelper::deleteShader); - PROGRAMS.clear(); - for (Shader shader : Shader.values()) { - createProgram(manager, shader); + (ISelectiveResourceReloadListener) (manager, predicate) -> { + if (predicate.test(VanillaResourceType.SHADERS)) { + PROGRAMS.values().forEach(ShaderLinkHelper::deleteShader); + PROGRAMS.clear(); + for (Shader shader : Shader.values()) { + createProgram(manager, shader); + } } }); } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 3b69e270c..a77dc0b61 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -14,7 +14,7 @@ Technology that empowers the player.''' [[dependencies.create]] modId="forge" mandatory=true - versionRange="[31.2.0,)" + versionRange="[31.2.44,)" ordering="NONE" side="BOTH" diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 125835300..e1d1a1168 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -55,13 +55,17 @@ void main() { float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; - Diffuse = diffuse(normalize((rotation * vec4(aNormal, 0.)).xyz)); + vec3 norm = (rotation * vec4(aNormal, 0.)).xyz; + + Diffuse = diffuse(norm); Light = light; TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); gl_Position = projection * view * renderPos; if (debug == 1) { Color = vec4(networkTint, 1); + } else if (debug == 2) { + Color = vec4(norm, 1); } else { Color = vec4(1); } From 398a8487915b78a1d41c17906b084eef386ca6e8 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 18 Jan 2021 00:31:33 -0800 Subject: [PATCH 038/147] pistons are lit and bearings are better lit in the corners stop sampling light in places that don't matter --- .../structureMovement/Contraption.java | 2 +- .../bearing/BearingLighter.java | 1 + .../bearing/StabilizedContraption.java | 5 +- .../piston/PistonContraption.java | 8 + .../piston/PistonLighter.java | 35 ++++ .../simibubi/create/events/ClientEvents.java | 2 +- .../create/foundation/render/RenderMath.java | 6 + .../foundation/render/SafeDirectBuffer.java | 165 ------------------ .../render/instancing/InstanceBuffer.java | 1 - .../render/light/ContraptionLighter.java | 3 +- .../render/light/GridAlignedBB.java | 51 ++++-- .../foundation/render/light/LightVolume.java | 68 +++++--- .../render/light/LightVolumeDebugger.java | 24 ++- 13 files changed, 150 insertions(+), 221 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/SafeDirectBuffer.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 66182fade..6453be2c4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -190,7 +190,7 @@ public abstract class Contraption { // Create subcontraptions for (BlockFace blockFace : pendingSubContraptions) { Direction face = blockFace.getFace(); - StabilizedContraption subContraption = new StabilizedContraption(face); + StabilizedContraption subContraption = new StabilizedContraption(this, face); World world = entity.world; BlockPos pos = blockFace.getPos(); if (!subContraption.assemble(world, pos)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java index de960b40d..f18aa3349 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java @@ -13,6 +13,7 @@ public class BearingLighter extends ContraptionLighter { @Override public GridAlignedBB getContraptionBounds() { GridAlignedBB localBounds = GridAlignedBB.fromAABB(contraption.bounds); + localBounds.rotate45(contraption.getFacing().getAxis()); localBounds.translate(contraption.anchor); return localBounds; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java index f54d09beb..cb5396eca 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java @@ -11,11 +11,14 @@ import net.minecraft.world.World; public class StabilizedContraption extends Contraption { + public Contraption parent; + private Direction facing; public StabilizedContraption() {} - public StabilizedContraption(Direction facing) { + public StabilizedContraption(Contraption parent, Direction facing) { + this.parent = parent; this.facing = facing; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java index 2895fb9bd..7ed8ab535 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java @@ -5,6 +5,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Blo import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.render.light.ContraptionLighter; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.CarpetBlock; @@ -18,6 +19,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; @@ -226,4 +229,9 @@ public class PistonContraption extends TranslatingContraption { return tag; } + @OnlyIn(Dist.CLIENT) + @Override + public ContraptionLighter makeLighter() { + return new PistonLighter(this); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java new file mode 100644 index 000000000..28d86c6dc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java @@ -0,0 +1,35 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.piston; + +import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.foundation.render.light.GridAlignedBB; +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3i; + +public class PistonLighter extends ContraptionLighter { + public PistonLighter(PistonContraption contraption) { + super(contraption); + } + + @Override + public GridAlignedBB getContraptionBounds() { + GridAlignedBB bounds = GridAlignedBB.fromAABB(contraption.bounds); + bounds.translate(contraption.anchor); + + int length = contraption.extensionLength; + Vec3i direction = contraption.orientation.getDirectionVec(); + + int shift = length / 2; + int shiftX = direction.getX() * shift; + int shiftY = direction.getY() * shift; + int shiftZ = direction.getZ() * shift; + bounds.translate(shiftX, shiftY, shiftZ); + + int grow = (length + 1) / 2; + int extendX = Math.abs(direction.getX() * grow); + int extendY = Math.abs(direction.getY() * grow); + int extendZ = Math.abs(direction.getZ() * grow); + bounds.grow(extendX, extendY, extendZ); + + return bounds; + } +} diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index d0b8fce07..dd58db9cd 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -126,7 +126,7 @@ public class ClientEvents { CouplingRenderer.renderAll(ms, buffer); CreateClient.schematicHandler.render(ms, buffer); CreateClient.outliner.renderOutlines(ms, buffer); - LightVolumeDebugger.render(ms, buffer); +// LightVolumeDebugger.render(ms, buffer); // CollisionDebugger.render(ms, buffer); buffer.draw(); diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java index 3839ff718..5ca9e3d66 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java @@ -1,6 +1,12 @@ package com.simibubi.create.foundation.render; public class RenderMath { + public static final float SQRT2 = 1.41421356237f; + + public static int timesSqrt2(int i) { + return (int) Math.floor((float) i * SQRT2 / 4f); + } + public static int nextPowerOf2(int a) { int h = Integer.highestOneBit(a); return (h == a) ? h : (h << 1); diff --git a/src/main/java/com/simibubi/create/foundation/render/SafeDirectBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SafeDirectBuffer.java deleted file mode 100644 index cb6a47172..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/SafeDirectBuffer.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.simibubi.create.foundation.render; - -import net.minecraft.client.renderer.GLAllocation; -import sun.nio.ch.DirectBuffer; - -import java.nio.*; - -public class SafeDirectBuffer implements AutoCloseable { - - private ByteBuffer wrapped; - - public SafeDirectBuffer(int capacity) { - this.wrapped = GLAllocation.createDirectByteBuffer(capacity); - } - - public void close() throws Exception { - if (wrapped instanceof DirectBuffer) { - ((DirectBuffer) wrapped).cleaner().clean(); - } - } - - /** - * Only use this function to pass information to OpenGL. - */ - @Deprecated - public ByteBuffer getBacking() { - return wrapped; - } - - public void order(ByteOrder bo) { - wrapped.order(bo); - } - - public void limit(int limit) { - wrapped.limit(limit); - } - - public void rewind() { - wrapped.rewind(); - } - - public byte get() { - return wrapped.get(); - } - - public ByteBuffer put(byte b) { - return wrapped.put(b); - } - - public byte get(int index) { - return wrapped.get(); - } - - public ByteBuffer put(int index, byte b) { - return wrapped.put(index, b); - } - - public ByteBuffer compact() { - return wrapped.compact(); - } - - public boolean isReadOnly() { - return wrapped.isReadOnly(); - } - - public boolean isDirect() { - return wrapped.isDirect(); - } - - public char getChar() { - return wrapped.getChar(); - } - - public ByteBuffer putChar(char value) { - return wrapped.putChar(value); - } - - public char getChar(int index) { - return wrapped.getChar(index); - } - - public ByteBuffer putChar(int index, char value) { - return wrapped.putChar(index, value); - } - - public short getShort() { - return wrapped.getShort(); - } - - public ByteBuffer putShort(short value) { - return wrapped.putShort(value); - } - - public short getShort(int index) { - return wrapped.getShort(index); - } - - public ByteBuffer putShort(int index, short value) { - return wrapped.putShort(index, value); - } - - public int getInt() { - return wrapped.getInt(); - } - - public ByteBuffer putInt(int value) { - return wrapped.putInt(value); - } - - public int getInt(int index) { - return wrapped.getInt(index); - } - - public ByteBuffer putInt(int index, int value) { - return wrapped.putInt(index, value); - } - - public long getLong() { - return wrapped.getLong(); - } - - public ByteBuffer putLong(long value) { - return wrapped.putLong(value); - } - - public long getLong(int index) { - return wrapped.getLong(index); - } - - public ByteBuffer putLong(int index, long value) { - return wrapped.putLong(index, value); - } - - public float getFloat() { - return wrapped.getFloat(); - } - - public ByteBuffer putFloat(float value) { - return wrapped.putFloat(value); - } - - public float getFloat(int index) { - return wrapped.getFloat(index); - } - - public ByteBuffer putFloat(int index, float value) { - return wrapped.putFloat(index, value); - } - - public double getDouble() { - return wrapped.getDouble(); - } - - public ByteBuffer putDouble(double value) { - return wrapped.putDouble(value); - } - - public double getDouble(int index) { - return wrapped.getDouble(index); - } - - public ByteBuffer putDouble(int index, double value) { - return wrapped.putDouble(index, value); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java index 371d7e5ca..0f88d52a3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java @@ -4,7 +4,6 @@ package com.simibubi.create.foundation.render.instancing; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.foundation.render.RenderMath; import com.simibubi.create.foundation.render.RenderWork; -import com.simibubi.create.foundation.render.SafeDirectBuffer; import com.simibubi.create.foundation.render.TemplateBuffer; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.*; diff --git a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java index 648055de4..44786f256 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java @@ -16,9 +16,10 @@ public abstract class ContraptionLighter { GridAlignedBB bounds = getContraptionBounds(); bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts + GridAlignedBB importantArea = GridAlignedBB.copy(bounds); bounds.nextPowerOf2Centered(); - lightVolume = new LightVolume(bounds); + lightVolume = new LightVolume(bounds, importantArea); lightVolume.initialize(contraption.entity.world); } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java index 03eb94efd..368b6883b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.light; import com.simibubi.create.foundation.render.RenderMath; +import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; @@ -79,12 +80,26 @@ public class GridAlignedBB { } public void translate(Vec3i by) { - this.minX += by.getX(); - this.minY += by.getY(); - this.minZ += by.getZ(); - this.maxX += by.getX(); - this.maxY += by.getY(); - this.maxZ += by.getZ(); + translate(by.getX(), by.getY(), by.getZ()); + } + + public void translate(int x, int y, int z) { + minX += x; + maxX += x; + minY += y; + maxY += y; + minZ += z; + maxZ += z; + } + + public void rotate45(Direction.Axis axis) { + if (axis == Direction.Axis.X) { + this.grow(0, RenderMath.timesSqrt2(sizeY()), RenderMath.timesSqrt2(sizeZ())); + } else if (axis == Direction.Axis.Y) { + this.grow(RenderMath.timesSqrt2(sizeX()), 0, RenderMath.timesSqrt2(sizeZ())); + } else if (axis == Direction.Axis.Z) { + this.grow(RenderMath.timesSqrt2(sizeX()), RenderMath.timesSqrt2(sizeY()), 0); + } } /** @@ -103,12 +118,12 @@ public class GridAlignedBB { int diffY = newSizeY - sizeY; int diffZ = newSizeZ - sizeZ; - this.minX -= diffX / 2; // floor division for the minimums - this.minY -= diffY / 2; - this.minZ -= diffZ / 2; - this.maxX += (diffX + 1) / 2; // ceiling divison for the maximums - this.maxY += (diffY + 1) / 2; - this.maxZ += (diffZ + 1) / 2; + minX -= diffX / 2; // floor division for the minimums + minY -= diffY / 2; + minZ -= diffZ / 2; + maxX += (diffX + 1) / 2; // ceiling divison for the maximums + maxY += (diffY + 1) / 2; + maxZ += (diffZ + 1) / 2; } /** @@ -134,12 +149,12 @@ public class GridAlignedBB { } public void grow(int x, int y, int z) { - this.minX -= x; - this.minY -= y; - this.minZ -= z; - this.maxX += x; - this.maxY += y; - this.maxZ += z; + minX -= x; + minY -= y; + minZ -= z; + maxX += x; + maxY += y; + maxZ += z; } public GridAlignedBB intersect(GridAlignedBB other) { diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index 7ab56ccd8..fd2a59fce 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -10,70 +10,80 @@ import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; +// TODO: Don't immediately destroy light volumes. +// There's a high chance that a contraption will stop and soon after start again. +// By caching lightvolumes based on their volumes/locations, we can save having +// to reread all the lighting data in those cases. public class LightVolume { - private final GridAlignedBB volume; + private final GridAlignedBB sampleVolume; + private final GridAlignedBB textureVolume; private ByteBuffer lightData; private boolean bufferDirty; private int glTexture; - public LightVolume(GridAlignedBB volume) { + public LightVolume(GridAlignedBB textureVolume, GridAlignedBB sampleVolume) { // the gpu requires that all textures have power of 2 side lengths - if (!volume.hasPowerOf2Sides()) + if (!textureVolume.hasPowerOf2Sides()) throw new IllegalArgumentException("LightVolume must have power of 2 side lengths"); - this.volume = volume; + this.textureVolume = textureVolume; + this.sampleVolume = sampleVolume; this.glTexture = GL11.glGenTextures(); - this.lightData = MemoryUtil.memAlloc(this.volume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte + this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte } - public GridAlignedBB getBox() { - return GridAlignedBB.copy(volume); + public GridAlignedBB getTextureVolume() { + return GridAlignedBB.copy(textureVolume); + } + + public GridAlignedBB getSampleVolume() { + return GridAlignedBB.copy(sampleVolume); } public int getMinX() { - return volume.minX; + return textureVolume.minX; } public int getMinY() { - return volume.minY; + return textureVolume.minY; } public int getMinZ() { - return volume.minZ; + return textureVolume.minZ; } public int getMaxX() { - return volume.maxX; + return textureVolume.maxX; } public int getMaxY() { - return volume.maxY; + return textureVolume.maxY; } public int getMaxZ() { - return volume.maxZ; + return textureVolume.maxZ; } public int getSizeX() { - return volume.sizeX(); + return textureVolume.sizeX(); } public int getSizeY() { - return volume.sizeY(); + return textureVolume.sizeY(); } public int getSizeZ() { - return volume.sizeZ(); + return textureVolume.sizeZ(); } public void notifyLightUpdate(ILightReader world, LightType type, SectionPos location) { GridAlignedBB changedVolume = GridAlignedBB.fromSection(location); - changedVolume.intersectAssign(volume); // compute the region contained by us that has dirty lighting data. + changedVolume.intersectAssign(sampleVolume); // compute the region contained by us that has dirty lighting data. if (!changedVolume.empty()) { if (type == LightType.BLOCK) copyBlock(world, changedVolume); @@ -88,11 +98,11 @@ public class LightVolume { public void initialize(ILightReader world) { BlockPos.Mutable pos = new BlockPos.Mutable(); - int shiftX = volume.minX; - int shiftY = volume.minY; - int shiftZ = volume.minZ; + int shiftX = textureVolume.minX; + int shiftY = textureVolume.minY; + int shiftZ = textureVolume.minZ; - volume.forEachContained((x, y, z) -> { + textureVolume.forEachContained((x, y, z) -> { pos.setPos(x, y, z); int blockLight = world.getLightLevel(LightType.BLOCK, pos); @@ -111,9 +121,9 @@ public class LightVolume { public void copyBlock(ILightReader world, GridAlignedBB worldVolume) { BlockPos.Mutable pos = new BlockPos.Mutable(); - int xShift = volume.minX; - int yShift = volume.minY; - int zShift = volume.minZ; + int xShift = textureVolume.minX; + int yShift = textureVolume.minY; + int zShift = textureVolume.minZ; worldVolume.forEachContained((x, y, z) -> { pos.setPos(x, y, z); @@ -133,9 +143,9 @@ public class LightVolume { public void copySky(ILightReader world, GridAlignedBB worldVolume) { BlockPos.Mutable pos = new BlockPos.Mutable(); - int xShift = volume.minX; - int yShift = volume.minY; - int zShift = volume.minZ; + int xShift = textureVolume.minX; + int yShift = textureVolume.minY; + int zShift = textureVolume.minZ; worldVolume.forEachContained((x, y, z) -> { pos.setPos(x, y, z); @@ -159,7 +169,7 @@ public class LightVolume { GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL20.GL_MIRRORED_REPEAT); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); if (bufferDirty) { - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, volume.sizeX(), volume.sizeY(), volume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, textureVolume.sizeX(), textureVolume.sizeY(), textureVolume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); bufferDirty = false; } } @@ -199,6 +209,6 @@ public class LightVolume { } private int index(int x, int y, int z) { - return (x + volume.sizeX() * (y + z * volume.sizeY())) * 2; + return (x + textureVolume.sizeX() * (y + z * textureVolume.sizeY())) * 2; } } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java index 11991177c..287532a40 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java @@ -2,17 +2,33 @@ package com.simibubi.create.foundation.render.light; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.RenderedContraption; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.outliner.AABBOutline; -import com.simibubi.create.foundation.utility.outliner.Outline; + +import java.util.ArrayList; public class LightVolumeDebugger { public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { ContraptionRenderDispatcher.renderers.values() .stream() - .map(r -> r.getLighter().lightVolume.getBox()) - .map(volume -> new AABBOutline(GridAlignedBB.toAABB(volume))) + .flatMap(r -> { + GridAlignedBB texture = r.getLighter().lightVolume.getTextureVolume(); + GridAlignedBB sample = r.getLighter().lightVolume.getSampleVolume(); + + ArrayList> pairs = new ArrayList<>(2); + + pairs.add(Pair.of(texture, 0xFFFFFF)); + pairs.add(Pair.of(sample, 0xFFFF00)); + + return pairs.stream(); + }) + .map(pair -> { + AABBOutline outline = new AABBOutline(GridAlignedBB.toAABB(pair.getFirst())); + + outline.getParams().colored(pair.getSecond()); + return outline; + }) .forEach(outline -> outline.render(ms, buffer)); } } From 9df796029f75e8ab7ba4308335c21f8cc1ef3486 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 18 Jan 2021 00:35:16 -0800 Subject: [PATCH 039/147] rename the confounding function --- .../simibubi/create/foundation/render/RenderMath.java | 2 +- .../create/foundation/render/light/GridAlignedBB.java | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java index 5ca9e3d66..b9cb6c5be 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.render; public class RenderMath { public static final float SQRT2 = 1.41421356237f; - public static int timesSqrt2(int i) { + public static int rotateSideLength(int i) { return (int) Math.floor((float) i * SQRT2 / 4f); } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java index 368b6883b..bb86dd135 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java @@ -3,14 +3,11 @@ package com.simibubi.create.foundation.render.light; import com.simibubi.create.foundation.render.RenderMath; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; import net.minecraft.util.math.Vec3i; -import net.minecraft.world.LightType; - -import java.util.function.IntFunction; import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2; +import static com.simibubi.create.foundation.render.RenderMath.rotateSideLength; public class GridAlignedBB { public int minX; @@ -94,11 +91,11 @@ public class GridAlignedBB { public void rotate45(Direction.Axis axis) { if (axis == Direction.Axis.X) { - this.grow(0, RenderMath.timesSqrt2(sizeY()), RenderMath.timesSqrt2(sizeZ())); + this.grow(0, rotateSideLength(sizeY()), rotateSideLength(sizeZ())); } else if (axis == Direction.Axis.Y) { - this.grow(RenderMath.timesSqrt2(sizeX()), 0, RenderMath.timesSqrt2(sizeZ())); + this.grow(rotateSideLength(sizeX()), 0, rotateSideLength(sizeZ())); } else if (axis == Direction.Axis.Z) { - this.grow(RenderMath.timesSqrt2(sizeX()), RenderMath.timesSqrt2(sizeY()), 0); + this.grow(rotateSideLength(sizeX()), rotateSideLength(sizeY()), 0); } } From 33e66c6e89aea36b0adb3f44e6159308b0402a6f Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 20 Jan 2021 00:47:40 -0800 Subject: [PATCH 040/147] pulleys are lit stabilized things are sort of lit but man is it jank light volumes have a more sane constructor try to mess around with contraption layering but it's still jank --- .../structureMovement/Contraption.java | 2 +- .../bearing/BearingLighter.java | 1 - .../bearing/StabilizedContraption.java | 21 +++++-- .../bearing/StabilizedLighter.java | 53 ++++++++++++++++ .../pulley/PulleyContraption.java | 5 ++ .../pulley/PulleyLighter.java | 32 ++++++++++ .../foundation/mixin/RenderInLayerMixin.java | 2 +- .../render/ContraptionRenderDispatcher.java | 14 ++++- .../render/FastRenderDispatcher.java | 8 +++ .../render/light/ContraptionLighter.java | 8 +-- .../render/light/GridAlignedBB.java | 60 +++++++++++++++++++ .../foundation/render/light/LightVolume.java | 11 ++-- 12 files changed, 196 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 6453be2c4..83059c93e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -190,7 +190,7 @@ public abstract class Contraption { // Create subcontraptions for (BlockFace blockFace : pendingSubContraptions) { Direction face = blockFace.getFace(); - StabilizedContraption subContraption = new StabilizedContraption(this, face); + StabilizedContraption subContraption = new StabilizedContraption(entity.getUniqueID(), face); World world = entity.world; BlockPos pos = blockFace.getPos(); if (!subContraption.assemble(world, pos)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java index f18aa3349..d49efaa43 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.simibubi.create.foundation.render.light.ContraptionLighter; import com.simibubi.create.foundation.render.light.GridAlignedBB; -import net.minecraft.util.math.AxisAlignedBB; public class BearingLighter extends ContraptionLighter { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java index cb5396eca..92b4e8298 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java @@ -1,24 +1,31 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.foundation.utility.NBTHelper; +import net.minecraft.entity.Entity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import java.util.UUID; + public class StabilizedContraption extends Contraption { - public Contraption parent; + public UUID parentID; private Direction facing; public StabilizedContraption() {} - public StabilizedContraption(Contraption parent, Direction facing) { - this.parent = parent; + public StabilizedContraption(UUID parentID, Direction facing) { + this.parentID = parentID; this.facing = facing; } @@ -33,7 +40,7 @@ public class StabilizedContraption extends Contraption { return false; return true; } - + @Override protected boolean isAnchoringBlockAt(BlockPos pos) { return false; @@ -48,12 +55,14 @@ public class StabilizedContraption extends Contraption { public CompoundNBT writeNBT(boolean spawnPacket) { CompoundNBT tag = super.writeNBT(spawnPacket); tag.putInt("Facing", facing.getIndex()); + tag.putUniqueId("Parent", parentID); return tag; } @Override public void readNBT(World world, CompoundNBT tag, boolean spawnData) { facing = Direction.byIndex(tag.getInt("Facing")); + parentID = tag.getUniqueId("Parent"); super.readNBT(world, tag, spawnData); } @@ -66,4 +75,8 @@ public class StabilizedContraption extends Contraption { return facing; } + @Override + public ContraptionLighter makeLighter() { + return new StabilizedLighter(this); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java new file mode 100644 index 000000000..556d22462 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java @@ -0,0 +1,53 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.bearing; + +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.foundation.render.light.GridAlignedBB; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.Vec3i; + +import java.util.List; + +public class StabilizedLighter extends ContraptionLighter { + public StabilizedLighter(StabilizedContraption contraption) { + super(contraption); + } + + @Override + public GridAlignedBB getContraptionBounds() { + GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds); + + // TODO: this whole thing is a hack and is not generalizable + Iterable allEntities = ((ClientWorld) contraption.entity.world).getAllEntities(); + + for (Entity entity : allEntities) { + + if (entity.getUniqueID() == contraption.parentID && entity instanceof AbstractContraptionEntity) { + Contraption mountedOn = ((AbstractContraptionEntity) entity).getContraption(); + + GridAlignedBB mountedBounds = GridAlignedBB.fromAABB(mountedOn.bounds); + + Vec3i dir = contraption.getFacing().getDirectionVec(); + + int mulX = 1 - Math.abs(dir.getX()); + int mulY = 1 - Math.abs(dir.getY()); + int mulZ = 1 - Math.abs(dir.getZ()); + + bb.minX -= mulX * mountedBounds.sizeX(); + bb.minY -= mulY * mountedBounds.sizeY(); + bb.minZ -= mulZ * mountedBounds.sizeZ(); + bb.maxX += mulX * mountedBounds.sizeX(); + bb.maxY += mulY * mountedBounds.sizeY(); + bb.maxZ += mulZ * mountedBounds.sizeZ(); + + break; + } + } + + bb.translate(contraption.anchor); + + return bb; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java index d4a48a889..55bb14c93 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pu import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; +import com.simibubi.create.foundation.render.light.ContraptionLighter; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -53,4 +54,8 @@ public class PulleyContraption extends TranslatingContraption { super.readNBT(world, nbt, spawnData); } + @Override + public ContraptionLighter makeLighter() { + return new PulleyLighter(this); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java new file mode 100644 index 000000000..fc60b3e84 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java @@ -0,0 +1,32 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.pulley; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.foundation.render.light.GridAlignedBB; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class PulleyLighter extends ContraptionLighter { + public PulleyLighter(PulleyContraption contraption) { + super(contraption); + } + + @Override + public GridAlignedBB getContraptionBounds() { + + GridAlignedBB bounds = GridAlignedBB.fromAABB(contraption.bounds); + + World world = contraption.entity.world; + + BlockPos.Mutable pos = new BlockPos.Mutable(contraption.anchor); + while (!AllBlocks.ROPE_PULLEY.has(world.getBlockState(pos)) && pos.getY() < 256) { + pos.move(0, 1, 0); + } + + bounds.translate(pos); + bounds.minY = 1; // the super constructor will take care of making this 0 + + return bounds; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index 5c019b01e..171943f5c 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -20,7 +20,7 @@ public class RenderInLayerMixin { * layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects. * This should probably be a forge event. */ - @Inject(at = @At("HEAD"), method = "renderLayer") + @Inject(at = @At("TAIL"), method = "renderLayer") private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { FastRenderDispatcher.renderLayer(type, stack, cameraX, cameraY, cameraZ); } diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java index c06c4ee2d..b34886d03 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.render.light.LightVolume; import com.simibubi.create.foundation.render.shader.Shader; @@ -14,9 +15,7 @@ import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; import net.minecraft.world.World; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL13; -import org.lwjgl.opengl.GL40; +import org.lwjgl.opengl.*; import java.util.ArrayList; import java.util.HashMap; @@ -53,6 +52,11 @@ public class ContraptionRenderDispatcher { if (renderers.isEmpty()) return; FastKineticRenderer.setup(Minecraft.getInstance().gameRenderer); +// if (renderType == RenderType.getTranslucent()) { +// GL30.glEnable(GL11.GL_DEPTH_TEST); +// GL20.glDepthFunc(GL20.GL_LESS); +// RenderSystem.defaultBlendFunc(); +// } GL11.glEnable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 @@ -81,6 +85,10 @@ public class ContraptionRenderDispatcher { ShaderHelper.releaseShader(); +// if (renderType == RenderType.getTranslucent()) { +// GL30.glEnable(GL11.GL_DEPTH_TEST); +// GL20.glDepthFunc(GL20.GL_LEQUAL); +// } GL11.glDisable(GL13.GL_TEXTURE_3D); FastKineticRenderer.teardown(); GL13.glActiveTexture(GL40.GL_TEXTURE0); diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 6054e1b00..b5353d5dd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; @@ -22,6 +23,8 @@ import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; import net.minecraft.world.chunk.Chunk; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL30; import java.util.Map; @@ -40,7 +43,12 @@ public class FastRenderDispatcher { Matrix4f projection = getProjectionMatrix(); if (type == FastKineticRenderer.getKineticRenderLayer()) { + RenderSystem.enableDepthTest(); + RenderSystem.enableCull(); + GL11.glCullFace(GL11.GL_BACK); CreateClient.kineticRenderer.renderInstancesAsWorld(type, projection, view); + RenderSystem.disableCull(); + //RenderSystem.disableDepthTest(); } ContraptionRenderDispatcher.renderLayer(type, projection, view); diff --git a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java index 44786f256..110113283 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java @@ -15,11 +15,11 @@ public abstract class ContraptionLighter { this.contraption = contraption; GridAlignedBB bounds = getContraptionBounds(); - bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts - GridAlignedBB importantArea = GridAlignedBB.copy(bounds); - bounds.nextPowerOf2Centered(); + bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting + bounds.minY = Math.max(bounds.minY, 0); + bounds.maxY = Math.min(bounds.maxY, 255); - lightVolume = new LightVolume(bounds, importantArea); + lightVolume = new LightVolume(bounds); lightVolume.initialize(contraption.entity.world); } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java index bb86dd135..f47889b11 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java @@ -1,9 +1,11 @@ package com.simibubi.create.foundation.render.light; import com.simibubi.create.foundation.render.RenderMath; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.SectionPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2; @@ -99,6 +101,55 @@ public class GridAlignedBB { } } + public void mirrorAbout(Direction.Axis axis) { + Vec3i axisVec = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getDirectionVec(); + int flipX = axisVec.getX() - 1; + int flipY = axisVec.getY() - 1; + int flipZ = axisVec.getZ() - 1; + + int maxX = this.maxX * flipX; + int maxY = this.maxY * flipY; + int maxZ = this.maxZ * flipZ; + this.maxX = this.minX * flipX; + this.maxY = this.minY * flipY; + this.maxZ = this.minZ * flipZ; + this.minX = maxX; + this.minY = maxY; + this.minZ = maxZ; + } + + public void expandAroundAxis(Direction.Axis axis) { + int maxXDiff = Math.max(this.maxX - 1, -this.minX); + int maxYDiff = Math.max(this.maxY - 1, -this.minY); + int maxZDiff = Math.max(this.maxZ - 1, -this.minZ); + + int maxDiff; + if (axis == Direction.Axis.X) + maxDiff = Math.max(maxZDiff, maxYDiff); + else if (axis == Direction.Axis.Y) + maxDiff = Math.max(maxZDiff, maxXDiff); + else if (axis == Direction.Axis.Z) + maxDiff = Math.max(maxXDiff, maxYDiff); + else + maxDiff = 0; + + Vec3i axisVec = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getDirectionVec(); + int axisX = axisVec.getX(); + int axisY = axisVec.getY(); + int axisZ = axisVec.getZ(); + + int planeX = 1 - axisX; + int planeY = 1 - axisY; + int planeZ = 1 - axisZ; + + minX = axisX * minX - maxDiff * planeX; + minY = axisY * minY - maxDiff * planeY; + minZ = axisZ * minZ - maxDiff * planeZ; + maxX = axisX * maxX + (maxDiff + 1) * planeX; + maxY = axisY * maxY + (maxDiff + 1) * planeY; + maxZ = axisZ * maxZ + (maxDiff + 1) * planeZ; + } + /** * Grow this bounding box to have power of 2 side length, scaling from the center. */ @@ -192,6 +243,15 @@ public class GridAlignedBB { this.maxZ = Math.max(this.maxZ, other.maxZ); } + public void unionAssign(AxisAlignedBB other) { + this.minX = Math.min(this.minX, (int) Math.floor(other.minX)); + this.minY = Math.min(this.minY, (int) Math.floor(other.minY)); + this.minZ = Math.min(this.minZ, (int) Math.floor(other.minZ)); + this.maxX = Math.max(this.maxX, (int) Math.ceil(other.maxX)); + this.maxY = Math.max(this.maxY, (int) Math.ceil(other.maxY)); + this.maxZ = Math.max(this.maxZ, (int) Math.ceil(other.maxZ)); + } + public boolean intersects(GridAlignedBB other) { return this.intersects(other.minX, other.minY, other.minZ, other.maxX, other.maxY, other.maxZ); } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index fd2a59fce..0f896cd2b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -24,13 +24,10 @@ public class LightVolume { private int glTexture; - public LightVolume(GridAlignedBB textureVolume, GridAlignedBB sampleVolume) { - // the gpu requires that all textures have power of 2 side lengths - if (!textureVolume.hasPowerOf2Sides()) - throw new IllegalArgumentException("LightVolume must have power of 2 side lengths"); - - this.textureVolume = textureVolume; - this.sampleVolume = sampleVolume; + public LightVolume(GridAlignedBB sampleVolume) { + this.sampleVolume = GridAlignedBB.copy(sampleVolume); + sampleVolume.nextPowerOf2Centered(); + this.textureVolume = sampleVolume; this.glTexture = GL11.glGenTextures(); this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte From 28cd9a1fe184be8e713b2d37000dd14713d32367 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Wed, 20 Jan 2021 22:36:04 +0100 Subject: [PATCH 041/147] Druidcraft woodcutter compatibility --- build.gradle | 5 + gradle.properties | 2 +- src/generated/resources/.cache/cache | 24 +-- .../assets/create/blockstates/fluid_pipe.json | 190 +++++++++--------- .../create/blockstates/radial_chassis.json | 24 +-- .../resources/assets/create/lang/en_us.json | 1 + .../assets/create/lang/unfinished/de_de.json | 3 +- .../assets/create/lang/unfinished/fr_fr.json | 3 +- .../assets/create/lang/unfinished/it_it.json | 3 +- .../assets/create/lang/unfinished/ja_jp.json | 3 +- .../assets/create/lang/unfinished/ko_kr.json | 3 +- .../assets/create/lang/unfinished/nl_nl.json | 3 +- .../assets/create/lang/unfinished/pt_br.json | 3 +- .../assets/create/lang/unfinished/ru_ru.json | 3 +- .../assets/create/lang/unfinished/zh_cn.json | 3 +- .../simibubi/create/compat/jei/CreateJEI.java | 20 +- .../jei/category/BlockCuttingCategory.java | 5 +- .../components/saw/SawTileEntity.java | 28 ++- .../create/foundation/config/CRecipes.java | 3 + .../utility/recipe/RecipeConditions.java | 7 +- .../assets/create/lang/default/messages.json | 1 + 21 files changed, 195 insertions(+), 142 deletions(-) diff --git a/build.gradle b/build.gradle index b8cf8d5e0..07408da84 100644 --- a/build.gradle +++ b/build.gradle @@ -98,6 +98,9 @@ repositories { name = "tterrag maven" url = "https://maven.tterrag.com/" } + maven { + url = "https://www.cursemaven.com" + } } configurations { @@ -116,6 +119,8 @@ dependencies { // at runtime, use the full JEI jar runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}") + // implementation fg.deobf("curse.maven:druidcraft-340991:3101903") + // i'll leave this here commented for easier testing //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") //runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984") diff --git a/gradle.properties b/gradle.properties index 999263025..97aaf8aa0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.daemon=false # mod version info mod_version=0.3e minecraft_version=1.15.2 -forge_version=31.2.31 +forge_version=31.2.47 # dependency versions registrate_version=1.0.0-rc.17 diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index bf2b276ce..b84f93444 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -140,7 +140,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json +3d97226b5e8d8f70ed08e45e78db1faf78d5e28b assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -335,7 +335,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -89b63c6e5875da07226854651079bcea85439f5b assets/create/blockstates/radial_chassis.json +8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -398,16 +398,16 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json f11f6bc6d9284f3b995e5d250745d0a1194bc695 assets/create/lang/en_ud.json -c7ce8fb0347cc524b4497a2c251122744d66c867 assets/create/lang/en_us.json -0ded0dcda370475b7e5398da8b18a0854a4465bb assets/create/lang/unfinished/de_de.json -3b023d30bf50b7b81be0394aab9f564d54ffc1b5 assets/create/lang/unfinished/fr_fr.json -9186e35869c87606b15057e854796f3556bf8a9b assets/create/lang/unfinished/it_it.json -9abc5a7129adfcb2492b7ba10afc64d77df4397e assets/create/lang/unfinished/ja_jp.json -3e2dc7dbc703826c87efe2c340c41a14c9c400c8 assets/create/lang/unfinished/ko_kr.json -26c3e64daddecf240ace2567d79a65e93c9c960f assets/create/lang/unfinished/nl_nl.json -76f2feec509e87e0819db706b344e7e87e7b4b99 assets/create/lang/unfinished/pt_br.json -079f2c1699d4b7280e028acb51d4b6a7eca10a03 assets/create/lang/unfinished/ru_ru.json -289f948c1f44a58fd454b356a6141561e5dcf024 assets/create/lang/unfinished/zh_cn.json +59dd1d0c9c0f412f581c699f0bf592fcf348759a assets/create/lang/en_us.json +b7e4fc8328d3aa4ec53be9bb43c23c47100eeafc assets/create/lang/unfinished/de_de.json +7ceceb887b54180d28226e30b8b0b1275467e184 assets/create/lang/unfinished/fr_fr.json +9e5e930062edbfcdeaaeeb12578a07fe6bcd0e81 assets/create/lang/unfinished/it_it.json +8166a89d96a366dfd702e166b60df7e36a76a120 assets/create/lang/unfinished/ja_jp.json +6d1a54f08518bbf76f409b19d8f51c67cdfff4d5 assets/create/lang/unfinished/ko_kr.json +e95942103c0ad4530dd7a919a4a3baeb66f47f51 assets/create/lang/unfinished/nl_nl.json +44f9d40e0b762f5a83e8b7e02edc09cc2e29e8ab assets/create/lang/unfinished/pt_br.json +7e2c09dc9dde79c98f3e7726cee803f795cfa63c assets/create/lang/unfinished/ru_ru.json +d8207dfebabd2985b3d60c9222e7682cefaafdcb assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 581373307..a4cffcde7 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { - "south": "false", - "up": "true", "down": "false", - "north": "true" + "north": "true", + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { - "south": "true", - "up": "true", "down": "false", - "north": "false" + "north": "false", + "up": "true", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", - "north": "true" + "north": "true", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "true", - "north": "false" + "north": "false", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,21 +104,21 @@ }, { "when": { - "south": "false", - "up": "true", "down": "true", - "north": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { - "south": "false", + "north": "false", "up": "true", - "down": "false", - "north": "false" + "south": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "down": "false", + "north": "false", + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -126,10 +126,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", - "north": "false" + "north": "false", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +137,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", - "north": "true" + "north": "true", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", - "north": "true" + "north": "true", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", - "north": "false" + "north": "false", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", - "north": "false" + "north": "false", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { - "south": "true", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "true", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "up": "true", - "down": "false", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "up": "true", - "down": "false", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "up": "false", - "down": "true", "west": "false", - "east": "true" + "down": "true", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "up": "false", - "down": "true", "west": "true", - "east": "false" + "down": "true", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "up": "true", + "west": "false", "down": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "up": "true", + "west": "false", "down": "false", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "up": "false", + "west": "false", "down": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "true", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "false", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index d60327a8a..9d00ea8b1 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index d1f8a8f5c..55b11711d 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -680,6 +680,7 @@ "create.recipe.mechanical_crafting": "Mechanical Crafting", "create.recipe.automatic_shaped": "Automated Shaped Crafting", "create.recipe.block_cutting": "Block Cutting", + "create.recipe.wood_cutting": "Wood Cutting", "create.recipe.blockzapper_upgrade": "Handheld Blockzapper", "create.recipe.sandpaper_polishing": "Sandpaper Polishing", "create.recipe.mystery_conversion": "Mysterious Conversion", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index b2d1bed88..796a6e81a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1209", + "_": "Missing Localizations: 1210", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blockpistole", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index afb011613..6ca43aaf8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 860", + "_": "Missing Localizations: 861", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "Fabrication mécanique", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Coupe de bloc", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blockzappeur portable", "create.recipe.sandpaper_polishing": "Polissage au papier de verre", "create.recipe.mystery_conversion": "Métamorphose chromatique", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 591f1afdd..eac6238ac 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 844", + "_": "Missing Localizations: 845", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "Creazione Meccanico", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Taglio Blocco", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", "create.recipe.sandpaper_polishing": "Carta Vetrata Levigata", "create.recipe.mystery_conversion": "Metamorfosi Cromatica", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 5ac5cf4a5..a93b0045b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 843", + "_": "Missing Localizations: 844", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "メカニカルクラフト", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "ブロックカット", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "携帯型ブロックザッパー", "create.recipe.sandpaper_polishing": "紙やすりでの研磨", "create.recipe.mystery_conversion": "色彩変態", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 6443f3e32..de866f2ad 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 50", + "_": "Missing Localizations: 51", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "기계 조합", "create.recipe.automatic_shaped": "유형 자동 조합", "create.recipe.block_cutting": "블 절단", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "휴대용 블록발사기 업그레이드", "create.recipe.sandpaper_polishing": "사포질", "create.recipe.mystery_conversion": "?", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 91e3aff32..44b05e2ff 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1150", + "_": "Missing Localizations: 1151", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Blok Zagen", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blokzapper", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 78bdb93c7..260acf9c5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1216", + "_": "Missing Localizations: 1217", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blockzapper Portátil", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 1ec2115ee..46eb0c3e9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 0", + "_": "Missing Localizations: 1", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "Механическое создание", "create.recipe.automatic_shaped": "Автоматическая форменная сборка", "create.recipe.block_cutting": "Резка блока", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", "create.recipe.mystery_conversion": "Хроматический метаморфоз", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 31e6354ff..dcba9794b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 3", + "_": "Missing Localizations: 4", "_": "->------------------------] Game Elements [------------------------<-", @@ -681,6 +681,7 @@ "create.recipe.mechanical_crafting": "自动合成", "create.recipe.automatic_shaped": "自动合成", "create.recipe.block_cutting": "方块切割", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "手持式方块放置器", "create.recipe.sandpaper_polishing": "砂纸打磨", "create.recipe.mystery_conversion": "神秘转化", diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 5cb215a61..de757db48 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -35,6 +35,7 @@ import com.simibubi.create.compat.jei.category.ProcessingViaFanCategory; import com.simibubi.create.compat.jei.category.SawingCategory; import com.simibubi.create.compat.jei.category.SpoutCategory; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; +import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.processing.BasinRecipe; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen; @@ -54,6 +55,7 @@ import mezz.jei.api.registration.ISubtypeRegistration; import mezz.jei.api.runtime.IIngredientManager; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.item.crafting.ICraftingRecipe; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeSerializer; @@ -61,8 +63,10 @@ import net.minecraft.item.crafting.IRecipeType; import net.minecraft.item.crafting.ShapedRecipe; import net.minecraft.util.IItemProvider; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.ModList; @JeiPlugin +@SuppressWarnings("unused") public class CreateJEI implements IModPlugin { private static final ResourceLocation ID = new ResourceLocation(Create.ID, "jei_plugin"); @@ -132,12 +136,18 @@ public class CreateJEI implements IModPlugin { .catalyst(AllBlocks.MECHANICAL_SAW::get) .build(), - blockCutting = register("block_cutting", BlockCuttingCategory::new) + blockCutting = register("block_cutting", () -> new BlockCuttingCategory(Items.STONE_BRICK_STAIRS)) .recipeList(() -> CondensedBlockCuttingRecipe.condenseRecipes(findRecipesByType(IRecipeType.STONECUTTING))) .catalyst(AllBlocks.MECHANICAL_SAW::get) .enableWhen(c -> c.allowStonecuttingOnSaw) .build(), + woodCutting = register("wood_cutting", () -> new BlockCuttingCategory(Items.OAK_STAIRS)) + .recipeList(() -> CondensedBlockCuttingRecipe.condenseRecipes(findRecipesByType(SawTileEntity.woodcuttingRecipeType.getValue()))) + .catalyst(AllBlocks.MECHANICAL_SAW::get) + .enableWhenBool(c -> c.allowWoodcuttingOnSaw.get() && ModList.get().isLoaded("druidcraft")) + .build(), + packing = register("packing", PackingCategory::standard).recipes(AllRecipeTypes.COMPACTING) .catalyst(AllBlocks.MECHANICAL_PRESS::get) .catalyst(AllBlocks.BASIN::get) @@ -293,8 +303,12 @@ public class CreateJEI implements IModPlugin { CategoryBuilder enableWhen(Function configValue) { this.pred = c -> configValue.apply(c) - .get() - .booleanValue(); + .get(); + return this; + } + + CategoryBuilder enableWhenBool(Function configValue) { + this.pred = configValue::apply; return this; } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java index 86806e554..8f00ae553 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java @@ -14,6 +14,7 @@ import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; import mezz.jei.api.ingredients.IIngredients; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.crafting.IRecipe; @@ -25,8 +26,8 @@ public class BlockCuttingCategory extends CreateRecipeCategory> woodcuttingRecipeType = new LazyValue<>(() -> Registry.RECIPE_TYPE.getOrDefault(new ResourceLocation("druidcraft", "woodcutting"))); public ProcessingInventory inventory; private int recipeIndex; - private LazyOptional invProvider = LazyOptional.empty(); + private final LazyOptional invProvider; private FilteringBehaviour filtering; public SawTileEntity(TileEntityType type) { @@ -251,7 +261,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { List results = new LinkedList(); if (recipe instanceof CuttingRecipe) results = ((CuttingRecipe) recipe).rollResults(); - else if (recipe instanceof StonecuttingRecipe) + else if (recipe instanceof StonecuttingRecipe || recipe.getType() == woodcuttingRecipeType.getValue()) results.add(recipe.getRecipeOutput() .copy()); @@ -266,10 +276,20 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { } private List> getRecipes() { + /* Predicate> types = AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get() ? RecipeConditions.isOfType(IRecipeType.STONECUTTING, AllRecipeTypes.CUTTING.getType()) : RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType()); - List> startedSearch = RecipeFinder.get(cuttingRecipesKey, world, types); + + */ + + Predicate> types = RecipeConditions.isOfType( + AllRecipeTypes.CUTTING.getType(), + AllConfigs.SERVER.recipes.allowStonecuttingOnSaw.get() ? IRecipeType.STONECUTTING : null, + AllConfigs.SERVER.recipes.allowWoodcuttingOnSaw.get() ? woodcuttingRecipeType.getValue() : null + ); + + List> startedSearch = RecipeFinder.get(cuttingRecipesKey, world, types); return startedSearch.stream() .filter(RecipeConditions.outputMatchesFilter(filtering)) .filter(RecipeConditions.firstIngredientMatches(inventory.getStackInSlot(0))) diff --git a/src/main/java/com/simibubi/create/foundation/config/CRecipes.java b/src/main/java/com/simibubi/create/foundation/config/CRecipes.java index 2f5ebcd65..e042c4f85 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CRecipes.java +++ b/src/main/java/com/simibubi/create/foundation/config/CRecipes.java @@ -7,6 +7,7 @@ public class CRecipes extends ConfigBase { public ConfigBool allowRegularCraftingInCrafter = b(true, "allowRegularCraftingInCrafter", Comments.allowRegularCraftingInCrafter); public ConfigBool allowStonecuttingOnSaw = b(true, "allowStonecuttingOnSaw", Comments.allowStonecuttingOnSaw); + public ConfigBool allowWoodcuttingOnSaw = b(true, "allowWoodcuttingOnSaw", Comments.allowWoodcuttingOnSaw); public ConfigInt lightSourceCountForRefinedRadiance = i(10, 1, "lightSourceCountForRefinedRadiance", Comments.refinedRadiance); public ConfigBool enableRefinedRadianceRecipe = @@ -27,6 +28,8 @@ public class CRecipes extends ConfigBase { "When true, allows any standard crafting recipes to be processed by Mechanical Crafters."; static String allowStonecuttingOnSaw = "When true, allows any stonecutting recipes to be processed by a Mechanical Saw."; + static String allowWoodcuttingOnSaw = + "When true, allows any Druidcraft woodcutter recipes to be processed by a Mechanical Saw."; static String refinedRadiance = "The amount of Light sources destroyed before Chromatic Compound turns into Refined Radiance."; static String refinedRadianceRecipe = "Allow the standard in-world Refined Radiance recipes."; diff --git a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeConditions.java b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeConditions.java index adc080537..cc96987e7 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeConditions.java +++ b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeConditions.java @@ -1,12 +1,13 @@ package com.simibubi.create.foundation.utility.recipe; -import com.google.common.base.Predicate; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeType; +import java.util.function.Predicate; + /** * Commonly used Predicates for searching through recipe collections. * @@ -15,11 +16,9 @@ import net.minecraft.item.crafting.IRecipeType; */ public class RecipeConditions { - public static Predicate> isOfType(IRecipeType type, IRecipeType... otherTypes) { + public static Predicate> isOfType(IRecipeType... otherTypes) { return recipe -> { IRecipeType recipeType = recipe.getType(); - if (recipeType == type) - return true; for (IRecipeType other : otherTypes) if (recipeType == other) return true; diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 33fa8d770..59999f0d3 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -30,6 +30,7 @@ "create.recipe.mechanical_crafting": "Mechanical Crafting", "create.recipe.automatic_shaped": "Automated Shaped Crafting", "create.recipe.block_cutting": "Block Cutting", + "create.recipe.wood_cutting": "Wood Cutting", "create.recipe.blockzapper_upgrade": "Handheld Blockzapper", "create.recipe.sandpaper_polishing": "Sandpaper Polishing", "create.recipe.mystery_conversion": "Mysterious Conversion", From 697a7df59c259cc781ff78b6f1add8a4ba34f0f4 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 21 Jan 2021 12:26:55 -0800 Subject: [PATCH 042/147] suddenly and magically, contraption rendering is 100% accurate --- .../render/ContraptionRenderDispatcher.java | 15 ++---- .../render/FastKineticRenderer.java | 47 ------------------- .../assets/create/shader/contraption.frag | 2 +- 3 files changed, 5 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java index b34886d03..0689583a7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.render.light.LightVolume; @@ -51,12 +52,7 @@ public class ContraptionRenderDispatcher { if (renderers.isEmpty()) return; - FastKineticRenderer.setup(Minecraft.getInstance().gameRenderer); -// if (renderType == RenderType.getTranslucent()) { -// GL30.glEnable(GL11.GL_DEPTH_TEST); -// GL20.glDepthFunc(GL20.GL_LESS); -// RenderSystem.defaultBlendFunc(); -// } + renderType.startDrawing(); GL11.glEnable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 @@ -85,12 +81,9 @@ public class ContraptionRenderDispatcher { ShaderHelper.releaseShader(); -// if (renderType == RenderType.getTranslucent()) { -// GL30.glEnable(GL11.GL_DEPTH_TEST); -// GL20.glDepthFunc(GL20.GL_LEQUAL); -// } + + renderType.endDrawing(); GL11.glDisable(GL13.GL_TEXTURE_3D); - FastKineticRenderer.teardown(); GL13.glActiveTexture(GL40.GL_TEXTURE0); } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java index 437bf1387..3d0764187 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java @@ -147,53 +147,6 @@ public class FastKineticRenderer { layer.endDrawing(); } - public static void setup(GameRenderer gameRenderer) { - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - - RenderSystem.enableLighting(); - RenderSystem.enableDepthTest(); - RenderSystem.enableCull(); - GL11.glCullFace(GL11.GL_BACK); - - LightTexture lightManager = gameRenderer.getLightmapTextureManager(); - - Texture blockAtlasTexture = Minecraft.getInstance().textureManager.getTexture(PlayerContainer.BLOCK_ATLAS_TEXTURE); - Texture lightTexture = Minecraft.getInstance().textureManager.getTexture(lightManager.resourceLocation); - - // bind the block atlas texture to 0 - GL13.glActiveTexture(GL40.GL_TEXTURE0); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, blockAtlasTexture.getGlTextureId()); - GL40.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); - GL40.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - - // bind the light texture to 1 and setup the mysterious filtering options - GL13.glActiveTexture(GL40.GL_TEXTURE1); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, lightTexture.getGlTextureId()); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, 10241, 9729); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, 10240, 9729); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, 10242, 10496); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, 10243, 10496); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.enableTexture(); - } - - public static void teardown() { - - GL13.glActiveTexture(GL40.GL_TEXTURE1); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); - - GL13.glActiveTexture(GL40.GL_TEXTURE0); - GL40.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); - GL40.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - - RenderSystem.disableCull(); - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.disableDepthTest(); - RenderSystem.disableLighting(); - } - public void registerCompartment(SuperByteBufferCache.Compartment instance) { rotating.put(instance, CacheBuilder.newBuilder().build()); belts.put(instance, CacheBuilder.newBuilder().build()); diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index c493e4c4e..d2ebc1d33 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -19,5 +19,5 @@ vec4 light() { void main() { vec4 tex = texture2D(BlockAtlas, TexCoords); - fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a) * Color; + fragColor = vec4(tex.rgb * light().rgb * Diffuse * Color.rgb, tex.a); } \ No newline at end of file From 11f9c7459cae4f5e135f596dec583757110801de Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 21 Jan 2021 14:14:20 -0800 Subject: [PATCH 043/147] prepare for fast actor rendering --- .../foundation/render/ContraptionBuffer.java | 99 ++++---------- .../create/foundation/render/GPUBuffer.java | 107 +++++++++++++++ .../instancing/DynamicInstanceBuffer.java | 30 +++++ .../render/instancing/InstanceBuffer.java | 126 +++++++----------- .../render/instancing/RotatingData.java | 18 ++- .../render/instancing/VertexFormat.java | 2 +- .../actors/DynamicRotatingActorData.java | 35 +++++ .../actors/RotatingActorBuffer.java | 31 +++++ .../actors/StaticRotatingActorData.java | 71 ++++++++++ .../foundation/render/shader/Shader.java | 1 + .../create/shader/contraption_actor.vert | 68 ++++++++++ 11 files changed, 421 insertions(+), 167 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java create mode 100644 src/main/resources/assets/create/shader/contraption_actor.vert diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java index d3c77a3a5..89e76292a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java @@ -10,90 +10,39 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; -public class ContraptionBuffer extends TemplateBuffer { +public class ContraptionBuffer extends GPUBuffer { public static final VertexFormat FORMAT = new VertexFormat(InstanceBuffer.FORMAT, RGBA); - protected int vao, ebo, vbo; - public ContraptionBuffer(BufferBuilder buf) { super(buf); - if (vertexCount > 0) setup(); } - public void delete() { - if (vertexCount > 0) { - RenderWork.enqueue(() -> { - GL15.glDeleteBuffers(vbo); - GL15.glDeleteBuffers(ebo); - GL30.glDeleteVertexArrays(vao); - }); - } + @Override + protected void copyVertex(ByteBuffer to, int vertex) { + to.putFloat(getX(template, vertex)); + to.putFloat(getY(template, vertex)); + to.putFloat(getZ(template, vertex)); + + to.put(getNX(template, vertex)); + to.put(getNY(template, vertex)); + to.put(getNZ(template, vertex)); + + to.putFloat(getU(template, vertex)); + to.putFloat(getV(template, vertex)); + + to.put(getR(template, vertex)); + to.put(getG(template, vertex)); + to.put(getB(template, vertex)); + to.put(getA(template, vertex)); } - public void render() { - if (vertexCount == 0) return; - GL30.glBindVertexArray(vao); - - for (int i = 0; i <= 3; i++) { - GL40.glEnableVertexAttribArray(i); - } - - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + @Override + protected VertexFormat getModelFormat() { + return FORMAT; + } + @Override + protected void drawCall() { GL40.glDrawElements(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0); - - for (int i = 0; i <= FORMAT.getNumAttributes(); i++) { - GL40.glDisableVertexAttribArray(i); - } - - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - GL30.glBindVertexArray(0); - } - - private void setup() { - int stride = FORMAT.getStride(); - int invariantSize = vertexCount * stride; - - vao = GL30.glGenVertexArrays(); - ebo = GlStateManager.genBuffers(); - vbo = GlStateManager.genBuffers(); - - GL30.glBindVertexArray(vao); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - - // allocate the buffer on the gpu - GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); - - // mirror it in system memory so we can write to it - ByteBuffer constant = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); - - for (int i = 0; i < vertexCount; i++) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); - - constant.put(getNX(template, i)); - constant.put(getNY(template, i)); - constant.put(getNZ(template, i)); - - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); - - constant.put(getR(template, i)); - constant.put(getG(template, i)); - constant.put(getB(template, i)); - constant.put(getA(template, i)); - } - constant.rewind(); - GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); - - buildEBO(ebo); - - FORMAT.informAttributes(0); - - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - // Deselect (bind to 0) the VAO - GL30.glBindVertexArray(0); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java b/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java new file mode 100644 index 000000000..854b814e8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java @@ -0,0 +1,107 @@ +package com.simibubi.create.foundation.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.render.instancing.VertexFormat; +import net.minecraft.client.renderer.BufferBuilder; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL40; + +import java.nio.ByteBuffer; + +public abstract class GPUBuffer extends TemplateBuffer { + + protected int vao, ebo, invariantVBO; + + public GPUBuffer(BufferBuilder buf) { + super(buf); + if (vertexCount > 0) setup(); + } + + protected void setup() { + int stride = getModelFormat().getStride(); + + int invariantSize = vertexCount * stride; + + vao = GL30.glGenVertexArrays(); + ebo = GlStateManager.genBuffers(); + invariantVBO = GlStateManager.genBuffers(); + + GL30.glBindVertexArray(vao); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, invariantVBO); + + // allocate the buffer on the gpu + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); + + // mirror it in system memory so we can write to it + ByteBuffer constant = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); + + for (int i = 0; i < vertexCount; i++) { + copyVertex(constant, i); + } + constant.rewind(); + GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); + + buildEBO(ebo); + + getModelFormat().informAttributes(0); + + GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + // Deselect (bind to 0) the VAO + GL30.glBindVertexArray(0); + } + + protected abstract void copyVertex(ByteBuffer to, int index); + + protected abstract VertexFormat getModelFormat(); + + protected int getTotalShaderAttributeCount() { + return getModelFormat().getShaderAttributeCount(); + } + + protected abstract void drawCall(); + + protected void preDrawTask() { + + } + + public void render() { + if (vao == 0) return; + + GL30.glBindVertexArray(vao); + preDrawTask(); + + int numAttributes = getTotalShaderAttributeCount(); + for (int i = 0; i <= numAttributes; i++) { + GL40.glEnableVertexAttribArray(i); + } + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + + drawCall(); + + for (int i = 0; i <= numAttributes; i++) { + GL40.glDisableVertexAttribArray(i); + } + + GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GL30.glBindVertexArray(0); + } + + public void delete() { + if (vertexCount > 0) { + RenderWork.enqueue(this::deleteInternal); + } + } + + protected void deleteInternal() { + GL15.glDeleteBuffers(invariantVBO); + GL15.glDeleteBuffers(ebo); + GL30.glDeleteVertexArrays(vao); + vao = 0; + ebo = 0; + invariantVBO = 0; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java new file mode 100644 index 000000000..0abba029c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java @@ -0,0 +1,30 @@ +package com.simibubi.create.foundation.render.instancing; + +import net.minecraft.client.renderer.BufferBuilder; +import org.lwjgl.opengl.*; + +public abstract class DynamicInstanceBuffer extends InstanceBuffer { + + protected int dynamicVBO; + + protected int dynamicBufferSize = -1; + + public DynamicInstanceBuffer(BufferBuilder buf) { + super(buf); + } + + @Override + protected void setup() { + super.setup(); + dynamicVBO = GL20.glGenBuffers(); + } + + protected abstract VertexFormat getDynamicFormat(); + + protected abstract D newDynamicPart(); + + @Override + protected int getTotalShaderAttributeCount() { + return super.getTotalShaderAttributeCount() + getDynamicFormat().getShaderAttributeCount(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java index 0f88d52a3..67a6ddcbf 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render.instancing; import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.render.GPUBuffer; import com.simibubi.create.foundation.render.RenderMath; import com.simibubi.create.foundation.render.RenderWork; import com.simibubi.create.foundation.render.TemplateBuffer; @@ -14,12 +15,13 @@ import java.util.function.Consumer; import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; -public abstract class InstanceBuffer extends TemplateBuffer { +public abstract class InstanceBuffer extends GPUBuffer { public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV); - protected int vao, ebo, invariantVBO, instanceVBO, instanceCount; + protected int instanceVBO; + protected int instanceCount; - protected int bufferSize = -1; + protected int instanceBufferSize = -1; protected final ArrayList data = new ArrayList<>(); protected boolean rebuffer = false; @@ -27,51 +29,31 @@ public abstract class InstanceBuffer extends TemplateBuf public InstanceBuffer(BufferBuilder buf) { super(buf); - if (vertexCount > 0) setup(); } - private void setup() { - int stride = FORMAT.getStride(); - - int invariantSize = vertexCount * stride; - - vao = GL30.glGenVertexArrays(); - ebo = GlStateManager.genBuffers(); - invariantVBO = GlStateManager.genBuffers(); + @Override + protected void setup() { + super.setup(); instanceVBO = GlStateManager.genBuffers(); + } - GL30.glBindVertexArray(vao); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, invariantVBO); + @Override + protected VertexFormat getModelFormat() { + return FORMAT; + } - // allocate the buffer on the gpu - GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); + @Override + protected void copyVertex(ByteBuffer constant, int i) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); - // mirror it in system memory so we can write to it - ByteBuffer constant = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); + constant.put(getNX(template, i)); + constant.put(getNY(template, i)); + constant.put(getNZ(template, i)); - for (int i = 0; i < vertexCount; i++) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); - - constant.put(getNX(template, i)); - constant.put(getNY(template, i)); - constant.put(getNZ(template, i)); - - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); - } - constant.rewind(); - GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); - - buildEBO(ebo); - - FORMAT.informAttributes(0); - - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - // Deselect (bind to 0) the VAO - GL30.glBindVertexArray(0); + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); } protected abstract VertexFormat getInstanceFormat(); @@ -93,20 +75,16 @@ public abstract class InstanceBuffer extends TemplateBuf if (shouldBuild) rebuffer = true; } - public void delete() { - if (vertexCount > 0) { - RenderWork.enqueue(() -> { - GL15.glDeleteBuffers(invariantVBO); - GL15.glDeleteBuffers(instanceVBO); - GL15.glDeleteBuffers(ebo); - GL30.glDeleteVertexArrays(vao); - vao = 0; - ebo = 0; - invariantVBO = 0; - instanceVBO = 0; - bufferSize = -1; - }); - } + protected void deleteInternal() { + GL15.glDeleteBuffers(invariantVBO); + GL15.glDeleteBuffers(instanceVBO); + GL15.glDeleteBuffers(ebo); + GL30.glDeleteVertexArrays(vao); + vao = 0; + ebo = 0; + invariantVBO = 0; + instanceVBO = 0; + instanceBufferSize = -1; } protected abstract D newInstance(); @@ -120,30 +98,16 @@ public abstract class InstanceBuffer extends TemplateBuf data.add(instanceData); } - public void render() { - if (vao == 0) return; - - GL30.glBindVertexArray(vao); - finishBuffering(); - - int numAttributes = getInstanceFormat().getNumAttributes() + FORMAT.getNumAttributes(); - for (int i = 0; i <= numAttributes; i++) { - GL40.glEnableVertexAttribArray(i); - } - - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - - GL40.glDrawElementsInstanced(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); - - for (int i = 0; i <= numAttributes; i++) { - GL40.glDisableVertexAttribArray(i); - } - - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - GL30.glBindVertexArray(0); + protected int getTotalShaderAttributeCount() { + return getInstanceFormat().getShaderAttributeCount() + FORMAT.getShaderAttributeCount(); } - private void finishBuffering() { + @Override + protected void drawCall() { + GL40.glDrawElementsInstanced(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); + } + + protected void preDrawTask() { if (!rebuffer || data.isEmpty()) return; instanceCount = data.size(); @@ -155,9 +119,9 @@ public abstract class InstanceBuffer extends TemplateBuf GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVBO); // this changes enough that it's not worth reallocating the entire buffer every time. - if (instanceSize > bufferSize) { + if (instanceSize > instanceBufferSize) { GL15.glBufferData(GL15.GL_ARRAY_BUFFER, instanceSize, GL15.GL_STATIC_DRAW); - bufferSize = instanceSize; + instanceBufferSize = instanceSize; } ByteBuffer buffer = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); @@ -166,10 +130,10 @@ public abstract class InstanceBuffer extends TemplateBuf buffer.rewind(); GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); - int staticAttributes = FORMAT.getNumAttributes(); + int staticAttributes = FORMAT.getShaderAttributeCount(); instanceFormat.informAttributes(staticAttributes); - for (int i = 0; i < instanceFormat.getNumAttributes(); i++) { + for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { GL33.glVertexAttribDivisor(i + staticAttributes, 1); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java index 1aa62c4a5..c905d93e9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java @@ -7,13 +7,13 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class RotatingData extends BasicData { - public static VertexFormat FORMAT = new VertexFormat(BasicData.FORMAT, FLOAT, FLOAT, VEC3); + public static VertexFormat FORMAT = new VertexFormat(BasicData.FORMAT, FLOAT, FLOAT, NORMAL); private float rotationalSpeed; private float rotationOffset; - private float rotationAxisX; - private float rotationAxisY; - private float rotationAxisZ; + private byte rotationAxisX; + private byte rotationAxisY; + private byte rotationAxisZ; public RotatingData setRotationalSpeed(float rotationalSpeed) { this.rotationalSpeed = rotationalSpeed; @@ -26,16 +26,14 @@ public class RotatingData extends BasicData { } public RotatingData setRotationAxis(Vector3f axis) { - this.rotationAxisX = axis.getX(); - this.rotationAxisY = axis.getY(); - this.rotationAxisZ = axis.getZ(); + setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); return this; } public RotatingData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { - this.rotationAxisX = rotationAxisX; - this.rotationAxisY = rotationAxisY; - this.rotationAxisZ = rotationAxisZ; + this.rotationAxisX = (byte) (rotationAxisX * 127); + this.rotationAxisY = (byte) (rotationAxisY * 127); + this.rotationAxisZ = (byte) (rotationAxisZ * 127); return this; } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java index 856fcdd7f..55003dc2e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java @@ -34,7 +34,7 @@ public class VertexFormat { this.stride = stride; } - public int getNumAttributes() { + public int getShaderAttributeCount() { return numAttributes; } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java new file mode 100644 index 000000000..613ff90bd --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java @@ -0,0 +1,35 @@ +package com.simibubi.create.foundation.render.instancing.actors; + +import com.simibubi.create.foundation.render.instancing.InstanceData; +import com.simibubi.create.foundation.render.instancing.VertexFormat; +import net.minecraft.client.renderer.Vector3f; + +import java.nio.ByteBuffer; + +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.NORMAL; + +public class DynamicRotatingActorData extends InstanceData { + public static VertexFormat FORMAT = new VertexFormat(NORMAL); + + private byte relativeMotionX; + private byte relativeMotionY; + private byte relativeMotionZ; + + public DynamicRotatingActorData setRelativeMotion(Vector3f axis) { + setRelativeMotion(axis.getX(), axis.getY(), axis.getZ()); + return this; + } + + public DynamicRotatingActorData setRelativeMotion(float relativeMotionX, float relativeMotionY, float relativeMotionZ) { + this.relativeMotionX = (byte) (relativeMotionX * 127); + this.relativeMotionY = (byte) (relativeMotionY * 127); + this.relativeMotionZ = (byte) (relativeMotionZ * 127); + return this; + } + + @Override + public void write(ByteBuffer buf) { + putVec3(buf, relativeMotionX, relativeMotionY, relativeMotionZ); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorBuffer.java new file mode 100644 index 000000000..6e33fc9f4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorBuffer.java @@ -0,0 +1,31 @@ +package com.simibubi.create.foundation.render.instancing.actors; + +import com.simibubi.create.foundation.render.instancing.DynamicInstanceBuffer; +import com.simibubi.create.foundation.render.instancing.VertexFormat; +import net.minecraft.client.renderer.BufferBuilder; + +public class RotatingActorBuffer extends DynamicInstanceBuffer { + public RotatingActorBuffer(BufferBuilder buf) { + super(buf); + } + + @Override + protected VertexFormat getDynamicFormat() { + return DynamicRotatingActorData.FORMAT; + } + + @Override + protected DynamicRotatingActorData newDynamicPart() { + return new DynamicRotatingActorData(); + } + + @Override + protected VertexFormat getInstanceFormat() { + return StaticRotatingActorData.FORMAT; + } + + @Override + protected StaticRotatingActorData newInstance() { + return new StaticRotatingActorData(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java new file mode 100644 index 000000000..48c71e91b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java @@ -0,0 +1,71 @@ +package com.simibubi.create.foundation.render.instancing.actors; + +import com.simibubi.create.foundation.render.instancing.InstanceData; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.instancing.VertexFormat; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.math.BlockPos; + +import java.nio.ByteBuffer; + +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; + +public class StaticRotatingActorData extends InstanceData { + public static VertexFormat FORMAT = new VertexFormat(POSITION, FLOAT, NORMAL, NORMAL); + + private float x; + private float y; + private float z; + private float rotationOffset; + private byte rotationAxisX; + private byte rotationAxisY; + private byte rotationAxisZ; + private byte localOrientationX; + private byte localOrientationY; + private byte localOrientationZ; + + public StaticRotatingActorData setPosition(BlockPos pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + return this; + } + + public StaticRotatingActorData setRotationOffset(float rotationOffset) { + this.rotationOffset = rotationOffset; + return this; + } + + public StaticRotatingActorData setRotationAxis(Vector3f axis) { + setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); + return this; + } + + public StaticRotatingActorData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { + this.rotationAxisX = (byte) (rotationAxisX * 127); + this.rotationAxisY = (byte) (rotationAxisY * 127); + this.rotationAxisZ = (byte) (rotationAxisZ * 127); + return this; + } + + public StaticRotatingActorData setLocalOrientation(Vector3f axis) { + setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); + return this; + } + + public StaticRotatingActorData setLocalOrientation(float localOrientationX, float localOrientationY, float localOrientationZ) { + this.localOrientationX = (byte) (localOrientationX * 127); + this.localOrientationY = (byte) (localOrientationY * 127); + this.localOrientationZ = (byte) (localOrientationZ * 127); + return this; + } + + @Override + public void write(ByteBuffer buf) { + putVec3(buf, x, y, z); + put(buf, rotationOffset); + putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); + putVec3(buf, localOrientationX, localOrientationY, localOrientationZ); + + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java index 2be9e5c96..38d0df8a9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java @@ -6,6 +6,7 @@ public enum Shader { CONTRAPTION_STRUCTURE("shader/contraption.vert", "shader/contraption.frag"), CONTRAPTION_ROTATING("shader/contraption_rotating.vert", "shader/contraption.frag"), CONTRAPTION_BELT("shader/contraption_belt.vert", "shader/contraption.frag"), + //CONTRAPTION_ACTOR("shader/contraption_actor.vert", "shader/contraption.frag"), ; public final String vert; diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert new file mode 100644 index 000000000..1c30f9d71 --- /dev/null +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -0,0 +1,68 @@ +#version 330 core +#define PI 3.1415926538 +// model data +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aNormal; +layout (location = 2) in vec2 aTexCoords; + +// instance data +layout (location = 3) in vec3 instancePos; +layout (location = 4) in float rotationOffset; +layout (location = 5) in vec3 localRotationAxis; +layout (location = 6) in vec3 localOrientation; + +// dynamic data +layout (location = 7) in vec3 relativeMotion; + +out float Diffuse; +out vec2 TexCoords; +out vec4 Color; +out vec3 BoxCoord; + +uniform vec3 lightBoxSize; +uniform vec3 lightBoxMin; +uniform mat4 model; + +uniform float time; +uniform int ticks; +uniform mat4 projection; +uniform mat4 view; +uniform int debug; + +mat4 rotate(vec3 axis, float angle) { + float s = sin(angle); + float c = cos(angle); + float oc = 1.0 - c; + + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); +} + +mat4 kineticRotation() { + float degrees = rotationOffset + time * speed * -3./10.; + float angle = fract(degrees / 360.) * PI * 2.; + + return rotate(normalize(localRotationAxis), angle); +} + +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); +} + +void main() { + mat4 kineticRotation = kineticRotation(); + vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos + 0.5, 0); + + vec4 worldPos = model * localPos; + + BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; + Diffuse = diffuse(normalize(model * kineticRotation * vec4(aNormal, 0.)).xyz); + Color = vec4(1.); + TexCoords = aTexCoords; + gl_Position = projection * view * worldPos; +} \ No newline at end of file From f6518d5c5d048cb0e9ba01bbe0d1c77050b6cf07 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 22 Jan 2021 11:28:39 -0800 Subject: [PATCH 044/147] insane amounts of refactoring surprisingly it all still works the same, but better maybe still some more cleanup to do --- .../com/simibubi/create/AllBlockPartials.java | 23 ++- .../com/simibubi/create/CreateClient.java | 3 +- .../base/KineticTileEntityRenderer.java | 8 +- .../actors/DrillMovementBehaviour.java | 5 + .../components/actors/DrillRenderer.java | 4 + .../components/saw/SawRenderer.java | 2 +- .../AbstractContraptionEntityRenderer.java | 4 +- .../ContraptionRenderer.java | 2 +- .../structureMovement/MovementBehaviour.java | 3 + .../advanced/SpeedControllerRenderer.java | 2 +- .../relays/belt/BeltRenderer.java | 55 +++--- .../create/foundation/render/Compartment.java | 12 ++ .../render/FastKineticRenderer.java | 174 ++++-------------- .../render/FastRenderDispatcher.java | 4 +- .../render/SuperByteBufferCache.java | 27 +-- .../{ => contraption}/ContraptionBuffer.java | 3 +- .../ContraptionKineticRenderer.java | 25 +++ .../ContraptionRenderDispatcher.java | 19 +- .../RenderedContraption.java | 34 +++- .../instancing/DynamicInstanceBuffer.java | 7 + .../render/instancing/InstanceContext.java | 10 +- .../instancing/KineticRenderMaterials.java | 6 + .../render/instancing/MaterialType.java | 3 + .../render/instancing/ModelFactory.java | 8 + .../render/instancing/RenderMaterial.java | 131 +++++++++++++ .../foundation/render/light/LightVolume.java | 1 + .../render/light/LightVolumeDebugger.java | 2 +- .../render/shader/ShaderHelper.java | 2 +- 28 files changed, 334 insertions(+), 245 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/Compartment.java rename src/main/java/com/simibubi/create/foundation/render/{ => contraption}/ContraptionBuffer.java (92%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java rename src/main/java/com/simibubi/create/foundation/render/{ => contraption}/ContraptionRenderDispatcher.java (80%) rename src/main/java/com/simibubi/create/foundation/render/{ => contraption}/RenderedContraption.java (80%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/MaterialType.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 2635a4a21..1eb2881ad 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -219,11 +220,11 @@ public class AllBlockPartials { } public InstanceBuffer renderOnRotating(InstanceContext ctx, BlockState referenceState) { - return ctx.getKinetics().renderPartialRotating(this, referenceState); + return ctx.getRotating().getModel(this, referenceState); } public InstanceBuffer renderOnBelt(InstanceContext ctx, BlockState referenceState) { - return ctx.getKinetics().renderPartialBelt(this, referenceState); + return ctx.getBelts().getModel(this, referenceState); } public InstanceBuffer renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState) { @@ -232,14 +233,16 @@ public class AllBlockPartials { } public InstanceBuffer renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState, Direction facing) { - MatrixStack ms = new MatrixStack(); - // TODO 1.15 find a way to cache this model matrix computation - MatrixStacker.of(ms) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing)) - .unCentre(); - return ctx.getKinetics().renderDirectionalPartialInstanced(this, referenceState, facing, ms); + Supplier ms = () -> { + MatrixStack stack = new MatrixStack(); + MatrixStacker.of(stack) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .unCentre(); + return stack; + }; + return ctx.getRotating().getModel(this, referenceState, facing, ms); } } diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index ca349a611..02fbacc5d 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,8 +16,7 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.RenderedContraption; +import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.FastKineticRenderer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index c064f762e..4f969416b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.SuperByteBufferCache.Compartment; +import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; @@ -61,12 +61,12 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer void renderRotatingKineticBlock(InstanceContext ctx, BlockState renderedState) { - InstanceBuffer instancedRenderer = ctx.getKinetics().renderBlockInstanced(KINETIC_TILE, renderedState); + InstanceBuffer instancedRenderer = ctx.getRotating().getModel(KINETIC_TILE, renderedState); renderRotatingBuffer(ctx, instancedRenderer); } public static void markForRebuild(InstanceContext ctx, BlockState renderedState) { - ctx.getKinetics().renderBlockInstanced(KINETIC_TILE, renderedState).clearInstanceData(); + ctx.getRotating().getModel(KINETIC_TILE, renderedState).clearInstanceData(); } public static void renderRotatingBuffer(InstanceContext ctx, InstanceBuffer instancer) { @@ -151,7 +151,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer getRotatedModel(InstanceContext ctx) { - return ctx.getKinetics().renderBlockInstanced(KINETIC_TILE, getRenderedBlockState(ctx.te)); + return ctx.getRotating().getModel(KINETIC_TILE, getRenderedBlockState(ctx.te)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index 62f8c319d..00f01202b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -34,6 +34,11 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { DrillRenderer.renderInContraption(context, ms, msLocal, buffer); } + @Override + public void addInstance(MovementContext context) { + super.addInstance(context); + } + @Override protected DamageSource getDamageSource() { return DrillBlock.damageSourceDrill; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index a54f8ff93..ca8474509 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -37,6 +37,10 @@ public class DrillRenderer extends KineticTileEntityRenderer { return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(state); } + public static void addInstanceForContraption(MovementContext context) { + //AllBlockPartials.DRILL_HEAD. + } + public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 75536539d..e35d85a0b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -141,7 +141,7 @@ public class SawRenderer extends SafeTileEntityRenderer implement BlockState state = te.getBlockState(); if (state.get(FACING).getAxis().isHorizontal()) return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); - return ctx.getKinetics().renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, + return ctx.getRotating().getModel(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index 2634d9f64..bb0e58296 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -2,9 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.RenderedContraption; -import net.java.games.input.Controller; +import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index 9b00b8f6e..b839f558d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -12,7 +12,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.render.SuperByteBufferCache.Compartment; +import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index bf25055fe..b4b3bf220 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -55,6 +55,9 @@ public abstract class MovementBehaviour { public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) {} + @OnlyIn(Dist.CLIENT) + public void addInstance(MovementContext context) {} + public void onSpeedChanged(MovementContext context, Vec3d oldMotion, Vec3d motion) { } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 073a6a792..5fade0d1d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -34,7 +34,7 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer getRotatedModel(InstanceContext ctx) { - return ctx.getKinetics().renderBlockInstanced(KineticTileEntityRenderer.KINETIC_TILE, + return ctx.getRotating().getModel(KineticTileEntityRenderer.KINETIC_TILE, KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(ctx.te))); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index bc8628880..c39af13c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -30,6 +30,7 @@ import net.minecraft.util.math.Vec3i; import net.minecraft.world.LightType; import java.util.Random; +import java.util.function.Supplier; public class BeltRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { @@ -82,8 +83,6 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme end = b; } - FastKineticRenderer fastKineticRenderer = ctx.getKinetics(); - for (boolean bottom : Iterate.trueAndFalse) { AllBlockPartials beltPartial = diagonal @@ -128,23 +127,7 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme } if (te.hasPulley()) { - // TODO 1.15 find a way to cache this model matrix computation - MatrixStack modelTransform = new MatrixStack(); - Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) - .rotateY(); - if (sideways) - dir = Direction.UP; - MatrixStacker msr = MatrixStacker.of(modelTransform); - msr.centre(); - if (dir.getAxis() == Axis.X) - msr.rotateY(90); - if (dir.getAxis() == Axis.Y) - msr.rotateX(90); - msr.rotateX(90); - msr.unCentre(); - - InstanceBuffer rotatingBuffer = fastKineticRenderer - .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + InstanceBuffer rotatingBuffer = getPulleyModel(ctx, blockState, sideways); KineticTileEntityRenderer.renderRotatingBuffer(ctx, rotatingBuffer); } } @@ -152,7 +135,6 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme @Override public void markForRebuild(InstanceContext ctx) { BeltTileEntity te = ctx.te; - FastKineticRenderer fastKineticRenderer = ctx.getKinetics(); BlockState blockState = te.getBlockState(); if (!AllBlocks.BELT.has(blockState)) @@ -197,25 +179,34 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme break; } - // TODO 1.15 find a way to cache this model matrix computation - MatrixStack modelTransform = new MatrixStack(); + InstanceBuffer rotatingBuffer = getPulleyModel(ctx, blockState, sideways); + + rotatingBuffer.clearInstanceData(); + } + + private InstanceBuffer getPulleyModel(InstanceContext ctx, BlockState blockState, boolean sideways) { Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) .rotateY(); if (sideways) dir = Direction.UP; - MatrixStacker msr = MatrixStacker.of(modelTransform); - msr.centre(); - if (dir.getAxis() == Axis.X) - msr.rotateY(90); - if (dir.getAxis() == Axis.Y) + + Axis axis = dir.getAxis(); + + Supplier ms = () -> { + MatrixStack modelTransform = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(modelTransform); + msr.centre(); + if (axis == Axis.X) + msr.rotateY(90); + if (axis == Axis.Y) + msr.rotateX(90); msr.rotateX(90); - msr.rotateX(90); - msr.unCentre(); + msr.unCentre(); - InstanceBuffer rotatingBuffer = fastKineticRenderer - .renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + return modelTransform; + }; - rotatingBuffer.clearInstanceData(); + return ctx.getRotating().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms); } protected void renderItems(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, diff --git a/src/main/java/com/simibubi/create/foundation/render/Compartment.java b/src/main/java/com/simibubi/create/foundation/render/Compartment.java new file mode 100644 index 000000000..646eb7191 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/Compartment.java @@ -0,0 +1,12 @@ +package com.simibubi.create.foundation.render; + +import com.simibubi.create.AllBlockPartials; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import org.apache.commons.lang3.tuple.Pair; + +public class Compartment { + public static final Compartment GENERIC_TILE = new Compartment<>(); + public static final Compartment PARTIAL = new Compartment<>(); + public static final Compartment> DIRECTIONAL_PARTIAL = new Compartment<>(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java index 3d0764187..d35a580b2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java @@ -1,56 +1,42 @@ package com.simibubi.create.foundation.render; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.contraption.RenderedContraption; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.render.shader.Shader; import com.simibubi.create.foundation.render.shader.ShaderCallback; import com.simibubi.create.foundation.render.shader.ShaderHelper; -import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.texture.Texture; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.inventory.container.PlayerContainer; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL13; -import org.lwjgl.opengl.GL40; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.function.Consumer; -import java.util.function.Supplier; - -import static com.simibubi.create.foundation.render.SuperByteBufferCache.PARTIAL; public class FastKineticRenderer { - Map, Cache>> rotating; - Map, Cache>> belts; + protected Map, RenderMaterial> materials = new HashMap<>(); public boolean dirty = false; public FastKineticRenderer() { - rotating = new HashMap<>(); - belts = new HashMap<>(); - registerCompartment(SuperByteBufferCache.PARTIAL); - registerCompartment(SuperByteBufferCache.DIRECTIONAL_PARTIAL); - registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); + registerMaterials(); } - public void buildTileEntityBuffers(World world) { + public void registerMaterials() { + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.BELT, BeltBuffer::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.ROTATING, RotatingBuffer::new)); + } + @SuppressWarnings("unchecked") + public > RenderMaterial get(MaterialType materialType) { + return (RenderMaterial) materials.get(materialType); + } + + @SuppressWarnings("unchecked") + public void buildTileEntityBuffers(World world) { List tileEntities = world.loadedTileEntityList; if (!tileEntities.isEmpty()) { @@ -66,11 +52,11 @@ public class FastKineticRenderer { } } - void addInstancedData(T te, IInstancedTileEntityRenderer renderer) { + public void addInstancedData(T te, IInstancedTileEntityRenderer renderer) { renderer.addInstanceData(new InstanceContext.World<>(te)); } - void addInstancedData(RenderedContraption c, T te, IInstancedTileEntityRenderer renderer) { + public void addInstancedData(RenderedContraption c, T te, IInstancedTileEntityRenderer renderer) { renderer.addInstanceData(new InstanceContext.Contraption<>(te, c)); } @@ -80,141 +66,45 @@ public class FastKineticRenderer { * guaranteed to be no race conditions with the render thread, i.e. when constructing a FastContraptionRenderer. */ public void markAllDirty() { - runOnAll(InstanceBuffer::markDirty); + for (RenderMaterial material : materials.values()) { + material.runOnAll(InstanceBuffer::markDirty); + } } public void invalidate() { - runOnAll(InstanceBuffer::delete); - belts.values().forEach(Cache::invalidateAll); - rotating.values().forEach(Cache::invalidateAll); + for (RenderMaterial material : materials.values()) { + material.runOnAll(InstanceBuffer::delete); + } dirty = true; } - private void runOnAll(Consumer> f) { - for (Cache> cache : rotating.values()) { - for (InstanceBuffer renderer : cache.asMap().values()) { - f.accept(renderer); - } - } - - for (Cache> cache : belts.values()) { - for (InstanceBuffer renderer : cache.asMap().values()) { - f.accept(renderer); - } - } + public void render(RenderType layer, Matrix4f projection, Matrix4f view) { + render(layer, projection, view, null); } - void renderBelts() { - for (Cache> cache : belts.values()) { - for (InstanceBuffer type : cache.asMap().values()) { - if (!type.isEmpty()) { - type.render(); - } - } - } - } - - void renderRotating() { - for (Cache> cache : rotating.values()) { - for (InstanceBuffer rotatingDataInstanceBuffer : cache.asMap().values()) { - if (!rotatingDataInstanceBuffer.isEmpty()) { - rotatingDataInstanceBuffer.render(); - } - } - } - } - - public void renderInstancesAsWorld(RenderType layer, Matrix4f projection, Matrix4f view) { + protected void prepareFrame() { if (dirty) { buildTileEntityBuffers(Minecraft.getInstance().world); markAllDirty(); dirty = false; } + } + + public void render(RenderType layer, Matrix4f projection, Matrix4f view, ShaderCallback callback) { + prepareFrame(); layer.startDrawing(); - ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projection, view); - - ShaderHelper.useShader(Shader.ROTATING, callback); - renderRotating(); - - ShaderHelper.useShader(Shader.BELT, callback); - renderBelts(); + for (RenderMaterial material : materials.values()) { + material.render(projection, view, callback); + } ShaderHelper.releaseShader(); layer.endDrawing(); } - public void registerCompartment(SuperByteBufferCache.Compartment instance) { - rotating.put(instance, CacheBuilder.newBuilder().build()); - belts.put(instance, CacheBuilder.newBuilder().build()); - } - - public InstanceBuffer renderPartialRotating(AllBlockPartials partial, BlockState referenceState) { - return getRotating(PARTIAL, partial, () -> rotatingInstancedRenderer(partial.get(), referenceState)); - } - - public InstanceBuffer renderPartialBelt(AllBlockPartials partial, BlockState referenceState) { - return getBelt(PARTIAL, partial, () -> beltInstancedRenderer(partial.get(), referenceState)); - } - - public InstanceBuffer renderDirectionalPartialInstanced(AllBlockPartials partial, BlockState referenceState, Direction dir, - MatrixStack modelTransform) { - return getRotating(SuperByteBufferCache.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> rotatingInstancedRenderer(partial.get(), referenceState, modelTransform)); - } - - public InstanceBuffer renderBlockInstanced(SuperByteBufferCache.Compartment compartment, BlockState toRender) { - return getRotating(compartment, toRender, () -> rotatingInstancedRenderer(toRender)); - } - - public InstanceBuffer getRotating(SuperByteBufferCache.Compartment compartment, T key, Supplier> supplier) { - Cache> compartmentCache = this.rotating.get(compartment); - try { - return compartmentCache.get(key, supplier::get); - } catch (ExecutionException e) { - e.printStackTrace(); - return null; - } - } - - public InstanceBuffer getBelt(SuperByteBufferCache.Compartment compartment, T key, Supplier> supplier) { - Cache> compartmentCache = this.belts.get(compartment); - try { - return compartmentCache.get(key, supplier::get); - } catch (ExecutionException e) { - e.printStackTrace(); - return null; - } - } - - private InstanceBuffer rotatingInstancedRenderer(BlockState renderedState) { - BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); - return rotatingInstancedRenderer(dispatcher.getModelForState(renderedState), renderedState); - } - - private InstanceBuffer rotatingInstancedRenderer(IBakedModel model, BlockState renderedState) { - return rotatingInstancedRenderer(model, renderedState, new MatrixStack()); - } - - private InstanceBuffer beltInstancedRenderer(IBakedModel model, BlockState renderedState) { - return beltInstancedRenderer(model, renderedState, new MatrixStack()); - } - - private InstanceBuffer rotatingInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { - BufferBuilder builder = SuperByteBufferCache.getBufferBuilder(model, referenceState, ms); - - return new RotatingBuffer(builder); - } - - private InstanceBuffer beltInstancedRenderer(IBakedModel model, BlockState referenceState, MatrixStack ms) { - BufferBuilder builder = SuperByteBufferCache.getBufferBuilder(model, referenceState, ms); - - return new BeltBuffer(builder); - } - public static RenderType getKineticRenderLayer() { return RenderType.getCutoutMipped(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index b5353d5dd..f79c59c74 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.render.instancing.InstanceContext; @@ -24,7 +25,6 @@ import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL30; import java.util.Map; @@ -46,7 +46,7 @@ public class FastRenderDispatcher { RenderSystem.enableDepthTest(); RenderSystem.enableCull(); GL11.glCullFace(GL11.GL_BACK); - CreateClient.kineticRenderer.renderInstancesAsWorld(type, projection, view); + CreateClient.kineticRenderer.render(type, projection, view); RenderSystem.disableCull(); //RenderSystem.disableDepthTest(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java index 39c8e33de..ab9e0fafa 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java @@ -27,20 +27,13 @@ import net.minecraft.util.math.BlockPos; public class SuperByteBufferCache { - public static class Compartment { - } - - public static final Compartment GENERIC_TILE = new Compartment<>(); - public static final Compartment PARTIAL = new Compartment<>(); - public static final Compartment> DIRECTIONAL_PARTIAL = new Compartment<>(); - Map, Cache> cache; public SuperByteBufferCache() { cache = new HashMap<>(); - registerCompartment(GENERIC_TILE); - registerCompartment(PARTIAL); - registerCompartment(DIRECTIONAL_PARTIAL); + registerCompartment(Compartment.GENERIC_TILE); + registerCompartment(Compartment.PARTIAL); + registerCompartment(Compartment.DIRECTIONAL_PARTIAL); } public SuperByteBuffer renderBlock(BlockState toRender) { @@ -48,23 +41,23 @@ public class SuperByteBufferCache { } public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState) { - return get(PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState)); + return get(Compartment.PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState)); } public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState, MatrixStack modelTransform) { - return get(PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState, modelTransform)); + return get(Compartment.PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState, modelTransform)); } public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, Direction dir) { - return get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> standardModelRender(partial.get(), referenceState)); + return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> standardModelRender(partial.get(), referenceState)); } public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, Direction dir, MatrixStack modelTransform) { - return get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> standardModelRender(partial.get(), referenceState, modelTransform)); + return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> standardModelRender(partial.get(), referenceState, modelTransform)); } public SuperByteBuffer renderBlockIn(Compartment compartment, BlockState toRender) { @@ -72,7 +65,7 @@ public class SuperByteBufferCache { } SuperByteBuffer getGeneric(BlockState key, Supplier supplier) { - return get(GENERIC_TILE, key, supplier); + return get(Compartment.GENERIC_TILE, key, supplier); } public SuperByteBuffer get(Compartment compartment, T key, Supplier supplier) { diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionBuffer.java similarity index 92% rename from src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionBuffer.java index 89e76292a..d9d59f0e9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ContraptionBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionBuffer.java @@ -1,6 +1,7 @@ -package com.simibubi.create.foundation.render; +package com.simibubi.create.foundation.render.contraption; import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.render.GPUBuffer; import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java new file mode 100644 index 000000000..b06626d16 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java @@ -0,0 +1,25 @@ +package com.simibubi.create.foundation.render.contraption; + +import com.simibubi.create.foundation.render.FastKineticRenderer; +import com.simibubi.create.foundation.render.instancing.BeltBuffer; +import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; +import com.simibubi.create.foundation.render.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.render.shader.Shader; +import com.simibubi.create.foundation.render.shader.ShaderCallback; +import com.simibubi.create.foundation.render.shader.ShaderHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; + +public class ContraptionKineticRenderer extends FastKineticRenderer { + + @Override + public void registerMaterials() { + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.CONTRAPTION_BELT, BeltBuffer::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.CONTRAPTION_ROTATING, RotatingBuffer::new)); + } + + @Override + protected void prepareFrame() {} +} diff --git a/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java similarity index 80% rename from src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java rename to src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index 0689583a7..039c3ed27 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -1,17 +1,13 @@ -package com.simibubi.create.foundation.render; +package com.simibubi.create.foundation.render.contraption; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.render.light.LightVolume; +import com.simibubi.create.foundation.render.FastKineticRenderer; import com.simibubi.create.foundation.render.shader.Shader; import com.simibubi.create.foundation.render.shader.ShaderCallback; import com.simibubi.create.foundation.render.shader.ShaderHelper; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; @@ -64,17 +60,8 @@ public class ContraptionRenderDispatcher { } if (renderType == FastKineticRenderer.getKineticRenderLayer()) { - int rotatingShader = ShaderHelper.useShader(Shader.CONTRAPTION_ROTATING, callback); for (RenderedContraption renderer : renderers.values()) { - renderer.setup(rotatingShader); - renderer.kinetics.renderRotating(); - renderer.teardown(); - } - - int beltShader = ShaderHelper.useShader(Shader.CONTRAPTION_BELT, callback); - for (RenderedContraption renderer : renderers.values()) { - renderer.setup(beltShader); - renderer.kinetics.renderBelts(); + renderer.kinetics.render(renderType, projectionMat, viewMat, renderer::setup); renderer.teardown(); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java similarity index 80% rename from src/main/java/com/simibubi/create/foundation/render/RenderedContraption.java rename to src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index 07f87978c..e000cb20e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -1,12 +1,15 @@ -package com.simibubi.create.foundation.render; +package com.simibubi.create.foundation.render.contraption; import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.FastKineticRenderer; import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.render.light.LightVolume; import com.simibubi.create.foundation.render.shader.ShaderHelper; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Matrix4f; @@ -14,15 +17,11 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.SectionPos; -import net.minecraft.world.ILightReader; -import net.minecraft.world.LightType; import net.minecraft.world.World; -import org.lwjgl.opengl.GL20; +import net.minecraft.world.gen.feature.template.Template; +import org.apache.commons.lang3.tuple.MutablePair; import java.nio.FloatBuffer; -import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -31,7 +30,7 @@ public class RenderedContraption { private final ContraptionLighter lighter; - public final FastKineticRenderer kinetics; + public final ContraptionKineticRenderer kinetics; private Contraption contraption; @@ -40,7 +39,7 @@ public class RenderedContraption { public RenderedContraption(World world, Contraption contraption) { this.contraption = contraption; this.lighter = contraption.makeLighter(); - this.kinetics = new FastKineticRenderer(); + this.kinetics = new ContraptionKineticRenderer(); buildLayers(contraption); buildInstancedTiles(contraption); @@ -98,6 +97,21 @@ public class RenderedContraption { kinetics.markAllDirty(); } + private void buildActors(Contraption c) { + List> actors = c.getActors(); + + for (MutablePair actor : actors) { + Template.BlockInfo blockInfo = actor.left; + MovementContext context = actor.right; + + MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); + + if (movementBehaviour != null) { + movementBehaviour.addInstance(context); + } + } + } + void setRenderSettings(Matrix4f model) { this.model = model; } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java index 0abba029c..e4e90992d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java @@ -27,4 +27,11 @@ public abstract class DynamicInstanceBuffer { this.te = te; } + public RenderMaterial> getRotating() { + return getKinetics().get(KineticRenderMaterials.ROTATING); + } + + public RenderMaterial> getBelts() { + return getKinetics().get(KineticRenderMaterials.BELTS); + } + public abstract FastKineticRenderer getKinetics(); public abstract boolean checkWorldLight(); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java new file mode 100644 index 000000000..5c0d4e658 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java @@ -0,0 +1,6 @@ +package com.simibubi.create.foundation.render.instancing; + +public class KineticRenderMaterials { + public static final MaterialType> ROTATING = new MaterialType<>(); + public static final MaterialType> BELTS = new MaterialType<>(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/MaterialType.java b/src/main/java/com/simibubi/create/foundation/render/instancing/MaterialType.java new file mode 100644 index 000000000..d3ef03f94 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/MaterialType.java @@ -0,0 +1,3 @@ +package com.simibubi.create.foundation.render.instancing; + +public class MaterialType { } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java b/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java new file mode 100644 index 000000000..36120053b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java @@ -0,0 +1,8 @@ +package com.simibubi.create.foundation.render.instancing; + +import net.minecraft.client.renderer.BufferBuilder; + +@FunctionalInterface +public interface ModelFactory> { + B convert(BufferBuilder buf); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java new file mode 100644 index 000000000..0679ec855 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java @@ -0,0 +1,131 @@ +package com.simibubi.create.foundation.render.instancing; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.Compartment; +import com.simibubi.create.foundation.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.shader.Shader; +import com.simibubi.create.foundation.render.shader.ShaderCallback; +import com.simibubi.create.foundation.render.shader.ShaderHelper; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.util.Direction; +import org.apache.commons.lang3.tuple.Pair; +import org.lwjgl.opengl.GL40; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import static com.simibubi.create.foundation.render.Compartment.PARTIAL; + +public class RenderMaterial> { + + protected final Map, Cache> models; + protected final ModelFactory factory; + protected final Shader shader; + + public RenderMaterial(Shader shader, ModelFactory factory) { + this.models = new HashMap<>(); + this.factory = factory; + this.shader = shader; + registerCompartment(Compartment.PARTIAL); + registerCompartment(Compartment.DIRECTIONAL_PARTIAL); + registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); + } + + public void render(Matrix4f projection, Matrix4f view) { + render(projection, view, null); + } + + public void render(Matrix4f projection, Matrix4f view, ShaderCallback setup) { + int handle = setupShader(projection, view); + if (setup != null) setup.call(handle); + makeRenderCalls(); + teardown(); + } + + protected int setupShader(Matrix4f projection, Matrix4f view) { + ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projection, view); + + return ShaderHelper.useShader(shader, callback); + } + + public void teardown() {} + + public void delete() { + runOnAll(InstanceBuffer::delete); + models.values().forEach(Cache::invalidateAll); + } + + protected void makeRenderCalls() { + for (Cache cache : models.values()) { + for (MODEL model : cache.asMap().values()) { + if (!model.isEmpty()) { + model.render(); + } + } + } + } + + public void runOnAll(Consumer f) { + for (Cache cache : models.values()) { + for (MODEL model : cache.asMap().values()) { + f.accept(model); + } + } + } + + public void registerCompartment(Compartment instance) { + models.put(instance, CacheBuilder.newBuilder().build()); + } + + public MODEL getModel(AllBlockPartials partial, BlockState referenceState) { + return get(PARTIAL, partial, () -> buildModel(partial.get(), referenceState)); + } + + public MODEL getModel(AllBlockPartials partial, BlockState referenceState, Direction dir, Supplier modelTransform) { + return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> buildModel(partial.get(), referenceState, modelTransform.get())); + } + + public MODEL getModel(Compartment compartment, BlockState toRender) { + return get(compartment, toRender, () -> buildModel(toRender)); + } + + public MODEL get(Compartment compartment, T key, Supplier supplier) { + Cache compartmentCache = models.get(compartment); + try { + return compartmentCache.get(key, supplier::get); + } catch (ExecutionException e) { + e.printStackTrace(); + return null; + } + } + + private MODEL buildModel(BlockState renderedState) { + BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + return buildModel(dispatcher.getModelForState(renderedState), renderedState); + } + + private MODEL buildModel(IBakedModel model, BlockState renderedState) { + return buildModel(model, renderedState, new MatrixStack()); + } + + private MODEL buildModel(IBakedModel model, BlockState referenceState, MatrixStack ms) { + BufferBuilder builder = SuperByteBufferCache.getBufferBuilder(model, referenceState, ms); + + return factory.convert(builder); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index 0f896cd2b..aae5a6b28 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -159,6 +159,7 @@ public class LightVolume { // just in case something goes wrong or we accidentally call this before this volume is properly disposed of. if (glTexture == 0 || lightData == null) return; + GL13.glActiveTexture(GL40.GL_TEXTURE4); GL12.glBindTexture(GL12.GL_TEXTURE_3D, glTexture); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java index 287532a40..651d0c5eb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.render.light; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.outliner.AABBOutline; diff --git a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java index 63e79bcf4..e0f915231 100644 --- a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java @@ -31,7 +31,7 @@ public class ShaderHelper { public static final Logger log = LogManager.getLogger("shader"); - public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); + public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); // TODO: these leak 80 bytes of memory per program launch public static final FloatBuffer VEC3_BUFFER = MemoryUtil.memAllocFloat(3); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); From cfd60fbc8d0de750065421eb8f196e6b411d8145 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 22 Jan 2021 18:00:14 -0800 Subject: [PATCH 045/147] fast actor rendering but it's not correct yet --- .../actors/DrillMovementBehaviour.java | 7 ++-- .../components/actors/DrillRenderer.java | 20 +++++++++- .../actors/HarvesterMovementBehaviour.java | 8 +++- .../components/actors/HarvesterRenderer.java | 24 ++++++++++++ .../structureMovement/MovementBehaviour.java | 3 +- .../render/FastKineticRenderer.java | 2 +- .../ContraptionKineticRenderer.java | 7 +--- .../contraption/RenderedContraption.java | 14 ++++--- .../render/instancing/InstanceBuffer.java | 4 +- .../instancing/KineticRenderMaterials.java | 4 ++ .../actors/StaticRotatingActorData.java | 39 +++++++++++++------ .../foundation/render/shader/Shader.java | 2 +- .../create/shader/contraption_actor.vert | 18 +++++++-- 13 files changed, 115 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index 00f01202b..dd5441db7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.actors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.contraption.RenderedContraption; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -31,12 +32,12 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { @OnlyIn(value = Dist.CLIENT) public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { - DrillRenderer.renderInContraption(context, ms, msLocal, buffer); + //DrillRenderer.renderInContraption(context, ms, msLocal, buffer); } @Override - public void addInstance(MovementContext context) { - super.addInstance(context); + public void addInstance(RenderedContraption contraption, MovementContext context) { + DrillRenderer.addInstanceForContraption(contraption, context); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index ca8474509..e9e267ad9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -7,6 +7,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.foundation.render.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -19,6 +22,7 @@ import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; @@ -37,8 +41,20 @@ public class DrillRenderer extends KineticTileEntityRenderer { return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(state); } - public static void addInstanceForContraption(MovementContext context) { - //AllBlockPartials.DRILL_HEAD. + public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) { + RenderMaterial> renderMaterial = contraption.getActorMaterial(); + + BlockState state = context.state; + InstanceBuffer model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); + + model.setupInstance(data -> { + Direction facing = state.get(DrillBlock.FACING); + Vector3f orientation = facing.getOpposite().getUnitVector(); + data.setPosition(context.localPos) + .setRotationOffset(0) + .setRotationAxis(orientation) + .setLocalRotation(AngleHelper.verticalAngle(facing), facing.getHorizontalAngle(), 0); + }); } public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index 38d5f55f8..a70af09ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.actors; import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; +import com.simibubi.create.foundation.render.contraption.RenderedContraption; import org.apache.commons.lang3.mutable.MutableBoolean; import com.mojang.blaze3d.matrix.MatrixStack; @@ -35,10 +36,15 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { .getOpposite()); } + @Override + public void addInstance(RenderedContraption contraption, MovementContext context) { + HarvesterRenderer.addInstanceForContraption(contraption, context); + } + @Override public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffers) { - HarvesterRenderer.renderInContraption(context, ms, msLocal, buffers); + //HarvesterRenderer.renderInContraption(context, ms, msLocal, buffers); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index f3933f0c8..c07e61054 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -5,6 +5,10 @@ import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FAC import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -14,6 +18,7 @@ import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -34,6 +39,25 @@ public class HarvesterRenderer extends SafeTileEntityRenderer> renderMaterial = contraption.getActorMaterial(); + + BlockState state = context.state; + InstanceBuffer model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); + + model.setupInstance(data -> { + Direction facing = state.get(HORIZONTAL_FACING); + Direction rotationAxis = facing.rotateY(); + float originOffset = 1 / 16f; + Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); + data.setPosition(context.localPos) + .setRotationOffset(0) + .setRotationCenter(rotOffset) + .setRotationAxis(rotationAxis.getUnitVector()) + .setLocalRotation(0, facing.getHorizontalAngle(), 0); + }); + } + public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffers) { BlockState blockState = context.state; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index b4b3bf220..d82dcfe38 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.render.contraption.RenderedContraption; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; @@ -56,7 +57,7 @@ public abstract class MovementBehaviour { IRenderTypeBuffer buffer) {} @OnlyIn(Dist.CLIENT) - public void addInstance(MovementContext context) {} + public void addInstance(RenderedContraption contraption, MovementContext context) {} public void onSpeedChanged(MovementContext context, Vec3d oldMotion, Vec3d motion) { diff --git a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java index d35a580b2..a0634c0ac 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java @@ -73,7 +73,7 @@ public class FastKineticRenderer { public void invalidate() { for (RenderMaterial material : materials.values()) { - material.runOnAll(InstanceBuffer::delete); + material.delete(); } dirty = true; } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java index b06626d16..215180d86 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java @@ -5,12 +5,8 @@ import com.simibubi.create.foundation.render.instancing.BeltBuffer; import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; import com.simibubi.create.foundation.render.instancing.RenderMaterial; import com.simibubi.create.foundation.render.instancing.RotatingBuffer; +import com.simibubi.create.foundation.render.instancing.actors.RotatingActorBuffer; import com.simibubi.create.foundation.render.shader.Shader; -import com.simibubi.create.foundation.render.shader.ShaderCallback; -import com.simibubi.create.foundation.render.shader.ShaderHelper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; public class ContraptionKineticRenderer extends FastKineticRenderer { @@ -18,6 +14,7 @@ public class ContraptionKineticRenderer extends FastKineticRenderer { public void registerMaterials() { materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.CONTRAPTION_BELT, BeltBuffer::new)); materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.CONTRAPTION_ROTATING, RotatingBuffer::new)); + materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(Shader.CONTRAPTION_ACTOR, RotatingActorBuffer::new)); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index e000cb20e..fab94150c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.FastKineticRenderer; -import com.simibubi.create.foundation.render.instancing.IInstanceRendered; -import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; +import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.render.light.ContraptionLighter; import com.simibubi.create.foundation.render.shader.ShaderHelper; import net.minecraft.client.renderer.BufferBuilder; @@ -43,6 +43,8 @@ public class RenderedContraption { buildLayers(contraption); buildInstancedTiles(contraption); + buildActors(contraption); + kinetics.markAllDirty(); } public int getEntityId() { @@ -57,6 +59,10 @@ public class RenderedContraption { return lighter; } + public RenderMaterial> getActorMaterial() { + return kinetics.get(KineticRenderMaterials.ACTORS); + } + public void doRenderLayer(RenderType layer, int shader) { ContraptionBuffer buffer = renderLayers.get(layer); if (buffer != null) { @@ -93,8 +99,6 @@ public class RenderedContraption { } } } - - kinetics.markAllDirty(); } private void buildActors(Contraption c) { @@ -107,7 +111,7 @@ public class RenderedContraption { MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); if (movementBehaviour != null) { - movementBehaviour.addInstance(context); + movementBehaviour.addInstance(this, context); } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java index 67a6ddcbf..bbb729de3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java @@ -99,7 +99,7 @@ public abstract class InstanceBuffer extends GPUBuffer { } protected int getTotalShaderAttributeCount() { - return getInstanceFormat().getShaderAttributeCount() + FORMAT.getShaderAttributeCount(); + return getInstanceFormat().getShaderAttributeCount() + super.getTotalShaderAttributeCount(); } @Override @@ -130,7 +130,7 @@ public abstract class InstanceBuffer extends GPUBuffer { buffer.rewind(); GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); - int staticAttributes = FORMAT.getShaderAttributeCount(); + int staticAttributes = getModelFormat().getShaderAttributeCount(); instanceFormat.informAttributes(staticAttributes); for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java index 5c0d4e658..cd941f5d9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java @@ -1,6 +1,10 @@ package com.simibubi.create.foundation.render.instancing; +import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; + public class KineticRenderMaterials { public static final MaterialType> ROTATING = new MaterialType<>(); public static final MaterialType> BELTS = new MaterialType<>(); + + public static final MaterialType> ACTORS = new MaterialType<>(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java index 48c71e91b..1b99cbd59 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java @@ -1,7 +1,6 @@ package com.simibubi.create.foundation.render.instancing.actors; import com.simibubi.create.foundation.render.instancing.InstanceData; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; @@ -11,7 +10,7 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class StaticRotatingActorData extends InstanceData { - public static VertexFormat FORMAT = new VertexFormat(POSITION, FLOAT, NORMAL, NORMAL); + public static VertexFormat FORMAT = new VertexFormat(POSITION, FLOAT, NORMAL, VEC3, NORMAL); private float x; private float y; @@ -20,9 +19,12 @@ public class StaticRotatingActorData extends InstanceData { private byte rotationAxisX; private byte rotationAxisY; private byte rotationAxisZ; - private byte localOrientationX; - private byte localOrientationY; - private byte localOrientationZ; + private float localRotationX; + private float localRotationY; + private float localRotationZ; + private byte rotationCenterX = 64; + private byte rotationCenterY = 64; + private byte rotationCenterZ = 64; public StaticRotatingActorData setPosition(BlockPos pos) { this.x = pos.getX(); @@ -48,15 +50,27 @@ public class StaticRotatingActorData extends InstanceData { return this; } - public StaticRotatingActorData setLocalOrientation(Vector3f axis) { - setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); + public StaticRotatingActorData setRotationCenter(Vector3f axis) { + setRotationCenter(axis.getX(), axis.getY(), axis.getZ()); return this; } - public StaticRotatingActorData setLocalOrientation(float localOrientationX, float localOrientationY, float localOrientationZ) { - this.localOrientationX = (byte) (localOrientationX * 127); - this.localOrientationY = (byte) (localOrientationY * 127); - this.localOrientationZ = (byte) (localOrientationZ * 127); + public StaticRotatingActorData setRotationCenter(float rotationCenterX, float rotationCenterY, float rotationCenterZ) { + this.rotationCenterX = (byte) (rotationCenterX * 127); + this.rotationCenterY = (byte) (rotationCenterY * 127); + this.rotationCenterZ = (byte) (rotationCenterZ * 127); + return this; + } + + public StaticRotatingActorData setLocalRotation(Vector3f axis) { + setLocalRotation(axis.getX(), axis.getY(), axis.getZ()); + return this; + } + + public StaticRotatingActorData setLocalRotation(float localRotationX, float localRotationY, float localRotationZ) { + this.localRotationX = localRotationX; + this.localRotationY = localRotationY; + this.localRotationZ = localRotationZ; return this; } @@ -65,7 +79,8 @@ public class StaticRotatingActorData extends InstanceData { putVec3(buf, x, y, z); put(buf, rotationOffset); putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); - putVec3(buf, localOrientationX, localOrientationY, localOrientationZ); + putVec3(buf, localRotationX, localRotationY, localRotationZ); + putVec3(buf, rotationCenterX, rotationCenterY, rotationCenterZ); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java index 38d0df8a9..075b963b5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java @@ -6,7 +6,7 @@ public enum Shader { CONTRAPTION_STRUCTURE("shader/contraption.vert", "shader/contraption.frag"), CONTRAPTION_ROTATING("shader/contraption_rotating.vert", "shader/contraption.frag"), CONTRAPTION_BELT("shader/contraption_belt.vert", "shader/contraption.frag"), - //CONTRAPTION_ACTOR("shader/contraption_actor.vert", "shader/contraption.frag"), + CONTRAPTION_ACTOR("shader/contraption_actor.vert", "shader/contraption.frag"), ; public final String vert; diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index 1c30f9d71..94083048e 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -9,10 +9,11 @@ layout (location = 2) in vec2 aTexCoords; layout (location = 3) in vec3 instancePos; layout (location = 4) in float rotationOffset; layout (location = 5) in vec3 localRotationAxis; -layout (location = 6) in vec3 localOrientation; +layout (location = 6) in vec3 localRotation; +layout (location = 7) in vec3 rotationCenter; // dynamic data -layout (location = 7) in vec3 relativeMotion; +//layout (location = 7) in vec3 relativeMotion; out float Diffuse; out vec2 TexCoords; @@ -40,7 +41,12 @@ mat4 rotate(vec3 axis, float angle) { 0., 0., 0., 1.); } +mat4 rotation(vec3 rot) { + return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); +} + mat4 kineticRotation() { + const float speed = 20; float degrees = rotationOffset + time * speed * -3./10.; float angle = fract(degrees / 360.) * PI * 2.; @@ -55,13 +61,17 @@ float diffuse(vec3 normal) { } void main() { + vec3 rot = fract(localRotation / 360.) * PI * 2.; + mat4 localRot = rotation(rot); + vec4 localPos = localRot * vec4(aPos - 0.5, 1f) + vec4(0.5, 0.5, 0.5, 0); + mat4 kineticRotation = kineticRotation(); - vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos + 0.5, 0); + localPos = kineticRotation * vec4(localPos.xyz - rotationCenter, 1) + vec4(instancePos + rotationCenter, 0); vec4 worldPos = model * localPos; BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(model * kineticRotation * vec4(aNormal, 0.)).xyz); + Diffuse = diffuse(normalize(model * localRot * kineticRotation * vec4(aNormal, 0.)).xyz); Color = vec4(1.); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; From 83cb735e629b99e742e8dab8b382874a357ce2df Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 23 Jan 2021 12:49:33 -0800 Subject: [PATCH 046/147] actors render correctly --- .../components/actors/DrillRenderer.java | 3 +- .../components/actors/HarvesterRenderer.java | 3 +- .../simibubi/create/events/ClientEvents.java | 6 ++++ .../render/FastKineticRenderer.java | 11 ++----- .../render/FastRenderDispatcher.java | 18 +++++----- .../create/foundation/render/GPUBuffer.java | 4 ++- .../ContraptionRenderDispatcher.java | 19 ++++------- .../render/instancing/RenderMaterial.java | 33 ++++++++++++------- .../foundation/render/light/LightVolume.java | 17 ++++++---- .../render/shader/ShaderCallback.java | 7 ++++ .../assets/create/shader/contraption.vert | 10 +++++- .../create/shader/contraption_actor.vert | 22 +++++++++---- .../create/shader/contraption_belt.vert | 11 +++++-- .../create/shader/contraption_rotating.vert | 11 +++++-- 14 files changed, 111 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index e9e267ad9..d3edadc79 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -49,10 +49,9 @@ public class DrillRenderer extends KineticTileEntityRenderer { model.setupInstance(data -> { Direction facing = state.get(DrillBlock.FACING); - Vector3f orientation = facing.getOpposite().getUnitVector(); data.setPosition(context.localPos) .setRotationOffset(0) - .setRotationAxis(orientation) + .setRotationAxis(0, 0, 1) .setLocalRotation(AngleHelper.verticalAngle(facing), facing.getHorizontalAngle(), 0); }); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index c07e61054..29a006d6f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -47,13 +47,12 @@ public class HarvesterRenderer extends SafeTileEntityRenderer { Direction facing = state.get(HORIZONTAL_FACING); - Direction rotationAxis = facing.rotateY(); float originOffset = 1 / 16f; Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); data.setPosition(context.localPos) .setRotationOffset(0) .setRotationCenter(rotOffset) - .setRotationAxis(rotationAxis.getUnitVector()) + .setRotationAxis(-1, 0, 0) .setLocalRotation(0, facing.getHorizontalAngle(), 0); }); } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index dd58db9cd..39a622a52 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -114,6 +114,12 @@ public class ClientEvents { AnimationTickHolder.ticks = 0; } + @SubscribeEvent + public static void onUnloadWorld(WorldEvent.Unload event) { + CreateClient.invalidateRenderers(); + AnimationTickHolder.ticks = 0; + } + @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); diff --git a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java index a0634c0ac..85a020d00 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java @@ -94,18 +94,11 @@ public class FastKineticRenderer { public void render(RenderType layer, Matrix4f projection, Matrix4f view, ShaderCallback callback) { prepareFrame(); - layer.startDrawing(); - for (RenderMaterial material : materials.values()) { - material.render(projection, view, callback); + if (material.canRenderInLayer(layer)) + material.render(layer, projection, view, callback); } ShaderHelper.releaseShader(); - - layer.endDrawing(); - } - - public static RenderType getKineticRenderLayer() { - return RenderType.getCutoutMipped(); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index f79c59c74..8ce6ef538 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -7,6 +7,7 @@ import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispat import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.shader.ShaderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; @@ -41,17 +42,18 @@ public class FastRenderDispatcher { view.multiplyBackward(stack.peek().getModel()); Matrix4f projection = getProjectionMatrix(); + type.startDrawing(); - if (type == FastKineticRenderer.getKineticRenderLayer()) { - RenderSystem.enableDepthTest(); - RenderSystem.enableCull(); - GL11.glCullFace(GL11.GL_BACK); - CreateClient.kineticRenderer.render(type, projection, view); - RenderSystem.disableCull(); - //RenderSystem.disableDepthTest(); - } + RenderSystem.enableDepthTest(); + RenderSystem.enableCull(); + GL11.glCullFace(GL11.GL_BACK); + CreateClient.kineticRenderer.render(type, projection, view); + RenderSystem.disableCull(); + //RenderSystem.disableDepthTest(); ContraptionRenderDispatcher.renderLayer(type, projection, view); + ShaderHelper.releaseShader(); + type.endDrawing(); } public static void notifyLightUpdate(ClientChunkProvider world, LightType type, SectionPos pos) { diff --git a/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java b/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java index 854b814e8..0f7c3e167 100644 --- a/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java @@ -13,6 +13,7 @@ import java.nio.ByteBuffer; public abstract class GPUBuffer extends TemplateBuffer { protected int vao, ebo, invariantVBO; + protected boolean removed; public GPUBuffer(BufferBuilder buf) { super(buf); @@ -68,7 +69,7 @@ public abstract class GPUBuffer extends TemplateBuffer { } public void render() { - if (vao == 0) return; + if (vao == 0 || removed) return; GL30.glBindVertexArray(vao); preDrawTask(); @@ -91,6 +92,7 @@ public abstract class GPUBuffer extends TemplateBuffer { } public void delete() { + removed = true; if (vertexCount > 0) { RenderWork.enqueue(this::deleteInternal); } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index 039c3ed27..5f55119fd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -43,12 +43,12 @@ public class ContraptionRenderDispatcher { return renderer; } - public static void renderLayer(RenderType renderType, Matrix4f projectionMat, Matrix4f viewMat) { + public static void renderLayer(RenderType layer, Matrix4f projectionMat, Matrix4f viewMat) { removeDeadContraptions(); if (renderers.isEmpty()) return; - renderType.startDrawing(); + layer.startDrawing(); GL11.glEnable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 @@ -56,20 +56,15 @@ public class ContraptionRenderDispatcher { int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); for (RenderedContraption renderer : renderers.values()) { - renderer.doRenderLayer(renderType, structureShader); + renderer.doRenderLayer(layer, structureShader); } - if (renderType == FastKineticRenderer.getKineticRenderLayer()) { - for (RenderedContraption renderer : renderers.values()) { - renderer.kinetics.render(renderType, projectionMat, viewMat, renderer::setup); - renderer.teardown(); - } + for (RenderedContraption renderer : renderers.values()) { + renderer.kinetics.render(layer, projectionMat, viewMat, renderer::setup); + renderer.teardown(); } - ShaderHelper.releaseShader(); - - - renderType.endDrawing(); + layer.endDrawing(); GL11.glDisable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE0); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java index 0679ec855..95cf9aa59 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java @@ -25,6 +25,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.function.Supplier; import static com.simibubi.create.foundation.render.Compartment.PARTIAL; @@ -34,33 +35,43 @@ public class RenderMaterial> { protected final Map, Cache> models; protected final ModelFactory factory; protected final Shader shader; + protected final Predicate layerPredicate; + /** + * Creates a material that renders in the default layer (CUTOUT_MIPPED) + */ public RenderMaterial(Shader shader, ModelFactory factory) { + this(shader, factory, type -> type == RenderType.getCutoutMipped()); + } + + public RenderMaterial(Shader shader, ModelFactory factory, Predicate layerPredicate) { this.models = new HashMap<>(); this.factory = factory; this.shader = shader; + this.layerPredicate = layerPredicate; registerCompartment(Compartment.PARTIAL); registerCompartment(Compartment.DIRECTIONAL_PARTIAL); registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); } - public void render(Matrix4f projection, Matrix4f view) { - render(projection, view, null); + public boolean canRenderInLayer(RenderType layer) { + return layerPredicate.test(layer); } - public void render(Matrix4f projection, Matrix4f view, ShaderCallback setup) { - int handle = setupShader(projection, view); - if (setup != null) setup.call(handle); + public void render(RenderType layer, Matrix4f projection, Matrix4f view) { + render(layer, projection, view, null); + } + + public void render(RenderType layer, Matrix4f projection, Matrix4f view, ShaderCallback setup) { + ShaderCallback cb = ShaderHelper.getViewProjectionCallback(projection, view); + + if (setup != null) cb = cb.andThen(setup); + + ShaderHelper.useShader(shader, cb); makeRenderCalls(); teardown(); } - protected int setupShader(Matrix4f projection, Matrix4f view) { - ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projection, view); - - return ShaderHelper.useShader(shader, callback); - } - public void teardown() {} public void delete() { diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index aae5a6b28..ac2c89a3c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -9,6 +9,7 @@ import org.lwjgl.opengl.*; import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicBoolean; // TODO: Don't immediately destroy light volumes. // There's a high chance that a contraption will stop and soon after start again. @@ -20,7 +21,8 @@ public class LightVolume { private final GridAlignedBB textureVolume; private ByteBuffer lightData; - private boolean bufferDirty; + private final AtomicBoolean bufferDirty = new AtomicBoolean(false); + private boolean removed; private int glTexture; @@ -108,7 +110,7 @@ public class LightVolume { writeLight(x - shiftX, y - shiftY, z - shiftZ, blockLight, skyLight); }); - bufferDirty = true; + bufferDirty.set(true); } /** @@ -130,7 +132,7 @@ public class LightVolume { writeBlock(x - xShift, y - yShift, z - zShift, light); }); - bufferDirty = true; + bufferDirty.set(true); } /** @@ -152,12 +154,12 @@ public class LightVolume { writeSky(x - xShift, y - yShift, z - zShift, light); }); - bufferDirty = true; + bufferDirty.set(true); } public void use() { // just in case something goes wrong or we accidentally call this before this volume is properly disposed of. - if (glTexture == 0 || lightData == null) return; + if (glTexture == 0 || lightData == null || removed) return; GL13.glActiveTexture(GL40.GL_TEXTURE4); GL12.glBindTexture(GL12.GL_TEXTURE_3D, glTexture); @@ -166,9 +168,9 @@ public class LightVolume { GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL20.GL_MIRRORED_REPEAT); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL20.GL_MIRRORED_REPEAT); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); - if (bufferDirty) { + if (bufferDirty.get()) { GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, textureVolume.sizeX(), textureVolume.sizeY(), textureVolume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); - bufferDirty = false; + bufferDirty.set(false); } } @@ -177,6 +179,7 @@ public class LightVolume { } public void delete() { + removed = true; RenderWork.enqueue(() -> { GL15.glDeleteTextures(glTexture); glTexture = 0; diff --git a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java index 0474da770..4c950f355 100644 --- a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java +++ b/src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java @@ -7,4 +7,11 @@ package com.simibubi.create.foundation.render.shader; public interface ShaderCallback { void call(int shader); + + default ShaderCallback andThen(ShaderCallback other) { + return i -> { + call(i); + other.call(i); + }; + } } diff --git a/src/main/resources/assets/create/shader/contraption.vert b/src/main/resources/assets/create/shader/contraption.vert index e68ed3c54..edd750914 100644 --- a/src/main/resources/assets/create/shader/contraption.vert +++ b/src/main/resources/assets/create/shader/contraption.vert @@ -42,9 +42,17 @@ float diffuse(vec3 normal) { void main() { vec4 worldPos = model * vec4(aPos, 1); + vec3 norm = (model * vec4(aNormal, 0.)).xyz; + BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse((model * vec4(aNormal, 0.)).xyz); + Diffuse = diffuse(norm); Color = aColor / diffuse(aNormal); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; + + if (debug == 2) { + Color = vec4(norm, 1); + } else { + Color = aColor / diffuse(aNormal); + } } diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index 94083048e..be74dba37 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -46,7 +46,7 @@ mat4 rotation(vec3 rot) { } mat4 kineticRotation() { - const float speed = 20; + const float speed = -20; float degrees = rotationOffset + time * speed * -3./10.; float angle = fract(degrees / 360.) * PI * 2.; @@ -61,18 +61,26 @@ float diffuse(vec3 normal) { } void main() { + mat4 kineticRotation = kineticRotation(); + vec4 localPos = kineticRotation * vec4(aPos - rotationCenter, 1) + vec4(rotationCenter, 0); + //localPos = vec4(localPos.xyz + instancePos, 1); + vec3 rot = fract(localRotation / 360.) * PI * 2.; mat4 localRot = rotation(rot); - vec4 localPos = localRot * vec4(aPos - 0.5, 1f) + vec4(0.5, 0.5, 0.5, 0); - - mat4 kineticRotation = kineticRotation(); - localPos = kineticRotation * vec4(localPos.xyz - rotationCenter, 1) + vec4(instancePos + rotationCenter, 0); + localPos = localRot * vec4(localPos.xyz - 0.5, 1f) + vec4(instancePos + 0.5, 0); vec4 worldPos = model * localPos; + vec3 norm = normalize(model * localRot * kineticRotation * vec4(aNormal, 0.)).xyz; + BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(model * localRot * kineticRotation * vec4(aNormal, 0.)).xyz); - Color = vec4(1.); + Diffuse = diffuse(norm); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; + + if (debug == 2) { + Color = vec4(norm, 1); + } else { + Color = vec4(1.); + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_belt.vert b/src/main/resources/assets/create/shader/contraption_belt.vert index 1548200d7..edd05364c 100644 --- a/src/main/resources/assets/create/shader/contraption_belt.vert +++ b/src/main/resources/assets/create/shader/contraption_belt.vert @@ -65,9 +65,16 @@ void main() { float scrollSize = scrollTexture.w - scrollTexture.y; float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; + vec3 norm = normalize(model * localRotation * vec4(aNormal, 0.)).xyz; + BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(model * localRotation * vec4(aNormal, 0.)).xyz); - Color = vec4(1.); + Diffuse = diffuse(norm); TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); gl_Position = projection * view * worldPos; + + if (debug == 2) { + Color = vec4(norm, 1); + } else { + Color = vec4(1.); + } } diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert index 7c4ff23db..b494b58d6 100644 --- a/src/main/resources/assets/create/shader/contraption_rotating.vert +++ b/src/main/resources/assets/create/shader/contraption_rotating.vert @@ -57,9 +57,16 @@ void main() { vec4 worldPos = model * localPos; + vec3 norm = normalize(model * kineticRotation * vec4(aNormal, 0.)).xyz; + BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(normalize(model * kineticRotation * vec4(aNormal, 0.)).xyz); - Color = vec4(1.); + Diffuse = diffuse(norm); TexCoords = aTexCoords; gl_Position = projection * view * worldPos; + + if (debug == 2) { + Color = vec4(norm, 1); + } else { + Color = vec4(1.); + } } \ No newline at end of file From 4cbea0f9c9eecb7ab4c6fabed4cf9ead2ae15503 Mon Sep 17 00:00:00 2001 From: Jozsef Date: Sat, 23 Jan 2021 15:32:17 -0800 Subject: [PATCH 047/147] intel graphics now like the shaders --- .../resources/assets/create/shader/belt.vert | 20 +++++----- .../assets/create/shader/contraption.vert | 14 +++---- .../create/shader/contraption_actor.vert | 37 ++++++++++--------- .../create/shader/contraption_belt.vert | 35 +++++++++--------- .../create/shader/contraption_rotating.vert | 32 ++++++++-------- .../assets/create/shader/rotating.vert | 28 ++++++++------ 6 files changed, 86 insertions(+), 80 deletions(-) diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index e1d1a1168..6e4ba0fbf 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -28,28 +28,28 @@ uniform int debug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1.0 - c; + float oc = 1 - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, + 0, 0, 0, 1); } float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; float z = normal.z; - return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); + return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } void main() { - vec3 rot = fract(rotationDegrees / 360.) * PI * 2.; + vec3 rot = fract(rotationDegrees / 360) * PI * 2; mat4 rotation = rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); - vec4 renderPos = rotation * vec4(aPos - vec3(0.5), 1f); - renderPos += vec4(instancePos + vec3(0.5), 0); + vec4 renderPos = rotation * vec4(aPos - vec3(.5), 1); + renderPos += vec4(instancePos + vec3(.5), 0); float scrollSize = scrollTexture.w - scrollTexture.y; @@ -59,7 +59,7 @@ void main() { Diffuse = diffuse(norm); Light = light; - TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); + TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0, scroll); gl_Position = projection * view * renderPos; if (debug == 1) { diff --git a/src/main/resources/assets/create/shader/contraption.vert b/src/main/resources/assets/create/shader/contraption.vert index edd750914..cffa4e863 100644 --- a/src/main/resources/assets/create/shader/contraption.vert +++ b/src/main/resources/assets/create/shader/contraption.vert @@ -24,25 +24,25 @@ uniform int debug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1.0 - c; + float oc = 1 - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, + 0, 0, 0, 1); } float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; float z = normal.z; - return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); + return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } void main() { vec4 worldPos = model * vec4(aPos, 1); - vec3 norm = (model * vec4(aNormal, 0.)).xyz; + vec3 norm = (model * vec4(aNormal, 0)).xyz; BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; Diffuse = diffuse(norm); diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index be74dba37..58c00ee1e 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -30,15 +30,23 @@ uniform mat4 projection; uniform mat4 view; uniform int debug; + mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1.0 - c; + float oc = 1 - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, + 0, 0, 0, 1); +} + +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } mat4 rotation(vec3 rot) { @@ -47,31 +55,24 @@ mat4 rotation(vec3 rot) { mat4 kineticRotation() { const float speed = -20; - float degrees = rotationOffset + time * speed * -3./10.; - float angle = fract(degrees / 360.) * PI * 2.; + float degrees = rotationOffset + time * speed * -3/10; + float angle = fract(degrees / 360) * PI * 2; return rotate(normalize(localRotationAxis), angle); } -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); -} - void main() { mat4 kineticRotation = kineticRotation(); vec4 localPos = kineticRotation * vec4(aPos - rotationCenter, 1) + vec4(rotationCenter, 0); //localPos = vec4(localPos.xyz + instancePos, 1); - vec3 rot = fract(localRotation / 360.) * PI * 2.; + vec3 rot = fract(localRotation / 360) * PI * 2; mat4 localRot = rotation(rot); - localPos = localRot * vec4(localPos.xyz - 0.5, 1f) + vec4(instancePos + 0.5, 0); + localPos = localRot * vec4(localPos.xyz - .5, 1) + vec4(instancePos + .5, 0); vec4 worldPos = model * localPos; - vec3 norm = normalize(model * localRot * kineticRotation * vec4(aNormal, 0.)).xyz; + vec3 norm = normalize(model * localRot * kineticRotation * vec4(aNormal, 0)).xyz; BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; Diffuse = diffuse(norm); @@ -81,6 +82,6 @@ void main() { if (debug == 2) { Color = vec4(norm, 1); } else { - Color = vec4(1.); + Color = vec4(1); } } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_belt.vert b/src/main/resources/assets/create/shader/contraption_belt.vert index edd05364c..e965c2e98 100644 --- a/src/main/resources/assets/create/shader/contraption_belt.vert +++ b/src/main/resources/assets/create/shader/contraption_belt.vert @@ -29,15 +29,23 @@ uniform mat4 projection; uniform mat4 view; uniform int debug; + mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1.0 - c; + float oc = 1 - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, + 0, 0, 0, 1); +} + +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } mat4 rotation(vec3 rot) { @@ -49,32 +57,25 @@ mat4 localRotation() { return rotation(rot); } -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); -} - void main() { mat4 localRotation = localRotation(); - vec4 localPos = localRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos + 0.5, 0); + vec4 localPos = localRotation * vec4(aPos - .5, 1) + vec4(instancePos + .5, 0); vec4 worldPos = model * localPos; float scrollSize = scrollTexture.w - scrollTexture.y; - float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; + float scroll = fract(speed * time / (36 * 16)) * scrollSize * scrollMult; - vec3 norm = normalize(model * localRotation * vec4(aNormal, 0.)).xyz; + vec3 norm = normalize(model * localRotation * vec4(aNormal, 0)).xyz; BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; Diffuse = diffuse(norm); - TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0., scroll); + TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0, scroll); gl_Position = projection * view * worldPos; if (debug == 2) { Color = vec4(norm, 1); } else { - Color = vec4(1.); + Color = vec4(1); } } diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert index b494b58d6..1c1887511 100644 --- a/src/main/resources/assets/create/shader/contraption_rotating.vert +++ b/src/main/resources/assets/create/shader/contraption_rotating.vert @@ -29,35 +29,35 @@ uniform int debug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1.0 - c; + float oc = 1 - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); -} - -mat4 kineticRotation() { - float degrees = rotationOffset + time * speed * -3./10.; - float angle = fract(degrees / 360.) * PI * 2.; - - return rotate(normalize(rotationAxis), angle); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, + 0, 0, 0, 1); } float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; float z = normal.z; - return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); + return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); +} + +mat4 kineticRotation() { + float degrees = rotationOffset + time * speed * -3/10; + float angle = fract(degrees / 360) * PI * 2; + + return rotate(normalize(rotationAxis), angle); } void main() { mat4 kineticRotation = kineticRotation(); - vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1f) + vec4(instancePos + 0.5, 0); + vec4 localPos = kineticRotation * vec4(aPos - .5, 1) + vec4(instancePos + .5, 0); vec4 worldPos = model * localPos; - vec3 norm = normalize(model * kineticRotation * vec4(aNormal, 0.)).xyz; + vec3 norm = normalize(model * kineticRotation * vec4(aNormal, 0)).xyz; BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; Diffuse = diffuse(norm); @@ -67,6 +67,6 @@ void main() { if (debug == 2) { Color = vec4(norm, 1); } else { - Color = vec4(1.); + Color = vec4(1); } } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index da40a8935..93b292516 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -22,34 +22,38 @@ uniform mat4 projection; uniform mat4 view; uniform int debug; -mat4 kineticRotation() { - float degrees = rotationOffset + time * speed * -3./10.; - float angle = fract(degrees / 360.) * PI * 2.; - - vec3 axis = normalize(rotationAxis); +mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1.0 - c; + float oc = 1 - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, + 0, 0, 0, 1); } float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; float z = normal.z; - return min(x * x * 0.6f + y * y * ((3f + y) / 4f) + z * z * 0.8f, 1f); + return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } + +mat4 kineticRotation() { + float degrees = rotationOffset + time * speed * -3/10; + float angle = fract(degrees / 360) * PI * 2; + + return rotate(normalize(rotationAxis), angle); +} + void main() { mat4 rotation = kineticRotation(); vec4 renderPos = rotation * vec4(aPos - vec3(0.5), 1); renderPos += vec4(instancePos + vec3(0.5), 0); - vec3 norm = (rotation * vec4(aNormal, 0.)).xyz; + vec3 norm = (rotation * vec4(aNormal, 0)).xyz; Diffuse = diffuse(norm); TexCoords = aTexCoords; From dea3f053647978d1361650769997f754e8c56c42 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 23 Jan 2021 16:39:11 -0800 Subject: [PATCH 048/147] fix saws not rendering their shafts in contraptions --- .../actors/BellMovementBehaviour.java | 4 ++-- .../actors/CampfireMovementBehaviour.java | 4 ++-- .../actors/DrillMovementBehaviour.java | 5 +++++ .../actors/HarvesterMovementBehaviour.java | 5 +++++ .../structureMovement/Contraption.java | 22 ++++++++++++++----- .../ContraptionRenderer.java | 2 +- .../structureMovement/MovementBehaviour.java | 8 +++++-- .../processing/BasinMovementBehaviour.java | 4 ++-- .../contraption/RenderedContraption.java | 4 ++-- .../render/instancing/InstanceBuffer.java | 2 +- .../foundation/render/light/LightVolume.java | 12 +++++----- 11 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java index cc14b1ffc..3bcaa5286 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java @@ -10,8 +10,8 @@ import net.minecraft.util.math.Vec3d; public class BellMovementBehaviour extends MovementBehaviour { @Override - public boolean hasSpecialMovementRenderer() { - return false; + public boolean renderAsNormalTileEntity() { + return true; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java index a1f1c148f..e27cffee5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java @@ -10,8 +10,8 @@ import net.minecraft.particles.ParticleTypes; public class CampfireMovementBehaviour extends MovementBehaviour { @Override - public boolean hasSpecialMovementRenderer() { - return false; + public boolean renderAsNormalTileEntity() { + return true; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index dd5441db7..2ec0ed260 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -35,6 +35,11 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { //DrillRenderer.renderInContraption(context, ms, msLocal, buffer); } + @Override + public boolean hasSpecialInstancedRendering() { + return true; + } + @Override public void addInstance(RenderedContraption contraption, MovementContext context) { DrillRenderer.addInstanceForContraption(contraption, context); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index a70af09ab..c135526e5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -36,6 +36,11 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { .getOpposite()); } + @Override + public boolean hasSpecialInstancedRendering() { + return true; + } + @Override public void addInstance(RenderedContraption contraption, MovementContext context) { HarvesterRenderer.addInstanceForContraption(contraption, context); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 83059c93e..d84eb8cf7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -118,7 +118,8 @@ public abstract class Contraption { // Client public Map presentTileEntities; - public List renderedTileEntities; + public List maybeInstancedTileEntities; + public List specialRenderedTileEntities; public Contraption() { blocks = new HashMap<>(); @@ -131,7 +132,8 @@ public abstract class Contraption { glueToRemove = new ArrayList<>(); initialPassengers = new HashMap<>(); presentTileEntities = new HashMap<>(); - renderedTileEntities = new ArrayList<>(); + maybeInstancedTileEntities = new ArrayList<>(); + specialRenderedTileEntities = new ArrayList<>(); pendingSubContraptions = new ArrayList<>(); stabilizedSubContraptions = new HashMap<>(); } @@ -520,7 +522,7 @@ public abstract class Contraption { public void readNBT(World world, CompoundNBT nbt, boolean spawnData) { blocks.clear(); presentTileEntities.clear(); - renderedTileEntities.clear(); + specialRenderedTileEntities.clear(); nbt.getList("Blocks", 10) .forEach(c -> { @@ -534,7 +536,7 @@ public abstract class Contraption { Block block = info.state.getBlock(); CompoundNBT tag = info.nbt; MovementBehaviour movementBehaviour = AllMovementBehaviours.of(block); - if (tag == null || (movementBehaviour != null && movementBehaviour.hasSpecialMovementRenderer())) + if (tag == null) return; tag.putInt("x", info.pos.getX()); @@ -557,8 +559,15 @@ public abstract class Contraption { if (te instanceof KineticTileEntity) ((KineticTileEntity) te).setSpeed(0); te.getBlockState(); + + if (movementBehaviour == null || !movementBehaviour.hasSpecialInstancedRendering()) + maybeInstancedTileEntities.add(te); + + if (movementBehaviour != null && !movementBehaviour.renderAsNormalTileEntity()) + return; + presentTileEntities.put(info.pos, te); - renderedTileEntities.add(te); + specialRenderedTileEntities.add(te); } }); @@ -576,7 +585,8 @@ public abstract class Contraption { .add(Pair.of(NBTUtil.readBlockPos(c.getCompound("Pos")), Direction.byIndex(c.getByte("Direction"))))); seats.clear(); - NBTHelper.iterateCompoundList(nbt.getList("Seats", NBT.TAG_COMPOUND), c -> seats.add(NBTUtil.readBlockPos(c))); + NBTHelper.iterateCompoundList(nbt.getList("Seats", NBT.TAG_COMPOUND), c -> seats.add + (NBTUtil.readBlockPos(c))); seatMapping.clear(); NBTHelper.iterateCompoundList(nbt.getList("Passengers", NBT.TAG_COMPOUND), diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index b839f558d..e22bf6284 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -76,7 +76,7 @@ public class ContraptionRenderer { protected static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { - TileEntityRenderHelper.renderTileEntities(world, c.renderedTileEntities, ms, msLocal, buffer); + TileEntityRenderHelper.renderTileEntities(world, c.specialRenderedTileEntities, ms, msLocal, buffer); } private static SuperByteBuffer buildStructureBuffer(Contraption c, RenderType layer) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index d82dcfe38..82ae42088 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -48,8 +48,12 @@ public abstract class MovementBehaviour { } - public boolean hasSpecialMovementRenderer() { - return true; + public boolean renderAsNormalTileEntity() { + return false; + } + + public boolean hasSpecialInstancedRendering() { + return false; } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java index a3de35c6c..1f77c0caa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinMovementBehaviour.java @@ -23,8 +23,8 @@ public class BasinMovementBehaviour extends MovementBehaviour { } @Override - public boolean hasSpecialMovementRenderer() { - return false; + public boolean renderAsNormalTileEntity() { + return true; } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index fab94150c..76e8d7f9a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -6,7 +6,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.FastKineticRenderer; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.render.light.ContraptionLighter; @@ -22,6 +21,7 @@ import net.minecraft.world.gen.feature.template.Template; import org.apache.commons.lang3.tuple.MutablePair; import java.nio.FloatBuffer; +import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -87,7 +87,7 @@ public class RenderedContraption { } private void buildInstancedTiles(Contraption c) { - List tileEntities = c.renderedTileEntities; + Collection tileEntities = c.maybeInstancedTileEntities; if (!tileEntities.isEmpty()) { for (TileEntity te : tileEntities) { if (te instanceof IInstanceRendered) { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java index bbb729de3..9a482dd8d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java @@ -104,7 +104,7 @@ public abstract class InstanceBuffer extends GPUBuffer { @Override protected void drawCall() { - GL40.glDrawElementsInstanced(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); + GL31.glDrawElementsInstanced(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); } protected void preDrawTask() { diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index ac2c89a3c..7b180c52b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -21,7 +21,7 @@ public class LightVolume { private final GridAlignedBB textureVolume; private ByteBuffer lightData; - private final AtomicBoolean bufferDirty = new AtomicBoolean(false); + private boolean bufferDirty; private boolean removed; private int glTexture; @@ -110,7 +110,7 @@ public class LightVolume { writeLight(x - shiftX, y - shiftY, z - shiftZ, blockLight, skyLight); }); - bufferDirty.set(true); + bufferDirty = true; } /** @@ -132,7 +132,7 @@ public class LightVolume { writeBlock(x - xShift, y - yShift, z - zShift, light); }); - bufferDirty.set(true); + bufferDirty = true; } /** @@ -154,7 +154,7 @@ public class LightVolume { writeSky(x - xShift, y - yShift, z - zShift, light); }); - bufferDirty.set(true); + bufferDirty = true; } public void use() { @@ -168,9 +168,9 @@ public class LightVolume { GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL20.GL_MIRRORED_REPEAT); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL20.GL_MIRRORED_REPEAT); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); - if (bufferDirty.get()) { + if (bufferDirty) { GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, textureVolume.sizeX(), textureVolume.sizeY(), textureVolume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); - bufferDirty.set(false); + bufferDirty = false; } } From 55ea7e3e55c9be19b0e4b94c854f862385213198 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 23 Jan 2021 21:02:11 -0800 Subject: [PATCH 049/147] cart contraptions are lit --- .../bearing/StabilizedLighter.java | 40 ++++++------------- .../mounted/MountedContraption.java | 6 +++ .../mounted/MountedLighter.java | 30 ++++++++++++++ .../simibubi/create/events/ClientEvents.java | 2 + .../ContraptionRenderDispatcher.java | 7 +++- .../render/light/ContraptionLighter.java | 21 +++++++--- .../render/light/GridAlignedBB.java | 39 ++++++++++++++++++ .../foundation/render/light/LightVolume.java | 18 ++++++--- .../resources/assets/create/shader/belt.vert | 4 +- 9 files changed, 126 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedLighter.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java index 556d22462..b92901b77 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.render.contraption.RenderedContraption; import com.simibubi.create.foundation.render.light.ContraptionLighter; import com.simibubi.create.foundation.render.light.GridAlignedBB; import net.minecraft.client.world.ClientWorld; @@ -15,38 +16,21 @@ public class StabilizedLighter extends ContraptionLighter super(contraption); } + @Override + public void tick(RenderedContraption owner) { + GridAlignedBB contraptionBounds = getContraptionBounds(); + + if (!contraptionBounds.sameAs(bounds)) { + lightVolume.move(contraption.entity.world, contraptionBoundsToVolume(contraptionBounds)); + bounds = contraptionBounds; + } + } + @Override public GridAlignedBB getContraptionBounds() { GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds); - // TODO: this whole thing is a hack and is not generalizable - Iterable allEntities = ((ClientWorld) contraption.entity.world).getAllEntities(); - - for (Entity entity : allEntities) { - - if (entity.getUniqueID() == contraption.parentID && entity instanceof AbstractContraptionEntity) { - Contraption mountedOn = ((AbstractContraptionEntity) entity).getContraption(); - - GridAlignedBB mountedBounds = GridAlignedBB.fromAABB(mountedOn.bounds); - - Vec3i dir = contraption.getFacing().getDirectionVec(); - - int mulX = 1 - Math.abs(dir.getX()); - int mulY = 1 - Math.abs(dir.getY()); - int mulZ = 1 - Math.abs(dir.getZ()); - - bb.minX -= mulX * mountedBounds.sizeX(); - bb.minY -= mulY * mountedBounds.sizeY(); - bb.minZ -= mulZ * mountedBounds.sizeZ(); - bb.maxX += mulX * mountedBounds.sizeX(); - bb.maxY += mulY * mountedBounds.sizeY(); - bb.maxZ += mulZ * mountedBounds.sizeZ(); - - break; - } - } - - bb.translate(contraption.anchor); + bb.translate(contraption.entity.getPosition()); return bb; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java index 3d6a28dd8..38406550a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java @@ -4,6 +4,7 @@ import static com.simibubi.create.content.contraptions.components.structureMovem import java.util.List; +import com.simibubi.create.foundation.render.light.ContraptionLighter; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; @@ -160,4 +161,9 @@ public class MountedContraption extends Contraption { IItemHandlerModifiable handlerFromInv = new InvWrapper((IInventory) cart); inventory = new CombinedInvWrapper(handlerFromInv, inventory); } + + @Override + public ContraptionLighter makeLighter() { + return new MountedLighter(this); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedLighter.java new file mode 100644 index 000000000..8523a9c13 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedLighter.java @@ -0,0 +1,30 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.mounted; + +import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.foundation.render.light.GridAlignedBB; + +public class MountedLighter extends ContraptionLighter { + public MountedLighter(MountedContraption contraption) { + super(contraption); + } + + @Override + public void tick(RenderedContraption owner) { + GridAlignedBB contraptionBounds = getContraptionBounds(); + + if (!contraptionBounds.sameAs(bounds)) { + lightVolume.move(contraption.entity.world, contraptionBoundsToVolume(contraptionBounds)); + bounds = contraptionBounds; + } + } + + @Override + public GridAlignedBB getContraptionBounds() { + GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds); + + bb.translate(contraption.entity.getPosition()); + + return bb; + } +} diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 39a622a52..7824ea87c 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -26,6 +26,7 @@ import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.RenderWork; +import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.light.LightVolumeDebugger; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; @@ -106,6 +107,7 @@ public class ClientEvents { ArmInteractionPointHandler.tick(); PlacementHelpers.tick(); CreateClient.outliner.tickOutlines(); + ContraptionRenderDispatcher.tick(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index 5f55119fd..6795420dc 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.render.contraption; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.render.FastKineticRenderer; import com.simibubi.create.foundation.render.shader.Shader; import com.simibubi.create.foundation.render.shader.ShaderCallback; import com.simibubi.create.foundation.render.shader.ShaderHelper; @@ -30,6 +29,12 @@ public class ContraptionRenderDispatcher { } } + public static void tick() { + for (RenderedContraption contraption : renderers.values()) { + contraption.getLighter().tick(contraption); + } + } + private static RenderedContraption getRenderer(World world, Contraption c) { RenderedContraption renderer; int entityId = c.entity.getEntityId(); diff --git a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java index 110113283..68b4342cc 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.light; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.render.contraption.RenderedContraption; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; @@ -11,18 +12,28 @@ public abstract class ContraptionLighter { protected final C contraption; public final LightVolume lightVolume; + protected GridAlignedBB bounds; + protected ContraptionLighter(C contraption) { this.contraption = contraption; - GridAlignedBB bounds = getContraptionBounds(); - bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting - bounds.minY = Math.max(bounds.minY, 0); - bounds.maxY = Math.min(bounds.maxY, 255); + bounds = getContraptionBounds(); - lightVolume = new LightVolume(bounds); + lightVolume = new LightVolume(contraptionBoundsToVolume(bounds)); lightVolume.initialize(contraption.entity.world); } + protected GridAlignedBB contraptionBoundsToVolume(GridAlignedBB bounds) { + bounds = bounds.copy(); + bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting + bounds.minY = Math.max(bounds.minY, 0); + bounds.maxY = Math.min(bounds.maxY, 255); + + return bounds; + } + + public void tick(RenderedContraption owner) {} + public abstract GridAlignedBB getContraptionBounds(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java index f47889b11..210a74031 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java @@ -55,6 +55,19 @@ public class GridAlignedBB { return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); } + public GridAlignedBB copy() { + return copy(this); + } + + public boolean sameAs(GridAlignedBB other) { + return minX == other.minX && + minY == other.minY && + minZ == other.minZ && + maxX == other.maxX && + maxY == other.maxY && + maxZ == other.maxZ; + } + public int sizeX() { return maxX - minX; } @@ -272,4 +285,30 @@ public class GridAlignedBB { } } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + GridAlignedBB that = (GridAlignedBB) o; + + if (minX != that.minX) return false; + if (minY != that.minY) return false; + if (minZ != that.minZ) return false; + if (maxX != that.maxX) return false; + if (maxY != that.maxY) return false; + return maxZ == that.maxZ; + } + + @Override + public int hashCode() { + int result = minX; + result = 31 * result + minY; + result = 31 * result + minZ; + result = 31 * result + maxX; + result = 31 * result + maxY; + result = 31 * result + maxZ; + return result; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index 7b180c52b..e0f251bcf 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -17,8 +17,8 @@ import java.util.concurrent.atomic.AtomicBoolean; // to reread all the lighting data in those cases. public class LightVolume { - private final GridAlignedBB sampleVolume; - private final GridAlignedBB textureVolume; + private GridAlignedBB sampleVolume; + private GridAlignedBB textureVolume; private ByteBuffer lightData; private boolean bufferDirty; @@ -27,14 +27,18 @@ public class LightVolume { private int glTexture; public LightVolume(GridAlignedBB sampleVolume) { - this.sampleVolume = GridAlignedBB.copy(sampleVolume); - sampleVolume.nextPowerOf2Centered(); - this.textureVolume = sampleVolume; + setSampleVolume(sampleVolume); this.glTexture = GL11.glGenTextures(); this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte } + private void setSampleVolume(GridAlignedBB sampleVolume) { + this.sampleVolume = sampleVolume; + this.textureVolume = sampleVolume.copy(); + this.textureVolume.nextPowerOf2Centered(); + } + public GridAlignedBB getTextureVolume() { return GridAlignedBB.copy(textureVolume); } @@ -79,6 +83,10 @@ public class LightVolume { return textureVolume.sizeZ(); } + public void move(ILightReader world, GridAlignedBB newSampleVolume) { + setSampleVolume(newSampleVolume); + initialize(world); + } public void notifyLightUpdate(ILightReader world, LightType type, SectionPos location) { GridAlignedBB changedVolume = GridAlignedBB.fromSection(location); diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 6e4ba0fbf..8a9c50380 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -53,9 +53,9 @@ void main() { float scrollSize = scrollTexture.w - scrollTexture.y; - float scroll = fract(speed * time / (36 * 16.)) * scrollSize * scrollMult; + float scroll = fract(speed * time / (36 * 16)) * scrollSize * scrollMult; - vec3 norm = (rotation * vec4(aNormal, 0.)).xyz; + vec3 norm = (rotation * vec4(aNormal, 0)).xyz; Diffuse = diffuse(norm); Light = light; From ebd20f5173459d081f1065c719a48985605af9e2 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 23 Jan 2021 23:07:12 -0800 Subject: [PATCH 050/147] suddenly, everything is smooth and dry - replace all usages of Minecraft.getRenderPartialTicks() with AnimationTickHolder.getPartialTicks() - refactor stabilized and mounted lighters into one class - separate fancy contraption render logic and entity render logic, should maybe move *all* rendering to ContraptionRenderDispatcher --- .../category/animations/AnimatedKinetics.java | 4 +- .../category/animations/AnimatedPress.java | 8 +-- .../category/animations/AnimatedSpout.java | 14 +++-- .../PortableStorageInterfaceRenderer.java | 44 ++++++++-------- .../components/deployer/DeployerRenderer.java | 3 +- .../AbstractContraptionEntityRenderer.java | 20 +++++--- .../structureMovement/Contraption.java | 51 ++++++------------- ...Lighter.java => NonStationaryLighter.java} | 6 +-- .../StabilizedBearingMovementBehaviour.java | 14 ++--- .../bearing/StabilizedContraption.java | 17 ++----- .../bearing/StabilizedLighter.java | 37 -------------- .../glue/SuperGlueEntity.java | 32 +++--------- .../mounted/MountedContraption.java | 17 +++---- .../train/CouplingRenderer.java | 13 ++--- .../turntable/TurntableHandler.java | 4 +- .../curiosities/ChromaticCompoundColor.java | 3 +- .../curiosities/tools/ExtendoGripItem.java | 8 +-- .../tools/ExtendoGripItemRenderer.java | 8 ++- .../tools/ExtendoGripRenderHandler.java | 8 +-- .../tools/SandPaperItemRenderer.java | 3 +- .../zapper/ZapperRenderHandler.java | 15 +++--- .../blockzapper/BlockzapperItemRenderer.java | 16 ++---- .../WorldshaperItemRenderer.java | 10 ++-- .../client/SchematicAndQuillHandler.java | 40 +++++---------- .../schematics/client/SchematicHandler.java | 14 +++-- .../client/SchematicTransformation.java | 16 +++--- .../schematics/client/tools/DeployTool.java | 6 +-- .../client/tools/SchematicToolBase.java | 11 ++-- .../simibubi/create/events/ClientEvents.java | 2 +- .../render/TileEntityRenderHelper.java | 5 +- .../ContraptionRenderDispatcher.java | 45 ++++++++++++++-- .../utility/outliner/ChasingAABBOutline.java | 6 +-- .../utility/outliner/LineOutline.java | 6 +-- .../foundation/utility/outliner/Outliner.java | 15 ++---- 34 files changed, 204 insertions(+), 317 deletions(-) rename src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/{mounted/MountedLighter.java => NonStationaryLighter.java} (84%) delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index 33fe15a29..4339372d5 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -3,17 +3,15 @@ package com.simibubi.create.compat.jei.category.animations; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.utility.AnimationTickHolder; - import mezz.jei.api.gui.drawable.IDrawable; import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction.Axis; public abstract class AnimatedKinetics implements IDrawable { public static float getCurrentAngle() { - return ((AnimationTickHolder.ticks + Minecraft.getInstance().getRenderPartialTicks()) * 4f) % 360; + return ((AnimationTickHolder.ticks + AnimationTickHolder.getPartialTicks()) * 4f) % 360; } protected BlockState shaft(Axis axis) { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java index 4bafd18ed..7b2d99c6e 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java @@ -1,13 +1,10 @@ package com.simibubi.create.compat.jei.category.animations; -import static com.simibubi.create.foundation.utility.AnimationTickHolder.ticks; - import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.GuiGameElement; - -import net.minecraft.client.Minecraft; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.util.Direction.Axis; public class AnimatedPress extends AnimatedKinetics { @@ -50,8 +47,7 @@ public class AnimatedPress extends AnimatedKinetics { } private float getAnimatedHeadOffset() { - float cycle = (ticks + Minecraft.getInstance() - .getRenderPartialTicks()) % 30; + float cycle = (AnimationTickHolder.getRenderTick()) % 30; if (cycle < 10) { float progress = cycle / 10; return -(progress * progress * progress); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index 32869ff0a..ad1ae4522 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -1,23 +1,22 @@ package com.simibubi.create.compat.jei.category.animations; -import static com.simibubi.create.foundation.utility.AnimationTickHolder.ticks; - -import java.util.List; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.gui.GuiGameElement; - -import net.minecraft.client.Minecraft; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer.Impl; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fluids.FluidStack; +import java.util.List; + +import static com.simibubi.create.foundation.utility.AnimationTickHolder.ticks; + public class AnimatedSpout extends AnimatedKinetics { private List fluids; @@ -39,8 +38,7 @@ public class AnimatedSpout extends AnimatedKinetics { .scale(scale) .render(); - float cycle = (ticks + Minecraft.getInstance() - .getRenderPartialTicks()) % 30; + float cycle = (ticks + AnimationTickHolder.getPartialTicks()) % 30; float squeeze = cycle < 20 ? MathHelper.sin((float) (cycle / 20f * Math.PI)) : 0; squeeze *= 20; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java index 83f29fb32..9644fd71a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -1,19 +1,16 @@ package com.simibubi.create.content.contraptions.components.actors; -import java.util.function.Consumer; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; - import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -22,6 +19,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; +import java.util.function.Consumer; + public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer { public PortableStorageInterfaceRenderer(TileEntityRendererDispatcher dispatcher) { @@ -43,8 +42,7 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer drawCallback, MatrixStack... matrixStacks) { for (MatrixStack ms : matrixStacks) @@ -109,6 +91,22 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer double distance = context.position.distanceTo(center); double nextDistance = context.position.add(context.motion) .distanceTo(center); - factor = .5f - MathHelper.clamp(MathHelper.lerp(Minecraft.getInstance() - .getRenderPartialTicks(), distance, nextDistance), 0, 1); + factor = .5f - MathHelper.clamp(MathHelper.lerp(AnimationTickHolder.getPartialTicks(), distance, nextDistance), 0, 1); } Vec3d offset = new Vec3d(blockState.get(FACING) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index bb0e58296..3d5801a0a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -1,9 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; - -import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; -import net.minecraft.client.Minecraft; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; import net.minecraft.client.renderer.entity.EntityRenderer; @@ -24,6 +22,14 @@ public abstract class AbstractContraptionEntityRenderer { - public MountedLighter(MountedContraption contraption) { +public class NonStationaryLighter extends ContraptionLighter { + public NonStationaryLighter(C contraption) { super(contraption); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index d6b4c99e8..dc9a28356 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -2,15 +2,10 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; -import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.content.contraptions.components.structureMovement.*; import com.simibubi.create.foundation.render.SuperByteBuffer; - -import net.minecraft.client.Minecraft; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.state.properties.BlockStateProperties; @@ -28,8 +23,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { Direction facing = context.state.get(BlockStateProperties.FACING); AllBlockPartials top = AllBlockPartials.BEARING_TOP; SuperByteBuffer superBuffer = top.renderOn(context.state); - float renderPartialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); + float renderPartialTicks = AnimationTickHolder.getPartialTicks(); // rotate to match blockstate Axis axis = facing.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java index 92b4e8298..5bb70f602 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java @@ -1,31 +1,22 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; - +import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.utility.NBTHelper; -import net.minecraft.entity.Entity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.UUID; - public class StabilizedContraption extends Contraption { - public UUID parentID; - private Direction facing; public StabilizedContraption() {} - public StabilizedContraption(UUID parentID, Direction facing) { - this.parentID = parentID; + public StabilizedContraption(Direction facing) { this.facing = facing; } @@ -55,14 +46,12 @@ public class StabilizedContraption extends Contraption { public CompoundNBT writeNBT(boolean spawnPacket) { CompoundNBT tag = super.writeNBT(spawnPacket); tag.putInt("Facing", facing.getIndex()); - tag.putUniqueId("Parent", parentID); return tag; } @Override public void readNBT(World world, CompoundNBT tag, boolean spawnData) { facing = Direction.byIndex(tag.getInt("Facing")); - parentID = tag.getUniqueId("Parent"); super.readNBT(world, tag, spawnData); } @@ -77,6 +66,6 @@ public class StabilizedContraption extends Contraption { @Override public ContraptionLighter makeLighter() { - return new StabilizedLighter(this); + return new NonStationaryLighter<>(this); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java deleted file mode 100644 index b92901b77..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedLighter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.simibubi.create.content.contraptions.components.structureMovement.bearing; - -import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.render.light.GridAlignedBB; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Vec3i; - -import java.util.List; - -public class StabilizedLighter extends ContraptionLighter { - public StabilizedLighter(StabilizedContraption contraption) { - super(contraption); - } - - @Override - public void tick(RenderedContraption owner) { - GridAlignedBB contraptionBounds = getContraptionBounds(); - - if (!contraptionBounds.sameAs(bounds)) { - lightVolume.move(contraption.entity.world, contraptionBoundsToVolume(contraptionBounds)); - bounds = contraptionBounds; - } - } - - @Override - public GridAlignedBB getContraptionBounds() { - GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds); - - bb.translate(contraption.entity.getPosition()); - - return bb; - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index f677487af..b9f5ab8dc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -1,9 +1,5 @@ package com.simibubi.create.content.contraptions.components.structureMovement.glue; -import javax.annotation.Nullable; - -import org.apache.commons.lang3.Validate; - import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; @@ -12,17 +8,13 @@ import com.simibubi.create.content.schematics.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.BlockFace; - import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntitySize; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.MoverType; -import net.minecraft.entity.Pose; +import net.minecraft.entity.*; import net.minecraft.entity.effect.LightningBoltEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -30,20 +22,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.DamageSource; -import net.minecraft.util.Direction; +import net.minecraft.util.*; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.Hand; -import net.minecraft.util.Mirror; -import net.minecraft.util.Rotation; -import net.minecraft.util.SoundEvents; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.*; import net.minecraft.util.math.RayTraceResult.Type; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; @@ -52,6 +33,9 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.PacketDistributor; +import org.apache.commons.lang3.Validate; + +import javax.annotation.Nullable; public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnData, ISpecialEntityItemRequirement { @@ -266,7 +250,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat ClientPlayerEntity cPlayer = (ClientPlayerEntity) player; Minecraft mc = Minecraft.getInstance(); RayTraceResult ray = - cPlayer.pick(mc.playerController.getBlockReachDistance(), mc.getRenderPartialTicks(), false); + cPlayer.pick(mc.playerController.getBlockReachDistance(), AnimationTickHolder.getPartialTicks(), false); if (!(ray instanceof BlockRayTraceResult)) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java index 38406550a..f13e6cb39 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java @@ -1,20 +1,14 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mounted; -import static com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.RAIL_SHAPE; - -import java.util.List; - -import com.simibubi.create.foundation.render.light.ContraptionLighter; -import org.apache.commons.lang3.tuple.Pair; - import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; +import com.simibubi.create.foundation.render.light.ContraptionLighter; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.item.minecart.AbstractMinecartEntity; @@ -33,6 +27,11 @@ import net.minecraft.world.gen.feature.template.Template.BlockInfo; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.items.wrapper.InvWrapper; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.List; + +import static com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.RAIL_SHAPE; public class MountedContraption extends Contraption { @@ -164,6 +163,6 @@ public class MountedContraption extends Contraption { @Override public ContraptionLighter makeLighter() { - return new MountedLighter(this); + return new NonStationaryLighter<>(this); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java index 0a8cb17b8..34a52daa3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java @@ -1,19 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.train; -import static net.minecraft.util.math.MathHelper.lerp; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; -import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.VecHelper; - +import com.simibubi.create.foundation.utility.*; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; @@ -28,6 +22,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import static net.minecraft.util.math.MathHelper.lerp; + public class CouplingRenderer { public static void renderAll(MatrixStack ms, IRenderTypeBuffer buffer) { @@ -115,8 +111,7 @@ public class CouplingRenderer { float y = (((float) (i >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F + 0.375F; float z = (((float) (i >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); + float pt = AnimationTickHolder.getPartialTicks(); double xIn = lerp(pt, cart.lastTickPosX, cart.getX()); double yIn = lerp(pt, cart.lastTickPosY, cart.getY()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java index a3ba8aaf9..d335edaf3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.contraptions.components.turntable; import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.client.Minecraft; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -38,7 +38,7 @@ public class TurntableHandler { if (offset.length() > 1/4f) speed *= MathHelper.clamp((1/2f - offset.length()) * 2, 0, 1); - mc.player.rotationYaw = mc.player.prevRotationYaw - speed * mc.getRenderPartialTicks(); + mc.player.rotationYaw = mc.player.prevRotationYaw - speed * AnimationTickHolder.getPartialTicks(); mc.player.renderYawOffset = mc.player.rotationYaw; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java index 34b5b503d..60ba0545c 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.curiosities; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; - import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.item.ItemStack; @@ -13,7 +12,7 @@ public class ChromaticCompoundColor implements IItemColor { @Override public int getColor(ItemStack stack, int layer) { Minecraft mc = Minecraft.getInstance(); - float pt = mc.getRenderPartialTicks(); + float pt = AnimationTickHolder.getPartialTicks(); float progress = (float) ((mc.player.getYaw(pt)) / 180 * Math.PI) + (AnimationTickHolder.getRenderTick() / 10f); if (layer == 0) return ColorHelper.mixColors(0x6e5773, 0x6B3074, ((float) MathHelper.sin(progress) + 1) / 2); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java index a74a092a0..dd9f57c99 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java @@ -1,13 +1,11 @@ package com.simibubi.create.content.curiosities.tools; -import java.util.UUID; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.networking.AllPackets; - +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.Entity; @@ -35,6 +33,8 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import java.util.UUID; + @EventBusSubscriber public class ExtendoGripItem extends Item { @@ -125,7 +125,7 @@ public class ExtendoGripItem extends Item { .getValue(); if (!player.isCreative()) d0 -= 0.5f; - Vec3d vec3d = player.getEyePosition(mc.getRenderPartialTicks()); + Vec3d vec3d = player.getEyePosition(AnimationTickHolder.getPartialTicks()); Vec3d vec3d1 = player.getLook(1.0F); Vec3d vec3d2 = vec3d.add(vec3d1.x * d0, vec3d1.y * d0, vec3d1.z * d0); AxisAlignedBB axisalignedbb = player.getBoundingBox() diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java index 3788d6000..d37daa176 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java @@ -6,8 +6,6 @@ import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRender import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; - -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.item.ItemStack; @@ -28,9 +26,9 @@ public class ExtendoGripItemRenderer extends CustomRenderedItemModelRenderer mainHandAnimation && swingProgress > 0) mainHandAnimation = 0.95f; - float animation = MathHelper.lerp(Minecraft.getInstance() - .getRenderPartialTicks(), ExtendoGripRenderHandler.lastMainHandAnimation, - ExtendoGripRenderHandler.mainHandAnimation); + float animation = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), + ExtendoGripRenderHandler.lastMainHandAnimation, + ExtendoGripRenderHandler.mainHandAnimation); animation = animation * animation * animation; ms.translate(flip * (0.64000005F - .1f), -0.4F + equipProgress * -0.6F, -0.71999997F + .3f); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java index 78b741a2b..8414e43c8 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java @@ -4,7 +4,6 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; import com.simibubi.create.foundation.utility.AnimationTickHolder; - import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -25,7 +24,7 @@ public class SandPaperItemRenderer extends ItemStackTileEntityRenderer { ClientPlayerEntity player = Minecraft.getInstance().player; SandPaperModel mainModel = (SandPaperModel) itemRenderer.getItemModelWithOverrides(stack, Minecraft.getInstance().world, null); TransformType perspective = mainModel.getCurrentPerspective(); - float partialTicks = Minecraft.getInstance().getRenderPartialTicks(); + float partialTicks = AnimationTickHolder.getPartialTicks(); boolean leftHand = perspective == TransformType.FIRST_PERSON_LEFT_HAND; boolean firstPerson = leftHand || perspective == TransformType.FIRST_PERSON_RIGHT_HAND; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java index fe428b05d..2c8d579ce 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java @@ -1,14 +1,9 @@ package com.simibubi.create.content.curiosities.zapper; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; -import java.util.function.Supplier; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.CreateClient; - +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.AbstractClientPlayerEntity; import net.minecraft.client.entity.player.ClientPlayerEntity; @@ -30,6 +25,11 @@ import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.function.Supplier; + @EventBusSubscriber(value = Dist.CLIENT) public class ZapperRenderHandler { @@ -63,8 +63,7 @@ public class ZapperRenderHandler { } public static Vec3d getExactBarrelPos(boolean mainHand) { - float partialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); + float partialTicks = AnimationTickHolder.getPartialTicks(); ClientPlayerEntity player = Minecraft.getInstance().player; float yaw = (float) ((player.getYaw(partialTicks)) / -180 * Math.PI); float pitch = (float) ((player.getPitch(partialTicks)) / -180 * Math.PI); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java index 3f05fca7f..6d8eaf1e7 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java @@ -1,20 +1,11 @@ package com.simibubi.create.content.curiosities.zapper.blockzapper; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Accelerator; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Amplifier; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Body; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Retriever; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Scope; -import static java.lang.Math.max; -import static net.minecraft.util.math.MathHelper.clamp; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.curiosities.zapper.ZapperItemRenderer; import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.ComponentTier; import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components; import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; - import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -25,6 +16,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.HandSide; import net.minecraft.util.math.MathHelper; +import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.*; +import static java.lang.Math.max; +import static net.minecraft.util.math.MathHelper.clamp; + public class BlockzapperItemRenderer extends ZapperItemRenderer { @Override @@ -32,8 +27,7 @@ public class BlockzapperItemRenderer extends ZapperItemRenderer { @Override @@ -24,8 +23,7 @@ public class WorldshaperItemRenderer extends ZapperItemRenderer customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer) { - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); + float pt = AnimationTickHolder.getPartialTicks(); Matrix4f matrix = localTransform.peek() .getModel(); diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index 6795420dc..8e85c187e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -1,26 +1,39 @@ package com.simibubi.create.foundation.render.contraption; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.foundation.render.shader.Shader; import com.simibubi.create.foundation.render.shader.ShaderCallback; import com.simibubi.create.foundation.render.shader.ShaderHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.world.ClientWorld; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; import net.minecraft.world.World; -import org.lwjgl.opengl.*; +import net.minecraftforge.event.TickEvent; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL40; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; +import java.util.Map; public class ContraptionRenderDispatcher { public static final HashMap renderers = new HashMap<>(); - public static void markForRendering(World world, Contraption c, MatrixStack model) { - getRenderer(world, c).setRenderSettings(model.peek().getModel()); + public static void markForRendering(Contraption c, MatrixStack model) { + getRenderer(c.entity.world, c).setRenderSettings(model.peek().getModel()); } public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) { @@ -29,6 +42,31 @@ public class ContraptionRenderDispatcher { } } + public static void renderTick(TickEvent.RenderTickEvent event) { + ClientWorld world = Minecraft.getInstance().world; + if (event.phase == TickEvent.Phase.START && world != null) { + Map> map = ContraptionHandler.loadedContraptions.get(world); + + for (WeakReference weakReference : map.values()) { + AbstractContraptionEntity entity = weakReference.get(); + + EntityRendererManager renderManager = Minecraft.getInstance().getRenderManager(); + + EntityRenderer renderer = renderManager.getRenderer(entity); + + if (renderer instanceof AbstractContraptionEntityRenderer) { + updateTransform(entity, (AbstractContraptionEntityRenderer) renderer); + } + } + } + } + + private static void updateTransform(C c, AbstractContraptionEntityRenderer entityRenderer) { + MatrixStack stack = entityRenderer.makeTransformMatrix(c, AnimationTickHolder.getPartialTicks()); + + markForRendering(c.getContraption(), stack); + } + public static void tick() { for (RenderedContraption contraption : renderers.values()) { contraption.getLighter().tick(contraption); @@ -84,6 +122,7 @@ public class ContraptionRenderDispatcher { } } + for (Integer id : toRemove) { renderers.remove(id); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java index 2fcacb96a..931b2affb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java @@ -2,8 +2,7 @@ package com.simibubi.create.foundation.utility.outliner; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; - -import net.minecraft.client.Minecraft; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; @@ -30,8 +29,7 @@ public class ChasingAABBOutline extends AABBOutline { @Override public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { - renderBB(ms, buffer, interpolateBBs(prevBB, bb, Minecraft.getInstance() - .getRenderPartialTicks())); + renderBB(ms, buffer, interpolateBBs(prevBB, bb, AnimationTickHolder.getPartialTicks())); } private static AxisAlignedBB interpolateBBs(AxisAlignedBB current, AxisAlignedBB target, float pt) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java index 3f3a307ab..e76bbc56d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java @@ -2,8 +2,7 @@ package com.simibubi.create.foundation.utility.outliner; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; - -import net.minecraft.client.Minecraft; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -47,8 +46,7 @@ public class LineOutline extends Outline { @Override public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); + float pt = AnimationTickHolder.getPartialTicks(); float distanceToTarget = 1 - MathHelper.lerp(pt, prevProgress, progress); Vec3d start = end.add(this.start.subtract(end) .scale(distanceToTarget)); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java index 39a019c65..f820fa384 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java @@ -1,24 +1,18 @@ package com.simibubi.create.foundation.utility.outliner; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.outliner.LineOutline.EndChasingLineOutline; import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; - -import net.minecraft.client.Minecraft; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import java.util.*; + public class Outliner { final Map outlines; @@ -143,8 +137,7 @@ public class Outliner { float fadeticks = OutlineEntry.fadeTicks; float lastAlpha = prevTicks >= 0 ? 1 : 1 + (prevTicks / fadeticks); float currentAlpha = 1 + (entry.ticksTillRemoval / fadeticks); - float alpha = MathHelper.lerp(Minecraft.getInstance() - .getRenderPartialTicks(), lastAlpha, currentAlpha); + float alpha = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), lastAlpha, currentAlpha); outline.params.alpha = alpha * alpha * alpha; if (outline.params.alpha < 1 / 8f) From 59e29ac9584fac149b9f6809440254bf2be58d0d Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 23 Jan 2021 23:32:23 -0800 Subject: [PATCH 051/147] that was a nasty crash os memory exception because memory that was being sent to the gpu was getting modified by another thread --- .../create/foundation/render/light/LightVolume.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index e0f251bcf..54b56b982 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -102,7 +102,7 @@ public class LightVolume { * Completely (re)populate this volume with block and sky lighting data. * This is expensive and should be avoided. */ - public void initialize(ILightReader world) { + public synchronized void initialize(ILightReader world) { BlockPos.Mutable pos = new BlockPos.Mutable(); int shiftX = textureVolume.minX; @@ -125,7 +125,7 @@ public class LightVolume { * Copy block light from the world into this volume. * @param worldVolume the region in the world to copy data from. */ - public void copyBlock(ILightReader world, GridAlignedBB worldVolume) { + public synchronized void copyBlock(ILightReader world, GridAlignedBB worldVolume) { BlockPos.Mutable pos = new BlockPos.Mutable(); int xShift = textureVolume.minX; @@ -147,7 +147,7 @@ public class LightVolume { * Copy sky light from the world into this volume. * @param worldVolume the region in the world to copy data from. */ - public void copySky(ILightReader world, GridAlignedBB worldVolume) { + public synchronized void copySky(ILightReader world, GridAlignedBB worldVolume) { BlockPos.Mutable pos = new BlockPos.Mutable(); int xShift = textureVolume.minX; @@ -177,11 +177,15 @@ public class LightVolume { GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL20.GL_MIRRORED_REPEAT); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); if (bufferDirty) { - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, textureVolume.sizeX(), textureVolume.sizeY(), textureVolume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + uploadTexture(); bufferDirty = false; } } + private synchronized void uploadTexture() { + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, textureVolume.sizeX(), textureVolume.sizeY(), textureVolume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + } + public void release() { GL12.glBindTexture(GL12.GL_TEXTURE_3D, 0); } From f05497a28ca72496ba3e4e8a38bc34b14b7e3369 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sun, 24 Jan 2021 01:07:22 -0800 Subject: [PATCH 052/147] okay the synchronized functions didn't actually fix it but now we actually benefit from the tile entity render filtering, another 2x ish performance --- .../content/contraptions/base/KineticTileEntityRenderer.java | 5 ----- .../content/contraptions/relays/belt/BeltRenderer.java | 5 ----- .../simibubi/create/foundation/render/light/LightVolume.java | 3 ++- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 4f969416b..fe5f8387c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -35,11 +35,6 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer impleme public BeltRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } - - @Override - public boolean isGlobalRenderer(BeltTileEntity te) { - return BeltBlock.canTransportObjects(te.getBlockState()); - } @Override protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index 54b56b982..836139b49 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -178,12 +178,13 @@ public class LightVolume { GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); if (bufferDirty) { uploadTexture(); - bufferDirty = false; } } private synchronized void uploadTexture() { + lightData.rewind(); GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, textureVolume.sizeX(), textureVolume.sizeY(), textureVolume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + bufferDirty = false; } public void release() { From cb25c5ab21cc710d0716ca9fe3c198c5628a190b Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+SuicidalSteve@users.noreply.github.com> Date: Sun, 24 Jan 2021 16:46:07 +0100 Subject: [PATCH 053/147] Omnidirectional Crushing -Fix directionality of horizontally placed crushing wheels. -Allow crushing wheels to work omnidirectionally -Allow downwards crushers to deposit directly into belts/chutes/depots and such below. -Allow horizontal crushers to take input from belts going below them. -Allow horizontal crushers to deposit directly into belts/chutes/depots and such placed below, offset by one in the output direction. -Crushers stall when they have a valid output block but cannot actually output. -Crushers outputting in any direction except down will shoot out the item entities with some speed. -Crushers can take entity input from their corresponding input directions rather than just up. However, outputting the entity drops in the right location does currently not work consistently. --- .../java/com/simibubi/create/AllShapes.java | 8 +- .../crusher/CrushingWheelBlock.java | 55 ++++--- .../crusher/CrushingWheelControllerBlock.java | 58 ++++--- .../CrushingWheelControllerTileEntity.java | 144 +++++++++++++----- .../BeltCrusherInteractionHandler.java | 86 +++++++++++ .../relays/belt/transport/BeltInventory.java | 4 + 6 files changed, 281 insertions(+), 74 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index ee77c574d..a96686a77 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -111,7 +111,10 @@ public class AllShapes { .forHorizontal(Direction.SOUTH), PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12) .add(3, 12, 3, 13, 16, 13) - .forDirectional(Direction.UP) + .forDirectional(Direction.UP), + CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16) + .forDirectional(Direction.DOWN) + ; @@ -147,7 +150,8 @@ public class AllShapes { HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16) .build(), HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(), - CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 22, 16), SEAT = cuboid(0, 0, 0, 16, 8, 16), + CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 16, 16), + SEAT = cuboid(0, 0, 0, 16, 8, 16), SEAT_COLLISION = cuboid(0, 0, 0, 16, 6, 16), MECHANICAL_PROCESSOR_SHAPE = shape(VoxelShapes.fullCube()).erase(4, 0, 4, 12, 16, 12) .build(), diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java index 548b4c6f8..9b76c0b3f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.crusher; import static com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock.VALID; +import static com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock.FACING; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; @@ -17,6 +18,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; @@ -53,7 +55,7 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - for (Direction d : Iterate.horizontalDirections) { + for (Direction d : Iterate.directions) { if (d.getAxis() == state.get(AXIS)) continue; if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(worldIn.getBlockState(pos.offset(d)))) @@ -65,21 +67,26 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE } } - public void updateControllers(BlockState state, World world, BlockPos pos, Direction facing) { - if (facing.getAxis() == state.get(AXIS) || facing.getAxis() - .isVertical()) + public void updateControllers(BlockState state, World world, BlockPos pos, Direction side) { + if (side.getAxis() == state.get(AXIS)) return; if (world == null) return; - BlockPos controllerPos = pos.offset(facing); - BlockPos otherWheelPos = pos.offset(facing, 2); + BlockPos controllerPos = pos.offset(side); + BlockPos otherWheelPos = pos.offset(side, 2); boolean controllerExists = AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(world.getBlockState(controllerPos)); boolean controllerIsValid = controllerExists && world.getBlockState(controllerPos) - .get(VALID); + .get(VALID); + Direction controllerOldDirection = controllerExists + ? world.getBlockState(controllerPos) + .get(FACING) + : null; + boolean controllerShouldExist = false; boolean controllerShouldBeValid = false; + Direction controllerNewDirection = Direction.DOWN; BlockState otherState = world.getBlockState(otherWheelPos); if (AllBlocks.CRUSHING_WHEEL.has(otherState)) { @@ -90,10 +97,22 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE CrushingWheelTileEntity otherTe = getTileEntity(world, otherWheelPos); if (te != null && otherTe != null && (te.getSpeed() > 0) != (otherTe.getSpeed() > 0) - && te.getSpeed() != 0) { - float signum = Math.signum(te.getSpeed()) * (state.get(AXIS) == Axis.X ? -1 : 1); - controllerShouldBeValid = facing.getAxisDirection() - .getOffset() != signum; + && te.getSpeed() != 0) { + Axis wheelAxis = state.get(AXIS); + Axis sideAxis = side.getAxis(); + int controllerADO = Math.round(Math.signum(te.getSpeed())) * side.getAxisDirection().getOffset(); + Vec3d controllerDirVec = new Vec3d(wheelAxis == Axis.X ? 1 : 0 + , wheelAxis == Axis.Y ? 1 : 0 + , wheelAxis == Axis.Z ? 1 : 0) + .crossProduct(new Vec3d(sideAxis == Axis.X ? 1 : 0 + , sideAxis == Axis.Y ? 1 : 0 + , sideAxis == Axis.Z ? 1 : 0)); + + controllerNewDirection = Direction.getFacingFromVector(controllerDirVec.x * controllerADO + , controllerDirVec.y * controllerADO + , controllerDirVec.z * controllerADO); + + controllerShouldBeValid = true; } if (otherState.get(AXIS) != state.get(AXIS)) controllerShouldExist = false; @@ -111,18 +130,20 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE if (!controllerExists) { if (!world.getBlockState(controllerPos) - .getMaterial() - .isReplaceable()) + .getMaterial() + .isReplaceable()) return; world.setBlockState(controllerPos, AllBlocks.CRUSHING_WHEEL_CONTROLLER.getDefaultState() - .with(VALID, controllerShouldBeValid)); - } else if (controllerIsValid != controllerShouldBeValid) { + .with(VALID, controllerShouldBeValid) + .with(FACING, controllerNewDirection)); + } else if (controllerIsValid != controllerShouldBeValid || controllerOldDirection != controllerNewDirection) { world.setBlockState(controllerPos, world.getBlockState(controllerPos) - .with(VALID, controllerShouldBeValid)); + .with(VALID, controllerShouldBeValid) + .with(FACING, controllerNewDirection)); } ((CrushingWheelControllerBlock) AllBlocks.CRUSHING_WHEEL_CONTROLLER.get()) - .updateSpeed(world.getBlockState(controllerPos), world, controllerPos); + .updateSpeed(world.getBlockState(controllerPos), world, controllerPos); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java index d85549b7f..97ddd3101 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.crusher; import java.util.Random; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.block.ITE; @@ -11,6 +12,7 @@ import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.DirectionalBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -23,7 +25,7 @@ import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.shapes.ISelectionContext; @@ -34,7 +36,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; -public class CrushingWheelControllerBlock extends Block +public class CrushingWheelControllerBlock extends DirectionalBlock implements ITE { public CrushingWheelControllerBlock(Properties p_i48440_1_) { @@ -66,27 +68,40 @@ public class CrushingWheelControllerBlock extends Block @Override protected void fillStateContainer(Builder builder) { builder.add(VALID); + builder.add(FACING); super.fillStateContainer(builder); } public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { if (!state.get(VALID)) return; + + Direction facing = state.get(FACING); + Axis axis = facing.getAxis(); + + checkEntityForProcessing(worldIn, pos, entityIn); + withTileEntityDo(worldIn, pos, te -> { if (te.processingEntity == entityIn) - entityIn.setMotionMultiplier(state, new Vec3d(0.25D, (double) 0.05F, 0.25D)); + + entityIn.setMotionMultiplier(state, new Vec3d(axis == Axis.X ? (double) 0.05F : 0.25D + , axis == Axis.Y ? (double) 0.05F : 0.25D + , axis == Axis.Z ? (double) 0.05F : 0.25D)); }); } - @Override - public void onLanded(IBlockReader worldIn, Entity entityIn) { - super.onLanded(worldIn, entityIn); + public void checkEntityForProcessing(World worldIn, BlockPos pos, Entity entityIn){ try { - CrushingWheelControllerTileEntity te = getTileEntity(worldIn, entityIn.getPosition().down()); + CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); if (te.crushingspeed == 0) return; if (entityIn instanceof ItemEntity) ((ItemEntity) entityIn).setPickupDelay(10); + CompoundNBT data = entityIn.getPersistentData(); + if (data.contains("BypassCrushingWheel")) { + if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) + return; + } if (te.isOccupied()) return; boolean isPlayer = entityIn instanceof PlayerEntity; @@ -99,6 +114,12 @@ public class CrushingWheelControllerBlock extends Block } catch (TileEntityException e) {} } + @Override + public void onLanded(IBlockReader worldIn, Entity entityIn) { + super.onLanded(worldIn, entityIn); + //Moved to onEntityCollision to allow for omnidirectional input + } + @Override public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) { if (!stateIn.get(VALID)) @@ -128,7 +149,7 @@ public class CrushingWheelControllerBlock extends Block return; } - for (Direction d : Iterate.horizontalDirections) { + for (Direction d : Iterate.directions) { BlockState neighbour = world.getBlockState(pos.offset(d)); if (!AllBlocks.CRUSHING_WHEEL.has(neighbour)) continue; @@ -144,22 +165,19 @@ public class CrushingWheelControllerBlock extends Block @Override public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, - ISelectionContext context) { + ISelectionContext context) { if (!state.get(VALID)) - return VoxelShapes.fullCube(); + return AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING)); Entity entity = context.getEntity(); if (entity != null) { - if (entity != null) { - CompoundNBT data = entity.getPersistentData(); - if (data.contains("BypassCrushingWheel")) { - if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) - return VoxelShapes.empty(); - } - } - if (new AxisAlignedBB(pos).contains(entity.getPositionVec())) - return VoxelShapes.empty(); + CompoundNBT data = entity.getPersistentData(); + if (data.contains("BypassCrushingWheel")) { + if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel")))) + if (state.get(FACING) != Direction.UP) //Allow output items to land on top of the block rather than falling back through. + return VoxelShapes.empty(); + } try { CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); @@ -167,7 +185,7 @@ public class CrushingWheelControllerBlock extends Block return VoxelShapes.empty(); } catch (TileEntityException e) {} } - return VoxelShapes.fullCube(); + return AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java index 2c1eb2f3b..88d2ee50e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java @@ -6,6 +6,8 @@ import java.util.Optional; import java.util.Random; import java.util.UUID; +import static com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock.FACING; + import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.processing.ProcessingInventory; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; @@ -16,6 +18,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.BlockItem; @@ -28,7 +31,9 @@ import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraftforge.common.capabilities.Capability; @@ -63,7 +68,15 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add(new DirectBeltInputBehaviour(this)); + behaviours.add(new DirectBeltInputBehaviour(this).onlyInsertWhen(this::supportsDirectBeltInput)); + } + + private boolean supportsDirectBeltInput(Direction side) { + BlockState blockState = getBlockState(); + if (blockState == null) + return false; + Direction direction = blockState.get(CrushingWheelControllerBlock.FACING); + return direction == Direction.DOWN || direction == side; } @Override @@ -72,26 +85,37 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { if (searchForEntity) { searchForEntity = false; List search = world.getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos()), - e -> entityUUID.equals(e.getUniqueID())); + e -> entityUUID.equals(e.getUniqueID())); if (search.isEmpty()) clear(); else processingEntity = search.get(0); } + + if (!isOccupied()) return; if (crushingspeed == 0) return; float speed = crushingspeed * 4; - Vec3d outPos = VecHelper.getCenterOf(pos); + + Vec3d centerPos = VecHelper.getCenterOf(pos); + Direction facing = getBlockState().get(FACING); + int offset = facing.getAxisDirection().getOffset(); + Vec3d outSpeed = new Vec3d((facing.getAxis() == Axis.X ? 0.25D : 0.0D) * offset + , offset == 1 ? (facing.getAxis() == Axis.Y ? 0.5D : 0.0D) : 0.0D //Increased upwards speed so upwards crushing wheels shoot out the item properly. + , (facing.getAxis() == Axis.Z ? 0.25D : 0.0D) * offset); //No downwards speed, so downwards crushing wheels drop the items as before. + Vec3d outPos = centerPos.add((facing.getAxis() == Axis.X ? .55f * offset : 0f) + , (facing.getAxis() == Axis.Y ? .55f * offset : 0f) + , (facing.getAxis() == Axis.Z ? .55f * offset : 0f)); if (!hasEntity()) { float processingSpeed = - MathHelper.clamp((speed) / (!inventory.appliedRecipe ? MathHelper.log2(inventory.getStackInSlot(0) - .getCount()) : 1), .25f, 20); + MathHelper.clamp((speed) / (!inventory.appliedRecipe ? MathHelper.log2(inventory.getStackInSlot(0) + .getCount()) : 1), .25f, 20); inventory.remainingTime -= processingSpeed; spawnParticles(inventory.getStackInSlot(0)); @@ -105,61 +129,111 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { return; } - if (inventory.remainingTime <= 0) { - for (int slot = 0; slot < inventory.getSlots(); slot++) { - ItemStack stack = inventory.getStackInSlot(slot); - if (stack.isEmpty()) - continue; - ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack); - entityIn.setMotion(Vec3d.ZERO); - entityIn.getPersistentData() - .put("BypassCrushingWheel", NBTUtil.writeBlockPos(pos)); - world.addEntity(entityIn); - } - inventory.clear(); - world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16); + if (inventory.remainingTime > 0) { return; } + inventory.remainingTime = 0; + + //Output Items + if (facing.getAxis().isHorizontal() || facing == Direction.DOWN) { + BlockPos nextPos = pos.add(facing.getAxis() == Axis.X ? 1f * offset : 0f + , (facing == Direction.DOWN || facing.getAxis().isHorizontal()) ? -1f : 0f + , facing.getAxis() == Axis.Z ? 1f * offset : 0f); + DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(world, nextPos, DirectBeltInputBehaviour.TYPE); + if (behaviour != null) { + boolean changed = false; + if (!behaviour.canInsertFromSide(facing)) + return; + for (int slot = 0; slot < inventory.getSlots(); slot++) { + ItemStack stack = inventory.getStackInSlot(slot); + if (stack.isEmpty()) + continue; + ItemStack remainder = behaviour.handleInsertion(stack, facing, false); + if (remainder.equals(stack, false)) + continue; + inventory.setStackInSlot(slot, remainder); + changed = true; + } + if (changed) { + markDirty(); + sendData(); + } + return; + } + } + + //Eject Items + for (int slot = 0; slot < inventory.getSlots(); slot++) { + ItemStack stack = inventory.getStackInSlot(slot); + if (stack.isEmpty()) + continue; + ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack); + entityIn.setMotion(outSpeed); + entityIn.getPersistentData() + .put("BypassCrushingWheel", NBTUtil.writeBlockPos(pos)); + world.addEntity(entityIn); + } + inventory.clear(); + world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16); + return; } if (!processingEntity.isAlive() || !processingEntity.getBoundingBox() - .intersects(new AxisAlignedBB(pos).grow(.5f))) { + .intersects(new AxisAlignedBB(pos).grow(.5f))) { clear(); return; } double xMotion = ((pos.getX() + .5f) - processingEntity.getX()) / 2f; + double yMotion = ((pos.getY() + .5f) - processingEntity.getY()) / 2f; double zMotion = ((pos.getZ() + .5f) - processingEntity.getZ()) / 2f; if (processingEntity.isSneaking()) xMotion = zMotion = 0; - - processingEntity.setMotion(new Vec3d(xMotion, Math.max(-speed / 4f, -.5f), zMotion)); + double movement = Math.max(-speed / 4f, -.5f) * -offset; + processingEntity.setMotion(new Vec3d(facing.getAxis() == Axis.X ? movement : xMotion + , facing.getAxis() == Axis.Y ? movement : 0f //Do not move entities upwards or downwards for horizontal crushers, + , facing.getAxis() == Axis.Z ? movement : zMotion)); //Or they'll only get their feet crushed. if (world.isRemote) return; if (!(processingEntity instanceof ItemEntity)) { processingEntity.attackEntityFrom(CrushingWheelTileEntity.damageSource, - AllConfigs.SERVER.kinetics.crushingDamage.get()); + AllConfigs.SERVER.kinetics.crushingDamage.get()); if (!processingEntity.isAlive()) { - processingEntity.setPosition(outPos.x, outPos.y - .75f, outPos.z); + processingEntity.setPosition(outPos.x + (facing.getAxis() == Axis.X ? .75f * offset : 0f) //This is supposed to move the mobs to the output location + , outPos.y + (facing.getAxis() == Axis.Y ? .75f * offset : 0f) //So the item drops end up on the other end + , outPos.z + (facing.getAxis() == Axis.Z ? .75f * offset : 0f)); //This, however, does not currently work consistently for non-downwards crushers. } return; } ItemEntity itemEntity = (ItemEntity) processingEntity; itemEntity.setPickupDelay(20); - if (processingEntity.getY() < pos.getY() + .25f) { - inventory.clear(); - inventory.setStackInSlot(0, itemEntity.getItem() - .copy()); - itemInserted(inventory.getStackInSlot(0)); - itemEntity.remove(); - world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16); + if (facing.getAxis() == Axis.Y) { + if (processingEntity.getY() * -offset < (centerPos.y - .25f) * -offset) { + intakeItem(itemEntity); + } + } else if (facing.getAxis() == Axis.Z) { + if (processingEntity.getZ() * -offset < (centerPos.z - .25f) * -offset) { + intakeItem(itemEntity); + } + } else { + if (processingEntity.getX() * -offset < (centerPos.x - .25f) * -offset) { + intakeItem(itemEntity); + } } + } + private void intakeItem(ItemEntity itemEntity) { + inventory.clear(); + inventory.setStackInSlot(0, itemEntity.getItem() + .copy()); + itemInserted(inventory.getStackInSlot(0)); + itemEntity.remove(); + world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16); } protected void spawnParticles(ItemStack stack) { @@ -169,14 +243,14 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { IParticleData particleData = null; if (stack.getItem() instanceof BlockItem) particleData = new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock() - .getDefaultState()); + .getDefaultState()); else particleData = new ItemParticleData(ParticleTypes.ITEM, stack); Random r = world.rand; for (int i = 0; i < 4; i++) world.addParticle(particleData, pos.getX() + r.nextFloat(), pos.getY() + r.nextFloat(), - pos.getZ() + r.nextFloat(), 0, 0, 0); + pos.getZ() + r.nextFloat(), 0, 0, 0); } private void applyRecipe() { @@ -185,11 +259,11 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { List list = new ArrayList<>(); if (recipe.isPresent()) { int rolls = inventory.getStackInSlot(0) - .getCount(); + .getCount(); inventory.clear(); for (int roll = 0; roll < rolls; roll++) { List rolledResults = recipe.get() - .rollResults(); + .rollResults(); for (int i = 0; i < rolledResults.size(); i++) { ItemStack stack = rolledResults.get(i); ItemHelper.addToList(stack, list); @@ -238,7 +312,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { private void itemInserted(ItemStack stack) { Optional> recipe = findRecipe(); inventory.remainingTime = recipe.isPresent() ? recipe.get() - .getProcessingDuration() : 100; + .getProcessingDuration() : 100; inventory.appliedRecipe = false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java new file mode 100644 index 000000000..c1c9fae10 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java @@ -0,0 +1,86 @@ +package com.simibubi.create.content.contraptions.relays.belt.transport; + +import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock; +import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerTileEntity; +import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.items.ItemHandlerHelper; + +public class BeltCrusherInteractionHandler { + + public static boolean checkForCrushers(BeltInventory beltInventory, TransportedItemStack currentItem, + float nextOffset) { + + boolean beltMovementPositive = beltInventory.beltMovementPositive; + int firstUpcomingSegment = (int) Math.floor(currentItem.beltPosition); + int step = beltMovementPositive ? 1 : -1; + firstUpcomingSegment = MathHelper.clamp(firstUpcomingSegment, 0, beltInventory.belt.beltLength - 1); + + for (int segment = firstUpcomingSegment; beltMovementPositive ? segment <= nextOffset + : segment + 1 >= nextOffset; segment += step) { + BlockPos crusherPos = BeltHelper.getPositionForOffset(beltInventory.belt, segment) + .up(); + World world = beltInventory.belt.getWorld(); + BlockState crusherState = world.getBlockState(crusherPos); + if (!(crusherState.getBlock() instanceof CrushingWheelControllerBlock)) + continue; + Direction crusherFacing = crusherState.get(CrushingWheelControllerBlock.FACING); + Direction movementFacing = beltInventory.belt.getMovementFacing(); + boolean blocking = crusherFacing == movementFacing; + if (crusherFacing != movementFacing) + continue; + + float crusherEntry = segment + .5f; + crusherEntry += .399f * (beltMovementPositive ? -1 : 1); + + boolean hasCrossed = nextOffset > crusherEntry && beltMovementPositive + || nextOffset < crusherEntry && !beltMovementPositive; + if (!hasCrossed) + return false; + if (blocking) + currentItem.beltPosition = crusherEntry; + + TileEntity te = world.getTileEntity(crusherPos); + if (!(te instanceof CrushingWheelControllerTileEntity)) + return true; + + CrushingWheelControllerTileEntity crusherTE = (CrushingWheelControllerTileEntity) te; + + int amountToExtract = -1; + ItemStack toInsert = currentItem.stack.copy(); + if (amountToExtract > toInsert.getCount()) + if (blocking) + return true; + else + continue; + + ItemStack remainder = ItemHandlerHelper.insertItemStacked(crusherTE.inventory, toInsert, false); + if (toInsert.equals(remainder, false)) + if (blocking) + return true; + else + continue; + + int notFilled = currentItem.stack.getCount() - toInsert.getCount(); + if (!remainder.isEmpty()) { + remainder.grow(notFilled); + } else if (notFilled > 0) + remainder = ItemHandlerHelper.copyStackWithSize(currentItem.stack, notFilled); + + currentItem.stack = remainder; + beltInventory.belt.sendData(); + if (blocking) + return true; + } + + return false; + } + + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 1284afba9..1646171bd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -151,6 +151,10 @@ public class BeltInventory { if (BeltFunnelInteractionHandler.checkForFunnels(this, currentItem, nextOffset)) continue; + // Horizontal Crushing Wheels + if (BeltCrusherInteractionHandler.checkForCrushers(this, currentItem, nextOffset)) + continue; + // Apply Movement currentItem.beltPosition += limitedMovement; currentItem.sideOffset += From 7bac93a03ccbe49456ddb56b1cfd464893915455 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 25 Jan 2021 00:24:07 -0800 Subject: [PATCH 054/147] fix drill orientation issue in contraptions --- .../content/contraptions/components/actors/DrillRenderer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index d3edadc79..9d2414870 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -49,10 +49,11 @@ public class DrillRenderer extends KineticTileEntityRenderer { model.setupInstance(data -> { Direction facing = state.get(DrillBlock.FACING); + float localRotationX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); data.setPosition(context.localPos) .setRotationOffset(0) .setRotationAxis(0, 0, 1) - .setLocalRotation(AngleHelper.verticalAngle(facing), facing.getHorizontalAngle(), 0); + .setLocalRotation(localRotationX, facing.getHorizontalAngle(), 0); }); } From 93353b61d636ab3ab026771c9a83827254a7d901 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 25 Jan 2021 01:17:55 -0800 Subject: [PATCH 055/147] smarter light volumes start the process of creating sane gl abstractions stabilized contraption bounds now fit tightly with them fix global tile entity issues --- .../components/deployer/DeployerRenderer.java | 5 + .../deployer/DeployerTileEntity.java | 6 -- .../mixer/MechanicalMixerRenderer.java | 5 + .../NonStationaryLighter.java | 10 ++ .../bearing/BearingLighter.java | 43 ++++++++- .../bearing/ClockworkBearingTileEntity.java | 4 + .../bearing/MechanicalBearingTileEntity.java | 4 + .../bearing/StabilizedContraption.java | 1 - .../processing/BasinOperatingTileEntity.java | 4 - .../relays/belt/BeltRenderer.java | 5 + .../relays/belt/BeltTileEntity.java | 7 -- .../block/mechanicalArm/ArmRenderer.java | 5 + .../block/mechanicalArm/ArmTileEntity.java | 4 - .../simibubi/create/events/ClientEvents.java | 1 + .../create/foundation/render/GPUBuffer.java | 61 ++++++------ .../create/foundation/render/RenderMath.java | 6 -- .../foundation/render/TemplateBuffer.java | 12 ++- .../create/foundation/render/gl/GlBuffer.java | 21 +++++ .../create/foundation/render/gl/GlObject.java | 43 +++++++++ .../foundation/render/gl/GlTexture.java | 25 +++++ .../foundation/render/gl/GlVertexArray.java | 21 +++++ .../instancing/DynamicInstanceBuffer.java | 11 ++- .../render/instancing/InstanceBuffer.java | 21 ++--- .../render/light/GridAlignedBB.java | 67 ++++--------- .../foundation/render/light/LightVolume.java | 94 ++++++++++++++----- 25 files changed, 328 insertions(+), 158 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/GlObject.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/GlTexture.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 40193fb67..e4e6b4031 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -39,6 +39,11 @@ public class DeployerRenderer extends SafeTileEntityRenderer super(dispatcher); } + @Override + public boolean isGlobalRenderer(DeployerTileEntity te) { + return true; + } + @Override protected void renderSafe(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index d0d0ea8cf..52c8ec809 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -376,10 +376,4 @@ public class DeployerTileEntity extends KineticTileEntity { TooltipHelper.addHint(tooltip, "hint.full_deployer"); return true; } - - @Override - public boolean shouldRenderAsTE() { - return true; - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 2ab2d8e75..b6344d5bd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -24,6 +24,11 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { super(dispatcher); } + @Override + public boolean isGlobalRenderer(KineticTileEntity te) { + return true; + } + @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java index 650a68248..92a7b2ff9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java @@ -9,6 +9,16 @@ public class NonStationaryLighter extends ContraptionLigh super(contraption); } + @Override + protected GridAlignedBB contraptionBoundsToVolume(GridAlignedBB bounds) { + bounds = bounds.copy(); + bounds.grow(2); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting + bounds.minY = Math.max(bounds.minY, 0); + bounds.maxY = Math.min(bounds.maxY, 255); + + return bounds; + } + @Override public void tick(RenderedContraption owner) { GridAlignedBB contraptionBounds = getContraptionBounds(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java index d49efaa43..31f3c79b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java @@ -2,6 +2,10 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.simibubi.create.foundation.render.light.ContraptionLighter; import com.simibubi.create.foundation.render.light.GridAlignedBB; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; + +import java.util.Set; public class BearingLighter extends ContraptionLighter { @@ -11,9 +15,40 @@ public class BearingLighter extends ContraptionLighter { @Override public GridAlignedBB getContraptionBounds() { - GridAlignedBB localBounds = GridAlignedBB.fromAABB(contraption.bounds); - localBounds.rotate45(contraption.getFacing().getAxis()); - localBounds.translate(contraption.anchor); - return localBounds; + Set blocks = contraption.getBlocks().keySet(); + + Direction orientation = contraption.facing; + + float maxDistanceSq = -1; + for (BlockPos pos : blocks) { + float x = pos.getX(); + float y = pos.getY(); + float z = pos.getZ(); + + float distSq = x * x + y * y + z * z; + + if (distSq > maxDistanceSq) maxDistanceSq = distSq; + } + + int radius = (int) (Math.ceil(Math.sqrt(maxDistanceSq))); + + GridAlignedBB betterBounds = GridAlignedBB.ofRadius(radius); + GridAlignedBB contraptionBounds = GridAlignedBB.fromAABB(contraption.bounds); + + Direction.Axis axis = orientation.getAxis(); + + if (axis == Direction.Axis.X) { + betterBounds.maxX = contraptionBounds.maxX; + betterBounds.minX = contraptionBounds.minX; + } else if (axis == Direction.Axis.Y) { + betterBounds.maxY = contraptionBounds.maxY; + betterBounds.minY = contraptionBounds.minY; + } else if (axis == Direction.Axis.Z) { + betterBounds.maxZ = contraptionBounds.maxZ; + betterBounds.minZ = contraptionBounds.minZ; + } + + betterBounds.translate(contraption.anchor); + return betterBounds; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java index aa465f4e9..91adc5d73 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java @@ -393,4 +393,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe return pos; } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index b4dde3bc4..75521e7df 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -282,4 +282,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp return true; } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java index 5bb70f602..fc1dd4420 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java @@ -26,7 +26,6 @@ public class StabilizedContraption extends Contraption { if (!searchMovedStructure(world, offset, null)) return false; startMoving(world); - expandBoundsAroundAxis(Axis.Y); if (blocks.isEmpty()) return false; return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java index 7c711358f..52e77bae2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java @@ -143,8 +143,4 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { protected abstract Object getRecipeCacheKey(); - @Override - public boolean shouldRenderAsTE() { - return true; - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 7582ace97..8e4c1bcfd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -50,6 +50,11 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme renderItems(te, partialTicks, ms, buffer, light, overlay); } + @Override + public boolean isGlobalRenderer(BeltTileEntity te) { + return te.isController(); + } + @Override public void addInstanceData(InstanceContext ctx) { BeltTileEntity te = ctx.te; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index c3ee377bf..c1f04f296 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -465,11 +465,4 @@ public class BeltTileEntity extends KineticTileEntity { return new ModelDataMap.Builder().withInitial(CASING_PROPERTY, casing) .build(); } - - @Override - public boolean shouldRenderAsTE() { - // Since only the controller does the item rendering, we potentially - // save a *lot* of time by not processing the other belts. - return isController(); - } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index ece88eec1..71b7224f1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -29,6 +29,11 @@ public class ArmRenderer extends KineticTileEntityRenderer { super(dispatcher); } + @Override + public boolean isGlobalRenderer(KineticTileEntity te) { + return true; + } + @Override protected void renderSafe(KineticTileEntity te, float pt, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index 0c56559d3..e088c50d0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -513,8 +513,4 @@ public class ArmTileEntity extends KineticTileEntity { } } - @Override - public boolean shouldRenderAsTE() { - return true; - } } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 10dafa065..8abe10395 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -27,6 +27,7 @@ import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.RenderWork; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.light.LightVolumeDebugger; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; diff --git a/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java b/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java index 0f7c3e167..8f1b845d6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java @@ -1,18 +1,20 @@ package com.simibubi.create.foundation.render; -import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.render.gl.GlBuffer; +import com.simibubi.create.foundation.render.gl.GlVertexArray; import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL40; import java.nio.ByteBuffer; public abstract class GPUBuffer extends TemplateBuffer { - protected int vao, ebo, invariantVBO; + protected GlVertexArray vao; + + protected GlBuffer ebo; + protected GlBuffer invariantVBO; protected boolean removed; public GPUBuffer(BufferBuilder buf) { @@ -25,12 +27,18 @@ public abstract class GPUBuffer extends TemplateBuffer { int invariantSize = vertexCount * stride; - vao = GL30.glGenVertexArrays(); - ebo = GlStateManager.genBuffers(); - invariantVBO = GlStateManager.genBuffers(); + vao = new GlVertexArray(); + invariantVBO = new GlBuffer(); + ebo = createEBO(); - GL30.glBindVertexArray(vao); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, invariantVBO); + vao.bind(); + + int numAttributes = getTotalShaderAttributeCount(); + for (int i = 0; i <= numAttributes; i++) { + GL40.glEnableVertexAttribArray(i); + } + + invariantVBO.bind(GL15.GL_ARRAY_BUFFER); // allocate the buffer on the gpu GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); @@ -44,14 +52,11 @@ public abstract class GPUBuffer extends TemplateBuffer { constant.rewind(); GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); - buildEBO(ebo); - getModelFormat().informAttributes(0); - GlStateManager.bindBuffers(GL15.GL_ARRAY_BUFFER, 0); - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + invariantVBO.unbind(GL15.GL_ARRAY_BUFFER); // Deselect (bind to 0) the VAO - GL30.glBindVertexArray(0); + vao.unbind(); } protected abstract void copyVertex(ByteBuffer to, int index); @@ -69,26 +74,17 @@ public abstract class GPUBuffer extends TemplateBuffer { } public void render() { - if (vao == 0 || removed) return; + if (vertexCount == 0 || removed) return; - GL30.glBindVertexArray(vao); + vao.bind(); preDrawTask(); - int numAttributes = getTotalShaderAttributeCount(); - for (int i = 0; i <= numAttributes; i++) { - GL40.glEnableVertexAttribArray(i); - } - - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + ebo.bind(GL15.GL_ELEMENT_ARRAY_BUFFER); drawCall(); - for (int i = 0; i <= numAttributes; i++) { - GL40.glDisableVertexAttribArray(i); - } - - GlStateManager.bindBuffers(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - GL30.glBindVertexArray(0); + ebo.unbind(GL15.GL_ELEMENT_ARRAY_BUFFER); + vao.unbind(); } public void delete() { @@ -99,11 +95,8 @@ public abstract class GPUBuffer extends TemplateBuffer { } protected void deleteInternal() { - GL15.glDeleteBuffers(invariantVBO); - GL15.glDeleteBuffers(ebo); - GL30.glDeleteVertexArrays(vao); - vao = 0; - ebo = 0; - invariantVBO = 0; + invariantVBO.delete(); + ebo.delete(); + vao.delete(); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java index b9cb6c5be..3839ff718 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java @@ -1,12 +1,6 @@ package com.simibubi.create.foundation.render; public class RenderMath { - public static final float SQRT2 = 1.41421356237f; - - public static int rotateSideLength(int i) { - return (int) Math.floor((float) i * SQRT2 / 4f); - } - public static int nextPowerOf2(int a) { int h = Integer.highestOneBit(a); return (h == a) ? h : (h << 1); diff --git a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java index c24e7261e..9f9fc7e0b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.datafixers.util.Pair; +import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.GL15; @@ -32,10 +33,13 @@ public class TemplateBuffer { ((Buffer)template).rewind(); } - protected void buildEBO(int ebo){ + protected final GlBuffer createEBO(){ + GlBuffer ebo = new GlBuffer(); + int indicesSize = vertexCount * VertexFormatElement.Type.USHORT.getSize(); - GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + ebo.bind(GL15.GL_ELEMENT_ARRAY_BUFFER); + GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); ByteBuffer indices = GL15.glMapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); @@ -46,6 +50,10 @@ public class TemplateBuffer { indices.rewind(); GL15.glUnmapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER); + + ebo.unbind(GL15.GL_ELEMENT_ARRAY_BUFFER); + + return ebo; } public boolean isEmpty() { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java new file mode 100644 index 000000000..59d30067f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java @@ -0,0 +1,21 @@ +package com.simibubi.create.foundation.render.gl; + +import org.lwjgl.opengl.GL20; + +public class GlBuffer extends GlObject { + public GlBuffer() { + setHandle(GL20.glGenBuffers()); + } + + public void bind(int target) { + GL20.glBindBuffer(target, handle()); + } + + public void unbind(int target) { + GL20.glBindBuffer(target, 0); + } + + protected void deleteInternal(int handle) { + GL20.glDeleteBuffers(handle); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlObject.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlObject.java new file mode 100644 index 000000000..3921657bb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlObject.java @@ -0,0 +1,43 @@ +package com.simibubi.create.foundation.render.gl; + +// Utility class for safely dealing with gl object handles. +public abstract class GlObject { + private static final int INVALID_HANDLE = Integer.MIN_VALUE; + + private int handle = INVALID_HANDLE; + + protected final void setHandle(int handle) { + this.handle = handle; + } + + public final int handle() { + this.checkHandle(); + + return this.handle; + } + + protected final void checkHandle() { + if (!this.isHandleValid()) { + throw new IllegalStateException("Handle is not valid"); + } + } + + protected final boolean isHandleValid() { + return this.handle != INVALID_HANDLE; + } + + protected final void invalidateHandle() { + this.handle = INVALID_HANDLE; + } + + public final void delete() { + if (!isHandleValid()) { + throw new IllegalStateException("Handle already deleted."); + } + + deleteInternal(handle); + invalidateHandle(); + } + + protected abstract void deleteInternal(int handle); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlTexture.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlTexture.java new file mode 100644 index 000000000..7c28e99c3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlTexture.java @@ -0,0 +1,25 @@ +package com.simibubi.create.foundation.render.gl; + +import org.lwjgl.opengl.GL20; + +public class GlTexture extends GlObject { + private final int textureType; + + public GlTexture(int textureType) { + this.textureType = textureType; + setHandle(GL20.glGenTextures()); + } + + @Override + protected void deleteInternal(int handle) { + GL20.glDeleteTextures(handle); + } + + public void bind() { + GL20.glBindTexture(textureType, handle()); + } + + public void unbind() { + GL20.glBindTexture(textureType, 0); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java new file mode 100644 index 000000000..64215e113 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java @@ -0,0 +1,21 @@ +package com.simibubi.create.foundation.render.gl; + +import org.lwjgl.opengl.GL30; + +public class GlVertexArray extends GlObject { + public GlVertexArray() { + setHandle(GL30.glGenVertexArrays()); + } + + public void bind() { + GL30.glBindVertexArray(handle()); + } + + public void unbind() { + GL30.glBindVertexArray(0); + } + + protected void deleteInternal(int handle) { + GL30.glDeleteVertexArrays(handle); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java index e4e90992d..540ec55e4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java @@ -1,11 +1,12 @@ package com.simibubi.create.foundation.render.instancing; +import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.*; public abstract class DynamicInstanceBuffer extends InstanceBuffer { - protected int dynamicVBO; + protected GlBuffer dynamicVBO; protected int dynamicBufferSize = -1; @@ -16,7 +17,7 @@ public abstract class DynamicInstanceBuffer extends GPUBuffer { public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV); - protected int instanceVBO; + protected GlBuffer instanceVBO; protected int instanceCount; protected int instanceBufferSize = -1; @@ -34,7 +35,7 @@ public abstract class InstanceBuffer extends GPUBuffer { @Override protected void setup() { super.setup(); - instanceVBO = GlStateManager.genBuffers(); + instanceVBO = new GlBuffer(); } @Override @@ -76,15 +77,8 @@ public abstract class InstanceBuffer extends GPUBuffer { } protected void deleteInternal() { - GL15.glDeleteBuffers(invariantVBO); - GL15.glDeleteBuffers(instanceVBO); - GL15.glDeleteBuffers(ebo); - GL30.glDeleteVertexArrays(vao); - vao = 0; - ebo = 0; - invariantVBO = 0; - instanceVBO = 0; - instanceBufferSize = -1; + super.deleteInternal(); + instanceVBO.delete(); } protected abstract D newInstance(); @@ -116,7 +110,7 @@ public abstract class InstanceBuffer extends GPUBuffer { int instanceSize = RenderMath.nextPowerOf2(instanceCount * instanceFormat.getStride()); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVBO); + instanceVBO.bind(GL15.GL_ARRAY_BUFFER); // this changes enough that it's not worth reallocating the entire buffer every time. if (instanceSize > instanceBufferSize) { @@ -137,8 +131,7 @@ public abstract class InstanceBuffer extends GPUBuffer { GL33.glVertexAttribDivisor(i + staticAttributes, 1); } - // Deselect (bind to 0) the VBO - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + instanceVBO.unbind(GL15.GL_ARRAY_BUFFER); shouldBuild = false; rebuffer = false; diff --git a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java index 210a74031..fd54986f4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java @@ -9,7 +9,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2; -import static com.simibubi.create.foundation.render.RenderMath.rotateSideLength; public class GridAlignedBB { public int minX; @@ -28,6 +27,10 @@ public class GridAlignedBB { this.maxZ = maxZ; } + public static GridAlignedBB ofRadius(int radius) { + return new GridAlignedBB(-radius, -radius, -radius, radius + 1, radius + 1, radius + 1); + } + public static GridAlignedBB copy(GridAlignedBB bb) { return new GridAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); } @@ -104,16 +107,6 @@ public class GridAlignedBB { maxZ += z; } - public void rotate45(Direction.Axis axis) { - if (axis == Direction.Axis.X) { - this.grow(0, rotateSideLength(sizeY()), rotateSideLength(sizeZ())); - } else if (axis == Direction.Axis.Y) { - this.grow(rotateSideLength(sizeX()), 0, rotateSideLength(sizeZ())); - } else if (axis == Direction.Axis.Z) { - this.grow(rotateSideLength(sizeX()), rotateSideLength(sizeY()), 0); - } - } - public void mirrorAbout(Direction.Axis axis) { Vec3i axisVec = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getDirectionVec(); int flipX = axisVec.getX() - 1; @@ -131,38 +124,6 @@ public class GridAlignedBB { this.minZ = maxZ; } - public void expandAroundAxis(Direction.Axis axis) { - int maxXDiff = Math.max(this.maxX - 1, -this.minX); - int maxYDiff = Math.max(this.maxY - 1, -this.minY); - int maxZDiff = Math.max(this.maxZ - 1, -this.minZ); - - int maxDiff; - if (axis == Direction.Axis.X) - maxDiff = Math.max(maxZDiff, maxYDiff); - else if (axis == Direction.Axis.Y) - maxDiff = Math.max(maxZDiff, maxXDiff); - else if (axis == Direction.Axis.Z) - maxDiff = Math.max(maxXDiff, maxYDiff); - else - maxDiff = 0; - - Vec3i axisVec = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getDirectionVec(); - int axisX = axisVec.getX(); - int axisY = axisVec.getY(); - int axisZ = axisVec.getZ(); - - int planeX = 1 - axisX; - int planeY = 1 - axisY; - int planeZ = 1 - axisZ; - - minX = axisX * minX - maxDiff * planeX; - minY = axisY * minY - maxDiff * planeY; - minZ = axisZ * minZ - maxDiff * planeZ; - maxX = axisX * maxX + (maxDiff + 1) * planeX; - maxY = axisY * maxY + (maxDiff + 1) * planeY; - maxZ = axisZ * maxZ + (maxDiff + 1) * planeZ; - } - /** * Grow this bounding box to have power of 2 side length, scaling from the center. */ @@ -269,6 +230,19 @@ public class GridAlignedBB { return this.intersects(other.minX, other.minY, other.minZ, other.maxX, other.maxY, other.maxZ); } + public boolean contains(GridAlignedBB other) { + return other.minX >= this.minX && + other.maxX <= this.maxX && + other.minY >= this.minY && + other.maxY <= this.maxY && + other.minZ >= this.minZ && + other.maxZ <= this.maxZ; + } + + public boolean isContainedBy(GridAlignedBB other) { + return other.contains(this); + } + public boolean intersects(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { return this.minX < maxX && this.maxX > minX && this.minY < maxY && this.maxY > minY && this.minZ < maxZ && this.maxZ > minZ; } @@ -292,12 +266,7 @@ public class GridAlignedBB { GridAlignedBB that = (GridAlignedBB) o; - if (minX != that.minX) return false; - if (minY != that.minY) return false; - if (minZ != that.minZ) return false; - if (maxX != that.maxX) return false; - if (maxY != that.maxY) return false; - return maxZ == that.maxZ; + return this.sameAs(that); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index 836139b49..027e9bfd4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.light; import com.simibubi.create.foundation.render.RenderWork; +import com.simibubi.create.foundation.render.gl.GlTexture; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; @@ -24,12 +25,12 @@ public class LightVolume { private boolean bufferDirty; private boolean removed; - private int glTexture; + private final GlTexture glTexture; public LightVolume(GridAlignedBB sampleVolume) { setSampleVolume(sampleVolume); - this.glTexture = GL11.glGenTextures(); + this.glTexture = new GlTexture(GL20.GL_TEXTURE_3D); this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte } @@ -84,32 +85,48 @@ public class LightVolume { } public void move(ILightReader world, GridAlignedBB newSampleVolume) { - setSampleVolume(newSampleVolume); - initialize(world); + if (textureVolume.contains(newSampleVolume)) { + if (newSampleVolume.intersects(sampleVolume)) { + GridAlignedBB newArea = newSampleVolume.intersect(sampleVolume); + sampleVolume = newSampleVolume; + + copyLight(world, newArea); + } else { + sampleVolume = newSampleVolume; + initialize(world); + } + } else { + setSampleVolume(newSampleVolume); + int volume = textureVolume.volume(); + if (volume * 2 > lightData.capacity()) { + lightData = MemoryUtil.memRealloc(lightData, volume * 2); + } + initialize(world); + } } public void notifyLightUpdate(ILightReader world, LightType type, SectionPos location) { GridAlignedBB changedVolume = GridAlignedBB.fromSection(location); + if (!changedVolume.intersects(sampleVolume)) + return; changedVolume.intersectAssign(sampleVolume); // compute the region contained by us that has dirty lighting data. - if (!changedVolume.empty()) { - if (type == LightType.BLOCK) copyBlock(world, changedVolume); - else if (type == LightType.SKY) copySky(world, changedVolume); - } + if (type == LightType.BLOCK) copyBlock(world, changedVolume); + else if (type == LightType.SKY) copySky(world, changedVolume); } /** * Completely (re)populate this volume with block and sky lighting data. * This is expensive and should be avoided. */ - public synchronized void initialize(ILightReader world) { + public void initialize(ILightReader world) { BlockPos.Mutable pos = new BlockPos.Mutable(); int shiftX = textureVolume.minX; int shiftY = textureVolume.minY; int shiftZ = textureVolume.minZ; - textureVolume.forEachContained((x, y, z) -> { + sampleVolume.forEachContained((x, y, z) -> { pos.setPos(x, y, z); int blockLight = world.getLightLevel(LightType.BLOCK, pos); @@ -125,7 +142,7 @@ public class LightVolume { * Copy block light from the world into this volume. * @param worldVolume the region in the world to copy data from. */ - public synchronized void copyBlock(ILightReader world, GridAlignedBB worldVolume) { + public void copyBlock(ILightReader world, GridAlignedBB worldVolume) { BlockPos.Mutable pos = new BlockPos.Mutable(); int xShift = textureVolume.minX; @@ -147,7 +164,7 @@ public class LightVolume { * Copy sky light from the world into this volume. * @param worldVolume the region in the world to copy data from. */ - public synchronized void copySky(ILightReader world, GridAlignedBB worldVolume) { + public void copySky(ILightReader world, GridAlignedBB worldVolume) { BlockPos.Mutable pos = new BlockPos.Mutable(); int xShift = textureVolume.minX; @@ -165,37 +182,66 @@ public class LightVolume { bufferDirty = true; } + /** + * Copy all light from the world into this volume. + * @param worldVolume the region in the world to copy data from. + */ + public void copyLight(ILightReader world, GridAlignedBB worldVolume) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + + int xShift = textureVolume.minX; + int yShift = textureVolume.minY; + int zShift = textureVolume.minZ; + + worldVolume.forEachContained((x, y, z) -> { + pos.setPos(x, y, z); + + int block = world.getLightLevel(LightType.BLOCK, pos); + int sky = world.getLightLevel(LightType.SKY, pos); + + writeLight(x - xShift, y - yShift, z - zShift, block, sky); + }); + + bufferDirty = true; + } + public void use() { // just in case something goes wrong or we accidentally call this before this volume is properly disposed of. - if (glTexture == 0 || lightData == null || removed) return; + if (lightData == null || removed) return; GL13.glActiveTexture(GL40.GL_TEXTURE4); - GL12.glBindTexture(GL12.GL_TEXTURE_3D, glTexture); + glTexture.bind(); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL20.GL_MIRRORED_REPEAT); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL20.GL_MIRRORED_REPEAT); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); + + uploadTexture(); + } + + private void uploadTexture() { if (bufferDirty) { - uploadTexture(); + int sizeX = textureVolume.sizeX(); + int sizeY = textureVolume.sizeY(); + int sizeZ = textureVolume.sizeZ(); + if (sizeX * sizeY * sizeZ * 2 > lightData.capacity()) + throw new IllegalStateException("Volume too big for buffer"); + + lightData.rewind(); + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + bufferDirty = false; } } - private synchronized void uploadTexture() { - lightData.rewind(); - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, textureVolume.sizeX(), textureVolume.sizeY(), textureVolume.sizeZ(), 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); - bufferDirty = false; - } - public void release() { - GL12.glBindTexture(GL12.GL_TEXTURE_3D, 0); + glTexture.unbind(); } public void delete() { removed = true; RenderWork.enqueue(() -> { - GL15.glDeleteTextures(glTexture); - glTexture = 0; + glTexture.delete(); MemoryUtil.memFree(lightData); lightData = null; }); From 1874b267b3f768487d47bcdff7bb6188892b0a72 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 25 Jan 2021 01:58:39 -0800 Subject: [PATCH 056/147] fix a contraption lighting glitch --- .../structureMovement/NonStationaryLighter.java | 1 + .../render/contraption/RenderedContraption.java | 2 +- .../render/light/ContraptionLighter.java | 15 +++++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java index 92a7b2ff9..54691d76c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java @@ -21,6 +21,7 @@ public class NonStationaryLighter extends ContraptionLigh @Override public void tick(RenderedContraption owner) { + super.tick(owner); GridAlignedBB contraptionBounds = getContraptionBounds(); if (!contraptionBounds.sameAs(bounds)) { diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index 76e8d7f9a..b36430fc3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -32,7 +32,7 @@ public class RenderedContraption { public final ContraptionKineticRenderer kinetics; - private Contraption contraption; + public Contraption contraption; private Matrix4f model; diff --git a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java index 68b4342cc..403fecee2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java @@ -2,11 +2,6 @@ package com.simibubi.create.foundation.render.light; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import net.minecraft.util.math.SectionPos; -import net.minecraft.world.ILightReader; -import net.minecraft.world.LightType; - -import static com.simibubi.create.foundation.render.RenderMath.nextPowerOf2; public abstract class ContraptionLighter { protected final C contraption; @@ -14,6 +9,8 @@ public abstract class ContraptionLighter { protected GridAlignedBB bounds; + protected boolean scheduleRebuild; + protected ContraptionLighter(C contraption) { this.contraption = contraption; @@ -22,6 +19,7 @@ public abstract class ContraptionLighter { lightVolume = new LightVolume(contraptionBoundsToVolume(bounds)); lightVolume.initialize(contraption.entity.world); + scheduleRebuild = true; } protected GridAlignedBB contraptionBoundsToVolume(GridAlignedBB bounds) { @@ -33,7 +31,12 @@ public abstract class ContraptionLighter { return bounds; } - public void tick(RenderedContraption owner) {} + public void tick(RenderedContraption owner) { + if (scheduleRebuild) { + lightVolume.initialize(owner.contraption.entity.world); + scheduleRebuild = false; + } + } public abstract GridAlignedBB getContraptionBounds(); } From f1c8e926861257cc0c61a448ac96c12f6f9bac71 Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+SuicidalSteve@users.noreply.github.com> Date: Mon, 25 Jan 2021 16:39:47 +0100 Subject: [PATCH 057/147] Horizontal Crushers Bugfix -Fix bug where horizontal crushers would input items they just output when the belt was 'facing' the opposite direction. --- .../CrushingWheelControllerTileEntity.java | 2 +- .../BeltCrusherInteractionHandler.java | 23 +++++-------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java index 88d2ee50e..147605918 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java @@ -137,7 +137,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { //Output Items if (facing.getAxis().isHorizontal() || facing == Direction.DOWN) { BlockPos nextPos = pos.add(facing.getAxis() == Axis.X ? 1f * offset : 0f - , (facing == Direction.DOWN || facing.getAxis().isHorizontal()) ? -1f : 0f + , (-1f) , facing.getAxis() == Axis.Z ? 1f * offset : 0f); DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(world, nextPos, DirectBeltInputBehaviour.TYPE); if (behaviour != null) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java index c1c9fae10..61a6b1514 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java @@ -32,19 +32,18 @@ public class BeltCrusherInteractionHandler { continue; Direction crusherFacing = crusherState.get(CrushingWheelControllerBlock.FACING); Direction movementFacing = beltInventory.belt.getMovementFacing(); - boolean blocking = crusherFacing == movementFacing; if (crusherFacing != movementFacing) continue; float crusherEntry = segment + .5f; crusherEntry += .399f * (beltMovementPositive ? -1 : 1); + float postCrusherEntry = crusherEntry + .199f * (!beltMovementPositive ? -1 : 1); - boolean hasCrossed = nextOffset > crusherEntry && beltMovementPositive - || nextOffset < crusherEntry && !beltMovementPositive; + boolean hasCrossed = nextOffset > crusherEntry && nextOffset < postCrusherEntry && beltMovementPositive + || nextOffset < crusherEntry && nextOffset > postCrusherEntry && !beltMovementPositive; if (!hasCrossed) return false; - if (blocking) - currentItem.beltPosition = crusherEntry; + currentItem.beltPosition = crusherEntry; TileEntity te = world.getTileEntity(crusherPos); if (!(te instanceof CrushingWheelControllerTileEntity)) @@ -52,20 +51,11 @@ public class BeltCrusherInteractionHandler { CrushingWheelControllerTileEntity crusherTE = (CrushingWheelControllerTileEntity) te; - int amountToExtract = -1; ItemStack toInsert = currentItem.stack.copy(); - if (amountToExtract > toInsert.getCount()) - if (blocking) - return true; - else - continue; ItemStack remainder = ItemHandlerHelper.insertItemStacked(crusherTE.inventory, toInsert, false); if (toInsert.equals(remainder, false)) - if (blocking) - return true; - else - continue; + return true; int notFilled = currentItem.stack.getCount() - toInsert.getCount(); if (!remainder.isEmpty()) { @@ -75,8 +65,7 @@ public class BeltCrusherInteractionHandler { currentItem.stack = remainder; beltInventory.belt.sendData(); - if (blocking) - return true; + return true; } return false; From 53a6ad00d505b5b1f4956c213357d16c094d3ca9 Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+SuicidalSteve@users.noreply.github.com> Date: Tue, 26 Jan 2021 19:11:45 +0100 Subject: [PATCH 058/147] Crushing More Bugs -Increase the size of the window in which the crusher picks up items to avoid it skipping over items at some of the highest speeds. --- .../relays/belt/transport/BeltCrusherInteractionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java index 61a6b1514..5568591f1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltCrusherInteractionHandler.java @@ -37,7 +37,7 @@ public class BeltCrusherInteractionHandler { float crusherEntry = segment + .5f; crusherEntry += .399f * (beltMovementPositive ? -1 : 1); - float postCrusherEntry = crusherEntry + .199f * (!beltMovementPositive ? -1 : 1); + float postCrusherEntry = crusherEntry + .799f * (!beltMovementPositive ? -1 : 1); boolean hasCrossed = nextOffset > crusherEntry && nextOffset < postCrusherEntry && beltMovementPositive || nextOffset < crusherEntry && nextOffset > postCrusherEntry && !beltMovementPositive; From 67d59540cf0dba6b2b8e1ef1c946c4778dba9fa6 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 26 Jan 2021 19:45:13 -0800 Subject: [PATCH 059/147] THIS IS NOT READY FOR USE new rendering api/pipeline not everything is there yet, but a lot is --- .../com/simibubi/create/AllBlockPartials.java | 58 ++++-- .../com/simibubi/create/AllTileEntities.java | 75 ++++--- .../com/simibubi/create/CreateClient.java | 21 +- .../base/BackHalfShaftInstance.java | 22 ++ .../contraptions/base/HalfShaftInstance.java | 32 +++ .../base/HorizontalHalfShaftInstance.java | 22 ++ .../contraptions/base/KineticTileEntity.java | 20 +- .../base/KineticTileEntityRenderer.java | 10 +- .../base/KineticTileInstance.java | 75 +++++++ .../base/RotatedPillarKineticBlock.java | 3 +- .../base/ShaftlessCogInstance.java | 23 +++ .../base/SingleRotatingInstance.java | 55 +++++ .../components/actors/DrillInstance.java | 25 +++ .../components/actors/DrillRenderer.java | 25 ++- .../components/actors/HarvesterRenderer.java | 13 +- .../components/clock/CuckooClockRenderer.java | 9 +- .../crafter/MechanicalCrafterRenderer.java | 21 +- .../components/deployer/DeployerRenderer.java | 1 - .../components/fan/EncasedFanRenderer.java | 10 +- .../components/flywheel/FlywheelRenderer.java | 11 +- .../millstone/MillStoneCogInstance.java | 25 +++ .../millstone/MillstoneRenderer.java | 5 +- .../mixer/MechanicalMixerRenderer.java | 4 +- .../motor/CreativeMotorRenderer.java | 5 +- .../components/saw/SawRenderer.java | 4 +- .../bearing/BearingRenderer.java | 7 +- .../contraptions/fluids/PumpCogInstance.java | 25 +++ .../contraptions/fluids/PumpRenderer.java | 11 +- .../advanced/SpeedControllerRenderer.java | 4 +- .../relays/belt/BeltInstance.java | 171 ++++++++++++++++ .../relays/belt/BeltRenderer.java | 55 ++--- .../contraptions/relays/belt/BeltSlope.java | 5 +- .../encased/SingleRotatingShaftInstance.java | 25 +++ .../relays/encased/SplitShaftInstance.java | 87 ++++++++ .../relays/encased/SplitShaftRenderer.java | 6 +- .../relays/gearbox/GearboxInstance.java | 121 +++++++++++ .../relays/gearbox/GearboxRenderer.java | 14 +- .../block/mechanicalArm/ArmInstance.java | 19 ++ .../block/mechanicalArm/ArmRenderer.java | 10 +- .../simibubi/create/events/ClientEvents.java | 2 +- .../foundation/mixin/OnRemoveTileMixin.java | 32 --- .../{GPUBuffer.java => BufferedModel.java} | 4 +- .../render/FastRenderDispatcher.java | 65 ++++-- ...ava => InstancedTileRenderDispatcher.java} | 91 +++++---- .../ContraptionKineticRenderer.java | 21 +- ...ptionBuffer.java => ContraptionModel.java} | 16 +- .../ContraptionRenderDispatcher.java | 6 +- .../contraption/RenderedContraption.java | 16 +- .../render/{ => gl}/shader/Shader.java | 2 +- .../{ => gl}/shader/ShaderCallback.java | 2 +- .../render/{ => gl}/shader/ShaderHelper.java | 3 +- .../render/instancing/BasicData.java | 72 ------- .../render/instancing/BeltData.java | 19 +- .../{BeltBuffer.java => BeltModel.java} | 4 +- ...Buffer.java => DynamicInstancedModel.java} | 5 +- .../render/instancing/IInstanceRendered.java | 4 +- .../render/instancing/IRendererFactory.java | 9 + .../render/instancing/InstanceBuffer.java | 140 ------------- .../render/instancing/InstanceContext.java | 13 +- .../render/instancing/InstanceKey.java | 31 +++ .../render/instancing/InstancedModel.java | 191 ++++++++++++++++++ .../InstancedTileRenderRegistry.java | 30 +++ .../render/instancing/KineticData.java | 101 +++++++++ .../instancing/KineticRenderMaterials.java | 6 +- .../render/instancing/ModelFactory.java | 2 +- .../render/instancing/RenderMaterial.java | 16 +- .../render/instancing/RotatingData.java | 21 +- ...RotatingBuffer.java => RotatingModel.java} | 4 +- .../render/instancing/TileEntityInstance.java | 38 ++++ .../render/instancing/VertexAttribute.java | 45 +++-- ...torBuffer.java => RotatingActorModel.java} | 6 +- .../render/light/ILightListener.java | 5 + .../resources/assets/create/shader/belt.vert | 41 ++-- .../create/shader/contraption_belt.vert | 23 ++- .../create/shader/contraption_rotating.vert | 19 +- .../assets/create/shader/rotating.vert | 26 +-- src/main/resources/create.mixins.json | 2 +- 77 files changed, 1626 insertions(+), 641 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/encased/SingleRotatingShaftInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java delete mode 100644 src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java rename src/main/java/com/simibubi/create/foundation/render/{GPUBuffer.java => BufferedModel.java} (95%) rename src/main/java/com/simibubi/create/foundation/render/{FastKineticRenderer.java => InstancedTileRenderDispatcher.java} (51%) rename src/main/java/com/simibubi/create/foundation/render/contraption/{ContraptionBuffer.java => ContraptionModel.java} (81%) rename src/main/java/com/simibubi/create/foundation/render/{ => gl}/shader/Shader.java (91%) rename src/main/java/com/simibubi/create/foundation/render/{ => gl}/shader/ShaderCallback.java (84%) rename src/main/java/com/simibubi/create/foundation/render/{ => gl}/shader/ShaderHelper.java (98%) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java rename src/main/java/com/simibubi/create/foundation/render/instancing/{BeltBuffer.java => BeltModel.java} (76%) rename src/main/java/com/simibubi/create/foundation/render/instancing/{DynamicInstanceBuffer.java => DynamicInstancedModel.java} (81%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/InstanceKey.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java rename src/main/java/com/simibubi/create/foundation/render/instancing/{RotatingBuffer.java => RotatingModel.java} (75%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java rename src/main/java/com/simibubi/create/foundation/render/instancing/actors/{RotatingActorBuffer.java => RotatingActorModel.java} (80%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/light/ILightListener.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 1eb2881ad..bc0c28e66 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -1,23 +1,17 @@ package com.simibubi.create; -import static net.minecraft.state.properties.BlockStateProperties.FACING; -import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.foundation.utility.*; - -import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.util.Direction; @@ -26,6 +20,15 @@ import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +import static net.minecraft.state.properties.BlockStateProperties.FACING; +import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; + public class AllBlockPartials { private static final List all = new ArrayList<>(); @@ -219,20 +222,41 @@ public class AllBlockPartials { return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); } - public InstanceBuffer renderOnRotating(InstanceContext ctx, BlockState referenceState) { + @Deprecated + public InstancedModel renderOnRotating(InstanceContext ctx, BlockState referenceState) { return ctx.getRotating().getModel(this, referenceState); } - public InstanceBuffer renderOnBelt(InstanceContext ctx, BlockState referenceState) { + public InstancedModel renderOnRotating(InstancedTileRenderDispatcher ctx, BlockState referenceState) { + return ctx.get(KineticRenderMaterials.ROTATING).getModel(this, referenceState); + } + + @Deprecated + public InstancedModel renderOnBelt(InstanceContext ctx, BlockState referenceState) { return ctx.getBelts().getModel(this, referenceState); } - public InstanceBuffer renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState) { + public InstancedModel renderOnBelt(InstancedTileRenderDispatcher ctx, BlockState referenceState) { + return ctx.get(KineticRenderMaterials.BELTS).getModel(this, referenceState); + } + + @Deprecated + public InstancedModel renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState) { Direction facing = referenceState.get(FACING); return renderOnDirectionalSouthRotating(ctx, referenceState, facing); } - public InstanceBuffer renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState, Direction facing) { + public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderDispatcher dispatcher, BlockState referenceState) { + Direction facing = referenceState.get(FACING); + return renderOnDirectionalSouthRotating(dispatcher, referenceState, facing); + } + + @Deprecated + public InstancedModel renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState, Direction facing) { + return renderOnDirectionalSouthRotating(ctx.getKinetics(), referenceState, facing); + } + + public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderDispatcher dispatcher, BlockState referenceState, Direction facing) { Supplier ms = () -> { MatrixStack stack = new MatrixStack(); MatrixStacker.of(stack) @@ -242,7 +266,7 @@ public class AllBlockPartials { .unCentre(); return stack; }; - return ctx.getRotating().getModel(this, referenceState, facing, ms); + return dispatcher.get(KineticRenderMaterials.ROTATING).getModel(this, referenceState, facing, ms); } } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 55b71eaee..8900b34c5 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -1,13 +1,7 @@ package com.simibubi.create; -import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.content.contraptions.components.actors.DrillRenderer; -import com.simibubi.create.content.contraptions.components.actors.DrillTileEntity; -import com.simibubi.create.content.contraptions.components.actors.HarvesterRenderer; -import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; -import com.simibubi.create.content.contraptions.components.actors.PortableFluidInterfaceTileEntity; -import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; -import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceRenderer; +import com.simibubi.create.content.contraptions.base.*; +import com.simibubi.create.content.contraptions.components.actors.*; import com.simibubi.create.content.contraptions.components.clock.CuckooClockRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterRenderer; @@ -25,6 +19,7 @@ import com.simibubi.create.content.contraptions.components.flywheel.FlywheelRend import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; import com.simibubi.create.content.contraptions.components.flywheel.engine.EngineRenderer; import com.simibubi.create.content.contraptions.components.flywheel.engine.FurnaceEngineTileEntity; +import com.simibubi.create.content.contraptions.components.millstone.MillStoneCogInstance; import com.simibubi.create.content.contraptions.components.millstone.MillstoneRenderer; import com.simibubi.create.content.contraptions.components.millstone.MillstoneTileEntity; import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerRenderer; @@ -47,20 +42,11 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pul import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.content.contraptions.components.turntable.TurntableTileEntity; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelTileEntity; +import com.simibubi.create.content.contraptions.fluids.PumpCogInstance; import com.simibubi.create.content.contraptions.fluids.PumpRenderer; import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; -import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyRenderer; -import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity; -import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainRenderer; -import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainTileEntity; -import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer; -import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveRenderer; -import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.TransparentStraightPipeRenderer; +import com.simibubi.create.content.contraptions.fluids.actors.*; +import com.simibubi.create.content.contraptions.fluids.pipes.*; import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; @@ -71,17 +57,15 @@ import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTil import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerRenderer; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity; +import com.simibubi.create.content.contraptions.relays.belt.BeltInstance; import com.simibubi.create.content.contraptions.relays.belt.BeltRenderer; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.SimpleKineticTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.AdjustablePulleyTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.ClutchTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftRenderer; -import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.SplitShaftRenderer; +import com.simibubi.create.content.contraptions.relays.encased.*; import com.simibubi.create.content.contraptions.relays.gauge.GaugeRenderer; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEntity; +import com.simibubi.create.content.contraptions.relays.gearbox.GearboxInstance; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxRenderer; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxTileEntity; import com.simibubi.create.content.contraptions.relays.gearbox.GearshiftTileEntity; @@ -99,15 +83,10 @@ import com.simibubi.create.content.logistics.block.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateTileEntity; import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTileEntity; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInstance; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity; -import com.simibubi.create.content.logistics.block.redstone.AnalogLeverRenderer; -import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; -import com.simibubi.create.content.logistics.block.redstone.ContentObserverTileEntity; -import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer; -import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; -import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; -import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity; +import com.simibubi.create.content.logistics.block.redstone.*; import com.simibubi.create.content.schematics.block.SchematicTableTileEntity; import com.simibubi.create.content.schematics.block.SchematicannonRenderer; import com.simibubi.create.content.schematics.block.SchematicannonTileEntity; @@ -133,30 +112,35 @@ public class AllTileEntities { .tileEntity("simple_kinetic", SimpleKineticTileEntity::new) .validBlocks(AllBlocks.SHAFT, AllBlocks.COGWHEEL, AllBlocks.LARGE_COGWHEEL) .renderer(() -> KineticTileEntityRenderer::new) + .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry MOTOR = Create.registrate() .tileEntity("motor", CreativeMotorTileEntity::new) .validBlocks(AllBlocks.CREATIVE_MOTOR) .renderer(() -> CreativeMotorRenderer::new) + .onRegister(HalfShaftInstance::register) .register(); public static final TileEntityEntry GEARBOX = Create.registrate() .tileEntity("gearbox", GearboxTileEntity::new) .validBlocks(AllBlocks.GEARBOX) .renderer(() -> GearboxRenderer::new) + .onRegister(GearboxInstance::register) .register(); public static final TileEntityEntry ENCASED_SHAFT = Create.registrate() .tileEntity("encased_shaft", EncasedShaftTileEntity::new) .validBlocks(AllBlocks.ANDESITE_ENCASED_SHAFT, AllBlocks.BRASS_ENCASED_SHAFT, AllBlocks.ENCASED_CHAIN_DRIVE) .renderer(() -> EncasedShaftRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry ADJUSTABLE_PULLEY = Create.registrate() .tileEntity("adjustable_pulley", AdjustablePulleyTileEntity::new) .validBlocks(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .renderer(() -> EncasedShaftRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry ENCASED_FAN = Create.registrate() @@ -175,12 +159,14 @@ public class AllTileEntities { .tileEntity("clutch", ClutchTileEntity::new) .validBlocks(AllBlocks.CLUTCH) .renderer(() -> SplitShaftRenderer::new) + .onRegister(SplitShaftInstance::register) .register(); public static final TileEntityEntry GEARSHIFT = Create.registrate() .tileEntity("gearshift", GearshiftTileEntity::new) .validBlocks(AllBlocks.GEARSHIFT) .renderer(() -> SplitShaftRenderer::new) + .onRegister(SplitShaftInstance::register) .register(); public static final TileEntityEntry TURNTABLE = Create.registrate() @@ -194,18 +180,21 @@ public class AllTileEntities { .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE) .validBlocks(AllBlocks.DYED_VALVE_HANDLES) .renderer(() -> HandCrankRenderer::new) + .onRegister(BackHalfShaftInstance::register) .register(); public static final TileEntityEntry CUCKOO_CLOCK = Create.registrate() .tileEntity("cuckoo_clock", CuckooClockTileEntity::new) .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) .renderer(() -> CuckooClockRenderer::new) + .onRegister(HorizontalHalfShaftInstance::register) .register(); public static final TileEntityEntry MECHANICAL_PUMP = Create.registrate() .tileEntity("mechanical_pump", PumpTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_PUMP) .renderer(() -> PumpRenderer::new) + .onRegister(PumpCogInstance::register) .register(); public static final TileEntityEntry SMART_FLUID_PIPE = Create.registrate() @@ -234,6 +223,7 @@ public class AllTileEntities { .tileEntity("fluid_valve", FluidValveTileEntity::new) .validBlocks(AllBlocks.FLUID_VALVE) .renderer(() -> FluidValveRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry FLUID_TANK = Create.registrate() @@ -252,6 +242,7 @@ public class AllTileEntities { .tileEntity("hose_pulley", HosePulleyTileEntity::new) .validBlocks(AllBlocks.HOSE_PULLEY) .renderer(() -> HosePulleyRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry SPOUT = Create.registrate() @@ -270,6 +261,7 @@ public class AllTileEntities { .tileEntity("belt", BeltTileEntity::new) .validBlocks(AllBlocks.BELT) .renderer(() -> BeltRenderer::new) + .onRegister(BeltInstance::register) .register(); public static final TileEntityEntry CHUTE = Create.registrate() @@ -294,36 +286,42 @@ public class AllTileEntities { .tileEntity("mechanical_arm", ArmTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_ARM) .renderer(() -> ArmRenderer::new) + .onRegister(ArmInstance::register) .register(); public static final TileEntityEntry MECHANICAL_PISTON = Create.registrate() .tileEntity("mechanical_piston", MechanicalPistonTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) .renderer(() -> MechanicalPistonRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry WINDMILL_BEARING = Create.registrate() .tileEntity("windmill_bearing", WindmillBearingTileEntity::new) .validBlocks(AllBlocks.WINDMILL_BEARING) .renderer(() -> BearingRenderer::new) + .onRegister(BackHalfShaftInstance::register) .register(); public static final TileEntityEntry MECHANICAL_BEARING = Create.registrate() .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_BEARING) .renderer(() -> BearingRenderer::new) + .onRegister(BackHalfShaftInstance::register) .register(); public static final TileEntityEntry CLOCKWORK_BEARING = Create.registrate() .tileEntity("clockwork_bearing", ClockworkBearingTileEntity::new) .validBlocks(AllBlocks.CLOCKWORK_BEARING) .renderer(() -> BearingRenderer::new) + .onRegister(BackHalfShaftInstance::register) .register(); public static final TileEntityEntry ROPE_PULLEY = Create.registrate() .tileEntity("rope_pulley", PulleyTileEntity::new) .validBlocks(AllBlocks.ROPE_PULLEY) .renderer(() -> PulleyRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry CHASSIS = Create.registrate() @@ -336,6 +334,7 @@ public class AllTileEntities { .tileEntity("drill", DrillTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_DRILL) .renderer(() -> DrillRenderer::new) + .onRegister(DrillInstance::register) .register(); public static final TileEntityEntry SAW = Create.registrate() @@ -367,6 +366,7 @@ public class AllTileEntities { .tileEntity("flywheel", FlywheelTileEntity::new) .validBlocks(AllBlocks.FLYWHEEL) .renderer(() -> FlywheelRenderer::new) + .onRegister(HorizontalHalfShaftInstance::register) .register(); public static final TileEntityEntry FURNACE_ENGINE = Create.registrate() @@ -379,12 +379,14 @@ public class AllTileEntities { .tileEntity("millstone", MillstoneTileEntity::new) .validBlocks(AllBlocks.MILLSTONE) .renderer(() -> MillstoneRenderer::new) + .onRegister(MillStoneCogInstance::register) .register(); public static final TileEntityEntry CRUSHING_WHEEL = Create.registrate() .tileEntity("crushing_wheel", CrushingWheelTileEntity::new) .validBlocks(AllBlocks.CRUSHING_WHEEL) .renderer(() -> KineticTileEntityRenderer::new) + .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry CRUSHING_WHEEL_CONTROLLER = @@ -398,24 +400,28 @@ public class AllTileEntities { .tileEntity("water_wheel", WaterWheelTileEntity::new) .validBlocks(AllBlocks.WATER_WHEEL) .renderer(() -> KineticTileEntityRenderer::new) + .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry MECHANICAL_PRESS = Create.registrate() .tileEntity("mechanical_press", MechanicalPressTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_PRESS) .renderer(() -> MechanicalPressRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry MECHANICAL_MIXER = Create.registrate() .tileEntity("mechanical_mixer", MechanicalMixerTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_MIXER) .renderer(() -> MechanicalMixerRenderer::new) + .onRegister(ShaftlessCogInstance::register) .register(); public static final TileEntityEntry DEPLOYER = Create.registrate() .tileEntity("deployer", DeployerTileEntity::new) .validBlocks(AllBlocks.DEPLOYER) .renderer(() -> DeployerRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry BASIN = Create.registrate() @@ -434,30 +440,35 @@ public class AllTileEntities { .tileEntity("mechanical_crafter", MechanicalCrafterTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_CRAFTER) .renderer(() -> MechanicalCrafterRenderer::new) + .onRegister(ShaftlessCogInstance::register) .register(); public static final TileEntityEntry SEQUENCED_GEARSHIFT = Create.registrate() .tileEntity("sequenced_gearshift", SequencedGearshiftTileEntity::new) .validBlocks(AllBlocks.SEQUENCED_GEARSHIFT) .renderer(() -> SplitShaftRenderer::new) + .onRegister(SplitShaftInstance::register) .register(); public static final TileEntityEntry ROTATION_SPEED_CONTROLLER = Create.registrate() .tileEntity("rotation_speed_controller", SpeedControllerTileEntity::new) .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) .renderer(() -> SpeedControllerRenderer::new) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry SPEEDOMETER = Create.registrate() .tileEntity("speedometer", SpeedGaugeTileEntity::new) .validBlocks(AllBlocks.SPEEDOMETER) .renderer(() -> GaugeRenderer::speed) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry STRESSOMETER = Create.registrate() .tileEntity("stressometer", StressGaugeTileEntity::new) .validBlocks(AllBlocks.STRESSOMETER) .renderer(() -> GaugeRenderer::stress) + .onRegister(SingleRotatingShaftInstance::register) .register(); public static final TileEntityEntry ANALOG_LEVER = Create.registrate() diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 02fbacc5d..ca0dcbdec 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -1,10 +1,5 @@ package com.simibubi.create; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; @@ -16,12 +11,11 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.FastKineticRenderer; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.utility.outliner.Outliner; - -import com.simibubi.create.foundation.render.shader.ShaderHelper; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelShapes; @@ -39,13 +33,18 @@ import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + public class CreateClient { public static ClientSchematicLoader schematicSender; public static SchematicHandler schematicHandler; public static SchematicAndQuillHandler schematicAndQuillHandler; public static SuperByteBufferCache bufferCache; - public static FastKineticRenderer kineticRenderer; + public static InstancedTileRenderDispatcher kineticRenderer; public static final Outliner outliner = new Outliner(); private static CustomBlockModels customBlockModels; @@ -73,7 +72,7 @@ public class CreateClient { bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); - kineticRenderer = new FastKineticRenderer(); + kineticRenderer = new InstancedTileRenderDispatcher(); AllKeys.register(); AllContainerTypes.registerScreenFactories(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java new file mode 100644 index 000000000..6538232d7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.contraptions.base; + +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; + +public class BackHalfShaftInstance extends HalfShaftInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, BackHalfShaftInstance::new); + } + + public BackHalfShaftInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected Direction getShaftDirection() { + return tile.getBlockState().get(BlockStateProperties.FACING).getOpposite(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java new file mode 100644 index 000000000..57611c092 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -0,0 +1,32 @@ +package com.simibubi.create.content.contraptions.base; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; + +public class HalfShaftInstance extends SingleRotatingInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, HalfShaftInstance::new); + } + + public HalfShaftInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected InstancedModel getModel() { + BlockState state = tile.getBlockState(); + Direction dir = getShaftDirection(); + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, state, dir); + } + + protected Direction getShaftDirection() { + return tile.getBlockState().get(BlockStateProperties.FACING); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java new file mode 100644 index 000000000..a4f9d2471 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.contraptions.base; + +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; + +public class HorizontalHalfShaftInstance extends HalfShaftInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, HorizontalHalfShaftInstance::new); + } + + public HorizontalHalfShaftInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected Direction getShaftDirection() { + return tile.getBlockState().get(BlockStateProperties.HORIZONTAL_FACING).getOpposite(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 90b76469d..d7973d1cb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.Create; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticNetwork; import com.simibubi.create.content.contraptions.RotationPropagator; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; @@ -246,7 +247,7 @@ public abstract class KineticTileEntity extends SmartTileEntity effects.triggerOverStressedEffect(); if (clientPacket) - FastRenderDispatcher.markForRebuild(this); + CreateClient.kineticRenderer.update(this); } public float getGeneratedSpeed() { @@ -458,8 +459,6 @@ public abstract class KineticTileEntity extends SmartTileEntity return overStressed; } - public static AxisAlignedBB NOWHERE_AABB = new AxisAlignedBB(Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN); - @Override public AxisAlignedBB getRenderBoundingBox() { return super.getRenderBoundingBox(); @@ -469,4 +468,19 @@ public abstract class KineticTileEntity extends SmartTileEntity public double getMaxRenderDistanceSquared() { return 16384.0D; // TODO: make this a config option } + + @Override + public void requestModelDataUpdate() { + super.requestModelDataUpdate(); + if (this.removed) { + FastRenderDispatcher.enqueueRemove(this); + } else { + FastRenderDispatcher.enqueueUpdate(this); + } + } + + @Override + public void onChunkLightUpdate() { + CreateClient.kineticRenderer.onLightUpdate(this); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index fe5f8387c..903b92b72 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -4,11 +4,11 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.Compartment; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -56,7 +56,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer void renderRotatingKineticBlock(InstanceContext ctx, BlockState renderedState) { - InstanceBuffer instancedRenderer = ctx.getRotating().getModel(KINETIC_TILE, renderedState); + InstancedModel instancedRenderer = ctx.getRotating().getModel(KINETIC_TILE, renderedState); renderRotatingBuffer(ctx, instancedRenderer); } @@ -64,7 +64,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer void renderRotatingBuffer(InstanceContext ctx, InstanceBuffer instancer) { + public static void renderRotatingBuffer(InstanceContext ctx, InstancedModel instancer) { instancer.setupInstance(data -> { T te = ctx.te; final BlockPos pos = te.getPos(); @@ -145,7 +145,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { return ctx.getRotating().getModel(KINETIC_TILE, getRenderedBlockState(ctx.te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java new file mode 100644 index 000000000..ccfd9515f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -0,0 +1,75 @@ +package com.simibubi.create.content.contraptions.base; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; +import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.*; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; +import net.minecraft.world.World; + +import java.util.function.Consumer; + +public abstract class KineticTileInstance extends TileEntityInstance { + + public KineticTileInstance(InstancedTileRenderDispatcher modelManager, T tile) { + super(modelManager, tile); + } + + protected void updateRotation(InstanceKey key, Direction.Axis axis) { + key.modifyInstance(data -> { + final BlockPos pos = tile.getPos(); + + data.setRotationalSpeed(tile.getSpeed()) + .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationAxis(axis); + }); + } + + protected final Consumer setupFunc(float speed, Direction.Axis axis) { + return data -> { + final BlockPos pos = tile.getPos(); + + data.setBlockLight(tile.getWorld().getLightLevel(LightType.BLOCK, tile.getPos())) + .setSkyLight(tile.getWorld().getLightLevel(LightType.SKY, tile.getPos())) + .setTileEntity(tile) + .setRotationalSpeed(speed) + .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationAxis(axis); + }; + } + + protected final void relight(KineticData data) { + World world = tile.getWorld(); + + data.setBlockLight(world.getLightLevel(LightType.BLOCK, tile.getPos())) + .setSkyLight(world.getLightLevel(LightType.SKY, tile.getPos())); + } + + protected static float getRotationOffsetForPosition(KineticTileEntity te, final BlockPos pos, final Direction.Axis axis) { + float offset = CogWheelBlock.isLargeCog(te.getBlockState()) ? 11.25f : 0; + double d = (((axis == Direction.Axis.X) ? 0 : pos.getX()) + ((axis == Direction.Axis.Y) ? 0 : pos.getY()) + + ((axis == Direction.Axis.Z) ? 0 : pos.getZ())) % 2; + if (d == 0) { + offset = 22.5f; + } + return offset; + } + + public static BlockState shaft(Direction.Axis axis) { + return AllBlocks.SHAFT.getDefaultState() + .with(ShaftBlock.AXIS, axis); + } + + public static Direction.Axis getRotationAxisOf(KineticTileEntity te) { + return ((IRotate) te.getBlockState() + .getBlock()).getRotationAxis(te.getBlockState()); + } + + protected final RenderMaterial> rotatingMaterial() { + return modelManager.get(KineticRenderMaterials.ROTATING); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java index 2e86a897a..f76ff0319 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.utility.Iterate; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; @@ -27,7 +26,7 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { switch (rot) { case COUNTERCLOCKWISE_90: case CLOCKWISE_90: - switch ((Direction.Axis) state.get(AXIS)) { + switch (state.get(AXIS)) { case X: return state.with(AXIS, Direction.Axis.Z); case Z: diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java new file mode 100644 index 000000000..d6f318f3f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java @@ -0,0 +1,23 @@ +package com.simibubi.create.content.contraptions.base; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.tileentity.TileEntityType; + +public class ShaftlessCogInstance extends SingleRotatingInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, ShaftlessCogInstance::new); + } + + public ShaftlessCogInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected InstancedModel getModel() { + return AllBlockPartials.SHAFTLESS_COGWHEEL.renderOnRotating(modelManager, tile.getBlockState()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java new file mode 100644 index 000000000..9e1732cd2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -0,0 +1,55 @@ +package com.simibubi.create.content.contraptions.base; + +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstanceKey; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; + +import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.KINETIC_TILE; + +public class SingleRotatingInstance extends KineticTileInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, SingleRotatingInstance::new); + } + + protected InstanceKey rotatingModelKey; + + public SingleRotatingInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + Direction.Axis axis = ((IRotate) tile.getBlockState().getBlock()).getRotationAxis(tile.getBlockState()); + rotatingModelKey = getModel().setupInstance(setupFunc(tile.getSpeed(), axis)); + } + + @Override + public void onUpdate() { + Direction.Axis axis = ((IRotate) tile.getBlockState().getBlock()).getRotationAxis(tile.getBlockState()); + updateRotation(rotatingModelKey, axis); + } + + @Override + public void updateLight() { + rotatingModelKey.modifyInstance(this::relight); + } + + @Override + public void remove() { + rotatingModelKey.delete(); + rotatingModelKey = null; + } + + protected BlockState getRenderedBlockState() { + return tile.getBlockState(); + } + + protected InstancedModel getModel() { + return rotatingMaterial().getModel(KINETIC_TILE, getRenderedBlockState()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java new file mode 100644 index 000000000..2082919b6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.tileentity.TileEntityType; + +public class DrillInstance extends SingleRotatingInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, DrillInstance::new); + } + + public DrillInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected InstancedModel getModel() { + return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 9d2414870..e528be196 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -1,31 +1,29 @@ package com.simibubi.create.content.contraptions.components.actors; -import static net.minecraft.state.properties.BlockStateProperties.FACING; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; - -import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + public class DrillRenderer extends KineticTileEntityRenderer { public DrillRenderer(TileEntityRendererDispatcher dispatcher) { @@ -33,7 +31,7 @@ public class DrillRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); } @@ -42,18 +40,19 @@ public class DrillRenderer extends KineticTileEntityRenderer { } public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) { - RenderMaterial> renderMaterial = contraption.getActorMaterial(); + RenderMaterial> renderMaterial = contraption.getActorMaterial(); BlockState state = context.state; - InstanceBuffer model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); + InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); model.setupInstance(data -> { Direction facing = state.get(DrillBlock.FACING); - float localRotationX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); + float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); + float eulerY = facing.getHorizontalAngle(); data.setPosition(context.localPos) .setRotationOffset(0) .setRotationAxis(0, 0, 1) - .setLocalRotation(localRotationX, facing.getHorizontalAngle(), 0); + .setLocalRotation(eulerX, eulerY, 0); }); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 29a006d6f..094ab403f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -1,20 +1,17 @@ package com.simibubi.create.content.contraptions.components.actors; -import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RenderMaterial; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -24,6 +21,8 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; + public class HarvesterRenderer extends SafeTileEntityRenderer { public HarvesterRenderer(TileEntityRendererDispatcher dispatcher) { @@ -40,10 +39,10 @@ public class HarvesterRenderer extends SafeTileEntityRenderer> renderMaterial = contraption.getActorMaterial(); + RenderMaterial> renderMaterial = contraption.getActorMaterial(); BlockState state = context.state; - InstanceBuffer model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); + InstancedModel model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); model.setupInstance(data -> { Direction facing = state.get(HORIZONTAL_FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index 9b2406d28..7d8656958 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -6,12 +6,11 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.SuperByteBuffer; - +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -93,7 +92,7 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { BlockState blockState = ctx.te.getBlockState(); return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, blockState, blockState.get(CuckooClockBlock.HORIZONTAL_FACING).getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java index f5068e880..740b1ca59 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java @@ -1,20 +1,16 @@ package com.simibubi.create.content.contraptions.components.crafter; -import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; -import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.standardKineticRotationTransform; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity.Phase; import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHandler.GroupedItems; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; - import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -25,11 +21,12 @@ import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; + public class MechanicalCrafterRenderer extends SafeTileEntityRenderer { public MechanicalCrafterRenderer(TileEntityRendererDispatcher dispatcher) { @@ -154,12 +151,12 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - KineticTileEntityRenderer.renderRotatingKineticBlock(new InstanceContext.World<>(te), getRenderedBlockState(te)); BlockState blockState = te.getBlockState(); BlockPos pos = te.getPos(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 4fbce8fb9..694afdf78 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -5,8 +5,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -35,9 +35,9 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { Direction direction = te.getBlockState() .get(FACING); - InstanceBuffer shaftHalf = + InstancedModel shaftHalf = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); - InstanceBuffer fanInner = + InstancedModel fanInner = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); shaftHalf.setupInstance(data -> { @@ -91,9 +91,9 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { Direction direction = te.getBlockState() .get(FACING); - InstanceBuffer shaftHalf = + InstancedModel shaftHalf = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); - InstanceBuffer fanInner = + InstancedModel fanInner = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); shaftHalf.clearInstanceData(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 89508a0cd..fd77e7f42 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -1,19 +1,16 @@ package com.simibubi.create.content.contraptions.components.flywheel; -import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; -import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; - -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -25,6 +22,8 @@ import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.Rotation; import net.minecraft.util.math.MathHelper; +import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; + public class FlywheelRenderer extends KineticTileEntityRenderer { public FlywheelRenderer(TileEntityRendererDispatcher dispatcher) { @@ -77,7 +76,7 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState(), ctx.te.getBlockState() .get(HORIZONTAL_FACING) .getOpposite()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java new file mode 100644 index 000000000..03c408569 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.contraptions.components.millstone; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.tileentity.TileEntityType; + +public class MillStoneCogInstance extends SingleRotatingInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, MillStoneCogInstance::new); + } + + public MillStoneCogInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected InstancedModel getModel() { + return AllBlockPartials.MILLSTONE_COG.renderOnRotating(modelManager, tile.getBlockState()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index 26316a422..7121fe9d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -3,9 +3,8 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; - -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -16,7 +15,7 @@ public class MillstoneRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { return AllBlockPartials.MILLSTONE_COG.renderOnRotating(ctx, ctx.te.getBlockState()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index b6344d5bd..fc1fc2df6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.block.BlockState; @@ -57,7 +57,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { return AllBlockPartials.SHAFTLESS_COGWHEEL.renderOnRotating(ctx, ctx.te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 96d02d5b2..5d74bf9ac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -3,9 +3,8 @@ package com.simibubi.create.content.contraptions.components.motor; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; - -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -16,7 +15,7 @@ public class CreativeMotorRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index e35d85a0b..d357081eb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -136,7 +136,7 @@ public class SawRenderer extends SafeTileEntityRenderer implement } } - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { KineticTileEntity te = ctx.te; BlockState state = te.getBlockState(); if (state.get(FACING).getAxis().isHorizontal()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index 6c6bc65fc..bb7a8765b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -4,12 +4,11 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; - -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -47,7 +46,7 @@ public class BearingRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { BlockState blockState = ctx.te.getBlockState(); return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, blockState, blockState.get(BearingBlock.FACING).getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java new file mode 100644 index 000000000..cd8558bd0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.contraptions.fluids; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.tileentity.TileEntityType; + +public class PumpCogInstance extends SingleRotatingInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, PumpCogInstance::new); + } + + public PumpCogInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected InstancedModel getModel() { + return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index fed7f4b04..985a775fe 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -4,13 +4,12 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; - -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; -import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -54,7 +53,7 @@ public class PumpRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 5fade0d1d..5ae680b64 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -33,7 +33,7 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer getRotatedModel(InstanceContext ctx) { + private InstancedModel getRotatedModel(InstanceContext ctx) { return ctx.getRotating().getModel(KineticTileEntityRenderer.KINETIC_TILE, KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(ctx.te))); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java new file mode 100644 index 000000000..f76a5b502 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -0,0 +1,171 @@ +package com.simibubi.create.content.contraptions.relays.belt; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.base.KineticTileInstance; +import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; + +import java.util.ArrayList; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class BeltInstance extends KineticTileInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, BeltInstance::new); + } + + private boolean upward; + private boolean diagonal; + private boolean sideways; + private boolean vertical; + private boolean alongX; + private boolean alongZ; + private BeltSlope beltSlope; + private Direction facing; + protected ArrayList> keys; + protected InstanceKey pulleyKey; + + public BeltInstance(InstancedTileRenderDispatcher modelManager, BeltTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + BlockState blockState = tile.getBlockState(); + if (!AllBlocks.BELT.has(blockState)) + return; + + keys = new ArrayList<>(2); + + beltSlope = blockState.get(BeltBlock.SLOPE); + facing = blockState.get(BeltBlock.HORIZONTAL_FACING); + upward = beltSlope == BeltSlope.UPWARD; + diagonal = beltSlope.isDiagonal(); + sideways = beltSlope == BeltSlope.SIDEWAYS; + vertical = beltSlope == BeltSlope.VERTICAL; + alongX = facing.getAxis() == Direction.Axis.X; + alongZ = facing.getAxis() == Direction.Axis.Z; + + BeltPart part = blockState.get(BeltBlock.PART); + boolean start = part == BeltPart.START; + boolean end = part == BeltPart.END; + + for (boolean bottom : Iterate.trueAndFalse) { + AllBlockPartials beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); + SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(diagonal, bottom); + + InstancedModel beltModel = beltPartial.renderOnBelt(modelManager, blockState); + Consumer setupFunc = setupFunc(spriteShift); + + keys.add(beltModel.setupInstance(setupFunc)); + + if (diagonal) break; + } + + if (tile.hasPulley()) { + InstancedModel pulleyModel = getPulleyModel(blockState); + + pulleyKey = pulleyModel.setupInstance(setupFunc(tile.getSpeed(), getRotationAxisOf(tile))); + } + } + + @Override + public void onUpdate() { + for (InstanceKey key : keys) { + key.modifyInstance(data -> data.setRotationalSpeed(getScrollSpeed())); + } + + if (pulleyKey != null) { + updateRotation(pulleyKey, getRotationAxisOf(tile)); + } + } + + @Override + public void updateLight() { + for (InstanceKey key : keys) { + key.modifyInstance(this::relight); + } + + if (pulleyKey != null) pulleyKey.modifyInstance(this::relight); + } + + @Override + public void remove() { + keys.forEach(InstanceKey::delete); + keys.clear(); + if (pulleyKey != null) pulleyKey.delete(); + pulleyKey = null; + } + + private float getScrollSpeed() { + float speed = tile.getSpeed(); + if (((facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE) ^ upward) ^ + ((alongX && !diagonal) || (alongZ && diagonal)) ^ (vertical && facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE)) { + speed = -speed; + } + if (sideways && (facing == Direction.SOUTH || facing == Direction.WEST)) + speed = -speed; + + return speed; + } + + private InstancedModel getPulleyModel(BlockState blockState) { + Direction dir = getOrientation(blockState); + + Direction.Axis axis = dir.getAxis(); + + Supplier ms = () -> { + MatrixStack modelTransform = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(modelTransform); + msr.centre(); + if (axis == Direction.Axis.X) + msr.rotateY(90); + if (axis == Direction.Axis.Y) + msr.rotateX(90); + msr.rotateX(90); + msr.unCentre(); + + return modelTransform; + }; + + return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms); + } + + private Direction getOrientation(BlockState blockState) { + Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) + .rotateY(); + if (beltSlope == BeltSlope.SIDEWAYS) + dir = Direction.UP; + + return dir; + } + + private Consumer setupFunc(SpriteShiftEntry spriteShift) { + return data -> { + float rotX = (!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0) + (beltSlope == BeltSlope.DOWNWARD ? 180 : 0); + float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 90 : 0); + float rotZ = sideways ? 90 : ((vertical && facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE) ? 180 : 0); + + BlockPos pos = tile.getPos(); + data.setTileEntity(tile) + .setBlockLight(tile.getWorld().getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(tile.getWorld().getLightLevel(LightType.SKY, pos)) + .setRotation(rotX, rotY, rotZ) + .setRotationalSpeed(getScrollSpeed()) + .setRotationOffset(0) + .setScrollTexture(spriteShift) + .setScrollMult(diagonal ? 3f / 8f : 0.5f); + }; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 8e4c1bcfd..c598fe765 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -7,7 +7,6 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.render.FastKineticRenderer; import com.simibubi.create.foundation.render.ShadowRenderHelper; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -85,18 +84,10 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme for (boolean bottom : Iterate.trueAndFalse) { - AllBlockPartials beltPartial = diagonal - ? start ? AllBlockPartials.BELT_DIAGONAL_START - : end ? AllBlockPartials.BELT_DIAGONAL_END : AllBlockPartials.BELT_DIAGONAL_MIDDLE - : bottom - ? start ? AllBlockPartials.BELT_START_BOTTOM - : end ? AllBlockPartials.BELT_END_BOTTOM : AllBlockPartials.BELT_MIDDLE_BOTTOM - : start ? AllBlockPartials.BELT_START - : end ? AllBlockPartials.BELT_END : AllBlockPartials.BELT_MIDDLE; + AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); - InstanceBuffer beltBuffer = beltPartial.renderOnBelt(ctx, blockState); - SpriteShiftEntry spriteShift = - diagonal ? AllSpriteShifts.BELT_DIAGONAL : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; + InstancedModel beltBuffer = beltPartial.renderOnBelt(ctx, blockState); + SpriteShiftEntry spriteShift = getSpriteShiftEntry(diagonal, bottom); beltBuffer.setupInstance(data -> { float speed = te.getSpeed(); @@ -127,11 +118,34 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme } if (te.hasPulley()) { - InstanceBuffer rotatingBuffer = getPulleyModel(ctx, blockState, sideways); + InstancedModel rotatingBuffer = getPulleyModel(ctx, blockState, sideways); KineticTileEntityRenderer.renderRotatingBuffer(ctx, rotatingBuffer); } } + public static SpriteShiftEntry getSpriteShiftEntry(boolean diagonal, boolean bottom) { + if (diagonal) return AllSpriteShifts.BELT_DIAGONAL; + if (bottom) return AllSpriteShifts.BELT_OFFSET; + return AllSpriteShifts.BELT; + } + + public static AllBlockPartials getBeltPartial(boolean diagonal, boolean start, boolean end, boolean bottom) { + if (diagonal) { + if (start) return AllBlockPartials.BELT_DIAGONAL_START; + if (end) return AllBlockPartials.BELT_DIAGONAL_END; + return AllBlockPartials.BELT_DIAGONAL_MIDDLE; + } else { + if (bottom) { + if (start) return AllBlockPartials.BELT_START_BOTTOM; + if (end) return AllBlockPartials.BELT_END_BOTTOM; + return AllBlockPartials.BELT_MIDDLE_BOTTOM; + } + if (start) return AllBlockPartials.BELT_START; + if (end) return AllBlockPartials.BELT_END; + return AllBlockPartials.BELT_MIDDLE; + } + } + @Override public void markForRebuild(InstanceContext ctx) { BeltTileEntity te = ctx.te; @@ -161,16 +175,9 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme for (boolean bottom : Iterate.trueAndFalse) { - AllBlockPartials beltPartial = diagonal - ? start ? AllBlockPartials.BELT_DIAGONAL_START - : end ? AllBlockPartials.BELT_DIAGONAL_END : AllBlockPartials.BELT_DIAGONAL_MIDDLE - : bottom - ? start ? AllBlockPartials.BELT_START_BOTTOM - : end ? AllBlockPartials.BELT_END_BOTTOM : AllBlockPartials.BELT_MIDDLE_BOTTOM - : start ? AllBlockPartials.BELT_START - : end ? AllBlockPartials.BELT_END : AllBlockPartials.BELT_MIDDLE; + AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); - InstanceBuffer beltBuffer = beltPartial.renderOnBelt(ctx, blockState); + InstancedModel beltBuffer = beltPartial.renderOnBelt(ctx, blockState); beltBuffer.clearInstanceData(); @@ -179,12 +186,12 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme break; } - InstanceBuffer rotatingBuffer = getPulleyModel(ctx, blockState, sideways); + InstancedModel rotatingBuffer = getPulleyModel(ctx, blockState, sideways); rotatingBuffer.clearInstanceData(); } - private InstanceBuffer getPulleyModel(InstanceContext ctx, BlockState blockState, boolean sideways) { + private InstancedModel getPulleyModel(InstanceContext ctx, BlockState blockState, boolean sideways) { Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) .rotateY(); if (sideways) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java index 8f934e10f..ab6cf32a8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.relays.belt; import com.simibubi.create.foundation.utility.Lang; - import net.minecraft.util.IStringSerializable; public enum BeltSlope implements IStringSerializable { @@ -11,4 +10,8 @@ public enum BeltSlope implements IStringSerializable { public String getName() { return Lang.asId(name()); } + + public boolean isDiagonal() { + return this == UPWARD || this == DOWNWARD; + } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SingleRotatingShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SingleRotatingShaftInstance.java new file mode 100644 index 000000000..89a661795 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SingleRotatingShaftInstance.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.contraptions.relays.encased; + +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntityType; + +public class SingleRotatingShaftInstance extends SingleRotatingInstance { + + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, SingleRotatingShaftInstance::new); + } + + public SingleRotatingShaftInstance(InstancedTileRenderDispatcher dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected BlockState getRenderedBlockState() { + return shaft(getRotationAxisOf(tile)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java new file mode 100644 index 000000000..077b9b091 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -0,0 +1,87 @@ +package com.simibubi.create.content.contraptions.relays.encased; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.base.KineticTileInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstanceKey; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.Iterate; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; + +import java.util.ArrayList; + +public class SplitShaftInstance extends KineticTileInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, SplitShaftInstance::new); + } + + protected ArrayList> keys; + + public SplitShaftInstance(InstancedTileRenderDispatcher modelManager, SplitShaftTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + keys = new ArrayList<>(2); + + BlockState state = tile.getBlockState(); + Block block = state.getBlock(); + final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(state); + + float speed = tile.getSpeed(); + + for (Direction dir : Iterate.directionsInAxis(boxAxis)) { + + InstancedModel half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, state, dir); + + float splitSpeed = speed * tile.getRotationSpeedModifier(dir); + + keys.add(half.setupInstance(setupFunc(splitSpeed, boxAxis))); + } + } + + @Override + public void onUpdate() { + BlockState state = tile.getBlockState(); + Block block = state.getBlock(); + final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(state); + + Direction[] directions = Iterate.directionsInAxis(boxAxis); + + for (int i : Iterate.zeroAndOne) { + updateRotation(keys.get(i), directions[i]); + } + } + + @Override + public void updateLight() { + for (InstanceKey key : keys) { + key.modifyInstance(this::relight); + } + } + + @Override + public void remove() { + keys.forEach(InstanceKey::delete); + keys.clear(); + } + + protected void updateRotation(InstanceKey key, Direction dir) { + key.modifyInstance(data -> { + Direction.Axis axis = dir.getAxis(); + final BlockPos pos = tile.getPos(); + + data.setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir)) + .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); + }); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index cf0affbfc..4e41c84f3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,8 +5,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; @@ -52,7 +52,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { if (boxAxis != axis) continue; - InstanceBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); + InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); shaft.setupInstance(data -> { float speed = te.getSpeed(); @@ -84,7 +84,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { Axis axis = direction.getAxis(); if (boxAxis != axis) continue; - InstanceBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); + InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); shaft.clearInstanceData(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java new file mode 100644 index 000000000..58a259be2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -0,0 +1,121 @@ +package com.simibubi.create.content.contraptions.relays.gearbox; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstanceKey; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.Iterate; +import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; + +import java.util.EnumMap; +import java.util.Map; + +public class GearboxInstance extends KineticTileInstance { + public static void register(TileEntityType type) { + InstancedTileRenderRegistry.instance.register(type, GearboxInstance::new); + } + + protected EnumMap> keys; + protected Direction sourceFacing; + + public GearboxInstance(InstancedTileRenderDispatcher modelManager, GearboxTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + keys = new EnumMap<>(Direction.class); + + BlockState state = tile.getBlockState(); + + final Direction.Axis boxAxis = state.get(BlockStateProperties.AXIS); + + BlockPos pos = tile.getPos(); + int blockLight = tile.getWorld().getLightLevel(LightType.BLOCK, pos); + int skyLight = tile.getWorld().getLightLevel(LightType.SKY, pos); + updateSourceFacing(); + + for (Direction direction : Iterate.directions) { + final Direction.Axis axis = direction.getAxis(); + if (boxAxis == axis) + continue; + + InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, state, direction); + + InstanceKey key = shaft.setupInstance(data -> { + data.setBlockLight(blockLight) + .setSkyLight(skyLight) + .setRotationalSpeed(getSpeed(direction)) + .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setTileEntity(tile); + }); + keys.put(direction, key); + } + } + + private float getSpeed(Direction direction) { + float speed = tile.getSpeed(); + + if (speed != 0 && sourceFacing != null) { + if (sourceFacing.getAxis() == direction.getAxis()) + speed *= sourceFacing == direction ? 1 : -1; + else if (sourceFacing.getAxisDirection() == direction.getAxisDirection()) + speed *= -1; + } + return speed; + } + + protected void updateSourceFacing() { + if (tile.hasSource()) { + BlockPos source = tile.source.subtract(tile.getPos()); + sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); + } else { + sourceFacing = null; + } + } + + @Override + public void onUpdate() { + updateSourceFacing(); + BlockPos pos = tile.getPos(); + for (Map.Entry> key : keys.entrySet()) { + key.getValue().modifyInstance(data -> { + Direction direction = key.getKey(); + Direction.Axis axis = direction.getAxis(); + + data.setRotationalSpeed(getSpeed(direction)) + .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); + }); + } + } + + @Override + public void updateLight() { + BlockPos pos = tile.getPos(); + int blockLight = tile.getWorld().getLightLevel(LightType.BLOCK, pos); + int skyLight = tile.getWorld().getLightLevel(LightType.SKY, pos); + + for (InstanceKey key : keys.values()) { + key.modifyInstance(data -> data.setBlockLight(blockLight).setSkyLight(skyLight)); + } + } + + @Override + public void remove() { + for (InstanceKey key : keys.values()) { + key.delete(); + } + + keys.clear(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 0a01c1bd6..87e6c6708 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -5,8 +5,8 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Pair; @@ -48,7 +48,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { skyLight = 0; } - for (Pair> shaft : getBuffers(ctx)) { + for (Pair> shaft : getBuffers(ctx)) { shaft.getSecond().setupInstance(data -> { float speed = te.getSpeed(); Direction direction = shaft.getFirst(); @@ -75,22 +75,22 @@ public class GearboxRenderer extends KineticTileEntityRenderer { @Override public void markForRebuild(InstanceContext ctx) { - getBuffers(ctx).stream().map(Pair::getSecond).forEach(InstanceBuffer::clearInstanceData); + getBuffers(ctx).stream().map(Pair::getSecond).forEach(InstancedModel::clearInstanceData); } - private List>> getBuffers(InstanceContext ctx) { + private List>> getBuffers(InstanceContext ctx) { KineticTileEntity te = ctx.te; final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); - List>> buffers = Lists.newArrayListWithCapacity(4); + List>> buffers = Lists.newArrayListWithCapacity(4); for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); if (boxAxis == axis) continue; - InstanceBuffer buffer = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); - Pair> pair = Pair.of(direction, buffer); + InstancedModel buffer = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); + Pair> pair = Pair.of(direction, buffer); buffers.add(pair); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java new file mode 100644 index 000000000..0d931d6c1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -0,0 +1,19 @@ +package com.simibubi.create.content.logistics.block.mechanicalArm; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.RotatingData; + +public class ArmInstance extends SingleRotatingInstance { + public ArmInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected InstancedModel getModel() { + return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState()); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 71b7224f1..4e2b715d9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -6,12 +6,14 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; -import com.simibubi.create.foundation.utility.*; - import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -123,7 +125,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { } @Override - protected InstanceBuffer getRotatedModel(InstanceContext ctx) { + protected InstancedModel getRotatedModel(InstanceContext ctx) { return AllBlockPartials.ARM_COG.renderOnRotating(ctx, ctx.te.getBlockState()); } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 8abe10395..d0bd82064 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -27,7 +27,6 @@ import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.RenderWork; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.light.LightVolumeDebugger; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -79,6 +78,7 @@ public class ClientEvents { return; AnimationTickHolder.tick(); + FastRenderDispatcher.tick(); CreateClient.schematicSender.tick(); CreateClient.schematicAndQuillHandler.tick(); diff --git a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java deleted file mode 100644 index 5fe04753a..000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.simibubi.create.foundation.mixin; - -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -@OnlyIn(Dist.CLIENT) -@Mixin(World.class) -public class OnRemoveTileMixin { - - @Shadow @Final public boolean isRemote; - - /** - * JUSTIFICATION: This method is called whenever a tile entity is removed due - * to a change in block state, even on the client. By hooking into this method, - * we gain easy access to the information while having no impact on performance. - */ - @Inject(at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/World;getTileEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/tileentity/TileEntity;"), method = "removeTileEntity", locals = LocalCapture.CAPTURE_FAILHARD) - private void onRemoveTile(BlockPos pos, CallbackInfo ci, TileEntity te) { - if (isRemote) FastRenderDispatcher.markForRebuild(te); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java similarity index 95% rename from src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/BufferedModel.java index 8f1b845d6..585ec2c0b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/GPUBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java @@ -9,7 +9,7 @@ import org.lwjgl.opengl.GL40; import java.nio.ByteBuffer; -public abstract class GPUBuffer extends TemplateBuffer { +public abstract class BufferedModel extends TemplateBuffer { protected GlVertexArray vao; @@ -17,7 +17,7 @@ public abstract class GPUBuffer extends TemplateBuffer { protected GlBuffer invariantVBO; protected boolean removed; - public GPUBuffer(BufferBuilder buf) { + public BufferedModel(BufferBuilder buf) { super(buf); if (vertexCount > 0) setup(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 8ce6ef538..20386c6f3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -4,11 +4,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.instancing.IInstanceRendered; -import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; -import com.simibubi.create.foundation.render.shader.ShaderHelper; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; +import com.simibubi.create.foundation.render.light.ILightListener; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.WorldAttached; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.multiplayer.ClientChunkProvider; @@ -16,8 +15,7 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector3f; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.client.world.ClientWorld; import net.minecraft.potion.Effects; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; @@ -28,15 +26,51 @@ import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; import java.util.Map; +import java.util.concurrent.ConcurrentLinkedQueue; public class FastRenderDispatcher { + public static WorldAttached> addedTiles = new WorldAttached<>(ConcurrentLinkedQueue::new); + public static WorldAttached> removedTiles = new WorldAttached<>(ConcurrentLinkedQueue::new); + private static Matrix4f projectionMatrixThisFrame = null; public static void endFrame() { projectionMatrixThisFrame = null; } + public static void enqueueUpdate(TileEntity te) { + addedTiles.get(te.getWorld()).add(te); + } + + public static void enqueueRemove(TileEntity te) { + removedTiles.get(te.getWorld()).add(te); + } + + public static void tick() { + ClientWorld world = Minecraft.getInstance().world; + + ConcurrentLinkedQueue added = addedTiles.get(world); + + if (added != null) { + while (!added.isEmpty()) { + TileEntity te = added.poll(); + + CreateClient.kineticRenderer.update(te); + } + } + + ConcurrentLinkedQueue removed = removedTiles.get(world); + + if (removed != null) { + while (!removed.isEmpty()) { + TileEntity te = removed.poll(); + + CreateClient.kineticRenderer.remove(te); + } + } + } + public static void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ) { Matrix4f view = Matrix4f.translate((float) -cameraX, (float) -cameraY, (float) -cameraZ); view.multiplyBackward(stack.peek().getModel()); @@ -69,25 +103,12 @@ public class FastRenderDispatcher { .stream() .filter(entry -> SectionPos.toChunk(entry.getKey().getY()) == sectionY) .map(Map.Entry::getValue) - .forEach(FastRenderDispatcher::markForRebuild); + .filter(tile -> tile instanceof ILightListener) + .map(tile -> (ILightListener) tile) + .forEach(ILightListener::onChunkLightUpdate); } } - public static void markForRebuild(TileEntity te) { - if (te instanceof IInstanceRendered) { - TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(te); - - if (renderer instanceof IInstancedTileEntityRenderer) { - markForRebuild(te, (IInstancedTileEntityRenderer) renderer); - } - } - } - - private static void markForRebuild(T te, IInstancedTileEntityRenderer renderer) { - CreateClient.kineticRenderer.dirty = true; - renderer.markForRebuild(new InstanceContext.World<>(te)); - } - // copied from GameRenderer.renderWorld private static Matrix4f getProjectionMatrix() { if (projectionMatrixThisFrame != null) return projectionMatrixThisFrame; diff --git a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderDispatcher.java similarity index 51% rename from src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java rename to src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderDispatcher.java index 85a020d00..b1eb363e3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderDispatcher.java @@ -1,59 +1,78 @@ package com.simibubi.create.foundation.render; import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.foundation.render.gl.shader.Shader; +import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.render.instancing.*; -import com.simibubi.create.foundation.render.shader.Shader; -import com.simibubi.create.foundation.render.shader.ShaderCallback; -import com.simibubi.create.foundation.render.shader.ShaderHelper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; +import javax.annotation.Nullable; import java.util.HashMap; -import java.util.List; import java.util.Map; -public class FastKineticRenderer { +public class InstancedTileRenderDispatcher { + protected Map> renderers = new HashMap<>(); + protected Map, RenderMaterial> materials = new HashMap<>(); - public boolean dirty = false; - - public FastKineticRenderer() { + public InstancedTileRenderDispatcher() { registerMaterials(); } public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.BELT, BeltBuffer::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.ROTATING, RotatingBuffer::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.BELT, BeltModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.ROTATING, RotatingModel::new)); } @SuppressWarnings("unchecked") - public > RenderMaterial get(MaterialType materialType) { + public > RenderMaterial get(MaterialType materialType) { return (RenderMaterial) materials.get(materialType); } @SuppressWarnings("unchecked") - public void buildTileEntityBuffers(World world) { - List tileEntities = world.loadedTileEntityList; + @Nullable + public TileEntityInstance getRenderer(T tile) { + if (renderers.containsKey(tile)) { + return (TileEntityInstance) renderers.get(tile); + } else { + TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); - if (!tileEntities.isEmpty()) { - for (TileEntity te : tileEntities) { - if (te instanceof IInstanceRendered) { - TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(te); + renderers.put(tile, renderer); - if (renderer instanceof IInstancedTileEntityRenderer) { - addInstancedData(te, (IInstancedTileEntityRenderer) renderer); - } - } - } + return renderer; } } - public void addInstancedData(T te, IInstancedTileEntityRenderer renderer) { - renderer.addInstanceData(new InstanceContext.World<>(te)); + public void onLightUpdate(T tile) { + if (tile instanceof IInstanceRendered) { + TileEntityInstance renderer = getRenderer(tile); + + if (renderer != null) + renderer.updateLight(); + } + } + + public void update(T tile) { + if (tile instanceof IInstanceRendered) { + TileEntityInstance renderer = getRenderer(tile); + + if (renderer != null) + renderer.update(); + } + } + + public void remove(T tile) { + if (tile instanceof IInstanceRendered) { + TileEntityInstance renderer = getRenderer(tile); + + if (renderer != null) { + renderer.remove(); + renderers.remove(tile); + } + } } public void addInstancedData(RenderedContraption c, T te, IInstancedTileEntityRenderer renderer) { @@ -67,7 +86,7 @@ public class FastKineticRenderer { */ public void markAllDirty() { for (RenderMaterial material : materials.values()) { - material.runOnAll(InstanceBuffer::markDirty); + material.runOnAll(InstancedModel::markDirty); } } @@ -75,25 +94,13 @@ public class FastKineticRenderer { for (RenderMaterial material : materials.values()) { material.delete(); } - dirty = true; } public void render(RenderType layer, Matrix4f projection, Matrix4f view) { render(layer, projection, view, null); } - protected void prepareFrame() { - if (dirty) { - buildTileEntityBuffers(Minecraft.getInstance().world); - markAllDirty(); - - dirty = false; - } - } - public void render(RenderType layer, Matrix4f projection, Matrix4f view, ShaderCallback callback) { - prepareFrame(); - for (RenderMaterial material : materials.values()) { if (material.canRenderInLayer(layer)) material.render(layer, projection, view, callback); diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java index 215180d86..f5761bedd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java @@ -1,22 +1,19 @@ package com.simibubi.create.foundation.render.contraption; -import com.simibubi.create.foundation.render.FastKineticRenderer; -import com.simibubi.create.foundation.render.instancing.BeltBuffer; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.gl.shader.Shader; +import com.simibubi.create.foundation.render.instancing.BeltModel; import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; import com.simibubi.create.foundation.render.instancing.RenderMaterial; -import com.simibubi.create.foundation.render.instancing.RotatingBuffer; -import com.simibubi.create.foundation.render.instancing.actors.RotatingActorBuffer; -import com.simibubi.create.foundation.render.shader.Shader; +import com.simibubi.create.foundation.render.instancing.RotatingModel; +import com.simibubi.create.foundation.render.instancing.actors.RotatingActorModel; -public class ContraptionKineticRenderer extends FastKineticRenderer { +public class ContraptionKineticRenderer extends InstancedTileRenderDispatcher { @Override public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.CONTRAPTION_BELT, BeltBuffer::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.CONTRAPTION_ROTATING, RotatingBuffer::new)); - materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(Shader.CONTRAPTION_ACTOR, RotatingActorBuffer::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.CONTRAPTION_BELT, BeltModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.CONTRAPTION_ROTATING, RotatingModel::new)); + materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(Shader.CONTRAPTION_ACTOR, RotatingActorModel::new)); } - - @Override - protected void prepareFrame() {} } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionBuffer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java similarity index 81% rename from src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java index d9d59f0e9..2d778b389 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java @@ -1,20 +1,20 @@ package com.simibubi.create.foundation.render.contraption; -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.foundation.render.GPUBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceBuffer; +import com.simibubi.create.foundation.render.BufferedModel; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.*; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL40; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.RGBA; -public class ContraptionBuffer extends GPUBuffer { - public static final VertexFormat FORMAT = new VertexFormat(InstanceBuffer.FORMAT, RGBA); +public class ContraptionModel extends BufferedModel { + public static final VertexFormat FORMAT = new VertexFormat(InstancedModel.FORMAT, RGBA); - public ContraptionBuffer(BufferBuilder buf) { + public ContraptionModel(BufferBuilder buf) { super(buf); } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index 8e85c187e..7ff467501 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -5,9 +5,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; -import com.simibubi.create.foundation.render.shader.Shader; -import com.simibubi.create.foundation.render.shader.ShaderCallback; -import com.simibubi.create.foundation.render.shader.ShaderHelper; +import com.simibubi.create.foundation.render.gl.shader.Shader; +import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index b36430fc3..aac348e79 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -6,10 +6,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.render.shader.ShaderHelper; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; @@ -26,7 +26,7 @@ import java.util.HashMap; import java.util.List; public class RenderedContraption { - private HashMap renderLayers = new HashMap<>(); + private HashMap renderLayers = new HashMap<>(); private final ContraptionLighter lighter; @@ -59,12 +59,12 @@ public class RenderedContraption { return lighter; } - public RenderMaterial> getActorMaterial() { + public RenderMaterial> getActorMaterial() { return kinetics.get(KineticRenderMaterials.ACTORS); } public void doRenderLayer(RenderType layer, int shader) { - ContraptionBuffer buffer = renderLayers.get(layer); + ContraptionModel buffer = renderLayers.get(layer); if (buffer != null) { setup(shader); buffer.render(); @@ -73,7 +73,7 @@ public class RenderedContraption { } private void buildLayers(Contraption c) { - for (ContraptionBuffer buffer : renderLayers.values()) { + for (ContraptionModel buffer : renderLayers.values()) { buffer.delete(); } @@ -153,7 +153,7 @@ public class RenderedContraption { } void invalidate() { - for (ContraptionBuffer buffer : renderLayers.values()) { + for (ContraptionModel buffer : renderLayers.values()) { buffer.delete(); } renderLayers.clear(); @@ -163,8 +163,8 @@ public class RenderedContraption { kinetics.invalidate(); } - private static ContraptionBuffer buildStructureBuffer(Contraption c, RenderType layer) { + private static ContraptionModel buildStructureBuffer(Contraption c, RenderType layer) { BufferBuilder builder = ContraptionRenderer.buildStructure(c, layer); - return new ContraptionBuffer(builder); + return new ContraptionModel(builder); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java similarity index 91% rename from src/main/java/com/simibubi/create/foundation/render/shader/Shader.java rename to src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java index 075b963b5..3ada3d9b3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.shader; +package com.simibubi.create.foundation.render.gl.shader; public enum Shader { ROTATING("shader/rotating.vert", "shader/instanced.frag"), diff --git a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java similarity index 84% rename from src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java rename to src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java index 4c950f355..d894b70b2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderCallback.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.shader; +package com.simibubi.create.foundation.render.gl.shader; /** * A Callback for when a shader is called. Used to define shader uniforms. diff --git a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java rename to src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java index e0f915231..817efb853 100644 --- a/src/main/java/com/simibubi/create/foundation/render/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.shader; +package com.simibubi.create.foundation.render.gl.shader; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.Create; @@ -11,7 +11,6 @@ import net.minecraft.client.shader.ShaderLinkHelper; import net.minecraft.client.shader.ShaderLoader; import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; -import net.minecraft.resources.IResourceManagerReloadListener; import net.minecraft.util.ResourceLocation; import net.minecraftforge.resource.ISelectiveResourceReloadListener; import net.minecraftforge.resource.VanillaResourceType; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java deleted file mode 100644 index d2d6bc94c..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BasicData.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.utility.ColorHelper; -import net.minecraft.client.renderer.Vector3f; -import net.minecraft.util.math.BlockPos; - -import java.nio.ByteBuffer; - -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; - -public class BasicData> extends InstanceData { - public static final VertexFormat FORMAT = new VertexFormat(RGB, POSITION, LIGHT); - - private byte r; - private byte g; - private byte b; - private float x; - private float y; - private float z; - private byte blockLight; - private byte skyLight; - - public D setBlockLight(int blockLight) { - this.blockLight = (byte) ((blockLight & 0xF) << 4); - return (D) this; - } - - public D setSkyLight(int skyLight) { - this.skyLight = (byte) ((skyLight & 0xF) << 4); - return (D) this; - } - - public D setPosition(Vector3f pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return (D) this; - } - - public D setTileEntity(KineticTileEntity te) { - setPosition(te.getPos()); - if (te.hasSource()) { - int color = ColorHelper.colorFromLong(te.network); - r = (byte) ((color >> 16) & 0xFF); - g = (byte) ((color >> 8) & 0xFF); - b = (byte) (color & 0xFF); - } - else { - r = (byte) 0xFF; - g = (byte) 0xFF; - b = (byte) 0x00; - } - return (D) this; - } - - public D setPosition(BlockPos pos) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - return (D) this; - } - - @Override - public void write(ByteBuffer buf) { - putVec3(buf, r, g, b); - - putVec3(buf, x, y, z); - - putVec2(buf, blockLight, skyLight); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java index b103a282e..86c686157 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java @@ -2,25 +2,28 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormatElement; import java.nio.ByteBuffer; import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; -public class BeltData extends BasicData { - public static VertexFormat FORMAT = new VertexFormat(BasicData.FORMAT, VEC3, FLOAT, VEC2, VEC4, FLOAT); +public class BeltData extends KineticData { + public static final VertexAttribute TARGET_UV = copy("scrollTexture", VEC4); + public static final VertexAttribute SCROLL_MULT = new VertexAttribute("scrollMult", VertexFormatElement.Type.BYTE, 1, true); + + public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, ROTATION, UV, TARGET_UV, SCROLL_MULT); private float rotX; private float rotY; private float rotZ; - private float rotationalSpeed; private float sourceU; private float sourceV; private float minU; private float minV; private float maxU; private float maxV; - private float scrollMult; + private byte scrollMult; public BeltData setRotation(float rotX, float rotY, float rotZ) { this.rotX = rotX; @@ -29,10 +32,6 @@ public class BeltData extends BasicData { return this; } - public BeltData setRotationalSpeed(float rotationalSpeed) { - this.rotationalSpeed = rotationalSpeed; - return this; - } public BeltData setScrollTexture(SpriteShiftEntry spriteShift) { TextureAtlasSprite source = spriteShift.getOriginal(); @@ -49,7 +48,7 @@ public class BeltData extends BasicData { } public BeltData setScrollMult(float scrollMult) { - this.scrollMult = scrollMult; + this.scrollMult = (byte) (scrollMult * 127); return this; } @@ -59,8 +58,6 @@ public class BeltData extends BasicData { putVec3(buf, rotX, rotY, rotZ); - put(buf, rotationalSpeed); - putVec2(buf, sourceU, sourceV); putVec4(buf, minU, minV, maxU, maxV); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java similarity index 76% rename from src/main/java/com/simibubi/create/foundation/render/instancing/BeltBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java index 7007d30ec..d323101a4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java @@ -2,8 +2,8 @@ package com.simibubi.create.foundation.render.instancing; import net.minecraft.client.renderer.BufferBuilder; -public class BeltBuffer extends InstanceBuffer { - public BeltBuffer(BufferBuilder buf) { +public class BeltModel extends InstancedModel { + public BeltModel(BufferBuilder buf) { super(buf); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java similarity index 81% rename from src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java index 540ec55e4..ebe8844e2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstanceBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java @@ -2,15 +2,14 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.*; -public abstract class DynamicInstanceBuffer extends InstanceBuffer { +public abstract class DynamicInstancedModel extends InstancedModel { protected GlBuffer dynamicVBO; protected int dynamicBufferSize = -1; - public DynamicInstanceBuffer(BufferBuilder buf) { + public DynamicInstancedModel(BufferBuilder buf) { super(buf); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java index e169de311..f83e47001 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java @@ -1,6 +1,8 @@ package com.simibubi.create.foundation.render.instancing; -public interface IInstanceRendered { +import com.simibubi.create.foundation.render.light.ILightListener; + +public interface IInstanceRendered extends ILightListener { default boolean shouldRenderAsTE() { return false; } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java new file mode 100644 index 000000000..2ad3a86bd --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java @@ -0,0 +1,9 @@ +package com.simibubi.create.foundation.render.instancing; + +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import net.minecraft.tileentity.TileEntity; + +@FunctionalInterface +public interface IRendererFactory { + TileEntityInstance create(InstancedTileRenderDispatcher manager, T te); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java deleted file mode 100644 index 6baa5ada4..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceBuffer.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - - -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.foundation.render.GPUBuffer; -import com.simibubi.create.foundation.render.RenderMath; -import com.simibubi.create.foundation.render.RenderWork; -import com.simibubi.create.foundation.render.TemplateBuffer; -import com.simibubi.create.foundation.render.gl.GlBuffer; -import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.*; - -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.function.Consumer; - -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; - -public abstract class InstanceBuffer extends GPUBuffer { - public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV); - - protected GlBuffer instanceVBO; - protected int instanceCount; - - protected int instanceBufferSize = -1; - - protected final ArrayList data = new ArrayList<>(); - protected boolean rebuffer = false; - protected boolean shouldBuild = true; - - public InstanceBuffer(BufferBuilder buf) { - super(buf); - } - - @Override - protected void setup() { - super.setup(); - instanceVBO = new GlBuffer(); - } - - @Override - protected VertexFormat getModelFormat() { - return FORMAT; - } - - @Override - protected void copyVertex(ByteBuffer constant, int i) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); - - constant.put(getNX(template, i)); - constant.put(getNY(template, i)); - constant.put(getNZ(template, i)); - - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); - } - - protected abstract VertexFormat getInstanceFormat(); - - public int numInstances() { - return instanceCount + data.size(); - } - - public boolean isEmpty() { - return numInstances() == 0; - } - - public void clearInstanceData() { - instanceCount = 0; - shouldBuild = true; - } - - public void markDirty() { - if (shouldBuild) rebuffer = true; - } - - protected void deleteInternal() { - super.deleteInternal(); - instanceVBO.delete(); - } - - protected abstract D newInstance(); - - public void setupInstance(Consumer setup) { - if (!shouldBuild) return; - - D instanceData = newInstance(); - setup.accept(instanceData); - - data.add(instanceData); - } - - protected int getTotalShaderAttributeCount() { - return getInstanceFormat().getShaderAttributeCount() + super.getTotalShaderAttributeCount(); - } - - @Override - protected void drawCall() { - GL31.glDrawElementsInstanced(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0, instanceCount); - } - - protected void preDrawTask() { - if (!rebuffer || data.isEmpty()) return; - - instanceCount = data.size(); - - VertexFormat instanceFormat = getInstanceFormat(); - - int instanceSize = RenderMath.nextPowerOf2(instanceCount * instanceFormat.getStride()); - - instanceVBO.bind(GL15.GL_ARRAY_BUFFER); - - // this changes enough that it's not worth reallocating the entire buffer every time. - if (instanceSize > instanceBufferSize) { - GL15.glBufferData(GL15.GL_ARRAY_BUFFER, instanceSize, GL15.GL_STATIC_DRAW); - instanceBufferSize = instanceSize; - } - - ByteBuffer buffer = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); - - data.forEach(instanceData -> instanceData.write(buffer)); - buffer.rewind(); - GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); - - int staticAttributes = getModelFormat().getShaderAttributeCount(); - instanceFormat.informAttributes(staticAttributes); - - for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { - GL33.glVertexAttribDivisor(i + staticAttributes, 1); - } - - instanceVBO.unbind(GL15.GL_ARRAY_BUFFER); - - shouldBuild = false; - rebuffer = false; - data.clear(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java index abad52793..711d2a393 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java @@ -1,10 +1,11 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import com.simibubi.create.foundation.render.FastKineticRenderer; import net.minecraft.tileentity.TileEntity; +@Deprecated public abstract class InstanceContext { public final T te; @@ -13,15 +14,15 @@ public abstract class InstanceContext { this.te = te; } - public RenderMaterial> getRotating() { + public RenderMaterial> getRotating() { return getKinetics().get(KineticRenderMaterials.ROTATING); } - public RenderMaterial> getBelts() { + public RenderMaterial> getBelts() { return getKinetics().get(KineticRenderMaterials.BELTS); } - public abstract FastKineticRenderer getKinetics(); + public abstract InstancedTileRenderDispatcher getKinetics(); public abstract boolean checkWorldLight(); @@ -35,7 +36,7 @@ public abstract class InstanceContext { } @Override - public FastKineticRenderer getKinetics() { + public InstancedTileRenderDispatcher getKinetics() { return c.kinetics; } @@ -52,7 +53,7 @@ public abstract class InstanceContext { } @Override - public FastKineticRenderer getKinetics() { + public InstancedTileRenderDispatcher getKinetics() { return CreateClient.kineticRenderer; } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceKey.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceKey.java new file mode 100644 index 000000000..9ba7f1141 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceKey.java @@ -0,0 +1,31 @@ +package com.simibubi.create.foundation.render.instancing; + +import java.util.function.Consumer; + +public class InstanceKey { + public static final int INVALID = -1; + + InstancedModel model; + int index; + + public InstanceKey(InstancedModel model, int index) { + this.model = model; + this.index = index; + } + + void invalidate() { + index = INVALID; + } + + public boolean isValid() { + return index != INVALID; + } + + public void modifyInstance(Consumer edit) { + model.modifyInstance(this, edit); + } + + public void delete() { + model.deleteInstance(this); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java new file mode 100644 index 000000000..edd1ed544 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java @@ -0,0 +1,191 @@ +package com.simibubi.create.foundation.render.instancing; + + +import com.simibubi.create.foundation.render.BufferedModel; +import com.simibubi.create.foundation.render.RenderMath; +import com.simibubi.create.foundation.render.gl.GlBuffer; +import net.minecraft.client.renderer.BufferBuilder; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL33; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.function.Consumer; + +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; + +public abstract class InstancedModel extends BufferedModel { + public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV); + + protected GlBuffer instanceVBO; + protected int glBufferSize = -1; + protected int glInstanceCount = 0; + + protected final ArrayList> keys = new ArrayList<>(); + protected final ArrayList data = new ArrayList<>(); + protected int minIndexChanged = -1; + + public InstancedModel(BufferBuilder buf) { + super(buf); + } + + @Override + protected void setup() { + super.setup(); + instanceVBO = new GlBuffer(); + } + + @Override + protected VertexFormat getModelFormat() { + return FORMAT; + } + + @Override + protected void copyVertex(ByteBuffer constant, int i) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); + + constant.put(getNX(template, i)); + constant.put(getNY(template, i)); + constant.put(getNZ(template, i)); + + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); + } + + protected abstract VertexFormat getInstanceFormat(); + + public int instanceCount() { + return data.size(); + } + + public boolean isEmpty() { + return instanceCount() == 0; + } + + public void clearInstanceData() { + + } + + public void markDirty() { + minIndexChanged = 0; + } + + protected void deleteInternal() { + super.deleteInternal(); + instanceVBO.delete(); + keys.forEach(InstanceKey::invalidate); + } + + protected abstract D newInstance(); + + public synchronized void deleteInstance(InstanceKey key) { + verifyKey(key); + + int index = key.index; + + keys.remove(index); + data.remove(index); + + for (int i = index; i < keys.size(); i++) { + keys.get(i).index--; + } + + setMinIndexChanged(key.index); + + key.invalidate(); + } + + public synchronized void modifyInstance(InstanceKey key, Consumer edit) { + verifyKey(key); + + D data = this.data.get(key.index); + + edit.accept(data); + + setMinIndexChanged(key.index); + } + + public synchronized InstanceKey setupInstance(Consumer setup) { + D instanceData = newInstance(); + setup.accept(instanceData); + + InstanceKey key = new InstanceKey<>(this, data.size()); + data.add(instanceData); + keys.add(key); + + setMinIndexChanged(key.index); + + return key; + } + + protected void setMinIndexChanged(int index) { + if (minIndexChanged < 0) { + minIndexChanged = index; + } else { + minIndexChanged = Math.min(minIndexChanged, index); + } + } + + protected final void verifyKey(InstanceKey key) { + if (key.model != this) throw new IllegalStateException("Provided key does not belong to model."); + + if (!key.isValid()) throw new IllegalStateException("Provided key has been invalidated."); + + if (key.index >= data.size()) throw new IndexOutOfBoundsException("Key points out of bounds. (" + key.index + " > " + (data.size() - 1) + ")"); + + if (keys.get(key.index) != key) throw new IllegalStateException("Key desync!!"); + } + + protected int getTotalShaderAttributeCount() { + return getInstanceFormat().getShaderAttributeCount() + super.getTotalShaderAttributeCount(); + } + + @Override + protected void drawCall() { + GL31.glDrawElementsInstanced(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0, glInstanceCount); + } + + protected void preDrawTask() { + if (minIndexChanged < 0 || data.isEmpty()) return; + + VertexFormat instanceFormat = getInstanceFormat(); + + int stride = instanceFormat.getStride(); + int instanceSize = RenderMath.nextPowerOf2((instanceCount() + 1) * stride); + + instanceVBO.bind(GL15.GL_ARRAY_BUFFER); + + // this probably changes enough that it's not worth reallocating the entire buffer every time. + if (instanceSize > glBufferSize) { + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, instanceSize, GL15.GL_STATIC_DRAW); + glBufferSize = instanceSize; + minIndexChanged = 0; + } + + ByteBuffer buffer = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); + + buffer.position(stride * minIndexChanged); + for (int i = minIndexChanged; i < data.size(); i++) { + data.get(i).write(buffer); + } + buffer.rewind(); + GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); + + glInstanceCount = data.size(); + + int staticAttributes = getModelFormat().getShaderAttributeCount(); + instanceFormat.informAttributes(staticAttributes); + + for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { + GL33.glVertexAttribDivisor(i + staticAttributes, 1); + } + + instanceVBO.unbind(GL15.GL_ARRAY_BUFFER); + + minIndexChanged = -1; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java new file mode 100644 index 000000000..71cd04266 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java @@ -0,0 +1,30 @@ +package com.simibubi.create.foundation.render.instancing; + +import com.google.common.collect.Maps; +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; + +import javax.annotation.Nullable; +import java.util.Map; + +public class InstancedTileRenderRegistry { + public static final InstancedTileRenderRegistry instance = new InstancedTileRenderRegistry(); + + private final Map, IRendererFactory> renderers = Maps.newHashMap(); + + public void register(TileEntityType type, IRendererFactory rendererFactory) { + this.renderers.put(type, rendererFactory); + } + + @SuppressWarnings("unchecked") + @Nullable + public TileEntityInstance create(InstancedTileRenderDispatcher manager, T tile) { + TileEntityType type = tile.getType(); + IRendererFactory factory = (IRendererFactory) this.renderers.get(type); + + if (factory == null) return null; + else return factory.create(manager, tile); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java new file mode 100644 index 000000000..41ff3d0ab --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java @@ -0,0 +1,101 @@ +package com.simibubi.create.foundation.render.instancing; + +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.utility.ColorHelper; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.math.BlockPos; + +import java.nio.ByteBuffer; + +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; + +public class KineticData> extends InstanceData { + public static final VertexAttribute ROTATION_CENTER = copy("rotationCenter", VEC3); + public static final VertexAttribute SPEED = copy("speed", FLOAT); + public static final VertexAttribute OFFSET = copy("offset", FLOAT); + public static final VertexFormat FORMAT = new VertexFormat(INSTANCE_POSITION, LIGHT, RGB, SPEED, OFFSET); + + private float x; + private float y; + private float z; + private byte blockLight; + private byte skyLight; + private byte r; + private byte g; + private byte b; + private float rotationalSpeed; + private float rotationOffset; + + public D setTileEntity(KineticTileEntity te) { + setPosition(te.getPos()); + if (te.hasSource()) { + setColor(te.network); + }else { + setColor(0xFF, 0xFF, 0x00); + } + return (D) this; + } + + public D setPosition(BlockPos pos) { + return setPosition(pos.getX(), pos.getY(), pos.getZ()); + } + + public D setPosition(Vector3f pos) { + return setPosition(pos.getX(), pos.getY(), pos.getZ()); + } + + public D setPosition(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + return (D) this; + } + + public D setBlockLight(int blockLight) { + this.blockLight = (byte) ((blockLight & 0xF) << 4); + return (D) this; + } + + public D setSkyLight(int skyLight) { + this.skyLight = (byte) ((skyLight & 0xF) << 4); + return (D) this; + } + + private void setColor(long l) { + int color = ColorHelper.colorFromLong(l); + r = (byte) ((color >> 16) & 0xFF); + g = (byte) ((color >> 8) & 0xFF); + b = (byte) (color & 0xFF); + } + + public D setColor(int r, int g, int b) { + return setColor((byte) r, (byte) g, (byte) b); + } + + public D setColor(byte r, byte g, byte b) { + this.r = r; + this.g = g; + this.b = b; + return (D) this; + } + + public D setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return (D) this; + } + + public D setRotationOffset(float rotationOffset) { + this.rotationOffset = rotationOffset; + return (D) this; + } + + + @Override + public void write(ByteBuffer buf) { + putVec3(buf, x, y, z); + putVec2(buf, blockLight, skyLight); + putVec3(buf, r, g, b); + put(buf, rotationalSpeed); + put(buf, rotationOffset); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java index cd941f5d9..37ac5b379 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java @@ -3,8 +3,8 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; public class KineticRenderMaterials { - public static final MaterialType> ROTATING = new MaterialType<>(); - public static final MaterialType> BELTS = new MaterialType<>(); + public static final MaterialType> ROTATING = new MaterialType<>(); + public static final MaterialType> BELTS = new MaterialType<>(); - public static final MaterialType> ACTORS = new MaterialType<>(); + public static final MaterialType> ACTORS = new MaterialType<>(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java b/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java index 36120053b..3024abcf5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java @@ -3,6 +3,6 @@ package com.simibubi.create.foundation.render.instancing; import net.minecraft.client.renderer.BufferBuilder; @FunctionalInterface -public interface ModelFactory> { +public interface ModelFactory> { B convert(BufferBuilder buf); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java index 95cf9aa59..cefd13d8e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java @@ -7,9 +7,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.render.shader.Shader; -import com.simibubi.create.foundation.render.shader.ShaderCallback; -import com.simibubi.create.foundation.render.shader.ShaderHelper; +import com.simibubi.create.foundation.render.gl.shader.Shader; +import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockRendererDispatcher; @@ -19,7 +19,6 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.util.Direction; import org.apache.commons.lang3.tuple.Pair; -import org.lwjgl.opengl.GL40; import java.util.HashMap; import java.util.Map; @@ -30,7 +29,7 @@ import java.util.function.Supplier; import static com.simibubi.create.foundation.render.Compartment.PARTIAL; -public class RenderMaterial> { +public class RenderMaterial> { protected final Map, Cache> models; protected final ModelFactory factory; @@ -75,7 +74,7 @@ public class RenderMaterial> { public void teardown() {} public void delete() { - runOnAll(InstanceBuffer::delete); + runOnAll(InstancedModel::delete); models.values().forEach(Cache::invalidateAll); } @@ -105,6 +104,11 @@ public class RenderMaterial> { return get(PARTIAL, partial, () -> buildModel(partial.get(), referenceState)); } + public MODEL getModel(AllBlockPartials partial, BlockState referenceState, Direction dir) { + return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> buildModel(partial.get(), referenceState)); + } + public MODEL getModel(AllBlockPartials partial, BlockState referenceState, Direction dir, Supplier modelTransform) { return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), () -> buildModel(partial.get(), referenceState, modelTransform.get())); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java index c905d93e9..2d2dc99e1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java @@ -1,27 +1,22 @@ package com.simibubi.create.foundation.render.instancing; import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.Direction; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.NORMAL; -public class RotatingData extends BasicData { - public static VertexFormat FORMAT = new VertexFormat(BasicData.FORMAT, FLOAT, FLOAT, NORMAL); +public class RotatingData extends KineticData { + public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, NORMAL); - private float rotationalSpeed; - private float rotationOffset; private byte rotationAxisX; private byte rotationAxisY; private byte rotationAxisZ; - public RotatingData setRotationalSpeed(float rotationalSpeed) { - this.rotationalSpeed = rotationalSpeed; - return this; - } - - public RotatingData setRotationOffset(float rotationOffset) { - this.rotationOffset = rotationOffset; + public RotatingData setRotationAxis(Direction.Axis axis) { + Direction orientation = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis); + setRotationAxis(orientation.getUnitVector()); return this; } @@ -40,8 +35,6 @@ public class RotatingData extends BasicData { @Override public void write(ByteBuffer buf) { super.write(buf); - put(buf, rotationalSpeed); - put(buf, rotationOffset); putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java similarity index 75% rename from src/main/java/com/simibubi/create/foundation/render/instancing/RotatingBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java index 7a7b24f4e..4b6a47150 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java @@ -2,8 +2,8 @@ package com.simibubi.create.foundation.render.instancing; import net.minecraft.client.renderer.BufferBuilder; -public class RotatingBuffer extends InstanceBuffer { - public RotatingBuffer(BufferBuilder buf) { +public class RotatingModel extends InstancedModel { + public RotatingModel(BufferBuilder buf) { super(buf); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java new file mode 100644 index 000000000..2bd228c58 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java @@ -0,0 +1,38 @@ +package com.simibubi.create.foundation.render.instancing; + +import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; + +public abstract class TileEntityInstance { + + protected final InstancedTileRenderDispatcher modelManager; + protected final T tile; + protected BlockState lastState; + + public TileEntityInstance(InstancedTileRenderDispatcher modelManager, T tile) { + this.modelManager = modelManager; + this.tile = tile; + this.lastState = tile.getBlockState(); + init(); + } + + protected abstract void init(); + + public final void update() { + BlockState currentState = tile.getBlockState(); + if (lastState == currentState) { + onUpdate(); + } else { + remove(); + init(); + lastState = currentState; + } + } + + protected abstract void onUpdate(); + + public abstract void updateLight(); + + public abstract void remove(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java index d4921bfba..1ed7fee2f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java @@ -4,30 +4,47 @@ import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.GL20; public class VertexAttribute { - public static final VertexAttribute MAT4 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 16); - public static final VertexAttribute VEC4 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 4); - public static final VertexAttribute VEC3 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 3); - public static final VertexAttribute VEC2 = new VertexAttribute(VertexFormatElement.Type.FLOAT, 2); - public static final VertexAttribute FLOAT = new VertexAttribute(VertexFormatElement.Type.FLOAT, 1); + public static final VertexAttribute MAT4 = new VertexAttribute("mat4", VertexFormatElement.Type.FLOAT, 16); + public static final VertexAttribute VEC4 = new VertexAttribute("vec4", VertexFormatElement.Type.FLOAT, 4); + public static final VertexAttribute VEC3 = new VertexAttribute("vec3", VertexFormatElement.Type.FLOAT, 3); + public static final VertexAttribute VEC2 = new VertexAttribute("vec2", VertexFormatElement.Type.FLOAT, 2); + public static final VertexAttribute FLOAT = new VertexAttribute("float", VertexFormatElement.Type.FLOAT, 1); - public static final VertexAttribute POSITION = VEC3; - public static final VertexAttribute NORMAL = new VertexAttribute(VertexFormatElement.Type.BYTE, 3, true); - public static final VertexAttribute RGBA = new VertexAttribute(VertexFormatElement.Type.UBYTE, 4, true); - public static final VertexAttribute RGB = new VertexAttribute(VertexFormatElement.Type.UBYTE, 3, true); - public static final VertexAttribute UV = VEC2; - public static final VertexAttribute LIGHT = new VertexAttribute(VertexFormatElement.Type.UBYTE, 2, true); + public static final VertexAttribute POSITION = copy("pos", VEC3); + public static final VertexAttribute INSTANCE_POSITION = copy("instancePos", VEC3); + public static final VertexAttribute ROTATION = copy("eulerAngles", VEC3); + public static final VertexAttribute NORMAL = new VertexAttribute("normal", VertexFormatElement.Type.BYTE, 3, true); + public static final VertexAttribute RGBA = new VertexAttribute("rgba", VertexFormatElement.Type.UBYTE, 4, true); + public static final VertexAttribute RGB = new VertexAttribute("rgb", VertexFormatElement.Type.UBYTE, 3, true); + public static final VertexAttribute UV = copy("uv", VEC2); + public static final VertexAttribute LIGHT = new VertexAttribute("light", VertexFormatElement.Type.UBYTE, 2, true); + private final String name; private final VertexFormatElement.Type type; private final int count; private final int size; private final int attributeCount; private final boolean normalized; - public VertexAttribute(VertexFormatElement.Type type, int count) { - this(type, count, false); + public static VertexAttribute copy(String name, VertexAttribute other) { + return new VertexAttribute(name, other); } - public VertexAttribute(VertexFormatElement.Type type, int count, boolean normalized) { + public VertexAttribute(String name, VertexAttribute that) { + this.name = name; + this.type = that.type; + this.count = that.count; + this.size = that.size; + this.attributeCount = that.attributeCount; + this.normalized = that.normalized; + } + + public VertexAttribute(String name, VertexFormatElement.Type type, int count) { + this(name, type, count, false); + } + + public VertexAttribute(String name, VertexFormatElement.Type type, int count, boolean normalized) { + this.name = name; this.type = type; this.count = count; this.size = type.getSize() * count; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorBuffer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java similarity index 80% rename from src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java index 6e33fc9f4..5bdfe4c9b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java @@ -1,11 +1,11 @@ package com.simibubi.create.foundation.render.instancing.actors; -import com.simibubi.create.foundation.render.instancing.DynamicInstanceBuffer; +import com.simibubi.create.foundation.render.instancing.DynamicInstancedModel; import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; -public class RotatingActorBuffer extends DynamicInstanceBuffer { - public RotatingActorBuffer(BufferBuilder buf) { +public class RotatingActorModel extends DynamicInstancedModel { + public RotatingActorModel(BufferBuilder buf) { super(buf); } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/ILightListener.java b/src/main/java/com/simibubi/create/foundation/render/light/ILightListener.java new file mode 100644 index 000000000..8b4a571f0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/light/ILightListener.java @@ -0,0 +1,5 @@ +package com.simibubi.create.foundation.render.light; + +public interface ILightListener { + void onChunkLightUpdate(); +} diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 8a9c50380..de852ff85 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -5,14 +5,15 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec3 networkTint; -layout (location = 4) in vec3 instancePos; -layout (location = 5) in vec2 light; -layout (location = 6) in vec3 rotationDegrees; -layout (location = 7) in float speed; -layout (location = 8) in vec2 sourceUV; -layout (location = 9) in vec4 scrollTexture; -layout (location = 10) in float scrollMult; +layout (location = 3) in vec3 instancePos; +layout (location = 4) in vec2 light; +layout (location = 5) in vec3 networkTint; +layout (location = 6) in float speed; +layout (location = 7) in float offset; +layout (location = 8) in vec3 eulerAngles; +layout (location = 9) in vec2 uv; +layout (location = 10) in vec4 scrollTexture; +layout (location = 11) in float scrollMult; out vec2 TexCoords; out vec2 Light; @@ -36,6 +37,10 @@ mat4 rotate(vec3 axis, float angle) { 0, 0, 0, 1); } +mat4 rotation(vec3 rot) { + return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); +} + float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; @@ -43,23 +48,23 @@ float diffuse(vec3 normal) { return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } +mat4 localRotation() { + vec3 rot = fract(eulerAngles / 360) * PI * 2; + return rotation(rot); +} + void main() { - vec3 rot = fract(rotationDegrees / 360) * PI * 2; - - mat4 rotation = rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); - - vec4 renderPos = rotation * vec4(aPos - vec3(.5), 1); - renderPos += vec4(instancePos + vec3(.5), 0); + mat4 localRotation = localRotation(); + vec4 renderPos = localRotation * vec4(aPos - vec3(.5), 1) + vec4(instancePos + vec3(.5), 0); float scrollSize = scrollTexture.w - scrollTexture.y; + float scroll = fract(speed * time / (36 * 16) + offset) * scrollSize * scrollMult; - float scroll = fract(speed * time / (36 * 16)) * scrollSize * scrollMult; - - vec3 norm = (rotation * vec4(aNormal, 0)).xyz; + vec3 norm = (localRotation * vec4(aNormal, 0)).xyz; Diffuse = diffuse(norm); Light = light; - TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0, scroll); + TexCoords = aTexCoords - uv + scrollTexture.xy + vec2(0, scroll); gl_Position = projection * view * renderPos; if (debug == 1) { diff --git a/src/main/resources/assets/create/shader/contraption_belt.vert b/src/main/resources/assets/create/shader/contraption_belt.vert index e965c2e98..8a0b8fbeb 100644 --- a/src/main/resources/assets/create/shader/contraption_belt.vert +++ b/src/main/resources/assets/create/shader/contraption_belt.vert @@ -5,14 +5,15 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec3 networkTint; -layout (location = 4) in vec3 instancePos; -layout (location = 5) in vec2 light; -layout (location = 6) in vec3 rotationDegrees; -layout (location = 7) in float speed; -layout (location = 8) in vec2 sourceUV; -layout (location = 9) in vec4 scrollTexture; -layout (location = 10) in float scrollMult; +layout (location = 3) in vec3 instancePos; +layout (location = 4) in vec2 light; +layout (location = 5) in vec3 networkTint; +layout (location = 6) in float speed; +layout (location = 7) in float offset; +layout (location = 8) in vec3 eulerAngles; +layout (location = 9) in vec2 uv; +layout (location = 10) in vec4 scrollTexture; +layout (location = 11) in float scrollMult; out float Diffuse; out vec2 TexCoords; @@ -53,7 +54,7 @@ mat4 rotation(vec3 rot) { } mat4 localRotation() { - vec3 rot = fract(rotationDegrees / 360) * PI * 2; + vec3 rot = fract(eulerAngles / 360) * PI * 2; return rotation(rot); } @@ -64,13 +65,13 @@ void main() { vec4 worldPos = model * localPos; float scrollSize = scrollTexture.w - scrollTexture.y; - float scroll = fract(speed * time / (36 * 16)) * scrollSize * scrollMult; + float scroll = fract(speed * time / (36 * 16) + offset) * scrollSize * scrollMult; vec3 norm = normalize(model * localRotation * vec4(aNormal, 0)).xyz; BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; Diffuse = diffuse(norm); - TexCoords = aTexCoords - sourceUV + scrollTexture.xy + vec2(0, scroll); + TexCoords = aTexCoords - uv + scrollTexture.xy + vec2(0, scroll); gl_Position = projection * view * worldPos; if (debug == 2) { diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert index 1c1887511..adf818290 100644 --- a/src/main/resources/assets/create/shader/contraption_rotating.vert +++ b/src/main/resources/assets/create/shader/contraption_rotating.vert @@ -4,11 +4,11 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec3 networkTint; -layout (location = 4) in vec3 instancePos; -layout (location = 5) in vec2 light; +layout (location = 3) in vec3 instancePos; +layout (location = 4) in vec2 light; +layout (location = 5) in vec3 networkTint; layout (location = 6) in float speed; -layout (location = 7) in float rotationOffset; +layout (location = 7) in float offset; layout (location = 8) in vec3 rotationAxis; out float Diffuse; @@ -26,6 +26,7 @@ uniform mat4 projection; uniform mat4 view; uniform int debug; + mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); @@ -44,16 +45,20 @@ float diffuse(vec3 normal) { return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } +mat4 rotation(vec3 rot) { + return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); +} + mat4 kineticRotation() { - float degrees = rotationOffset + time * speed * -3/10; + float degrees = offset + time * speed * -3/10; float angle = fract(degrees / 360) * PI * 2; - return rotate(normalize(rotationAxis), angle); + return rotate(vec3(0, 1, 0), angle); } void main() { mat4 kineticRotation = kineticRotation(); - vec4 localPos = kineticRotation * vec4(aPos - .5, 1) + vec4(instancePos + .5, 0); + vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1) + vec4(instancePos + .5, 0); vec4 worldPos = model * localPos; diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index 93b292516..42d22357d 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -4,11 +4,11 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec3 networkTint; -layout (location = 4) in vec3 instancePos; -layout (location = 5) in vec2 light; +layout (location = 3) in vec3 instancePos; +layout (location = 4) in vec2 light; +layout (location = 5) in vec3 networkTint; layout (location = 6) in float speed; -layout (location = 7) in float rotationOffset; +layout (location = 7) in float offset; layout (location = 8) in vec3 rotationAxis; out vec2 TexCoords; @@ -40,24 +40,26 @@ float diffuse(vec3 normal) { return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } +mat4 rotation(vec3 rot) { + return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); +} + mat4 kineticRotation() { - float degrees = rotationOffset + time * speed * -3/10; + float degrees = offset + time * speed * -3/10; float angle = fract(degrees / 360) * PI * 2; - return rotate(normalize(rotationAxis), angle); + return rotate(rotationAxis, angle); } void main() { - mat4 rotation = kineticRotation(); - vec4 renderPos = rotation * vec4(aPos - vec3(0.5), 1); + mat4 kineticRotation = kineticRotation(); + vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1) + vec4(instancePos + .5, 0); - renderPos += vec4(instancePos + vec3(0.5), 0); - - vec3 norm = (rotation * vec4(aNormal, 0)).xyz; + vec3 norm = (kineticRotation * vec4(aNormal, 0)).xyz; Diffuse = diffuse(norm); TexCoords = aTexCoords; - gl_Position = projection * view * renderPos; + gl_Position = projection * view * localPos; Light = light; if (debug == 1) { diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index f674ecc82..beb9f49c8 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -3,7 +3,7 @@ "package": "com.simibubi.create.foundation.mixin", "compatibilityLevel": "JAVA_8", "refmap": "create.refmap.json", - "client": ["CancelTileEntityRenderMixin", "LightUpdateMixin", "OnRemoveTileMixin", "RenderInLayerMixin"], + "client": ["CancelTileEntityRenderMixin", "LightUpdateMixin", "RenderInLayerMixin"], "injectors": { "defaultRequire": 1 }, From e690f2b8ac9e8fa1325b17487ce78276c13182fe Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 27 Jan 2021 14:03:18 -0800 Subject: [PATCH 060/147] okay you can use it now fixed a lighting bug (with a hack, again) everything now uses the new api (kinetic components on contraptions are slightly broken) --- .../com/simibubi/create/AllBlockPartials.java | 10 +- .../com/simibubi/create/AllTileEntities.java | 32 +++-- .../com/simibubi/create/CreateClient.java | 6 +- .../base/BackHalfShaftInstance.java | 9 +- .../contraptions/base/HalfShaftInstance.java | 9 +- .../base/HorizontalHalfShaftInstance.java | 9 +- .../contraptions/base/KineticTileEntity.java | 4 +- .../base/KineticTileEntityRenderer.java | 5 +- .../base/KineticTileInstance.java | 35 ++---- .../base/ShaftlessCogInstance.java | 9 +- .../base/SingleRotatingInstance.java | 15 ++- .../components/actors/DrillInstance.java | 10 +- .../crafter/MechanicalCrafterInstance.java | 46 +++++++ .../components/deployer/DeployerRenderer.java | 5 +- .../components/fan/FanInstance.java | 117 ++++++++++++++++++ .../millstone/MillStoneCogInstance.java | 10 +- .../press/MechanicalPressRenderer.java | 5 + .../components/saw/SawInstance.java | 35 ++++++ .../components/saw/SawRenderer.java | 5 +- .../contraptions/fluids/PumpCogInstance.java | 9 +- .../advanced/SpeedControllerRenderer.java | 5 +- .../relays/belt/BeltInstance.java | 13 +- .../relays/belt/BeltRenderer.java | 9 +- ...gShaftInstance.java => ShaftInstance.java} | 13 +- .../relays/encased/SplitShaftInstance.java | 11 +- .../relays/gearbox/GearboxInstance.java | 13 +- .../block/mechanicalArm/ArmInstance.java | 13 +- .../simibubi/create/events/ClientEvents.java | 1 + .../foundation/mixin/OnRemoveTileMixin.java | 32 +++++ .../render/FastRenderDispatcher.java | 37 +++--- ...atcher.java => InstancedTileRenderer.java} | 26 ++-- .../ContraptionKineticRenderer.java | 4 +- .../contraption/RenderedContraption.java | 14 +-- .../IInstancedTileEntityRenderer.java | 10 -- .../render/instancing/IRendererFactory.java | 4 +- .../render/instancing/InstanceContext.java | 27 +--- .../render/instancing/InstancedModel.java | 5 +- .../InstancedTileRenderRegistry.java | 4 +- .../render/instancing/TileEntityInstance.java | 14 ++- .../foundation/render/light/LightVolume.java | 10 +- src/main/resources/create.mixins.json | 2 +- 41 files changed, 431 insertions(+), 221 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java rename src/main/java/com/simibubi/create/content/contraptions/relays/encased/{SingleRotatingShaftInstance.java => ShaftInstance.java} (61%) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java rename src/main/java/com/simibubi/create/foundation/render/{InstancedTileRenderDispatcher.java => InstancedTileRenderer.java} (77%) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index bc0c28e66..d156c584b 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.utility.AngleHelper; @@ -227,7 +227,7 @@ public class AllBlockPartials { return ctx.getRotating().getModel(this, referenceState); } - public InstancedModel renderOnRotating(InstancedTileRenderDispatcher ctx, BlockState referenceState) { + public InstancedModel renderOnRotating(InstancedTileRenderer ctx, BlockState referenceState) { return ctx.get(KineticRenderMaterials.ROTATING).getModel(this, referenceState); } @@ -236,7 +236,7 @@ public class AllBlockPartials { return ctx.getBelts().getModel(this, referenceState); } - public InstancedModel renderOnBelt(InstancedTileRenderDispatcher ctx, BlockState referenceState) { + public InstancedModel renderOnBelt(InstancedTileRenderer ctx, BlockState referenceState) { return ctx.get(KineticRenderMaterials.BELTS).getModel(this, referenceState); } @@ -246,7 +246,7 @@ public class AllBlockPartials { return renderOnDirectionalSouthRotating(ctx, referenceState, facing); } - public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderDispatcher dispatcher, BlockState referenceState) { + public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderer dispatcher, BlockState referenceState) { Direction facing = referenceState.get(FACING); return renderOnDirectionalSouthRotating(dispatcher, referenceState, facing); } @@ -256,7 +256,7 @@ public class AllBlockPartials { return renderOnDirectionalSouthRotating(ctx.getKinetics(), referenceState, facing); } - public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderDispatcher dispatcher, BlockState referenceState, Direction facing) { + public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderer dispatcher, BlockState referenceState, Direction facing) { Supplier ms = () -> { MatrixStack stack = new MatrixStack(); MatrixStacker.of(stack) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 8900b34c5..8fb212476 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -4,6 +4,7 @@ import com.simibubi.create.content.contraptions.base.*; import com.simibubi.create.content.contraptions.components.actors.*; import com.simibubi.create.content.contraptions.components.clock.CuckooClockRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity; +import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterInstance; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterRenderer; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; import com.simibubi.create.content.contraptions.components.crank.HandCrankRenderer; @@ -14,6 +15,7 @@ import com.simibubi.create.content.contraptions.components.deployer.DeployerRend import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.contraptions.components.fan.EncasedFanRenderer; import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity; +import com.simibubi.create.content.contraptions.components.fan.FanInstance; import com.simibubi.create.content.contraptions.components.fan.NozzleTileEntity; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; @@ -28,6 +30,7 @@ import com.simibubi.create.content.contraptions.components.motor.CreativeMotorRe import com.simibubi.create.content.contraptions.components.motor.CreativeMotorTileEntity; import com.simibubi.create.content.contraptions.components.press.MechanicalPressRenderer; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; +import com.simibubi.create.content.contraptions.components.saw.SawInstance; import com.simibubi.create.content.contraptions.components.saw.SawRenderer; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingRenderer; @@ -133,20 +136,21 @@ public class AllTileEntities { .tileEntity("encased_shaft", EncasedShaftTileEntity::new) .validBlocks(AllBlocks.ANDESITE_ENCASED_SHAFT, AllBlocks.BRASS_ENCASED_SHAFT, AllBlocks.ENCASED_CHAIN_DRIVE) .renderer(() -> EncasedShaftRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry ADJUSTABLE_PULLEY = Create.registrate() .tileEntity("adjustable_pulley", AdjustablePulleyTileEntity::new) .validBlocks(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .renderer(() -> EncasedShaftRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry ENCASED_FAN = Create.registrate() .tileEntity("encased_fan", EncasedFanTileEntity::new) .validBlocks(AllBlocks.ENCASED_FAN) .renderer(() -> EncasedFanRenderer::new) + .onRegister(FanInstance::register) .register(); public static final TileEntityEntry NOZZLE = Create.registrate() @@ -173,6 +177,7 @@ public class AllTileEntities { .tileEntity("turntable", TurntableTileEntity::new) .validBlocks(AllBlocks.TURNTABLE) .renderer(() -> KineticTileEntityRenderer::new) + .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry HAND_CRANK = Create.registrate() @@ -180,7 +185,7 @@ public class AllTileEntities { .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE) .validBlocks(AllBlocks.DYED_VALVE_HANDLES) .renderer(() -> HandCrankRenderer::new) - .onRegister(BackHalfShaftInstance::register) + .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry CUCKOO_CLOCK = Create.registrate() @@ -223,7 +228,7 @@ public class AllTileEntities { .tileEntity("fluid_valve", FluidValveTileEntity::new) .validBlocks(AllBlocks.FLUID_VALVE) .renderer(() -> FluidValveRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry FLUID_TANK = Create.registrate() @@ -242,7 +247,7 @@ public class AllTileEntities { .tileEntity("hose_pulley", HosePulleyTileEntity::new) .validBlocks(AllBlocks.HOSE_PULLEY) .renderer(() -> HosePulleyRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry SPOUT = Create.registrate() @@ -293,7 +298,7 @@ public class AllTileEntities { .tileEntity("mechanical_piston", MechanicalPistonTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) .renderer(() -> MechanicalPistonRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry WINDMILL_BEARING = Create.registrate() @@ -321,7 +326,7 @@ public class AllTileEntities { .tileEntity("rope_pulley", PulleyTileEntity::new) .validBlocks(AllBlocks.ROPE_PULLEY) .renderer(() -> PulleyRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry CHASSIS = Create.registrate() @@ -341,6 +346,7 @@ public class AllTileEntities { .tileEntity("saw", SawTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_SAW) .renderer(() -> SawRenderer::new) + .onRegister(SawInstance::register) .register(); public static final TileEntityEntry HARVESTER = Create.registrate() @@ -407,7 +413,7 @@ public class AllTileEntities { .tileEntity("mechanical_press", MechanicalPressTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_PRESS) .renderer(() -> MechanicalPressRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry MECHANICAL_MIXER = Create.registrate() @@ -421,7 +427,7 @@ public class AllTileEntities { .tileEntity("deployer", DeployerTileEntity::new) .validBlocks(AllBlocks.DEPLOYER) .renderer(() -> DeployerRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry BASIN = Create.registrate() @@ -440,7 +446,7 @@ public class AllTileEntities { .tileEntity("mechanical_crafter", MechanicalCrafterTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_CRAFTER) .renderer(() -> MechanicalCrafterRenderer::new) - .onRegister(ShaftlessCogInstance::register) + .onRegister(MechanicalCrafterInstance::register) .register(); public static final TileEntityEntry SEQUENCED_GEARSHIFT = Create.registrate() @@ -454,21 +460,21 @@ public class AllTileEntities { .tileEntity("rotation_speed_controller", SpeedControllerTileEntity::new) .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) .renderer(() -> SpeedControllerRenderer::new) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry SPEEDOMETER = Create.registrate() .tileEntity("speedometer", SpeedGaugeTileEntity::new) .validBlocks(AllBlocks.SPEEDOMETER) .renderer(() -> GaugeRenderer::speed) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry STRESSOMETER = Create.registrate() .tileEntity("stressometer", StressGaugeTileEntity::new) .validBlocks(AllBlocks.STRESSOMETER) .renderer(() -> GaugeRenderer::stress) - .onRegister(SingleRotatingShaftInstance::register) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry ANALOG_LEVER = Create.registrate() diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index ca0dcbdec..561107461 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -11,7 +11,7 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; @@ -44,7 +44,7 @@ public class CreateClient { public static SchematicHandler schematicHandler; public static SchematicAndQuillHandler schematicAndQuillHandler; public static SuperByteBufferCache bufferCache; - public static InstancedTileRenderDispatcher kineticRenderer; + public static InstancedTileRenderer kineticRenderer; public static final Outliner outliner = new Outliner(); private static CustomBlockModels customBlockModels; @@ -72,7 +72,7 @@ public class CreateClient { bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); - kineticRenderer = new InstancedTileRenderDispatcher(); + kineticRenderer = new InstancedTileRenderer(); AllKeys.register(); AllContainerTypes.registerScreenFactories(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java index 6538232d7..b386cc41d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java @@ -1,17 +1,20 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class BackHalfShaftInstance extends HalfShaftInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, BackHalfShaftInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, BackHalfShaftInstance::new)); } - public BackHalfShaftInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public BackHalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java index 57611c092..81950b2ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; @@ -9,13 +9,16 @@ import net.minecraft.block.BlockState; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class HalfShaftInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, HalfShaftInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, HalfShaftInstance::new)); } - public HalfShaftInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public HalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java index a4f9d2471..e9ddd647f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java @@ -1,17 +1,20 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class HorizontalHalfShaftInstance extends HalfShaftInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, HorizontalHalfShaftInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, HorizontalHalfShaftInstance::new)); } - public HorizontalHalfShaftInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public HorizontalHalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index d7973d1cb..baae13d13 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -472,9 +472,7 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override public void requestModelDataUpdate() { super.requestModelDataUpdate(); - if (this.removed) { - FastRenderDispatcher.enqueueRemove(this); - } else { + if (!this.removed) { FastRenderDispatcher.enqueueUpdate(this); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 903b92b72..f1015dd48 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -6,7 +6,6 @@ import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; @@ -26,7 +25,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber(value = Dist.CLIENT) -public class KineticTileEntityRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { +public class KineticTileEntityRenderer extends SafeTileEntityRenderer { public static final Compartment KINETIC_TILE = new Compartment<>(); public static boolean rainbowMode = false; @@ -45,12 +44,10 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer(te)); } - @Override public void addInstanceData(InstanceContext ctx) { renderRotatingBuffer(ctx, getRotatedModel(ctx)); } - @Override public void markForRebuild(InstanceContext ctx) { getRotatedModel(ctx).clearInstanceData(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index ccfd9515f..ece5c0594 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -3,54 +3,46 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.*; import net.minecraft.block.BlockState; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; -import net.minecraft.world.World; import java.util.function.Consumer; public abstract class KineticTileInstance extends TileEntityInstance { - public KineticTileInstance(InstancedTileRenderDispatcher modelManager, T tile) { + public KineticTileInstance(InstancedTileRenderer modelManager, T tile) { super(modelManager, tile); } - protected void updateRotation(InstanceKey key, Direction.Axis axis) { + protected final void updateRotation(InstanceKey key, Direction.Axis axis) { key.modifyInstance(data -> { - final BlockPos pos = tile.getPos(); - data.setRotationalSpeed(tile.getSpeed()) - .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationOffset(getRotationOffset(axis)) .setRotationAxis(axis); }); } protected final Consumer setupFunc(float speed, Direction.Axis axis) { return data -> { - final BlockPos pos = tile.getPos(); - - data.setBlockLight(tile.getWorld().getLightLevel(LightType.BLOCK, tile.getPos())) - .setSkyLight(tile.getWorld().getLightLevel(LightType.SKY, tile.getPos())) + data.setBlockLight(tile.getWorld().getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(tile.getWorld().getLightLevel(LightType.SKY, pos)) .setTileEntity(tile) .setRotationalSpeed(speed) - .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationOffset(getRotationOffset(axis)) .setRotationAxis(axis); }; } protected final void relight(KineticData data) { - World world = tile.getWorld(); - - data.setBlockLight(world.getLightLevel(LightType.BLOCK, tile.getPos())) - .setSkyLight(world.getLightLevel(LightType.SKY, tile.getPos())); + data.setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)); } - protected static float getRotationOffsetForPosition(KineticTileEntity te, final BlockPos pos, final Direction.Axis axis) { - float offset = CogWheelBlock.isLargeCog(te.getBlockState()) ? 11.25f : 0; + protected float getRotationOffset(final Direction.Axis axis) { + float offset = CogWheelBlock.isLargeCog(lastState) ? 11.25f : 0; double d = (((axis == Direction.Axis.X) ? 0 : pos.getX()) + ((axis == Direction.Axis.Y) ? 0 : pos.getY()) + ((axis == Direction.Axis.Z) ? 0 : pos.getZ())) % 2; if (d == 0) { @@ -64,9 +56,8 @@ public abstract class KineticTileInstance extends T .with(ShaftBlock.AXIS, axis); } - public static Direction.Axis getRotationAxisOf(KineticTileEntity te) { - return ((IRotate) te.getBlockState() - .getBlock()).getRotationAxis(te.getBlockState()); + public Direction.Axis getRotationAxis() { + return ((IRotate) lastState.getBlock()).getRotationAxis(lastState); } protected final RenderMaterial> rotatingMaterial() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java index d6f318f3f..e4d47c08b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java @@ -1,18 +1,21 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class ShaftlessCogInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, ShaftlessCogInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, ShaftlessCogInstance::new)); } - public ShaftlessCogInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public ShaftlessCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index 9e1732cd2..374c2207f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstanceKey; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; @@ -8,29 +8,32 @@ import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.KINETIC_TILE; public class SingleRotatingInstance extends KineticTileInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, SingleRotatingInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, SingleRotatingInstance::new)); } protected InstanceKey rotatingModelKey; - public SingleRotatingInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public SingleRotatingInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } @Override protected void init() { - Direction.Axis axis = ((IRotate) tile.getBlockState().getBlock()).getRotationAxis(tile.getBlockState()); + Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); rotatingModelKey = getModel().setupInstance(setupFunc(tile.getSpeed(), axis)); } @Override public void onUpdate() { - Direction.Axis axis = ((IRotate) tile.getBlockState().getBlock()).getRotationAxis(tile.getBlockState()); + Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); updateRotation(rotatingModelKey, axis); } @@ -46,7 +49,7 @@ public class SingleRotatingInstance extends KineticTileInstance getModel() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index 2082919b6..77b5779fb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -3,18 +3,20 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class DrillInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, DrillInstance::new); - } + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, DrillInstance::new)); } - public DrillInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public DrillInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java new file mode 100644 index 000000000..fa8dec58c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.contraptions.components.crafter; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +import java.util.function.Supplier; + +public class MechanicalCrafterInstance extends SingleRotatingInstance { + public static void register(TileEntityType type) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, MechanicalCrafterInstance::new)); + } + + public MechanicalCrafterInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected InstancedModel getModel() { + Direction facing = lastState.get(MechanicalCrafterBlock.HORIZONTAL_FACING); + + Supplier ms = () -> { + MatrixStack stack = new MatrixStack(); + MatrixStacker.of(stack) + .centre() + .rotateZ(90) + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .unCentre(); + return stack; + }; + return rotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, lastState, facing, ms); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index a81162e17..d3aa7b2e7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -9,7 +9,6 @@ import com.simibubi.create.content.contraptions.components.deployer.DeployerTile import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -33,7 +32,7 @@ import net.minecraft.world.World; import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; -public class DeployerRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { +public class DeployerRenderer extends SafeTileEntityRenderer { public DeployerRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -53,12 +52,10 @@ public class DeployerRenderer extends SafeTileEntityRenderer } - @Override public void addInstanceData(InstanceContext ctx) { KineticTileEntityRenderer.renderRotatingKineticBlock(ctx, getRenderedBlockState(ctx.te)); } - @Override public void markForRebuild(InstanceContext ctx) { KineticTileEntityRenderer.markForRebuild(ctx, getRenderedBlockState(ctx.te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java new file mode 100644 index 000000000..8872229d2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -0,0 +1,117 @@ +package com.simibubi.create.content.contraptions.components.fan; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.base.KineticTileInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstanceKey; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +import static net.minecraft.state.properties.BlockStateProperties.FACING; + +public class FanInstance extends KineticTileInstance { + public static void register(TileEntityType type) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, FanInstance::new)); + } + + protected InstanceKey shaft; + protected InstanceKey fan; + + public FanInstance(InstancedTileRenderer modelManager, EncasedFanTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + final Direction direction = lastState.get(FACING); + final Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); + + InstancedModel shaftHalf = + AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, direction.getOpposite()); + InstancedModel fanInner = + AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, lastState, direction.getOpposite()); + + shaft = shaftHalf.setupInstance(data -> { + BlockPos behind = pos.offset(direction.getOpposite()); + int blockLight = world.getLightLevel(LightType.BLOCK, behind); + int skyLight = world.getLightLevel(LightType.SKY, behind); + + data.setRotationalSpeed(tile.getSpeed()) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setTileEntity(tile) + .setBlockLight(blockLight) + .setSkyLight(skyLight); + }); + fan = fanInner.setupInstance(data -> { + BlockPos inFront = pos.offset(direction); + int blockLight = world.getLightLevel(LightType.BLOCK, inFront); + int skyLight = world.getLightLevel(LightType.SKY, inFront); + + data.setRotationalSpeed(getFanSpeed()) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setTileEntity(tile) + .setBlockLight(blockLight) + .setSkyLight(skyLight); + }); + } + + private float getFanSpeed() { + float speed = tile.getSpeed() * 5; + if (speed > 0) + speed = MathHelper.clamp(speed, 80, 64 * 20); + if (speed < 0) + speed = MathHelper.clamp(speed, -64 * 20, -80); + return speed; + } + + @Override + protected void onUpdate() { + Direction.Axis axis = lastState.get(FACING).getAxis(); + updateRotation(shaft, axis); + + fan.modifyInstance(data -> { + data.setRotationalSpeed(getFanSpeed()) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); + }); + } + + @Override + public void updateLight() { + final Direction direction = lastState.get(FACING); + + shaft.modifyInstance(data -> { + BlockPos behind = pos.offset(direction.getOpposite()); + int blockLight = world.getLightLevel(LightType.BLOCK, behind); + int skyLight = world.getLightLevel(LightType.SKY, behind); + data.setBlockLight(blockLight) + .setSkyLight(skyLight); + }); + fan.modifyInstance(data -> { + BlockPos inFront = pos.offset(direction); + int blockLight = world.getLightLevel(LightType.BLOCK, inFront); + int skyLight = world.getLightLevel(LightType.SKY, inFront); + data.setBlockLight(blockLight) + .setSkyLight(skyLight); + }); + } + + @Override + public void remove() { + shaft.delete(); + fan.delete(); + shaft = fan = null; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java index 03c408569..bd663dc70 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java @@ -3,18 +3,20 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class MillStoneCogInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, MillStoneCogInstance::new); - } + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, MillStoneCogInstance::new)); } - public MillStoneCogInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public MillStoneCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index 58a7a6c83..60f7d437f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -19,6 +19,11 @@ public class MechanicalPressRenderer extends KineticTileEntityRenderer { super(dispatcher); } + @Override + public boolean isGlobalRenderer(KineticTileEntity tile) { + return true; + } + @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java new file mode 100644 index 000000000..5b5175ad1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java @@ -0,0 +1,35 @@ +package com.simibubi.create.content.contraptions.components.saw; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Rotation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +import static net.minecraft.state.properties.BlockStateProperties.FACING; + +public class SawInstance extends SingleRotatingInstance { + public static void register(TileEntityType type) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, SawInstance::new)); + } + + public SawInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected InstancedModel getModel() { + if (lastState.get(FACING).getAxis().isHorizontal()) + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180)); + else + return rotatingMaterial().getModel(KineticTileEntityRenderer.KINETIC_TILE, shaft(getRotationAxis())); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index d357081eb..217be3457 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -6,7 +6,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; @@ -32,7 +31,7 @@ import net.minecraft.util.math.Vec3d; import static net.minecraft.state.properties.BlockStateProperties.FACING; -public class SawRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { +public class SawRenderer extends SafeTileEntityRenderer { public SawRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -47,12 +46,10 @@ public class SawRenderer extends SafeTileEntityRenderer implement } - @Override public void addInstanceData(InstanceContext ctx) { KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx)); } - @Override public void markForRebuild(InstanceContext ctx) { getRotatedModel(ctx).clearInstanceData(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index cd8558bd0..2c23dd4e8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -3,18 +3,21 @@ package com.simibubi.create.content.contraptions.fluids; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class PumpCogInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, PumpCogInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, PumpCogInstance::new)); } - public PumpCogInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public PumpCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 5ae680b64..caee82b16 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer; import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; @@ -10,7 +9,7 @@ import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRendere import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -public class SpeedControllerRenderer extends SmartTileEntityRenderer implements IInstancedTileEntityRenderer { +public class SpeedControllerRenderer extends SmartTileEntityRenderer { public SpeedControllerRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -23,12 +22,10 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer(tileEntityIn)); } - @Override public void addInstanceData(InstanceContext ctx) { KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx)); } - @Override public void markForRebuild(InstanceContext ctx) { getRotatedModel(ctx).clearInstanceData(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index f76a5b502..345fd0d30 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -14,6 +14,8 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; import java.util.ArrayList; import java.util.function.Consumer; @@ -21,7 +23,8 @@ import java.util.function.Supplier; public class BeltInstance extends KineticTileInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, BeltInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, BeltInstance::new)); } private boolean upward; @@ -35,7 +38,7 @@ public class BeltInstance extends KineticTileInstance { protected ArrayList> keys; protected InstanceKey pulleyKey; - public BeltInstance(InstancedTileRenderDispatcher modelManager, BeltTileEntity tile) { + public BeltInstance(InstancedTileRenderer modelManager, BeltTileEntity tile) { super(modelManager, tile); } @@ -75,7 +78,7 @@ public class BeltInstance extends KineticTileInstance { if (tile.hasPulley()) { InstancedModel pulleyModel = getPulleyModel(blockState); - pulleyKey = pulleyModel.setupInstance(setupFunc(tile.getSpeed(), getRotationAxisOf(tile))); + pulleyKey = pulleyModel.setupInstance(setupFunc(tile.getSpeed(), getRotationAxis())); } } @@ -86,7 +89,7 @@ public class BeltInstance extends KineticTileInstance { } if (pulleyKey != null) { - updateRotation(pulleyKey, getRotationAxisOf(tile)); + updateRotation(pulleyKey, getRotationAxis()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index c598fe765..984fc6b49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -8,7 +8,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.ShadowRenderHelper; -import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.instancing.BeltData; +import com.simibubi.create.foundation.render.instancing.InstanceContext; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -31,7 +34,7 @@ import net.minecraft.world.LightType; import java.util.Random; import java.util.function.Supplier; -public class BeltRenderer extends SafeTileEntityRenderer implements IInstancedTileEntityRenderer { +public class BeltRenderer extends SafeTileEntityRenderer { public BeltRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); @@ -54,7 +57,6 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme return te.isController(); } - @Override public void addInstanceData(InstanceContext ctx) { BeltTileEntity te = ctx.te; BlockState blockState = te.getBlockState(); @@ -146,7 +148,6 @@ public class BeltRenderer extends SafeTileEntityRenderer impleme } } - @Override public void markForRebuild(InstanceContext ctx) { BeltTileEntity te = ctx.te; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SingleRotatingShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java similarity index 61% rename from src/main/java/com/simibubi/create/content/contraptions/relays/encased/SingleRotatingShaftInstance.java rename to src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java index 89a661795..e563df129 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SingleRotatingShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java @@ -2,24 +2,27 @@ package com.simibubi.create.content.contraptions.relays.encased; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; -public class SingleRotatingShaftInstance extends SingleRotatingInstance { +public class ShaftInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, SingleRotatingShaftInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, ShaftInstance::new)); } - public SingleRotatingShaftInstance(InstancedTileRenderDispatcher dispatcher, KineticTileEntity tile) { + public ShaftInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { super(dispatcher, tile); } @Override protected BlockState getRenderedBlockState() { - return shaft(getRotationAxisOf(tile)); + return shaft(getRotationAxis()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index 077b9b091..15d3d2771 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.relays.encased; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstanceKey; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; @@ -14,17 +14,20 @@ import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; import java.util.ArrayList; public class SplitShaftInstance extends KineticTileInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, SplitShaftInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, SplitShaftInstance::new)); } protected ArrayList> keys; - public SplitShaftInstance(InstancedTileRenderDispatcher modelManager, SplitShaftTileEntity tile) { + public SplitShaftInstance(InstancedTileRenderer modelManager, SplitShaftTileEntity tile) { super(modelManager, tile); } @@ -80,7 +83,7 @@ public class SplitShaftInstance extends KineticTileInstance { public static void register(TileEntityType type) { - InstancedTileRenderRegistry.instance.register(type, GearboxInstance::new); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, GearboxInstance::new)); } protected EnumMap> keys; protected Direction sourceFacing; - public GearboxInstance(InstancedTileRenderDispatcher modelManager, GearboxTileEntity tile) { + public GearboxInstance(InstancedTileRenderer modelManager, GearboxTileEntity tile) { super(modelManager, tile); } @@ -54,7 +57,7 @@ public class GearboxInstance extends KineticTileInstance { data.setBlockLight(blockLight) .setSkyLight(skyLight) .setRotationalSpeed(getSpeed(direction)) - .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationOffset(getRotationOffset(axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) .setTileEntity(tile); }); @@ -93,7 +96,7 @@ public class GearboxInstance extends KineticTileInstance { Direction.Axis axis = direction.getAxis(); data.setRotationalSpeed(getSpeed(direction)) - .setRotationOffset(getRotationOffsetForPosition(tile, pos, axis)) + .setRotationOffset(getRotationOffset(axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); }); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index 0d931d6c1..82655699c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -3,12 +3,21 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class ArmInstance extends SingleRotatingInstance { - public ArmInstance(InstancedTileRenderDispatcher modelManager, KineticTileEntity tile) { + public static void register(TileEntityType type) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, ArmInstance::new)); + } + + public ArmInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index d0bd82064..fe626d735 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -50,6 +50,7 @@ import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.RenderTickEvent; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java new file mode 100644 index 000000000..5970e3dfe --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java @@ -0,0 +1,32 @@ +package com.simibubi.create.foundation.mixin; + +import com.simibubi.create.foundation.render.FastRenderDispatcher; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@OnlyIn(Dist.CLIENT) +@Mixin(World.class) +public class OnRemoveTileMixin { + + @Shadow @Final public boolean isRemote; + + /** + * JUSTIFICATION: This method is called whenever a tile entity is removed due + * to a change in block state, even on the client. By hooking into this method, + * we gain easy access to the information while having no impact on performance. + */ + @Inject(at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/World;getTileEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/tileentity/TileEntity;"), method = "removeTileEntity", locals = LocalCapture.CAPTURE_FAILHARD) + private void onRemoveTile(BlockPos pos, CallbackInfo ci, TileEntity te) { + if (isRemote) FastRenderDispatcher.enqueueRemove(te); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 20386c6f3..64e66bee0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; +import com.simibubi.create.foundation.render.instancing.TileEntityInstance; import com.simibubi.create.foundation.render.light.ILightListener; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; @@ -25,13 +26,17 @@ import net.minecraft.world.LightType; import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; +import javax.annotation.Nullable; import java.util.Map; +import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.function.Consumer; public class FastRenderDispatcher { - public static WorldAttached> addedTiles = new WorldAttached<>(ConcurrentLinkedQueue::new); - public static WorldAttached> removedTiles = new WorldAttached<>(ConcurrentLinkedQueue::new); + public static WorldAttached> queuedUpdates = new WorldAttached<>(ConcurrentLinkedQueue::new); + public static WorldAttached> queuedRemovals = new WorldAttached<>(ConcurrentLinkedQueue::new); + public static WorldAttached>> addedLastTick = new WorldAttached<>(ConcurrentLinkedQueue::new); private static Matrix4f projectionMatrixThisFrame = null; @@ -40,34 +45,28 @@ public class FastRenderDispatcher { } public static void enqueueUpdate(TileEntity te) { - addedTiles.get(te.getWorld()).add(te); + queuedUpdates.get(te.getWorld()).add(te); } public static void enqueueRemove(TileEntity te) { - removedTiles.get(te.getWorld()).add(te); + queuedRemovals.get(te.getWorld()).add(te); } public static void tick() { ClientWorld world = Minecraft.getInstance().world; - ConcurrentLinkedQueue added = addedTiles.get(world); + runQueue(addedLastTick.get(world), TileEntityInstance::updateLight); + runQueue(queuedUpdates.get(world), CreateClient.kineticRenderer::update); + runQueue(queuedRemovals.get(world), CreateClient.kineticRenderer::remove); + } - if (added != null) { - while (!added.isEmpty()) { - TileEntity te = added.poll(); + private static void runQueue(@Nullable Queue q, Consumer action) { + if (q == null) return; - CreateClient.kineticRenderer.update(te); - } - } + while (!q.isEmpty()) { + T t = q.poll(); - ConcurrentLinkedQueue removed = removedTiles.get(world); - - if (removed != null) { - while (!removed.isEmpty()) { - TileEntity te = removed.poll(); - - CreateClient.kineticRenderer.remove(te); - } + action.accept(t); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java similarity index 77% rename from src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderDispatcher.java rename to src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java index b1eb363e3..6b86af49b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.render; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; import com.simibubi.create.foundation.render.gl.shader.Shader; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; @@ -13,12 +12,12 @@ import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; -public class InstancedTileRenderDispatcher { +public class InstancedTileRenderer { protected Map> renderers = new HashMap<>(); protected Map, RenderMaterial> materials = new HashMap<>(); - public InstancedTileRenderDispatcher() { + public InstancedTileRenderer() { registerMaterials(); } @@ -40,7 +39,10 @@ public class InstancedTileRenderDispatcher { } else { TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); - renderers.put(tile, renderer); + if (renderer != null) { + FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(renderer); + renderers.put(tile, renderer); + } return renderer; } @@ -75,25 +77,11 @@ public class InstancedTileRenderDispatcher { } } - public void addInstancedData(RenderedContraption c, T te, IInstancedTileEntityRenderer renderer) { - renderer.addInstanceData(new InstanceContext.Contraption<>(te, c)); - } - - /** - * This function should be called after building instances. - * It must be called either on the render thread before committing to rendering, or in a place where there are - * guaranteed to be no race conditions with the render thread, i.e. when constructing a FastContraptionRenderer. - */ - public void markAllDirty() { - for (RenderMaterial material : materials.values()) { - material.runOnAll(InstancedModel::markDirty); - } - } - public void invalidate() { for (RenderMaterial material : materials.values()) { material.delete(); } + renderers.clear(); } public void render(RenderType layer, Matrix4f projection, Matrix4f view) { diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java index f5761bedd..7b77398f7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.render.contraption; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import com.simibubi.create.foundation.render.gl.shader.Shader; import com.simibubi.create.foundation.render.instancing.BeltModel; import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.render.instancing.RenderMaterial; import com.simibubi.create.foundation.render.instancing.RotatingModel; import com.simibubi.create.foundation.render.instancing.actors.RotatingActorModel; -public class ContraptionKineticRenderer extends InstancedTileRenderDispatcher { +public class ContraptionKineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index aac348e79..80122a1e4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -7,14 +7,15 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; -import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; +import com.simibubi.create.foundation.render.instancing.RenderMaterial; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.render.light.ContraptionLighter; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template; @@ -44,7 +45,6 @@ public class RenderedContraption { buildLayers(contraption); buildInstancedTiles(contraption); buildActors(contraption); - kinetics.markAllDirty(); } public int getEntityId() { @@ -91,11 +91,7 @@ public class RenderedContraption { if (!tileEntities.isEmpty()) { for (TileEntity te : tileEntities) { if (te instanceof IInstanceRendered) { - TileEntityRenderer renderer = TileEntityRendererDispatcher.instance.getRenderer(te); - - if (renderer instanceof IInstancedTileEntityRenderer) { - kinetics.addInstancedData(this, te, (IInstancedTileEntityRenderer) renderer); - } + kinetics.getRenderer(te); // this is enough to instantiate the model instance } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java deleted file mode 100644 index 4b9ccaa1b..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstancedTileEntityRenderer.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -import net.minecraft.tileentity.TileEntity; - -public interface IInstancedTileEntityRenderer { - - void addInstanceData(InstanceContext ctx); - - void markForRebuild(InstanceContext ctx); -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java index 2ad3a86bd..263b4af17 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java @@ -1,9 +1,9 @@ package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import net.minecraft.tileentity.TileEntity; @FunctionalInterface public interface IRendererFactory { - TileEntityInstance create(InstancedTileRenderDispatcher manager, T te); + TileEntityInstance create(InstancedTileRenderer manager, T te); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java index 711d2a393..1d1ef8c3f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java @@ -1,8 +1,7 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import net.minecraft.tileentity.TileEntity; @Deprecated @@ -22,30 +21,10 @@ public abstract class InstanceContext { return getKinetics().get(KineticRenderMaterials.BELTS); } - public abstract InstancedTileRenderDispatcher getKinetics(); + public abstract InstancedTileRenderer getKinetics(); public abstract boolean checkWorldLight(); - public static class Contraption extends InstanceContext { - - public final RenderedContraption c; - - public Contraption(T te, RenderedContraption c) { - super(te); - this.c = c; - } - - @Override - public InstancedTileRenderDispatcher getKinetics() { - return c.kinetics; - } - - @Override - public boolean checkWorldLight() { - return false; - } - } - public static class World extends InstanceContext { public World(T te) { @@ -53,7 +32,7 @@ public abstract class InstanceContext { } @Override - public InstancedTileRenderDispatcher getKinetics() { + public InstancedTileRenderer getKinetics() { return CreateClient.kineticRenderer; } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java index edd1ed544..19063df7f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java @@ -5,10 +5,7 @@ import com.simibubi.create.foundation.render.BufferedModel; import com.simibubi.create.foundation.render.RenderMath; import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL31; -import org.lwjgl.opengl.GL33; +import org.lwjgl.opengl.*; import java.nio.ByteBuffer; import java.util.ArrayList; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java index 71cd04266..64c0012db 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.render.instancing; import com.google.common.collect.Maps; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; @@ -19,7 +19,7 @@ public class InstancedTileRenderRegistry { @SuppressWarnings("unchecked") @Nullable - public TileEntityInstance create(InstancedTileRenderDispatcher manager, T tile) { + public TileEntityInstance create(InstancedTileRenderer manager, T tile) { TileEntityType type = tile.getType(); IRendererFactory factory = (IRendererFactory) this.renderers.get(type); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java index 2bd228c58..1d1762e3a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java @@ -1,18 +1,24 @@ package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.render.InstancedTileRenderDispatcher; +import com.simibubi.create.foundation.render.InstancedTileRenderer; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; public abstract class TileEntityInstance { - protected final InstancedTileRenderDispatcher modelManager; + protected final InstancedTileRenderer modelManager; protected final T tile; + protected final World world; + protected final BlockPos pos; protected BlockState lastState; - public TileEntityInstance(InstancedTileRenderDispatcher modelManager, T tile) { + public TileEntityInstance(InstancedTileRenderer modelManager, T tile) { this.modelManager = modelManager; this.tile = tile; + this.world = tile.getWorld(); + this.pos = tile.getPos(); this.lastState = tile.getBlockState(); init(); } @@ -25,8 +31,8 @@ public abstract class TileEntityInstance { onUpdate(); } else { remove(); - init(); lastState = currentState; + init(); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index 027e9bfd4..bbf69d51f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -10,12 +10,7 @@ import org.lwjgl.opengl.*; import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; -import java.util.concurrent.atomic.AtomicBoolean; -// TODO: Don't immediately destroy light volumes. -// There's a high chance that a contraption will stop and soon after start again. -// By caching lightvolumes based on their volumes/locations, we can save having -// to reread all the lighting data in those cases. public class LightVolume { private GridAlignedBB sampleVolume; @@ -31,7 +26,7 @@ public class LightVolume { setSampleVolume(sampleVolume); this.glTexture = new GlTexture(GL20.GL_TEXTURE_3D); - this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte + this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); } private void setSampleVolume(GridAlignedBB sampleVolume) { @@ -225,10 +220,7 @@ public class LightVolume { int sizeX = textureVolume.sizeX(); int sizeY = textureVolume.sizeY(); int sizeZ = textureVolume.sizeZ(); - if (sizeX * sizeY * sizeZ * 2 > lightData.capacity()) - throw new IllegalStateException("Volume too big for buffer"); - lightData.rewind(); GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); bufferDirty = false; } diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index beb9f49c8..ae2f46a98 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -7,5 +7,5 @@ "injectors": { "defaultRequire": 1 }, - "minVersion": "0.8" + "minVersion": "0.8", "mixins": ["OnRemoveTileMixin"] } \ No newline at end of file From 04ccf6e738cfbc4c7aace72b9662c699aeec97b9 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 27 Jan 2021 16:28:39 -0800 Subject: [PATCH 061/147] belt light --- .../contraptions/relays/belt/BeltHelper.java | 4 ++ .../relays/belt/BeltRenderer.java | 56 ++++--------------- .../relays/belt/BeltTileEntity.java | 17 ++++++ 3 files changed, 32 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java index 63360a12a..0268ea996 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java @@ -40,6 +40,10 @@ public class BeltHelper { return getSegmentTE(world, controllerPos); } + public static BeltTileEntity getBeltForOffset(BeltTileEntity controller, float offset) { + return getBeltAtSegment(controller, (int) Math.floor(offset)); + } + public static BeltTileEntity getBeltAtSegment(BeltTileEntity controller, int segment) { BlockPos pos = getPositionForOffset(controller, segment); TileEntity te = controller.getWorld() diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 984fc6b49..bbaa75d8f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -148,50 +148,6 @@ public class BeltRenderer extends SafeTileEntityRenderer { } } - public void markForRebuild(InstanceContext ctx) { - BeltTileEntity te = ctx.te; - - BlockState blockState = te.getBlockState(); - if (!AllBlocks.BELT.has(blockState)) - return; - - BeltSlope beltSlope = blockState.get(BeltBlock.SLOPE); - BeltPart part = blockState.get(BeltBlock.PART); - Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); - AxisDirection axisDirection = facing.getAxisDirection(); - - boolean downward = beltSlope == BeltSlope.DOWNWARD; - boolean upward = beltSlope == BeltSlope.UPWARD; - boolean diagonal = downward || upward; - boolean start = part == BeltPart.START; - boolean end = part == BeltPart.END; - boolean sideways = beltSlope == BeltSlope.SIDEWAYS; - boolean vertical = beltSlope == BeltSlope.VERTICAL; - - if (downward || vertical && axisDirection == AxisDirection.POSITIVE) { - boolean b = start; - start = end; - end = b; - } - - for (boolean bottom : Iterate.trueAndFalse) { - - AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); - - InstancedModel beltBuffer = beltPartial.renderOnBelt(ctx, blockState); - - beltBuffer.clearInstanceData(); - - // Diagonal belt do not have a separate bottom model - if (diagonal) - break; - } - - InstancedModel rotatingBuffer = getPulleyModel(ctx, blockState, sideways); - - rotatingBuffer.clearInstanceData(); - } - private InstancedModel getPulleyModel(InstanceContext ctx, BlockState blockState, boolean sideways) { Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) .rotateY(); @@ -246,11 +202,14 @@ public class BeltRenderer extends SafeTileEntityRenderer { float sideOffset = MathHelper.lerp(partialTicks, transported.prevSideOffset, transported.sideOffset); float verticalMovement = verticality; + if (te.getSpeed() == 0) { offset = transported.beltPosition; sideOffset = transported.sideOffset; } + int stackLight = getPackedLight(te, offset); + if (offset < .5) verticalMovement = 0; verticalMovement = verticalMovement * (Math.min(offset, te.beltLength - .5f) - .5f); @@ -318,7 +277,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { } ms.scale(.5f, .5f, .5f); - itemRenderer.renderItem(transported.stack, TransformType.FIXED, light, overlay, ms, buffer); + itemRenderer.renderItem(transported.stack, TransformType.FIXED, stackLight, overlay, ms, buffer); ms.pop(); if (!renderUpright) { @@ -335,4 +294,11 @@ public class BeltRenderer extends SafeTileEntityRenderer { ms.pop(); } + protected int getPackedLight(BeltTileEntity controller, float beltPos) { + BeltTileEntity belt = BeltHelper.getBeltForOffset(controller, beltPos); + + if (belt == null) return 0; + + return (belt.skyLight << 20) | (belt.blockLight << 4); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index c1f04f296..2635ae9c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -27,6 +27,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; +import net.minecraft.world.LightType; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.ModelDataMap; import net.minecraftforge.client.model.data.ModelProperty; @@ -61,6 +62,10 @@ public class BeltTileEntity extends KineticTileEntity { public CompoundNBT trackerUpdateTag; + // client + public byte blockLight; + public byte skyLight; + public static enum CasingType { NONE, ANDESITE, BRASS; } @@ -211,6 +216,7 @@ public class BeltTileEntity extends KineticTileEntity { if (!clientPacket) return; + updateLight(); if (casingBefore == casing) return; requestModelDataUpdate(); @@ -465,4 +471,15 @@ public class BeltTileEntity extends KineticTileEntity { return new ModelDataMap.Builder().withInitial(CASING_PROPERTY, casing) .build(); } + + @Override + public void onChunkLightUpdate() { + super.onChunkLightUpdate(); + updateLight(); + } + + private void updateLight() { + skyLight = (byte) world.getLightLevel(LightType.SKY, pos); + blockLight = (byte) world.getLightLevel(LightType.BLOCK, pos); + } } From b63466774b131ff4f4e31f6155058c9a2ebeb8e2 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 28 Jan 2021 14:39:34 -0800 Subject: [PATCH 062/147] probably fix the NPEs start work on adaptive backend extra sanity stuff for the render manager massive speedup when rendering a lot of tile entities --- .../contraptions/base/KineticTileEntity.java | 2 +- .../base/KineticTileInstance.java | 4 +- .../base/SingleRotatingInstance.java | 1 - .../components/fan/FanInstance.java | 1 - .../relays/belt/BeltInstance.java | 28 +++++---- .../relays/encased/SplitShaftInstance.java | 13 ++--- .../relays/gearbox/GearboxInstance.java | 20 ++----- .../mixin/CancelTileEntityRenderMixin.java | 14 +---- .../foundation/render/BufferedModel.java | 17 +++--- .../render/FastRenderDispatcher.java | 27 +++++---- .../render/InstancedTileRenderer.java | 41 +++++++++---- .../contraption/RenderedContraption.java | 2 +- .../create/foundation/render/gl/Backend.java | 7 +++ .../render/gl/backend/MapBuffer.java | 58 +++++++++++++++++++ .../render/instancing/InstancedModel.java | 47 +++++++++------ 15 files changed, 176 insertions(+), 106 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/Backend.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index baae13d13..70a96022a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -247,7 +247,7 @@ public abstract class KineticTileEntity extends SmartTileEntity effects.triggerOverStressedEffect(); if (clientPacket) - CreateClient.kineticRenderer.update(this); + FastRenderDispatcher.enqueueUpdate(this); } public float getGeneratedSpeed() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index ece5c0594..91fff6251 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -27,8 +27,8 @@ public abstract class KineticTileInstance extends T protected final Consumer setupFunc(float speed, Direction.Axis axis) { return data -> { - data.setBlockLight(tile.getWorld().getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(tile.getWorld().getLightLevel(LightType.SKY, pos)) + data.setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)) .setTileEntity(tile) .setRotationalSpeed(speed) .setRotationOffset(getRotationOffset(axis)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index 374c2207f..db9b4a71c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -45,7 +45,6 @@ public class SingleRotatingInstance extends KineticTileInstance { public void remove() { shaft.delete(); fan.delete(); - shaft = fan = null; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 345fd0d30..72292b8c1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -44,14 +44,13 @@ public class BeltInstance extends KineticTileInstance { @Override protected void init() { - BlockState blockState = tile.getBlockState(); - if (!AllBlocks.BELT.has(blockState)) + if (!AllBlocks.BELT.has(lastState)) return; keys = new ArrayList<>(2); - beltSlope = blockState.get(BeltBlock.SLOPE); - facing = blockState.get(BeltBlock.HORIZONTAL_FACING); + beltSlope = lastState.get(BeltBlock.SLOPE); + facing = lastState.get(BeltBlock.HORIZONTAL_FACING); upward = beltSlope == BeltSlope.UPWARD; diagonal = beltSlope.isDiagonal(); sideways = beltSlope == BeltSlope.SIDEWAYS; @@ -59,7 +58,7 @@ public class BeltInstance extends KineticTileInstance { alongX = facing.getAxis() == Direction.Axis.X; alongZ = facing.getAxis() == Direction.Axis.Z; - BeltPart part = blockState.get(BeltBlock.PART); + BeltPart part = lastState.get(BeltBlock.PART); boolean start = part == BeltPart.START; boolean end = part == BeltPart.END; @@ -67,7 +66,7 @@ public class BeltInstance extends KineticTileInstance { AllBlockPartials beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(diagonal, bottom); - InstancedModel beltModel = beltPartial.renderOnBelt(modelManager, blockState); + InstancedModel beltModel = beltPartial.renderOnBelt(modelManager, lastState); Consumer setupFunc = setupFunc(spriteShift); keys.add(beltModel.setupInstance(setupFunc)); @@ -76,7 +75,7 @@ public class BeltInstance extends KineticTileInstance { } if (tile.hasPulley()) { - InstancedModel pulleyModel = getPulleyModel(blockState); + InstancedModel pulleyModel = getPulleyModel(); pulleyKey = pulleyModel.setupInstance(setupFunc(tile.getSpeed(), getRotationAxis())); } @@ -107,7 +106,6 @@ public class BeltInstance extends KineticTileInstance { keys.forEach(InstanceKey::delete); keys.clear(); if (pulleyKey != null) pulleyKey.delete(); - pulleyKey = null; } private float getScrollSpeed() { @@ -122,8 +120,8 @@ public class BeltInstance extends KineticTileInstance { return speed; } - private InstancedModel getPulleyModel(BlockState blockState) { - Direction dir = getOrientation(blockState); + private InstancedModel getPulleyModel() { + Direction dir = getOrientation(); Direction.Axis axis = dir.getAxis(); @@ -141,11 +139,11 @@ public class BeltInstance extends KineticTileInstance { return modelTransform; }; - return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms); + return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, lastState, dir, ms); } - private Direction getOrientation(BlockState blockState) { - Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) + private Direction getOrientation() { + Direction dir = lastState.get(BeltBlock.HORIZONTAL_FACING) .rotateY(); if (beltSlope == BeltSlope.SIDEWAYS) dir = Direction.UP; @@ -161,8 +159,8 @@ public class BeltInstance extends KineticTileInstance { BlockPos pos = tile.getPos(); data.setTileEntity(tile) - .setBlockLight(tile.getWorld().getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(tile.getWorld().getLightLevel(LightType.SKY, pos)) + .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)) .setRotation(rotX, rotY, rotZ) .setRotationalSpeed(getScrollSpeed()) .setRotationOffset(0) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index 15d3d2771..e1b2d2e9d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -35,15 +35,14 @@ public class SplitShaftInstance extends KineticTileInstance(2); - BlockState state = tile.getBlockState(); - Block block = state.getBlock(); - final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(state); + Block block = lastState.getBlock(); + final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(lastState); float speed = tile.getSpeed(); for (Direction dir : Iterate.directionsInAxis(boxAxis)) { - InstancedModel half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, state, dir); + InstancedModel half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, dir); float splitSpeed = speed * tile.getRotationSpeedModifier(dir); @@ -53,9 +52,8 @@ public class SplitShaftInstance extends KineticTileInstance key, Direction dir) { key.modifyInstance(data -> { Direction.Axis axis = dir.getAxis(); - final BlockPos pos = tile.getPos(); data.setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir)) .setRotationOffset(getRotationOffset(axis)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index c9f321708..b6cbb530a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -37,13 +37,10 @@ public class GearboxInstance extends KineticTileInstance { protected void init() { keys = new EnumMap<>(Direction.class); - BlockState state = tile.getBlockState(); + final Direction.Axis boxAxis = lastState.get(BlockStateProperties.AXIS); - final Direction.Axis boxAxis = state.get(BlockStateProperties.AXIS); - - BlockPos pos = tile.getPos(); - int blockLight = tile.getWorld().getLightLevel(LightType.BLOCK, pos); - int skyLight = tile.getWorld().getLightLevel(LightType.SKY, pos); + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); updateSourceFacing(); for (Direction direction : Iterate.directions) { @@ -51,7 +48,7 @@ public class GearboxInstance extends KineticTileInstance { if (boxAxis == axis) continue; - InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, state, direction); + InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, direction); InstanceKey key = shaft.setupInstance(data -> { data.setBlockLight(blockLight) @@ -79,7 +76,7 @@ public class GearboxInstance extends KineticTileInstance { protected void updateSourceFacing() { if (tile.hasSource()) { - BlockPos source = tile.source.subtract(tile.getPos()); + BlockPos source = tile.source.subtract(pos); sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); } else { sourceFacing = null; @@ -89,7 +86,6 @@ public class GearboxInstance extends KineticTileInstance { @Override public void onUpdate() { updateSourceFacing(); - BlockPos pos = tile.getPos(); for (Map.Entry> key : keys.entrySet()) { key.getValue().modifyInstance(data -> { Direction direction = key.getKey(); @@ -104,7 +100,6 @@ public class GearboxInstance extends KineticTileInstance { @Override public void updateLight() { - BlockPos pos = tile.getPos(); int blockLight = tile.getWorld().getLightLevel(LightType.BLOCK, pos); int skyLight = tile.getWorld().getLightLevel(LightType.SKY, pos); @@ -115,10 +110,7 @@ public class GearboxInstance extends KineticTileInstance { @Override public void remove() { - for (InstanceKey key : keys.values()) { - key.delete(); - } - + keys.values().forEach(InstanceKey::delete); keys.clear(); } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java index 6b9c41924..f95e3cfa6 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java @@ -27,18 +27,6 @@ public class CancelTileEntityRenderMixin { private void noRenderInstancedTiles(CallbackInfoReturnable> cir) { List tiles = cir.getReturnValue(); - List out = new ArrayList<>(tiles.size()); - - for (TileEntity tile : tiles) { - if (tile instanceof IInstanceRendered) { - IInstanceRendered instanceRendered = (IInstanceRendered) tile; - - if (!instanceRendered.shouldRenderAsTE()) continue; - } - - out.add(tile); - } - - cir.setReturnValue(out); + tiles.removeIf(tile -> tile instanceof IInstanceRendered && !((IInstanceRendered) tile).shouldRenderAsTE()); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java index 585ec2c0b..74cdd8f55 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java @@ -1,11 +1,12 @@ package com.simibubi.create.foundation.render; +import com.simibubi.create.foundation.render.gl.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; import com.simibubi.create.foundation.render.gl.GlVertexArray; import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL40; +import org.lwjgl.opengl.GL20; import java.nio.ByteBuffer; @@ -35,7 +36,7 @@ public abstract class BufferedModel extends TemplateBuffer { int numAttributes = getTotalShaderAttributeCount(); for (int i = 0; i <= numAttributes; i++) { - GL40.glEnableVertexAttribArray(i); + GL20.glEnableVertexAttribArray(i); } invariantVBO.bind(GL15.GL_ARRAY_BUFFER); @@ -44,13 +45,11 @@ public abstract class BufferedModel extends TemplateBuffer { GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); // mirror it in system memory so we can write to it - ByteBuffer constant = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); - - for (int i = 0; i < vertexCount; i++) { - copyVertex(constant, i); - } - constant.rewind(); - GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); + Backend.MAP_BUFFER.mapBuffer(GL15.GL_ARRAY_BUFFER, invariantSize, buffer -> { + for (int i = 0; i < vertexCount; i++) { + copyVertex(buffer, i); + } + }); getModelFormat().informAttributes(0); diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 64e66bee0..d797ffcd5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -27,16 +27,16 @@ import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.Map; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; public class FastRenderDispatcher { - public static WorldAttached> queuedUpdates = new WorldAttached<>(ConcurrentLinkedQueue::new); - public static WorldAttached> queuedRemovals = new WorldAttached<>(ConcurrentLinkedQueue::new); - public static WorldAttached>> addedLastTick = new WorldAttached<>(ConcurrentLinkedQueue::new); + public static WorldAttached> queuedUpdates = new WorldAttached<>(ConcurrentHashMap::newKeySet); + public static WorldAttached> queuedRemovals = new WorldAttached<>(ConcurrentHashMap::newKeySet); + public static WorldAttached, Boolean>> addedLastTick = new WorldAttached<>(ConcurrentHashMap::newKeySet); private static Matrix4f projectionMatrixThisFrame = null; @@ -56,18 +56,21 @@ public class FastRenderDispatcher { ClientWorld world = Minecraft.getInstance().world; runQueue(addedLastTick.get(world), TileEntityInstance::updateLight); - runQueue(queuedUpdates.get(world), CreateClient.kineticRenderer::update); runQueue(queuedRemovals.get(world), CreateClient.kineticRenderer::remove); + CreateClient.kineticRenderer.clean(); + + runQueue(queuedUpdates.get(world), CreateClient.kineticRenderer::update); } - private static void runQueue(@Nullable Queue q, Consumer action) { - if (q == null) return; + private static void runQueue(@Nullable ConcurrentHashMap.KeySetView changed, Consumer action) { + if (changed == null) return; - while (!q.isEmpty()) { - T t = q.poll(); + // because of potential concurrency issues, we make a copy of what's in the set at the time we get here + ArrayList tiles = new ArrayList<>(changed); - action.accept(t); - } + tiles.forEach(action); + + changed.removeAll(tiles); } public static void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ) { diff --git a/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java index 6b86af49b..f382df2c2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java @@ -4,13 +4,16 @@ import com.simibubi.create.foundation.render.gl.shader.Shader; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.tileentity.TileEntity; import javax.annotation.Nullable; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class InstancedTileRenderer { protected Map> renderers = new HashMap<>(); @@ -31,12 +34,17 @@ public class InstancedTileRenderer { return (RenderMaterial) materials.get(materialType); } + @Nullable + public TileEntityInstance getInstance(T tile) { + return getInstance(tile, true); + } + @SuppressWarnings("unchecked") @Nullable - public TileEntityInstance getRenderer(T tile) { + public TileEntityInstance getInstance(T tile, boolean create) { if (renderers.containsKey(tile)) { return (TileEntityInstance) renderers.get(tile); - } else { + } else if (create) { TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); if (renderer != null) { @@ -45,38 +53,49 @@ public class InstancedTileRenderer { } return renderer; + } else { + return null; } } public void onLightUpdate(T tile) { if (tile instanceof IInstanceRendered) { - TileEntityInstance renderer = getRenderer(tile); + TileEntityInstance instance = getInstance(tile); - if (renderer != null) - renderer.updateLight(); + if (instance != null) + instance.updateLight(); } } public void update(T tile) { if (tile instanceof IInstanceRendered) { - TileEntityInstance renderer = getRenderer(tile); + TileEntityInstance instance = getInstance(tile); - if (renderer != null) - renderer.update(); + if (instance != null) + instance.update(); } } public void remove(T tile) { if (tile instanceof IInstanceRendered) { - TileEntityInstance renderer = getRenderer(tile); + TileEntityInstance instance = getInstance(tile, false); - if (renderer != null) { - renderer.remove(); + if (instance != null) { + instance.remove(); renderers.remove(tile); } } } + public void clean() { + // Clean up twice a second. This doesn't have to happen every tick, + // but this does need to be run to ensure we don't miss anything. + if (AnimationTickHolder.ticks % 10 == 0) { + List removed = renderers.keySet().stream().filter(TileEntity::isRemoved).collect(Collectors.toList()); + removed.forEach(renderers::remove); + } + } + public void invalidate() { for (RenderMaterial material : materials.values()) { material.delete(); diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index 80122a1e4..8fda2a8b9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -91,7 +91,7 @@ public class RenderedContraption { if (!tileEntities.isEmpty()) { for (TileEntity te : tileEntities) { if (te instanceof IInstanceRendered) { - kinetics.getRenderer(te); // this is enough to instantiate the model instance + kinetics.getInstance(te); // this is enough to instantiate the model instance } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/Backend.java new file mode 100644 index 000000000..d534209a3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/Backend.java @@ -0,0 +1,7 @@ +package com.simibubi.create.foundation.render.gl; + +import com.simibubi.create.foundation.render.gl.backend.MapBuffer; + +public class Backend { + public static final MapBuffer MAP_BUFFER = MapBuffer.GL30_RANGE; +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java new file mode 100644 index 000000000..82a3e795b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java @@ -0,0 +1,58 @@ +package com.simibubi.create.foundation.render.gl.backend; + +import org.lwjgl.opengl.ARBMapBufferRange; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL30; + +import java.nio.ByteBuffer; +import java.util.function.Consumer; + +public enum MapBuffer { + + GL30_RANGE { + @Override + public void mapBuffer(int target, int offset, int length, Consumer upload) { + ByteBuffer buffer = GL30.glMapBufferRange(target, offset, length, GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_RANGE_BIT); + + upload.accept(buffer); + buffer.rewind(); + + GL30.glUnmapBuffer(target); + } + }, + ARB_RANGE { + @Override + public void mapBuffer(int target, int offset, int length, Consumer upload) { + ByteBuffer buffer = ARBMapBufferRange.glMapBufferRange(target, offset, length, GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_RANGE_BIT); + + upload.accept(buffer); + buffer.rewind(); + + GL30.glUnmapBuffer(target); + } + }, + GL15_MAP { + @Override + public void mapBuffer(int target, int offset, int length, Consumer upload) { + ByteBuffer buffer = GL15.glMapBuffer(target, GL15.GL_WRITE_ONLY); + + buffer.position(offset); + upload.accept(buffer); + buffer.rewind(); + GL15.glUnmapBuffer(target); + } + }, + UNSUPPORTED { + @Override + public void mapBuffer(int target, int offset, int length, Consumer upload) { + throw new UnsupportedOperationException("glMapBuffer not supported"); + } + }; + + + public abstract void mapBuffer(int target, int offset, int length, Consumer upload); + + public final void mapBuffer(int target, int size, Consumer upload) { + mapBuffer(target, 0, size, upload); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java index 19063df7f..dbeb93c1f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java @@ -1,11 +1,16 @@ package com.simibubi.create.foundation.render.instancing; +import com.google.common.collect.Range; import com.simibubi.create.foundation.render.BufferedModel; import com.simibubi.create.foundation.render.RenderMath; +import com.simibubi.create.foundation.render.gl.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.*; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL33; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -23,6 +28,7 @@ public abstract class InstancedModel extends BufferedMod protected final ArrayList> keys = new ArrayList<>(); protected final ArrayList data = new ArrayList<>(); protected int minIndexChanged = -1; + protected int maxIndexChanged = -1; public InstancedModel(BufferBuilder buf) { super(buf); @@ -67,10 +73,6 @@ public abstract class InstancedModel extends BufferedMod } - public void markDirty() { - minIndexChanged = 0; - } - protected void deleteInternal() { super.deleteInternal(); instanceVBO.delete(); @@ -91,7 +93,8 @@ public abstract class InstancedModel extends BufferedMod keys.get(i).index--; } - setMinIndexChanged(key.index); + markIndexChanged(index - 1); + maxIndexChanged = keys.size() - 1; key.invalidate(); } @@ -103,7 +106,7 @@ public abstract class InstancedModel extends BufferedMod edit.accept(data); - setMinIndexChanged(key.index); + markIndexChanged(key.index); } public synchronized InstanceKey setupInstance(Consumer setup) { @@ -114,16 +117,22 @@ public abstract class InstancedModel extends BufferedMod data.add(instanceData); keys.add(key); - setMinIndexChanged(key.index); + markIndexChanged(key.index); return key; } - protected void setMinIndexChanged(int index) { + protected void markIndexChanged(int index) { if (minIndexChanged < 0) { minIndexChanged = index; - } else { - minIndexChanged = Math.min(minIndexChanged, index); + } else if (index < minIndexChanged) { + minIndexChanged = index; + } + + if (maxIndexChanged < 0) { + maxIndexChanged = index; + } else if (index > maxIndexChanged) { + maxIndexChanged = index; } } @@ -161,16 +170,17 @@ public abstract class InstancedModel extends BufferedMod GL15.glBufferData(GL15.GL_ARRAY_BUFFER, instanceSize, GL15.GL_STATIC_DRAW); glBufferSize = instanceSize; minIndexChanged = 0; + maxIndexChanged = data.size() - 1; } - ByteBuffer buffer = GL15.glMapBuffer(GL15.GL_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); + int offset = minIndexChanged * stride; + int length = (1 + maxIndexChanged - minIndexChanged) * stride; - buffer.position(stride * minIndexChanged); - for (int i = minIndexChanged; i < data.size(); i++) { - data.get(i).write(buffer); - } - buffer.rewind(); - GL15.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); + Backend.MAP_BUFFER.mapBuffer(GL15.GL_ARRAY_BUFFER, offset, length, buffer -> { + for (int i = minIndexChanged; i <= maxIndexChanged; i++) { + data.get(i).write(buffer); + } + }); glInstanceCount = data.size(); @@ -184,5 +194,6 @@ public abstract class InstancedModel extends BufferedMod instanceVBO.unbind(GL15.GL_ARRAY_BUFFER); minIndexChanged = -1; + maxIndexChanged = -1; } } From 1de931a122795af13479cb823a044ffb5200e841 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 28 Jan 2021 14:41:54 -0800 Subject: [PATCH 063/147] make pulley key null, could avoid a crash --- .../create/content/contraptions/relays/belt/BeltInstance.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 72292b8c1..585001d36 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -106,6 +106,7 @@ public class BeltInstance extends KineticTileInstance { keys.forEach(InstanceKey::delete); keys.clear(); if (pulleyKey != null) pulleyKey.delete(); + pulleyKey = null; } private float getScrollSpeed() { From 751fc7192d1a9cbe319d9d964e506405f6b7bb2d Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 28 Jan 2021 23:59:58 -0800 Subject: [PATCH 064/147] fix rotating stuff on contraptions --- .../resources/assets/create/shader/contraption_rotating.vert | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert index adf818290..6506bdd09 100644 --- a/src/main/resources/assets/create/shader/contraption_rotating.vert +++ b/src/main/resources/assets/create/shader/contraption_rotating.vert @@ -53,7 +53,7 @@ mat4 kineticRotation() { float degrees = offset + time * speed * -3/10; float angle = fract(degrees / 360) * PI * 2; - return rotate(vec3(0, 1, 0), angle); + return rotate(rotationAxis, angle); } void main() { From 16b8e1175e13c4f77e20a45ebb6ae8776b980beb Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 30 Jan 2021 15:00:26 -0800 Subject: [PATCH 065/147] contraptions self light but man it is slow optimization in PlacementSimulationWorld.getBlockState --- .../contraptions/base/KineticTileEntity.java | 2 + .../ContraptionRenderer.java | 11 + .../render/contraption/ContraptionModel.java | 12 +- .../contraption/RenderedContraption.java | 5 +- .../foundation/render/gl/shader/Shader.java | 2 +- .../PlacementSimulationWorld.java | 45 +++- .../worldWrappers/WrappedChunkProvider.java | 82 ++++++ .../utility/worldWrappers/WrappedWorld.java | 12 + .../worldWrappers/chunk/WrappedChunk.java | 250 ++++++++++++++++++ .../create/shader/contraption_structure.frag | 24 ++ ...aption.vert => contraption_structure.vert} | 3 + 11 files changed, 438 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java create mode 100644 src/main/resources/assets/create/shader/contraption_structure.frag rename src/main/resources/assets/create/shader/{contraption.vert => contraption_structure.vert} (94%) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 70a96022a..1fbb1009d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -217,6 +217,8 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override protected void read(CompoundNBT compound, boolean clientPacket) { boolean overStressedBefore = overStressed; + Long networkBefore = network; + float speedBefore = speed; clearKineticInformation(); // DO NOT READ kinetic information when placed after movement diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index e22bf6284..f0f2d4cb4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import java.util.List; import java.util.Random; +import net.minecraft.world.lighting.WorldLightManager; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; @@ -101,6 +102,15 @@ public class ContraptionRenderer { for (BlockInfo info : c.getBlocks() .values()) renderWorld.setBlockState(info.pos, info.state); + + WorldLightManager lighter = renderWorld.lighter; + + renderWorld.chunkProvider.getLightSources().forEach((pos) -> { + lighter.func_215573_a(pos, renderWorld.getLightValue(pos)); + }); + + lighter.tick(Integer.MAX_VALUE, true, false); + for (BlockInfo info : c.getBlocks() .values()) { BlockState state = info.state; @@ -120,6 +130,7 @@ public class ContraptionRenderer { builder.finishDrawing(); renderWorld.clear(); + renderWorld = null; return builder; } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java index 2d778b389..ec89f9df2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java @@ -4,15 +4,17 @@ import com.simibubi.create.foundation.render.BufferedModel; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.LightTexture; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL40; import java.nio.ByteBuffer; +import static com.simibubi.create.foundation.render.instancing.VertexAttribute.LIGHT; import static com.simibubi.create.foundation.render.instancing.VertexAttribute.RGBA; public class ContraptionModel extends BufferedModel { - public static final VertexFormat FORMAT = new VertexFormat(InstancedModel.FORMAT, RGBA); + public static final VertexFormat FORMAT = new VertexFormat(InstancedModel.FORMAT, RGBA, LIGHT); public ContraptionModel(BufferBuilder buf) { super(buf); @@ -35,6 +37,14 @@ public class ContraptionModel extends BufferedModel { to.put(getG(template, vertex)); to.put(getB(template, vertex)); to.put(getA(template, vertex)); + + int light = getLight(template, vertex); + + byte sky = (byte) (LightTexture.getSkyLightCoordinates(light) << 4); + byte block = (byte) (LightTexture.getBlockLightCoordinates(light) << 4); + + to.put(block); + to.put(sky); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index 8fda2a8b9..0d3b6e105 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -7,10 +7,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; -import com.simibubi.create.foundation.render.instancing.IInstanceRendered; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; -import com.simibubi.create.foundation.render.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.render.light.ContraptionLighter; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java index 3ada3d9b3..2190946cd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.render.gl.shader; public enum Shader { ROTATING("shader/rotating.vert", "shader/instanced.frag"), BELT("shader/belt.vert", "shader/instanced.frag"), - CONTRAPTION_STRUCTURE("shader/contraption.vert", "shader/contraption.frag"), + CONTRAPTION_STRUCTURE("shader/contraption_structure.vert", "shader/contraption_structure.frag"), CONTRAPTION_ROTATING("shader/contraption_rotating.vert", "shader/contraption.frag"), CONTRAPTION_BELT("shader/contraption_belt.vert", "shader/contraption.frag"), CONTRAPTION_ACTOR("shader/contraption_actor.vert", "shader/contraption.frag"), diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java index ee209d16f..affececcf 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java @@ -2,24 +2,50 @@ package com.simibubi.create.foundation.utility.worldWrappers; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.function.Predicate; +import com.simibubi.create.foundation.render.light.GridAlignedBB; +import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.LightType; import net.minecraft.world.World; +import net.minecraft.world.chunk.NibbleArray; +import net.minecraft.world.lighting.WorldLightManager; public class PlacementSimulationWorld extends WrappedWorld { public HashMap blocksAdded; public HashMap tesAdded; + public HashSet spannedChunks; + public WorldLightManager lighter; + public WrappedChunkProvider chunkProvider; + private final BlockPos.Mutable scratch = new BlockPos.Mutable(); + public PlacementSimulationWorld(World wrapped) { - super(wrapped); + this(wrapped, new WrappedChunkProvider()); + } + + public PlacementSimulationWorld(World wrapped, WrappedChunkProvider chunkProvider) { + super(wrapped, chunkProvider); + this.chunkProvider = chunkProvider.setWorld(this); + spannedChunks = new HashSet<>(); + lighter = new WorldLightManager(chunkProvider, true, false); // blockLight, skyLight blocksAdded = new HashMap<>(); tesAdded = new HashMap<>(); } + @Override + public WorldLightManager getLightingProvider() { + return lighter; + } + public void setTileEntities(Collection tileEntities) { tesAdded.clear(); tileEntities.forEach(te -> tesAdded.put(te.getPos(), te)); @@ -31,6 +57,15 @@ public class PlacementSimulationWorld extends WrappedWorld { @Override public boolean setBlockState(BlockPos pos, BlockState newState, int flags) { + + SectionPos sectionPos = SectionPos.from(pos); + + if (spannedChunks.add(sectionPos)) { + lighter.updateSectionStatus(sectionPos, false); + } + + lighter.checkBlock(pos); + blocksAdded.put(pos, newState); return true; } @@ -62,9 +97,11 @@ public class PlacementSimulationWorld extends WrappedWorld { @Override public BlockState getBlockState(BlockPos pos) { - if (blocksAdded.containsKey(pos)) - return blocksAdded.get(pos); - return Blocks.AIR.getDefaultState(); + BlockState state = blocksAdded.get(pos); + if (state != null) + return state; + else + return Blocks.AIR.getDefaultState(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java new file mode 100644 index 000000000..e34d5cb11 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java @@ -0,0 +1,82 @@ +package com.simibubi.create.foundation.utility.worldWrappers; + +import com.simibubi.create.foundation.utility.worldWrappers.chunk.WrappedChunk; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.chunk.AbstractChunkProvider; +import net.minecraft.world.chunk.ChunkStatus; +import net.minecraft.world.chunk.IChunk; +import net.minecraft.world.chunk.IChunkLightProvider; +import net.minecraft.world.lighting.WorldLightManager; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BooleanSupplier; +import java.util.stream.Stream; + +public class WrappedChunkProvider extends AbstractChunkProvider { + private PlacementSimulationWorld world; + + public HashMap chunks; + + public WrappedChunkProvider setWorld(PlacementSimulationWorld world) { + this.world = world; + this.chunks = new HashMap<>(); + return this; + } + + public Stream getLightSources() { + return world.blocksAdded + .entrySet() + .stream() + .filter(it -> it.getValue().getLightValue(world, it.getKey()) != 0) + .map(Map.Entry::getKey); + } + + @Nullable + @Override + public IBlockReader getChunkForLight(int x, int z) { + return getChunk(x, z); + } + + @Override + public IBlockReader getWorld() { + return world; + } + + @Nullable + @Override + public IChunk getChunk(int x, int z, ChunkStatus status, boolean p_212849_4_) { + return getChunk(x, z); + } + + public WrappedChunk getChunk(int x, int z) { + long pos = ChunkPos.asLong(x, z); + + WrappedChunk chunk = chunks.get(pos); + + if (chunk == null) { + chunk = new WrappedChunk(world, x, z); + chunks.put(pos, chunk); + } + + return chunk; + } + + @Override + public void tick(BooleanSupplier p_217207_1_) { + + } + + @Override + public String makeString() { + return "WrappedChunkProvider"; + } + + @Override + public WorldLightManager getLightManager() { + return world.getLightingProvider(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java index b198db079..e986bf8bd 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java @@ -19,18 +19,30 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.ITickList; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; +import net.minecraft.world.lighting.WorldLightManager; import net.minecraft.world.storage.MapData; public class WrappedWorld extends World { protected World world; + public WrappedWorld(World world, WrappedChunkProvider provider) { + super(world.getWorldInfo(), world.getDimension().getType(), (w, d) -> provider, + world.getProfiler(), world.isRemote); + this.world = world; + } + public WrappedWorld(World world) { super(world.getWorldInfo(), world.getDimension().getType(), (w, d) -> world.getChunkProvider(), world.getProfiler(), world.isRemote); this.world = world; } + @Override + public WorldLightManager getLightingProvider() { + return super.getLightingProvider(); + } + @Override public World getWorld() { return world; diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java new file mode 100644 index 000000000..521d5319d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java @@ -0,0 +1,250 @@ +package com.simibubi.create.foundation.utility.worldWrappers.chunk; + +import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; +import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import it.unimi.dsi.fastutil.longs.LongSet; +import it.unimi.dsi.fastutil.shorts.ShortList; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.IFluidState; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.palette.UpgradeData; +import net.minecraft.world.ITickList; +import net.minecraft.world.biome.BiomeContainer; +import net.minecraft.world.chunk.ChunkSection; +import net.minecraft.world.chunk.ChunkStatus; +import net.minecraft.world.chunk.IChunk; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.feature.structure.StructureStart; + +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; + +public class WrappedChunk implements IChunk { + + private final PlacementSimulationWorld world; + private boolean needsLight; + private final int x; + private final int z; + private final ChunkPos pos; + + public WrappedChunk(PlacementSimulationWorld world, int x, int z) { + this.world = world; + this.needsLight = true; + this.x = x; + this.z = z; + this.pos = new ChunkPos(x, z); + } + + @Override + public Stream getLightSources() { + return world.blocksAdded + .entrySet() + .stream() + .filter(it -> { + BlockPos blockPos = it.getKey(); + boolean chunkContains = blockPos.getX() >> 4 == x && blockPos.getZ() >> 4 == z; + return chunkContains && it.getValue().getLightValue(world, blockPos) != 0; + }) + .map(Map.Entry::getKey); + } + + @Nullable + @Override + public BlockState setBlockState(BlockPos p_177436_1_, BlockState p_177436_2_, boolean p_177436_3_) { + return null; + } + + @Override + public void addTileEntity(BlockPos p_177426_1_, TileEntity p_177426_2_) { + + } + + @Override + public void addEntity(Entity p_76612_1_) { + + } + + @Override + public Set getTileEntitiesPos() { + return null; + } + + @Override + public ChunkSection[] getSections() { + return new ChunkSection[0]; + } + + @Override + public Collection> func_217311_f() { + return null; + } + + @Override + public void setHeightmap(Heightmap.Type p_201607_1_, long[] p_201607_2_) { + + } + + @Override + public Heightmap getHeightmap(Heightmap.Type p_217303_1_) { + return null; + } + + @Override + public int getTopBlockY(Heightmap.Type p_201576_1_, int p_201576_2_, int p_201576_3_) { + return 0; + } + + @Override + public ChunkPos getPos() { + return null; + } + + @Override + public void setLastSaveTime(long p_177432_1_) { + + } + + @Override + public Map getStructureStarts() { + return null; + } + + @Override + public void setStructureStarts(Map p_201612_1_) { + + } + + @Nullable + @Override + public BiomeContainer getBiomeArray() { + return null; + } + + @Override + public void setModified(boolean p_177427_1_) { + + } + + @Override + public boolean isModified() { + return false; + } + + @Override + public ChunkStatus getStatus() { + return null; + } + + @Override + public void removeTileEntity(BlockPos p_177425_1_) { + + } + + @Override + public ShortList[] getPackedPositions() { + return new ShortList[0]; + } + + @Nullable + @Override + public CompoundNBT getDeferredTileEntity(BlockPos p_201579_1_) { + return null; + } + + @Nullable + @Override + public CompoundNBT func_223134_j(BlockPos p_223134_1_) { + return null; + } + + @Override + public ITickList getBlocksToBeTicked() { + return null; + } + + @Override + public ITickList getFluidsToBeTicked() { + return null; + } + + @Override + public UpgradeData getUpgradeData() { + return null; + } + + @Override + public void setInhabitedTime(long p_177415_1_) { + + } + + @Override + public long getInhabitedTime() { + return 0; + } + + @Override + public boolean hasLight() { + return needsLight; + } + + @Override + public void setLight(boolean needsLight) { + this.needsLight = needsLight; + } + + @Nullable + @Override + public TileEntity getTileEntity(BlockPos pos) { + return null; + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return world.getBlockState(pos); + } + + @Override + public IFluidState getFluidState(BlockPos pos) { + return null; + } + + @Nullable + @Override + public StructureStart getStructureStart(String p_201585_1_) { + return null; + } + + @Override + public void putStructureStart(String p_201584_1_, StructureStart p_201584_2_) { + + } + + @Override + public LongSet getStructureReferences(String p_201578_1_) { + return null; + } + + @Override + public void addStructureReference(String p_201583_1_, long p_201583_2_) { + + } + + @Override + public Map getStructureReferences() { + return null; + } + + @Override + public void setStructureReferences(Map p_201606_1_) { + + } +} diff --git a/src/main/resources/assets/create/shader/contraption_structure.frag b/src/main/resources/assets/create/shader/contraption_structure.frag new file mode 100644 index 000000000..b8a07b4dc --- /dev/null +++ b/src/main/resources/assets/create/shader/contraption_structure.frag @@ -0,0 +1,24 @@ +#version 440 core + +in vec2 TexCoords; +in vec4 Color; +in float Diffuse; +in vec3 BoxCoord; +in vec2 ModelLight; + +out vec4 fragColor; + +layout(binding=0) uniform sampler2D BlockAtlas; +layout(binding=2) uniform sampler2D LightMap; +layout(binding=4) uniform sampler3D LightVolume; + +vec4 light() { + vec2 lm = texture(LightVolume, BoxCoord).rg * 0.9375 + 0.03125; + return texture2D(LightMap, max(lm, ModelLight)); +} + +void main() { + vec4 tex = texture2D(BlockAtlas, TexCoords); + + fragColor = vec4(tex.rgb * light().rgb * Diffuse * Color.rgb, tex.a); +} \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption.vert b/src/main/resources/assets/create/shader/contraption_structure.vert similarity index 94% rename from src/main/resources/assets/create/shader/contraption.vert rename to src/main/resources/assets/create/shader/contraption_structure.vert index cffa4e863..9547cf0bd 100644 --- a/src/main/resources/assets/create/shader/contraption.vert +++ b/src/main/resources/assets/create/shader/contraption_structure.vert @@ -5,11 +5,13 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; layout (location = 3) in vec4 aColor; +layout (location = 4) in vec2 modelLight; out float Diffuse; out vec2 TexCoords; out vec4 Color; out vec3 BoxCoord; +out vec2 ModelLight; uniform vec3 lightBoxSize; uniform vec3 lightBoxMin; @@ -48,6 +50,7 @@ void main() { Diffuse = diffuse(norm); Color = aColor / diffuse(aNormal); TexCoords = aTexCoords; + ModelLight = modelLight; gl_Position = projection * view * worldPos; if (debug == 2) { From f6b68acbd5be9276d609ff16a74270b72f5a08b8 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 30 Jan 2021 15:37:50 -0800 Subject: [PATCH 066/147] contraptions self light but it's slightly less slow --- .../ContraptionRenderer.java | 8 -- .../contraption/RenderedContraption.java | 75 +++++++++++++++++-- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index f0f2d4cb4..ed990fbd5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -103,14 +103,6 @@ public class ContraptionRenderer { .values()) renderWorld.setBlockState(info.pos, info.state); - WorldLightManager lighter = renderWorld.lighter; - - renderWorld.chunkProvider.getLightSources().forEach((pos) -> { - lighter.func_215573_a(pos, renderWorld.getLightValue(pos)); - }); - - lighter.tick(Integer.MAX_VALUE, true, false); - for (BlockInfo info : c.getBlocks() .values()) { BlockState state = info.state; diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index 0d3b6e105..a1c3575ee 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -1,27 +1,37 @@ package com.simibubi.create.foundation.render.contraption; +import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.render.light.ContraptionLighter; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; +import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.lighting.WorldLightManager; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.model.data.EmptyModelData; import org.apache.commons.lang3.tuple.MutablePair; +import org.lwjgl.opengl.GL11; import java.nio.FloatBuffer; import java.util.Collection; import java.util.HashMap; import java.util.List; +import java.util.Random; public class RenderedContraption { private HashMap renderLayers = new HashMap<>(); @@ -76,10 +86,11 @@ public class RenderedContraption { renderLayers.clear(); + PlacementSimulationWorld renderWorld = setupRenderWorld(c); List blockLayers = RenderType.getBlockLayers(); for (RenderType layer : blockLayers) { - renderLayers.put(layer, buildStructureBuffer(c, layer)); + renderLayers.put(layer, buildStructureModel(renderWorld, c, layer)); } } @@ -156,8 +167,58 @@ public class RenderedContraption { kinetics.invalidate(); } - private static ContraptionModel buildStructureBuffer(Contraption c, RenderType layer) { - BufferBuilder builder = ContraptionRenderer.buildStructure(c, layer); + private static ContraptionModel buildStructureModel(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) { + BufferBuilder builder = buildStructure(renderWorld, c, layer); return new ContraptionModel(builder); } + + public static PlacementSimulationWorld setupRenderWorld(Contraption c) { + PlacementSimulationWorld renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world); + + renderWorld.setTileEntities(c.presentTileEntities.values()); + + for (Template.BlockInfo info : c.getBlocks() + .values()) + renderWorld.setBlockState(info.pos, info.state); + + WorldLightManager lighter = renderWorld.lighter; + + renderWorld.chunkProvider.getLightSources().forEach((pos) -> lighter.func_215573_a(pos, renderWorld.getLightValue(pos))); + + lighter.tick(Integer.MAX_VALUE, true, false); + + return renderWorld; + } + + public static BufferBuilder buildStructure(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) { + + ForgeHooksClient.setRenderLayer(layer); + MatrixStack ms = new MatrixStack(); + BlockRendererDispatcher dispatcher = Minecraft.getInstance() + .getBlockRendererDispatcher(); + BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); + Random random = new Random(); + BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); + builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); + + for (Template.BlockInfo info : c.getBlocks() + .values()) { + BlockState state = info.state; + + if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) + continue; + if (!RenderTypeLookup.canRenderInLayer(state, layer)) + continue; + + IBakedModel originalModel = dispatcher.getModelForState(state); + ms.push(); + ms.translate(info.pos.getX(), info.pos.getY(), info.pos.getZ()); + blockRenderer.renderModel(renderWorld, originalModel, state, info.pos, ms, builder, true, random, 42, + OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + ms.pop(); + } + + builder.finishDrawing(); + return builder; + } } From f319dd5e8d420d5e60e94f11ebb94bcee84a564e Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 1 Feb 2021 16:16:35 -0800 Subject: [PATCH 067/147] fix #1 finally start work on shader abstraction use backend for ebos fix some issues with ghost instances, more work to be done --- .../contraptions/base/KineticTileEntity.java | 13 +++++ .../relays/belt/BeltTileEntity.java | 5 ++ .../foundation/mixin/OnRemoveTileMixin.java | 3 +- .../render/FastRenderDispatcher.java | 10 +--- .../render/InstancedTileRenderer.java | 29 ++++++---- .../foundation/render/TemplateBuffer.java | 15 ++--- .../ContraptionKineticRenderer.java | 8 +-- .../ContraptionRenderDispatcher.java | 4 +- .../foundation/render/gl/GlPrimitiveType.java | 37 +++++++++++++ .../render/gl/shader/AllShaderPrograms.java | 55 +++++++++++++++++++ .../foundation/render/gl/shader/GLSLType.java | 45 +++++++++++++++ .../render/gl/shader/ProgramBuilder.java | 49 +++++++++++++++++ .../foundation/render/gl/shader/Shader.java | 19 ------- .../render/gl/shader/ShaderConstants.java | 21 +++++++ .../render/gl/shader/ShaderHelper.java | 12 ++-- .../render/gl/shader/ShaderType.java | 6 ++ .../render/gl/shader/ShaderUniforms.java | 13 +++++ .../render/instancing/BeltData.java | 3 +- .../render/instancing/RenderMaterial.java | 8 +-- .../render/instancing/VertexAttribute.java | 26 ++++----- .../foundation/render/light/LightVolume.java | 25 ++++++++- 21 files changed, 325 insertions(+), 81 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/GLSLType.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramBuilder.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderUniforms.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 1fbb1009d..92ab725c9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -471,6 +471,19 @@ public abstract class KineticTileEntity extends SmartTileEntity return 16384.0D; // TODO: make this a config option } + @Override + public void onLoad() { + super.onLoad(); + if (world != null && world.isRemote) + CreateClient.kineticRenderer.add(this); + } + + @Override + public void onChunkUnloaded() { + if (world != null && world.isRemote) + CreateClient.kineticRenderer.remove(this); + } + @Override public void requestModelDataUpdate() { super.requestModelDataUpdate(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 2635ae9c3..acb2d0865 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -478,6 +478,11 @@ public class BeltTileEntity extends KineticTileEntity { updateLight(); } + @Override + public boolean shouldRenderAsTE() { + return isController(); + } + private void updateLight() { skyLight = (byte) world.getLightLevel(LightType.SKY, pos); blockLight = (byte) world.getLightLevel(LightType.BLOCK, pos); diff --git a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java index 5970e3dfe..9c57a7551 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.mixin; +import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.render.FastRenderDispatcher; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -27,6 +28,6 @@ public class OnRemoveTileMixin { */ @Inject(at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/World;getTileEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/tileentity/TileEntity;"), method = "removeTileEntity", locals = LocalCapture.CAPTURE_FAILHARD) private void onRemoveTile(BlockPos pos, CallbackInfo ci, TileEntity te) { - if (isRemote) FastRenderDispatcher.enqueueRemove(te); + if (isRemote) CreateClient.kineticRenderer.remove(te); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index d797ffcd5..56b6d523b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -35,8 +35,7 @@ import java.util.function.Consumer; public class FastRenderDispatcher { public static WorldAttached> queuedUpdates = new WorldAttached<>(ConcurrentHashMap::newKeySet); - public static WorldAttached> queuedRemovals = new WorldAttached<>(ConcurrentHashMap::newKeySet); - public static WorldAttached, Boolean>> addedLastTick = new WorldAttached<>(ConcurrentHashMap::newKeySet); + public static WorldAttached> addedLastTick = new WorldAttached<>(ConcurrentHashMap::newKeySet); private static Matrix4f projectionMatrixThisFrame = null; @@ -48,15 +47,10 @@ public class FastRenderDispatcher { queuedUpdates.get(te.getWorld()).add(te); } - public static void enqueueRemove(TileEntity te) { - queuedRemovals.get(te.getWorld()).add(te); - } - public static void tick() { ClientWorld world = Minecraft.getInstance().world; - runQueue(addedLastTick.get(world), TileEntityInstance::updateLight); - runQueue(queuedRemovals.get(world), CreateClient.kineticRenderer::remove); + runQueue(addedLastTick.get(world), CreateClient.kineticRenderer::onLightUpdate); CreateClient.kineticRenderer.clean(); runQueue(queuedUpdates.get(world), CreateClient.kineticRenderer::update); diff --git a/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java index f382df2c2..8f11476b0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.render; -import com.simibubi.create.foundation.render.gl.shader.Shader; +import com.simibubi.create.foundation.render.gl.shader.AllShaderPrograms; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.render.instancing.*; @@ -11,9 +11,7 @@ import net.minecraft.tileentity.TileEntity; import javax.annotation.Nullable; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.stream.Collectors; public class InstancedTileRenderer { protected Map> renderers = new HashMap<>(); @@ -25,8 +23,8 @@ public class InstancedTileRenderer { } public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.BELT, BeltModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.ROTATING, RotatingModel::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllShaderPrograms.BELT, BeltModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllShaderPrograms.ROTATING, RotatingModel::new)); } @SuppressWarnings("unchecked") @@ -42,13 +40,15 @@ public class InstancedTileRenderer { @SuppressWarnings("unchecked") @Nullable public TileEntityInstance getInstance(T tile, boolean create) { - if (renderers.containsKey(tile)) { - return (TileEntityInstance) renderers.get(tile); + TileEntityInstance instance = renderers.get(tile); + + if (instance != null) { + return (TileEntityInstance) instance; } else if (create) { TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); if (renderer != null) { - FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(renderer); + FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(tile); renderers.put(tile, renderer); } @@ -60,16 +60,22 @@ public class InstancedTileRenderer { public void onLightUpdate(T tile) { if (tile instanceof IInstanceRendered) { - TileEntityInstance instance = getInstance(tile); + TileEntityInstance instance = getInstance(tile, false); if (instance != null) instance.updateLight(); } } + public void add(T tile) { + if (tile instanceof IInstanceRendered) { + getInstance(tile); + } + } + public void update(T tile) { if (tile instanceof IInstanceRendered) { - TileEntityInstance instance = getInstance(tile); + TileEntityInstance instance = getInstance(tile, false); if (instance != null) instance.update(); @@ -91,8 +97,7 @@ public class InstancedTileRenderer { // Clean up twice a second. This doesn't have to happen every tick, // but this does need to be run to ensure we don't miss anything. if (AnimationTickHolder.ticks % 10 == 0) { - List removed = renderers.keySet().stream().filter(TileEntity::isRemoved).collect(Collectors.toList()); - removed.forEach(renderers::remove); + renderers.keySet().stream().filter(TileEntity::isRemoved).forEach(renderers::remove); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java index 9f9fc7e0b..b81201c5b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.datafixers.util.Pair; +import com.simibubi.create.foundation.render.gl.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.vertex.VertexFormatElement; @@ -41,15 +42,11 @@ public class TemplateBuffer { ebo.bind(GL15.GL_ELEMENT_ARRAY_BUFFER); GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); - - ByteBuffer indices = GL15.glMapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, GL15.GL_WRITE_ONLY); - - for (int i = 0; i < vertexCount; i++) { - indices.putShort((short) i); - } - indices.rewind(); - - GL15.glUnmapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER); + Backend.MAP_BUFFER.mapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, indices -> { + for (int i = 0; i < vertexCount; i++) { + indices.putShort((short) i); + } + }); ebo.unbind(GL15.GL_ELEMENT_ARRAY_BUFFER); diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java index 7b77398f7..36f57f343 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.render.contraption; import com.simibubi.create.foundation.render.InstancedTileRenderer; -import com.simibubi.create.foundation.render.gl.shader.Shader; +import com.simibubi.create.foundation.render.gl.shader.AllShaderPrograms; import com.simibubi.create.foundation.render.instancing.BeltModel; import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; import com.simibubi.create.foundation.render.instancing.RenderMaterial; @@ -12,8 +12,8 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(Shader.CONTRAPTION_BELT, BeltModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(Shader.CONTRAPTION_ROTATING, RotatingModel::new)); - materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(Shader.CONTRAPTION_ACTOR, RotatingActorModel::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllShaderPrograms.CONTRAPTION_BELT, BeltModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllShaderPrograms.CONTRAPTION_ROTATING, RotatingModel::new)); + materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(AllShaderPrograms.CONTRAPTION_ACTOR, RotatingActorModel::new)); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index 7ff467501..7d968a390 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; -import com.simibubi.create.foundation.render.gl.shader.Shader; +import com.simibubi.create.foundation.render.gl.shader.AllShaderPrograms; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -97,7 +97,7 @@ public class ContraptionRenderDispatcher { ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projectionMat, viewMat); - int structureShader = ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, callback); + int structureShader = ShaderHelper.useShader(AllShaderPrograms.CONTRAPTION_STRUCTURE, callback); for (RenderedContraption renderer : renderers.values()) { renderer.doRenderLayer(layer, structureShader); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java new file mode 100644 index 000000000..cec97b41f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java @@ -0,0 +1,37 @@ +package com.simibubi.create.foundation.render.gl; + +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public enum GlPrimitiveType { + FLOAT(4, "Float", 5126), + UBYTE(1, "Unsigned Byte", 5121), + BYTE(1, "Byte", 5120), + USHORT(2, "Unsigned Short", 5123), + SHORT(2, "Short", 5122), + UINT(4, "Unsigned Int", 5125), + INT(4, "Int", 5124); + + private final int size; + private final String displayName; + private final int glConstant; + + private GlPrimitiveType(int p_i46095_3_, String p_i46095_4_, int p_i46095_5_) { + this.size = p_i46095_3_; + this.displayName = p_i46095_4_; + this.glConstant = p_i46095_5_; + } + + public int getSize() { + return this.size; + } + + public String getDisplayName() { + return this.displayName; + } + + public int getGlConstant() { + return this.glConstant; + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java new file mode 100644 index 000000000..df1903d07 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java @@ -0,0 +1,55 @@ +package com.simibubi.create.foundation.render.gl.shader; + +import com.simibubi.create.Create; +import net.minecraft.util.ResourceLocation; + +public enum AllShaderPrograms { + ROTATING("shader/rotating.vert", "shader/instanced.frag"), + BELT("shader/belt.vert", "shader/instanced.frag"), + CONTRAPTION_STRUCTURE("shader/contraption_structure.vert", "shader/contraption_structure.frag"), + CONTRAPTION_ROTATING("shader/contraption_rotating.vert", "shader/contraption.frag"), + CONTRAPTION_BELT("shader/contraption_belt.vert", "shader/contraption.frag"), + CONTRAPTION_ACTOR("shader/contraption_actor.vert", "shader/contraption.frag"), + ; + + public final String vert; + public final String frag; + + AllShaderPrograms(String vert, String frag) { + this.vert = vert; + this.frag = frag; + } +} + +//public class AllShaderPrograms { +// public static final ProgramBuilder ROTATING = new ProgramBuilder(name("rotating")) +// .vert(vert("rotating")) +// .frag(frag("instanced")); +// public static final ProgramBuilder BELT = new ProgramBuilder(name("belt")) +// .vert(vert("belt")) +// .frag(frag("instanced")); +// public static final ProgramBuilder CONTRAPTION_STRUCTURE = new ProgramBuilder(name("contraption_structure")) +// .vert(vert("contraption_structure")) +// .frag(frag("contraption_structure")); +// public static final ProgramBuilder CONTRAPTION_ROTATING = new ProgramBuilder(name("contraption_rotating")) +// .vert(vert("contraption_rotating")) +// .frag(frag("contraption")); +// public static final ProgramBuilder CONTRAPTION_BELT = new ProgramBuilder(name("contraption_belt")) +// .vert(vert("contraption_belt")) +// .frag(frag("contraption")); +// public static final ProgramBuilder CONTRAPTION_ACTOR = new ProgramBuilder(name("contraption_actor")) +// .vert(vert("contraption_actor")) +// .frag(frag("contraption")); +// +// private static ResourceLocation vert(String file) { +// return new ResourceLocation(Create.ID, "shader/" + file + ".vert"); +// } +// +// private static ResourceLocation frag(String file) { +// return new ResourceLocation(Create.ID, "shader/" + file + ".vert"); +// } +// +// private static ResourceLocation name(String name) { +// return new ResourceLocation(Create.ID, name); +// } +//} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GLSLType.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GLSLType.java new file mode 100644 index 000000000..4cd2d8d56 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GLSLType.java @@ -0,0 +1,45 @@ +package com.simibubi.create.foundation.render.gl.shader; + +import com.simibubi.create.foundation.render.gl.GlPrimitiveType; + +public class GLSLType { + public static final GLSLType FLOAT = new GLSLType("mat4", GlPrimitiveType.FLOAT, 16); + public static final GLSLType VEC2 = new GLSLType("vec4", GlPrimitiveType.FLOAT, 4); + public static final GLSLType VEC3 = new GLSLType("vec3", GlPrimitiveType.FLOAT, 3); + public static final GLSLType VEC4 = new GLSLType("vec2", GlPrimitiveType.FLOAT, 2); + public static final GLSLType MAT4 = new GLSLType("float", GlPrimitiveType.FLOAT, 1); + + private final String symbol; + private final GlPrimitiveType base; + private final int count; + private final int size; + private final int attributeCount; + + public GLSLType(String symbol, GlPrimitiveType base, int count) { + this.symbol = symbol; + this.base = base; + this.count = count; + this.size = base.getSize() * count; + this.attributeCount = (this.size + 15) / 16; // ceiling division. GLSL vertex attributes can only be 16 bytes wide + } + + public String getSymbol() { + return symbol; + } + + public GlPrimitiveType getBase() { + return base; + } + + public int getCount() { + return count; + } + + public int getSize() { + return size; + } + + public int getAttributeCount() { + return attributeCount; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramBuilder.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramBuilder.java new file mode 100644 index 000000000..a427f02fb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramBuilder.java @@ -0,0 +1,49 @@ +package com.simibubi.create.foundation.render.gl.shader; + +import net.minecraft.util.ResourceLocation; + +import java.util.EnumMap; +import java.util.Map; + +public class ProgramBuilder { + + private final ResourceLocation name; + private final Map shaders; + + private ShaderConstants constants; + + public ProgramBuilder(ResourceLocation name) { + this.name = name; + shaders = new EnumMap<>(ShaderType.class); + } + + public ResourceLocation getName() { + return name; + } + + public Map getShaders() { + return shaders; + } + + public ShaderConstants getConstants() { + return constants; + } + + public ProgramBuilder setConstants(ShaderConstants constants) { + this.constants = constants; + return this; + } + + public ProgramBuilder vert(ResourceLocation file) { + return shader(ShaderType.VERTEX, file); + } + + public ProgramBuilder frag(ResourceLocation file) { + return shader(ShaderType.FRAGMENT, file); + } + + public ProgramBuilder shader(ShaderType type, ResourceLocation file) { + shaders.put(type, file); + return this; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java deleted file mode 100644 index 2190946cd..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/Shader.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.simibubi.create.foundation.render.gl.shader; - -public enum Shader { - ROTATING("shader/rotating.vert", "shader/instanced.frag"), - BELT("shader/belt.vert", "shader/instanced.frag"), - CONTRAPTION_STRUCTURE("shader/contraption_structure.vert", "shader/contraption_structure.frag"), - CONTRAPTION_ROTATING("shader/contraption_rotating.vert", "shader/contraption.frag"), - CONTRAPTION_BELT("shader/contraption_belt.vert", "shader/contraption.frag"), - CONTRAPTION_ACTOR("shader/contraption_actor.vert", "shader/contraption.frag"), - ; - - public final String vert; - public final String frag; - - Shader(String vert, String frag) { - this.vert = vert; - this.frag = frag; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java new file mode 100644 index 000000000..77fdabba6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java @@ -0,0 +1,21 @@ +package com.simibubi.create.foundation.render.gl.shader; + +import java.util.ArrayList; + +public class ShaderConstants { + + private final ArrayList defines; + + public ShaderConstants() { + defines = new ArrayList<>(); + } + + public ShaderConstants define(String def) { + defines.add(def); + return this; + } + + public ArrayList getDefines() { + return defines; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java index 817efb853..5a107a058 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java @@ -34,7 +34,7 @@ public class ShaderHelper { public static final FloatBuffer VEC3_BUFFER = MemoryUtil.memAllocFloat(3); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); - private static final Map PROGRAMS = new EnumMap<>(Shader.class); + private static final Map PROGRAMS = new EnumMap<>(AllShaderPrograms.class); @SuppressWarnings("deprecation") public static void initShaders() { @@ -46,7 +46,7 @@ public class ShaderHelper { if (predicate.test(VanillaResourceType.SHADERS)) { PROGRAMS.values().forEach(ShaderLinkHelper::deleteShader); PROGRAMS.clear(); - for (Shader shader : Shader.values()) { + for (AllShaderPrograms shader : AllShaderPrograms.values()) { createProgram(manager, shader); } } @@ -54,7 +54,7 @@ public class ShaderHelper { } } - public static int getShaderHandle(Shader shader) { + public static int getShaderHandle(AllShaderPrograms shader) { ShaderProgram shaderProgram = PROGRAMS.get(shader); return shaderProgram.getProgram(); @@ -74,11 +74,11 @@ public class ShaderHelper { }; } - public static int useShader(Shader shader) { + public static int useShader(AllShaderPrograms shader) { return useShader(shader, null); } - public static int useShader(Shader shader, @Nullable ShaderCallback cb) { + public static int useShader(AllShaderPrograms shader, @Nullable ShaderCallback cb) { ShaderProgram prog = PROGRAMS.get(shader); if (prog == null) { return -1; @@ -109,7 +109,7 @@ public class ShaderHelper { ShaderLinkHelper.useProgram(0); } - private static void createProgram(IResourceManager manager, Shader shader) { + private static void createProgram(IResourceManager manager, AllShaderPrograms shader) { try { ShaderLoader vert = createShader(manager, shader.vert, ShaderLoader.ShaderType.VERTEX); ShaderLoader frag = createShader(manager, shader.frag, ShaderLoader.ShaderType.FRAGMENT); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java new file mode 100644 index 000000000..ebab415df --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java @@ -0,0 +1,6 @@ +package com.simibubi.create.foundation.render.gl.shader; + +public enum ShaderType { + VERTEX, + FRAGMENT, +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderUniforms.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderUniforms.java new file mode 100644 index 000000000..8baa6e1c6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderUniforms.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.render.gl.shader; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class ShaderUniforms { + private final Map uniforms; + + public ShaderUniforms() { + this.uniforms = new HashMap<>(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java index 86c686157..c202c5c8f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.render.gl.GlPrimitiveType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.VertexFormatElement; @@ -10,7 +11,7 @@ import static com.simibubi.create.foundation.render.instancing.VertexAttribute.* public class BeltData extends KineticData { public static final VertexAttribute TARGET_UV = copy("scrollTexture", VEC4); - public static final VertexAttribute SCROLL_MULT = new VertexAttribute("scrollMult", VertexFormatElement.Type.BYTE, 1, true); + public static final VertexAttribute SCROLL_MULT = new VertexAttribute("scrollMult", GlPrimitiveType.BYTE, 1, true); public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, ROTATION, UV, TARGET_UV, SCROLL_MULT); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java index cefd13d8e..14242ad75 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java @@ -7,7 +7,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.render.gl.shader.Shader; +import com.simibubi.create.foundation.render.gl.shader.AllShaderPrograms; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import net.minecraft.block.BlockState; @@ -33,17 +33,17 @@ public class RenderMaterial> { protected final Map, Cache> models; protected final ModelFactory factory; - protected final Shader shader; + protected final AllShaderPrograms shader; protected final Predicate layerPredicate; /** * Creates a material that renders in the default layer (CUTOUT_MIPPED) */ - public RenderMaterial(Shader shader, ModelFactory factory) { + public RenderMaterial(AllShaderPrograms shader, ModelFactory factory) { this(shader, factory, type -> type == RenderType.getCutoutMipped()); } - public RenderMaterial(Shader shader, ModelFactory factory, Predicate layerPredicate) { + public RenderMaterial(AllShaderPrograms shader, ModelFactory factory, Predicate layerPredicate) { this.models = new HashMap<>(); this.factory = factory; this.shader = shader; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java index 1ed7fee2f..1994c2ba4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java @@ -1,26 +1,26 @@ package com.simibubi.create.foundation.render.instancing; -import net.minecraft.client.renderer.vertex.VertexFormatElement; +import com.simibubi.create.foundation.render.gl.GlPrimitiveType; import org.lwjgl.opengl.GL20; public class VertexAttribute { - public static final VertexAttribute MAT4 = new VertexAttribute("mat4", VertexFormatElement.Type.FLOAT, 16); - public static final VertexAttribute VEC4 = new VertexAttribute("vec4", VertexFormatElement.Type.FLOAT, 4); - public static final VertexAttribute VEC3 = new VertexAttribute("vec3", VertexFormatElement.Type.FLOAT, 3); - public static final VertexAttribute VEC2 = new VertexAttribute("vec2", VertexFormatElement.Type.FLOAT, 2); - public static final VertexAttribute FLOAT = new VertexAttribute("float", VertexFormatElement.Type.FLOAT, 1); + public static final VertexAttribute MAT4 = new VertexAttribute("mat4", GlPrimitiveType.FLOAT, 16); + public static final VertexAttribute VEC4 = new VertexAttribute("vec4", GlPrimitiveType.FLOAT, 4); + public static final VertexAttribute VEC3 = new VertexAttribute("vec3", GlPrimitiveType.FLOAT, 3); + public static final VertexAttribute VEC2 = new VertexAttribute("vec2", GlPrimitiveType.FLOAT, 2); + public static final VertexAttribute FLOAT = new VertexAttribute("float", GlPrimitiveType.FLOAT, 1); public static final VertexAttribute POSITION = copy("pos", VEC3); public static final VertexAttribute INSTANCE_POSITION = copy("instancePos", VEC3); public static final VertexAttribute ROTATION = copy("eulerAngles", VEC3); - public static final VertexAttribute NORMAL = new VertexAttribute("normal", VertexFormatElement.Type.BYTE, 3, true); - public static final VertexAttribute RGBA = new VertexAttribute("rgba", VertexFormatElement.Type.UBYTE, 4, true); - public static final VertexAttribute RGB = new VertexAttribute("rgb", VertexFormatElement.Type.UBYTE, 3, true); + public static final VertexAttribute NORMAL = new VertexAttribute("normal", GlPrimitiveType.BYTE, 3, true); + public static final VertexAttribute RGBA = new VertexAttribute("rgba", GlPrimitiveType.UBYTE, 4, true); + public static final VertexAttribute RGB = new VertexAttribute("rgb", GlPrimitiveType.UBYTE, 3, true); public static final VertexAttribute UV = copy("uv", VEC2); - public static final VertexAttribute LIGHT = new VertexAttribute("light", VertexFormatElement.Type.UBYTE, 2, true); + public static final VertexAttribute LIGHT = new VertexAttribute("light", GlPrimitiveType.UBYTE, 2, true); private final String name; - private final VertexFormatElement.Type type; + private final GlPrimitiveType type; private final int count; private final int size; private final int attributeCount; @@ -39,11 +39,11 @@ public class VertexAttribute { this.normalized = that.normalized; } - public VertexAttribute(String name, VertexFormatElement.Type type, int count) { + public VertexAttribute(String name, GlPrimitiveType type, int count) { this(name, type, count, false); } - public VertexAttribute(String name, VertexFormatElement.Type type, int count, boolean normalized) { + public VertexAttribute(String name, GlPrimitiveType type, int count, boolean normalized) { this.name = name; this.type = type; this.count = count; diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index bbf69d51f..9ec917814 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render.light; import com.simibubi.create.foundation.render.RenderWork; import com.simibubi.create.foundation.render.gl.GlTexture; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; @@ -26,7 +27,19 @@ public class LightVolume { setSampleVolume(sampleVolume); this.glTexture = new GlTexture(GL20.GL_TEXTURE_3D); - this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); + this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: reduce this to span only sampleVolume + + // allocate space for the texture + GL20.glActiveTexture(GL20.GL_TEXTURE4); + glTexture.bind(); + + int sizeX = textureVolume.sizeX(); + int sizeY = textureVolume.sizeY(); + int sizeZ = textureVolume.sizeZ(); + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, 0); + + glTexture.unbind(); + GL20.glActiveTexture(GL20.GL_TEXTURE0); } private void setSampleVolume(GridAlignedBB sampleVolume) { @@ -217,11 +230,19 @@ public class LightVolume { private void uploadTexture() { if (bufferDirty) { + GL20.glPixelStorei(GL20.GL_UNPACK_ROW_LENGTH, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_PIXELS, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_ROWS, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_IMAGES, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_IMAGE_HEIGHT, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 2); int sizeX = textureVolume.sizeX(); int sizeY = textureVolume.sizeY(); int sizeZ = textureVolume.sizeZ(); - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + GL12.glTexSubImage3D(GL12.GL_TEXTURE_3D, 0, 0, 0, 0, sizeX, sizeY, sizeZ, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + + GL20.glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 4); // 4 is the default bufferDirty = false; } } From b766658415745b0d9c6943f893cd82947074bd28 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 2 Feb 2021 13:11:22 -0800 Subject: [PATCH 068/147] probably fix all issues with ghost instances instanced tiles on contraptions now self light properly --- .../components/actors/DrillRenderer.java | 2 ++ .../components/actors/HarvesterRenderer.java | 5 ++- .../foundation/render/BufferedModel.java | 4 +-- .../foundation/render/TemplateBuffer.java | 5 ++- .../contraption/RenderedContraption.java | 33 +++++++++++-------- .../create/foundation/render/gl/Backend.java | 7 ---- .../foundation/render/gl/backend/Backend.java | 20 +++++++++++ .../render/gl/backend/MapBuffer.java | 4 --- .../render/gl/shader/AllShaderPrograms.java | 2 +- .../render/instancing/InstancedModel.java | 22 +++++++++---- .../actors/StaticRotatingActorData.java | 15 ++++++++- .../assets/create/shader/contraption.frag | 3 +- .../create/shader/contraption_actor.vert | 13 +++++--- .../create/shader/contraption_belt.vert | 2 ++ .../create/shader/contraption_rotating.vert | 2 ++ .../create/shader/contraption_structure.frag | 24 -------------- 16 files changed, 93 insertions(+), 70 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/Backend.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java delete mode 100644 src/main/resources/assets/create/shader/contraption_structure.frag diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index e528be196..069627f80 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -21,6 +21,7 @@ import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; +import net.minecraft.world.LightType; import static net.minecraft.state.properties.BlockStateProperties.FACING; @@ -50,6 +51,7 @@ public class DrillRenderer extends KineticTileEntityRenderer { float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); float eulerY = facing.getHorizontalAngle(); data.setPosition(context.localPos) + .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) .setRotationOffset(0) .setRotationAxis(0, 0, 1) .setLocalRotation(eulerX, eulerY, 0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 094ab403f..08522970e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -20,6 +20,7 @@ import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.LightType; import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; @@ -49,6 +50,7 @@ public class HarvesterRenderer extends SafeTileEntityRenderer { + Backend.mapBuffer(GL15.GL_ARRAY_BUFFER, invariantSize, buffer -> { for (int i = 0; i < vertexCount; i++) { copyVertex(buffer, i); } diff --git a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java index b81201c5b..1d81fe2dc 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java @@ -1,8 +1,7 @@ package com.simibubi.create.foundation.render; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.datafixers.util.Pair; -import com.simibubi.create.foundation.render.gl.Backend; +import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.vertex.VertexFormatElement; @@ -42,7 +41,7 @@ public class TemplateBuffer { ebo.bind(GL15.GL_ELEMENT_ARRAY_BUFFER); GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); - Backend.MAP_BUFFER.mapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, indices -> { + Backend.mapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, indices -> { for (int i = 0; i < vertexCount; i++) { indices.putShort((short) i); } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index a1c3575ee..1d59aaded 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -19,6 +19,7 @@ import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template; import net.minecraft.world.lighting.WorldLightManager; @@ -36,6 +37,8 @@ import java.util.Random; public class RenderedContraption { private HashMap renderLayers = new HashMap<>(); + public final PlacementSimulationWorld renderWorld; + private final ContraptionLighter lighter; public final ContraptionKineticRenderer kinetics; @@ -48,10 +51,11 @@ public class RenderedContraption { this.contraption = contraption; this.lighter = contraption.makeLighter(); this.kinetics = new ContraptionKineticRenderer(); + this.renderWorld = setupRenderWorld(world, contraption); - buildLayers(contraption); - buildInstancedTiles(contraption); - buildActors(contraption); + buildLayers(); + buildInstancedTiles(); + buildActors(); } public int getEntityId() { @@ -79,34 +83,37 @@ public class RenderedContraption { } } - private void buildLayers(Contraption c) { + private void buildLayers() { for (ContraptionModel buffer : renderLayers.values()) { buffer.delete(); } renderLayers.clear(); - PlacementSimulationWorld renderWorld = setupRenderWorld(c); List blockLayers = RenderType.getBlockLayers(); for (RenderType layer : blockLayers) { - renderLayers.put(layer, buildStructureModel(renderWorld, c, layer)); + renderLayers.put(layer, buildStructureModel(renderWorld, contraption, layer)); } } - private void buildInstancedTiles(Contraption c) { - Collection tileEntities = c.maybeInstancedTileEntities; + private void buildInstancedTiles() { + Collection tileEntities = contraption.maybeInstancedTileEntities; if (!tileEntities.isEmpty()) { for (TileEntity te : tileEntities) { if (te instanceof IInstanceRendered) { - kinetics.getInstance(te); // this is enough to instantiate the model instance + World world = te.getWorld(); + BlockPos pos = te.getPos(); + te.setLocation(renderWorld, pos); + kinetics.add(te); + te.setLocation(world, pos); } } } } - private void buildActors(Contraption c) { - List> actors = c.getActors(); + private void buildActors() { + List> actors = contraption.getActors(); for (MutablePair actor : actors) { Template.BlockInfo blockInfo = actor.left; @@ -172,8 +179,8 @@ public class RenderedContraption { return new ContraptionModel(builder); } - public static PlacementSimulationWorld setupRenderWorld(Contraption c) { - PlacementSimulationWorld renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world); + public static PlacementSimulationWorld setupRenderWorld(World world, Contraption c) { + PlacementSimulationWorld renderWorld = new PlacementSimulationWorld(world); renderWorld.setTileEntities(c.presentTileEntities.values()); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/Backend.java deleted file mode 100644 index d534209a3..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/Backend.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.simibubi.create.foundation.render.gl; - -import com.simibubi.create.foundation.render.gl.backend.MapBuffer; - -public class Backend { - public static final MapBuffer MAP_BUFFER = MapBuffer.GL30_RANGE; -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java new file mode 100644 index 000000000..bbadc9fce --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java @@ -0,0 +1,20 @@ +package com.simibubi.create.foundation.render.gl.backend; + +import java.nio.ByteBuffer; +import java.util.function.Consumer; + +public class Backend { + private static final MapBuffer MAP_BUFFER = MapBuffer.GL30_RANGE; + + private Backend() { + throw new UnsupportedOperationException(); + } + + public static void mapBuffer(int target, int offset, int length, Consumer upload) { + MAP_BUFFER.mapBuffer(target, offset, length, upload); + } + + public static void mapBuffer(int target, int size, Consumer upload) { + MAP_BUFFER.mapBuffer(target, 0, size, upload); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java index 82a3e795b..2d50966b0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java @@ -51,8 +51,4 @@ public enum MapBuffer { public abstract void mapBuffer(int target, int offset, int length, Consumer upload); - - public final void mapBuffer(int target, int size, Consumer upload) { - mapBuffer(target, 0, size, upload); - } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java index df1903d07..d6ab91d97 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java @@ -6,7 +6,7 @@ import net.minecraft.util.ResourceLocation; public enum AllShaderPrograms { ROTATING("shader/rotating.vert", "shader/instanced.frag"), BELT("shader/belt.vert", "shader/instanced.frag"), - CONTRAPTION_STRUCTURE("shader/contraption_structure.vert", "shader/contraption_structure.frag"), + CONTRAPTION_STRUCTURE("shader/contraption_structure.vert", "shader/contraption.frag"), CONTRAPTION_ROTATING("shader/contraption_rotating.vert", "shader/contraption.frag"), CONTRAPTION_BELT("shader/contraption_belt.vert", "shader/contraption.frag"), CONTRAPTION_ACTOR("shader/contraption_actor.vert", "shader/contraption.frag"), diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java index dbeb93c1f..bddec4394 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java @@ -1,10 +1,9 @@ package com.simibubi.create.foundation.render.instancing; -import com.google.common.collect.Range; import com.simibubi.create.foundation.render.BufferedModel; import com.simibubi.create.foundation.render.RenderMath; -import com.simibubi.create.foundation.render.gl.Backend; +import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.GL11; @@ -161,7 +160,8 @@ public abstract class InstancedModel extends BufferedMod VertexFormat instanceFormat = getInstanceFormat(); int stride = instanceFormat.getStride(); - int instanceSize = RenderMath.nextPowerOf2((instanceCount() + 1) * stride); + int newInstanceCount = instanceCount(); + int instanceSize = RenderMath.nextPowerOf2((newInstanceCount + 1) * stride); instanceVBO.bind(GL15.GL_ARRAY_BUFFER); @@ -170,19 +170,29 @@ public abstract class InstancedModel extends BufferedMod GL15.glBufferData(GL15.GL_ARRAY_BUFFER, instanceSize, GL15.GL_STATIC_DRAW); glBufferSize = instanceSize; minIndexChanged = 0; - maxIndexChanged = data.size() - 1; + maxIndexChanged = newInstanceCount - 1; } int offset = minIndexChanged * stride; int length = (1 + maxIndexChanged - minIndexChanged) * stride; - Backend.MAP_BUFFER.mapBuffer(GL15.GL_ARRAY_BUFFER, offset, length, buffer -> { + Backend.mapBuffer(GL15.GL_ARRAY_BUFFER, offset, length, buffer -> { for (int i = minIndexChanged; i <= maxIndexChanged; i++) { data.get(i).write(buffer); } }); - glInstanceCount = data.size(); + if (newInstanceCount < glInstanceCount) { + int clearFrom = (maxIndexChanged + 1) * stride; + int clearTo = (glInstanceCount) * stride; + Backend.mapBuffer(GL15.GL_ARRAY_BUFFER, clearFrom, clearTo - clearFrom, buffer -> { + for (int i = clearFrom; i < clearTo; i++) { + buffer.put((byte) 0); + } + }); + } + + glInstanceCount = newInstanceCount; int staticAttributes = getModelFormat().getShaderAttributeCount(); instanceFormat.informAttributes(staticAttributes); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java index 1b99cbd59..16ee52c25 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java @@ -10,11 +10,13 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; public class StaticRotatingActorData extends InstanceData { - public static VertexFormat FORMAT = new VertexFormat(POSITION, FLOAT, NORMAL, VEC3, NORMAL); + public static VertexFormat FORMAT = new VertexFormat(POSITION, LIGHT, FLOAT, NORMAL, VEC3, NORMAL); private float x; private float y; private float z; + private byte blockLight; + private byte skyLight; private float rotationOffset; private byte rotationAxisX; private byte rotationAxisY; @@ -33,6 +35,16 @@ public class StaticRotatingActorData extends InstanceData { return this; } + public StaticRotatingActorData setBlockLight(int blockLight) { + this.blockLight = (byte) ((blockLight & 0xF) << 4); + return this; + } + + public StaticRotatingActorData setSkyLight(int skyLight) { + this.skyLight = (byte) ((skyLight & 0xF) << 4); + return this; + } + public StaticRotatingActorData setRotationOffset(float rotationOffset) { this.rotationOffset = rotationOffset; return this; @@ -77,6 +89,7 @@ public class StaticRotatingActorData extends InstanceData { @Override public void write(ByteBuffer buf) { putVec3(buf, x, y, z); + putVec2(buf, blockLight, skyLight); put(buf, rotationOffset); putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); putVec3(buf, localRotationX, localRotationY, localRotationZ); diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index d2ebc1d33..b8a07b4dc 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -4,6 +4,7 @@ in vec2 TexCoords; in vec4 Color; in float Diffuse; in vec3 BoxCoord; +in vec2 ModelLight; out vec4 fragColor; @@ -13,7 +14,7 @@ layout(binding=4) uniform sampler3D LightVolume; vec4 light() { vec2 lm = texture(LightVolume, BoxCoord).rg * 0.9375 + 0.03125; - return texture2D(LightMap, lm); + return texture2D(LightMap, max(lm, ModelLight)); } void main() { diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index 58c00ee1e..e0f1b59ef 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -7,18 +7,20 @@ layout (location = 2) in vec2 aTexCoords; // instance data layout (location = 3) in vec3 instancePos; -layout (location = 4) in float rotationOffset; -layout (location = 5) in vec3 localRotationAxis; -layout (location = 6) in vec3 localRotation; -layout (location = 7) in vec3 rotationCenter; +layout (location = 4) in vec2 modelLight; +layout (location = 5) in float rotationOffset; +layout (location = 6) in vec3 localRotationAxis; +layout (location = 7) in vec3 localRotation; +layout (location = 8) in vec3 rotationCenter; // dynamic data -//layout (location = 7) in vec3 relativeMotion; +//layout (location = 9) in vec3 relativeMotion; out float Diffuse; out vec2 TexCoords; out vec4 Color; out vec3 BoxCoord; +out vec2 ModelLight; uniform vec3 lightBoxSize; uniform vec3 lightBoxMin; @@ -77,6 +79,7 @@ void main() { BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; Diffuse = diffuse(norm); TexCoords = aTexCoords; + ModelLight = modelLight; gl_Position = projection * view * worldPos; if (debug == 2) { diff --git a/src/main/resources/assets/create/shader/contraption_belt.vert b/src/main/resources/assets/create/shader/contraption_belt.vert index 8a0b8fbeb..520e5ce72 100644 --- a/src/main/resources/assets/create/shader/contraption_belt.vert +++ b/src/main/resources/assets/create/shader/contraption_belt.vert @@ -19,6 +19,7 @@ out float Diffuse; out vec2 TexCoords; out vec4 Color; out vec3 BoxCoord; +out vec2 ModelLight; uniform vec3 lightBoxSize; uniform vec3 lightBoxMin; @@ -72,6 +73,7 @@ void main() { BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; Diffuse = diffuse(norm); TexCoords = aTexCoords - uv + scrollTexture.xy + vec2(0, scroll); + ModelLight = light; gl_Position = projection * view * worldPos; if (debug == 2) { diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert index 6506bdd09..6b91caf3e 100644 --- a/src/main/resources/assets/create/shader/contraption_rotating.vert +++ b/src/main/resources/assets/create/shader/contraption_rotating.vert @@ -15,6 +15,7 @@ out float Diffuse; out vec2 TexCoords; out vec4 Color; out vec3 BoxCoord; +out vec2 ModelLight; uniform vec3 lightBoxSize; uniform vec3 lightBoxMin; @@ -67,6 +68,7 @@ void main() { BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; Diffuse = diffuse(norm); TexCoords = aTexCoords; + ModelLight = light; gl_Position = projection * view * worldPos; if (debug == 2) { diff --git a/src/main/resources/assets/create/shader/contraption_structure.frag b/src/main/resources/assets/create/shader/contraption_structure.frag deleted file mode 100644 index b8a07b4dc..000000000 --- a/src/main/resources/assets/create/shader/contraption_structure.frag +++ /dev/null @@ -1,24 +0,0 @@ -#version 440 core - -in vec2 TexCoords; -in vec4 Color; -in float Diffuse; -in vec3 BoxCoord; -in vec2 ModelLight; - -out vec4 fragColor; - -layout(binding=0) uniform sampler2D BlockAtlas; -layout(binding=2) uniform sampler2D LightMap; -layout(binding=4) uniform sampler3D LightVolume; - -vec4 light() { - vec2 lm = texture(LightVolume, BoxCoord).rg * 0.9375 + 0.03125; - return texture2D(LightMap, max(lm, ModelLight)); -} - -void main() { - vec4 tex = texture2D(BlockAtlas, TexCoords); - - fragColor = vec4(tex.rgb * light().rgb * Diffuse * Color.rgb, tex.a); -} \ No newline at end of file From 8c0e983f36d3dabc1df42a1fce49ddd64410ba45 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 3 Feb 2021 23:21:10 -0800 Subject: [PATCH 069/147] An absolutely ridiculous amount of refactoring. Shader system got a complete makeover, but still needs a little work. Objective was GL compatibility, now runs with 3.3, 2.0 is target. Remove old tile rendering code. Need to bring back old old (vanilla) tile rendering code. --- .../com/simibubi/create/AllBlockPartials.java | 39 +--- .../com/simibubi/create/CreateClient.java | 6 +- .../base/BackHalfShaftInstance.java | 2 +- .../contraptions/base/HalfShaftInstance.java | 2 +- .../base/HorizontalHalfShaftInstance.java | 2 +- .../base/KineticTileEntityRenderer.java | 40 ----- .../base/KineticTileInstance.java | 8 +- .../base/ShaftlessCogInstance.java | 2 +- .../base/SingleRotatingInstance.java | 2 +- .../components/actors/DrillInstance.java | 2 +- .../components/actors/DrillRenderer.java | 10 +- .../components/actors/HarvesterRenderer.java | 2 +- .../components/clock/CuckooClockRenderer.java | 7 - .../crafter/MechanicalCrafterInstance.java | 2 +- .../components/deployer/DeployerRenderer.java | 9 - .../components/fan/EncasedFanRenderer.java | 71 -------- .../components/fan/FanInstance.java | 2 +- .../components/flywheel/FlywheelRenderer.java | 7 - .../millstone/MillStoneCogInstance.java | 2 +- .../millstone/MillstoneRenderer.java | 5 - .../mixer/MechanicalMixerRenderer.java | 6 - .../motor/CreativeMotorRenderer.java | 5 - .../components/saw/SawInstance.java | 2 +- .../components/saw/SawRenderer.java | 18 -- .../bearing/BearingRenderer.java | 7 - .../contraptions/fluids/PumpCogInstance.java | 2 +- .../contraptions/fluids/PumpRenderer.java | 6 - .../advanced/SpeedControllerRenderer.java | 14 -- .../relays/belt/BeltInstance.java | 5 +- .../relays/belt/BeltRenderer.java | 94 ---------- .../relays/encased/ShaftInstance.java | 2 +- .../relays/encased/SplitShaftInstance.java | 4 +- .../relays/encased/SplitShaftRenderer.java | 60 ------- .../relays/gearbox/GearboxInstance.java | 3 +- .../relays/gearbox/GearboxRenderer.java | 66 ------- .../block/mechanicalArm/ArmInstance.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 6 - .../foundation/render/AllProgramSpecs.java | 34 ++++ .../foundation/render/AllVertexSpecs.java | 54 ++++++ .../foundation/render/BufferedModel.java | 2 +- .../render/FastRenderDispatcher.java | 10 +- .../foundation/render/KineticRenderer.java | 12 ++ .../ContraptionKineticRenderer.java | 12 +- .../render/contraption/ContraptionModel.java | 6 +- .../contraption/ContraptionProgram.java | 35 ++++ .../ContraptionRenderDispatcher.java | 11 +- .../contraption/RenderedContraption.java | 36 +--- .../foundation/render/gl/BasicProgram.java | 51 ++++++ .../foundation/render/gl/SamplerBinding.java | 26 +++ .../foundation/render/gl/SamplerType.java | 25 +++ .../render/gl/attrib/AttributeGroup.java | 27 +++ .../render/gl/attrib/CommonAttributes.java | 23 +++ .../attrib}/VertexAttribute.java | 16 +- .../attrib}/VertexFormat.java | 2 +- .../render/gl/attrib/VertexSpec.java | 61 +++++++ .../render/gl/shader/AllShaderPrograms.java | 55 ------ .../render/gl/shader/GlProgram.java | 119 ++++++++++++ .../foundation/render/gl/shader/GlShader.java | 53 ++++++ .../render/gl/shader/ProgramBuilder.java | 49 ----- .../render/gl/shader/ProgramSpec.java | 37 ++++ .../render/gl/shader/ShaderCallback.java | 12 +- .../render/gl/shader/ShaderConstants.java | 30 +++- .../render/gl/shader/ShaderHelper.java | 170 ++++++------------ .../render/gl/shader/ShaderType.java | 13 +- .../render/instancing/BeltData.java | 10 +- .../render/instancing/BeltModel.java | 1 + .../instancing/DynamicInstancedModel.java | 1 + .../render/instancing/IRendererFactory.java | 1 - .../render/instancing/InstanceContext.java | 44 ----- .../render/instancing/InstancedModel.java | 6 +- .../InstancedTileRenderRegistry.java | 1 - .../InstancedTileRenderer.java | 45 +++-- .../render/instancing/KineticData.java | 13 +- .../render/instancing/RenderMaterial.java | 27 +-- .../render/instancing/RotatingData.java | 3 +- .../render/instancing/RotatingModel.java | 1 + .../render/instancing/TileEntityInstance.java | 5 +- .../actors/DynamicRotatingActorData.java | 5 +- .../instancing/actors/RotatingActorModel.java | 2 +- .../actors/StaticRotatingActorData.java | 7 +- .../resources/assets/create/shader/belt.vert | 66 ++++--- .../assets/create/shader/contraption.frag | 17 +- .../create/shader/contraption_actor.vert | 31 ++-- .../create/shader/contraption_belt.vert | 84 --------- .../create/shader/contraption_rotating.vert | 79 -------- .../create/shader/contraption_structure.vert | 31 ++-- .../assets/create/shader/instanced.frag | 10 +- .../assets/create/shader/rotating.vert | 53 ++++-- 88 files changed, 915 insertions(+), 1133 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/AllVertexSpecs.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/SamplerBinding.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/SamplerType.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java rename src/main/java/com/simibubi/create/foundation/render/{instancing => gl/attrib}/VertexAttribute.java (54%) rename src/main/java/com/simibubi/create/foundation/render/{instancing => gl/attrib}/VertexFormat.java (96%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexSpec.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramBuilder.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java rename src/main/java/com/simibubi/create/foundation/render/{ => instancing}/InstancedTileRenderer.java (63%) delete mode 100644 src/main/resources/assets/create/shader/contraption_belt.vert delete mode 100644 src/main/resources/assets/create/shader/contraption_rotating.vert diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index d156c584b..cee881770 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -1,11 +1,9 @@ package com.simibubi.create; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.utility.AngleHelper; @@ -222,41 +220,20 @@ public class AllBlockPartials { return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); } - @Deprecated - public InstancedModel renderOnRotating(InstanceContext ctx, BlockState referenceState) { - return ctx.getRotating().getModel(this, referenceState); + public InstancedModel renderOnRotating(InstancedTileRenderer ctx, BlockState referenceState) { + return ctx.getMaterial(KineticRenderMaterials.ROTATING).getModel(this, referenceState); } - public InstancedModel renderOnRotating(InstancedTileRenderer ctx, BlockState referenceState) { - return ctx.get(KineticRenderMaterials.ROTATING).getModel(this, referenceState); + public InstancedModel renderOnBelt(InstancedTileRenderer ctx, BlockState referenceState) { + return ctx.getMaterial(KineticRenderMaterials.BELTS).getModel(this, referenceState); } - @Deprecated - public InstancedModel renderOnBelt(InstanceContext ctx, BlockState referenceState) { - return ctx.getBelts().getModel(this, referenceState); - } - - public InstancedModel renderOnBelt(InstancedTileRenderer ctx, BlockState referenceState) { - return ctx.get(KineticRenderMaterials.BELTS).getModel(this, referenceState); - } - - @Deprecated - public InstancedModel renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState) { - Direction facing = referenceState.get(FACING); - return renderOnDirectionalSouthRotating(ctx, referenceState, facing); - } - - public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderer dispatcher, BlockState referenceState) { + public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderer dispatcher, BlockState referenceState) { Direction facing = referenceState.get(FACING); return renderOnDirectionalSouthRotating(dispatcher, referenceState, facing); } - @Deprecated - public InstancedModel renderOnDirectionalSouthRotating(InstanceContext ctx, BlockState referenceState, Direction facing) { - return renderOnDirectionalSouthRotating(ctx.getKinetics(), referenceState, facing); - } - - public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderer dispatcher, BlockState referenceState, Direction facing) { + public InstancedModel renderOnDirectionalSouthRotating(InstancedTileRenderer dispatcher, BlockState referenceState, Direction facing) { Supplier ms = () -> { MatrixStack stack = new MatrixStack(); MatrixStacker.of(stack) @@ -266,7 +243,7 @@ public class AllBlockPartials { .unCentre(); return stack; }; - return dispatcher.get(KineticRenderMaterials.ROTATING).getModel(this, referenceState, facing, ms); + return dispatcher.getMaterial(KineticRenderMaterials.ROTATING).getModel(this, referenceState, facing, ms); } } diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 561107461..143e5eec5 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -11,7 +11,7 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.KineticRenderer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; @@ -44,7 +44,7 @@ public class CreateClient { public static SchematicHandler schematicHandler; public static SchematicAndQuillHandler schematicAndQuillHandler; public static SuperByteBufferCache bufferCache; - public static InstancedTileRenderer kineticRenderer; + public static KineticRenderer kineticRenderer; public static final Outliner outliner = new Outliner(); private static CustomBlockModels customBlockModels; @@ -72,7 +72,7 @@ public class CreateClient { bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); - kineticRenderer = new InstancedTileRenderer(); + kineticRenderer = new KineticRenderer(); AllKeys.register(); AllContainerTypes.registerScreenFactories(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java index b386cc41d..0ec0cda06 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java index 81950b2ec..d25b28b73 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java index e9ddd647f..4c4af041f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index f1015dd48..8bd192394 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -6,7 +6,6 @@ import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -44,42 +43,6 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer(te)); } - public void addInstanceData(InstanceContext ctx) { - renderRotatingBuffer(ctx, getRotatedModel(ctx)); - } - - public void markForRebuild(InstanceContext ctx) { - getRotatedModel(ctx).clearInstanceData(); - } - - public static void renderRotatingKineticBlock(InstanceContext ctx, BlockState renderedState) { - InstancedModel instancedRenderer = ctx.getRotating().getModel(KINETIC_TILE, renderedState); - renderRotatingBuffer(ctx, instancedRenderer); - } - - public static void markForRebuild(InstanceContext ctx, BlockState renderedState) { - ctx.getRotating().getModel(KINETIC_TILE, renderedState).clearInstanceData(); - } - - public static void renderRotatingBuffer(InstanceContext ctx, InstancedModel instancer) { - instancer.setupInstance(data -> { - T te = ctx.te; - final BlockPos pos = te.getPos(); - Axis axis = ((IRotate) te.getBlockState() - .getBlock()).getRotationAxis(te.getBlockState()); - - data.setRotationalSpeed(te.getSpeed()) - .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) - .setRotationAxis(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis).getUnitVector()) - .setTileEntity(te); - - if (ctx.checkWorldLight()) { - data.setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos())) - .setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos())); - } - }); - } - public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { float time = AnimationTickHolder.getRenderTick(); float offset = getRotationOffsetForPosition(te, pos, axis); @@ -142,8 +105,5 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer getRotatedModel(InstanceContext ctx) { - return ctx.getRotating().getModel(KINETIC_TILE, getRenderedBlockState(ctx.te)); - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index 91fff6251..c3b2bf4c1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.*; import net.minecraft.block.BlockState; import net.minecraft.util.Direction; @@ -13,7 +13,7 @@ import java.util.function.Consumer; public abstract class KineticTileInstance extends TileEntityInstance { - public KineticTileInstance(InstancedTileRenderer modelManager, T tile) { + public KineticTileInstance(InstancedTileRenderer modelManager, T tile) { super(modelManager, tile); } @@ -60,7 +60,7 @@ public abstract class KineticTileInstance extends T return ((IRotate) lastState.getBlock()).getRotationAxis(lastState); } - protected final RenderMaterial> rotatingMaterial() { - return modelManager.get(KineticRenderMaterials.ROTATING); + protected final RenderMaterial> rotatingMaterial() { + return modelManager.getMaterial(KineticRenderMaterials.ROTATING); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java index e4d47c08b..0cec9d237 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index db9b4a71c..fb951f8d5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstanceKey; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index 77b5779fb..8ab9aeac0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 069627f80..5a124d5a2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -6,11 +6,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.contraption.ContraptionProgram; import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RenderMaterial; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -31,17 +30,12 @@ public class DrillRenderer extends KineticTileEntityRenderer { super(dispatcher); } - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); - } - protected static SuperByteBuffer getRotatingModel(BlockState state) { return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(state); } public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) { - RenderMaterial> renderMaterial = contraption.getActorMaterial(); + RenderMaterial> renderMaterial = contraption.getActorMaterial(); BlockState state = context.state; InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 08522970e..8c706264b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -40,7 +40,7 @@ public class HarvesterRenderer extends SafeTileEntityRenderer> renderMaterial = contraption.getActorMaterial(); + RenderMaterial> renderMaterial = contraption.getActorMaterial(); BlockState state = context.state; InstancedModel model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index 7d8656958..0ab7d28c5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -7,7 +7,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; @@ -91,12 +90,6 @@ public class CuckooClockRenderer extends KineticTileEntityRenderer { } - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - BlockState blockState = ctx.te.getBlockState(); - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, blockState, blockState.get(CuckooClockBlock.HORIZONTAL_FACING).getOpposite()); - } - private SuperByteBuffer rotateHand(SuperByteBuffer buffer, float angle, Direction facing) { float pivotX = 2 / 16f; float pivotY = 6 / 16f; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java index fa8dec58c..6e1fc2203 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index d3aa7b2e7..ef98c5693 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -9,7 +9,6 @@ import com.simibubi.create.content.contraptions.components.deployer.DeployerTile import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -52,14 +51,6 @@ public class DeployerRenderer extends SafeTileEntityRenderer } - public void addInstanceData(InstanceContext ctx) { - KineticTileEntityRenderer.renderRotatingKineticBlock(ctx, getRenderedBlockState(ctx.te)); - } - - public void markForRebuild(InstanceContext ctx) { - KineticTileEntityRenderer.markForRebuild(ctx, getRenderedBlockState(ctx.te)); - } - protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { BlockState deployerState = te.getBlockState(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 694afdf78..6c857986c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -29,74 +28,4 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); } - @Override - public void addInstanceData(InstanceContext ctx) { - KineticTileEntity te = ctx.te; - Direction direction = te.getBlockState() - .get(FACING); - - InstancedModel shaftHalf = - AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); - InstancedModel fanInner = - AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); - - shaftHalf.setupInstance(data -> { - final BlockPos pos = te.getPos(); - Direction.Axis axis = ((IRotate) te.getBlockState() - .getBlock()).getRotationAxis(te.getBlockState()); - data.setRotationalSpeed(te.getSpeed()) - .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setTileEntity(te); - - if (ctx.checkWorldLight()) { - BlockPos behind = te.getPos().offset(direction.getOpposite()); - int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, behind); - int skyLight = te.getWorld().getLightLevel(LightType.SKY, behind); - - data.setBlockLight(blockLight) - .setSkyLight(skyLight); - } - }); - fanInner.setupInstance(data -> { - final BlockPos pos = te.getPos(); - Direction.Axis axis = ((IRotate) te.getBlockState() - .getBlock()).getRotationAxis(te.getBlockState()); - - float speed = te.getSpeed() * 5; - if (speed > 0) - speed = MathHelper.clamp(speed, 80, 64 * 20); - if (speed < 0) - speed = MathHelper.clamp(speed, -64 * 20, -80); - - data.setRotationalSpeed(speed) - .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setTileEntity(te); - - if (ctx.checkWorldLight()) { - BlockPos inFront = te.getPos().offset(direction); - int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, inFront); - int skyLight = te.getWorld().getLightLevel(LightType.SKY, inFront); - - data.setBlockLight(blockLight) - .setSkyLight(skyLight); - } - }); - } - - @Override - public void markForRebuild(InstanceContext ctx) { - KineticTileEntity te = ctx.te; - Direction direction = te.getBlockState() - .get(FACING); - - InstancedModel shaftHalf = - AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); - InstancedModel fanInner = - AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction.getOpposite()); - - shaftHalf.clearInstanceData(); - fanInner.clearInstanceData(); - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index 04f173aa3..8ad1f6d52 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.fan; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstanceKey; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index fd77e7f42..9c4d6b6be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -7,7 +7,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; @@ -75,12 +74,6 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { wheel.renderInto(ms, vb); } - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState(), ctx.te.getBlockState() - .get(HORIZONTAL_FACING) - .getOpposite()); - } protected SuperByteBuffer transformConnector(SuperByteBuffer buffer, boolean upper, boolean rotating, float angle, boolean flip) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java index bd663dc70..7e198b68d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index 7121fe9d2..624c58fa5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -3,7 +3,6 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -14,9 +13,5 @@ public class MillstoneRenderer extends KineticTileEntityRenderer { super(dispatcher); } - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - return AllBlockPartials.MILLSTONE_COG.renderOnRotating(ctx, ctx.te.getBlockState()); - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index fc1fc2df6..859e0528b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -6,7 +6,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -55,9 +54,4 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { .light(packedLightmapCoords) .renderInto(ms, vb); } - - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - return AllBlockPartials.SHAFTLESS_COGWHEEL.renderOnRotating(ctx, ctx.te.getBlockState()); - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 5d74bf9ac..127e1b754 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -3,7 +3,6 @@ package com.simibubi.create.content.contraptions.components.motor; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -14,9 +13,5 @@ public class CreativeMotorRenderer extends KineticTileEntityRenderer { super(dispatcher); } - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java index 5b5175ad1..6769cedc9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 217be3457..b59db0d26 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -6,7 +6,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -46,14 +45,6 @@ public class SawRenderer extends SafeTileEntityRenderer { } - public void addInstanceData(InstanceContext ctx) { - KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx)); - } - - public void markForRebuild(InstanceContext ctx) { - getRotatedModel(ctx).clearInstanceData(); - } - protected void renderBlade(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light){ BlockState blockState = te.getBlockState(); SuperByteBuffer superBuffer; @@ -133,15 +124,6 @@ public class SawRenderer extends SafeTileEntityRenderer { } } - protected InstancedModel getRotatedModel(InstanceContext ctx) { - KineticTileEntity te = ctx.te; - BlockState state = te.getBlockState(); - if (state.get(FACING).getAxis().isHorizontal()) - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); - return ctx.getRotating().getModel(KineticTileEntityRenderer.KINETIC_TILE, - getRenderedBlockState(te)); - } - protected BlockState getRenderedBlockState(KineticTileEntity te) { return KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index bb7a8765b..90fbb0a77 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; @@ -45,10 +44,4 @@ public class BearingRenderer extends KineticTileEntityRenderer { superBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - BlockState blockState = ctx.te.getBlockState(); - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, blockState, blockState.get(BearingBlock.FACING).getOpposite()); - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index 2c23dd4e8..6c2a88a70 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.fluids; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 985a775fe..35f53c01d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; @@ -52,9 +51,4 @@ public class PumpRenderer extends KineticTileEntityRenderer { } } - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(ctx, ctx.te.getBlockState()); - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index caee82b16..80c19026e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; @@ -22,17 +21,4 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer(tileEntityIn)); } - public void addInstanceData(InstanceContext ctx) { - KineticTileEntityRenderer.renderRotatingBuffer(ctx, getRotatedModel(ctx)); - } - - public void markForRebuild(InstanceContext ctx) { - getRotatedModel(ctx).clearInstanceData(); - } - - private InstancedModel getRotatedModel(InstanceContext ctx) { - return ctx.getRotating().getModel(KineticTileEntityRenderer.KINETIC_TILE, - KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(ctx.te))); - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 585001d36..6de68adfb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -5,11 +5,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -38,7 +37,7 @@ public class BeltInstance extends KineticTileInstance { protected ArrayList> keys; protected InstanceKey pulleyKey; - public BeltInstance(InstancedTileRenderer modelManager, BeltTileEntity tile) { + public BeltInstance(InstancedTileRenderer modelManager, BeltTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index bbaa75d8f..448d97cac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -9,7 +9,6 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.Transporte import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.ShadowRenderHelper; import com.simibubi.create.foundation.render.instancing.BeltData; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -57,74 +56,6 @@ public class BeltRenderer extends SafeTileEntityRenderer { return te.isController(); } - public void addInstanceData(InstanceContext ctx) { - BeltTileEntity te = ctx.te; - BlockState blockState = te.getBlockState(); - if (!AllBlocks.BELT.has(blockState)) - return; - - BeltSlope beltSlope = blockState.get(BeltBlock.SLOPE); - BeltPart part = blockState.get(BeltBlock.PART); - Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); - AxisDirection axisDirection = facing.getAxisDirection(); - - boolean downward = beltSlope == BeltSlope.DOWNWARD; - boolean upward = beltSlope == BeltSlope.UPWARD; - boolean diagonal = downward || upward; - boolean start = part == BeltPart.START; - boolean end = part == BeltPart.END; - boolean sideways = beltSlope == BeltSlope.SIDEWAYS; - boolean vertical = beltSlope == BeltSlope.VERTICAL; - boolean alongX = facing.getAxis() == Axis.X; - boolean alongZ = facing.getAxis() == Axis.Z; - - if (downward || vertical && axisDirection == AxisDirection.POSITIVE) { - boolean b = start; - start = end; - end = b; - } - - for (boolean bottom : Iterate.trueAndFalse) { - - AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); - - InstancedModel beltBuffer = beltPartial.renderOnBelt(ctx, blockState); - SpriteShiftEntry spriteShift = getSpriteShiftEntry(diagonal, bottom); - - beltBuffer.setupInstance(data -> { - float speed = te.getSpeed(); - if (((axisDirection == AxisDirection.NEGATIVE) ^ upward) ^ - ((alongX && !diagonal) || (alongZ && diagonal)) ^ - vertical) - speed = -speed; - - if (sideways && (facing == Direction.SOUTH || facing == Direction.WEST)) - speed = -speed; - - float rotX = !diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0; - float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 90 : 0); - float rotZ = sideways ? 90 : (vertical ? 180 : 0); - - data.setTileEntity(te) - .setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos())) - .setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos())) - .setRotation(rotX, rotY, rotZ) - .setRotationalSpeed(speed) - .setScrollTexture(spriteShift) - .setScrollMult(diagonal ? 3f / 8f : 0.5f); - }); - - // Diagonal belt do not have a separate bottom model - if (diagonal) - break; - } - - if (te.hasPulley()) { - InstancedModel rotatingBuffer = getPulleyModel(ctx, blockState, sideways); - KineticTileEntityRenderer.renderRotatingBuffer(ctx, rotatingBuffer); - } - } - public static SpriteShiftEntry getSpriteShiftEntry(boolean diagonal, boolean bottom) { if (diagonal) return AllSpriteShifts.BELT_DIAGONAL; if (bottom) return AllSpriteShifts.BELT_OFFSET; @@ -148,31 +79,6 @@ public class BeltRenderer extends SafeTileEntityRenderer { } } - private InstancedModel getPulleyModel(InstanceContext ctx, BlockState blockState, boolean sideways) { - Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) - .rotateY(); - if (sideways) - dir = Direction.UP; - - Axis axis = dir.getAxis(); - - Supplier ms = () -> { - MatrixStack modelTransform = new MatrixStack(); - MatrixStacker msr = MatrixStacker.of(modelTransform); - msr.centre(); - if (axis == Axis.X) - msr.rotateY(90); - if (axis == Axis.Y) - msr.rotateX(90); - msr.rotateX(90); - msr.unCentre(); - - return modelTransform; - }; - - return ctx.getRotating().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms); - } - protected void renderItems(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { if (!te.isController()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java index e563df129..bb45e1c85 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.contraptions.relays.encased; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index e1b2d2e9d..5bb674062 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -3,17 +3,15 @@ package com.simibubi.create.content.contraptions.relays.encased; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstanceKey; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 4e41c84f3..67897372e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.Iterate; @@ -29,63 +28,4 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); } - @Override - public void addInstanceData(InstanceContext ctx) { - KineticTileEntity te = ctx.te; - Block block = te.getBlockState().getBlock(); - final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); - final BlockPos pos = te.getPos(); - - int blockLight; - int skyLight; - - if (ctx.checkWorldLight()) { - blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()); - skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos()); - } else { - blockLight = 0; - skyLight = 0; - } - - for (Direction direction : Iterate.directions) { - Axis axis = direction.getAxis(); - if (boxAxis != axis) - continue; - - InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); - - shaft.setupInstance(data -> { - float speed = te.getSpeed(); - - float modifier = 1; - - if (te instanceof SplitShaftTileEntity) - modifier = ((SplitShaftTileEntity) te).getRotationSpeedModifier(direction); - - speed *= modifier; - - data.setBlockLight(blockLight) - .setSkyLight(skyLight) - .setRotationalSpeed(speed) - .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setTileEntity(te); - }); - } - } - - @Override - public void markForRebuild(InstanceContext ctx) { - KineticTileEntity te = ctx.te; - Block block = te.getBlockState().getBlock(); - final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); - - for (Direction direction : Iterate.directions) { - Axis axis = direction.getAxis(); - if (boxAxis != axis) continue; - - InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); - shaft.clearInstanceData(); - } - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index b6cbb530a..ae6cfb934 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -2,13 +2,12 @@ package com.simibubi.create.content.contraptions.relays.gearbox; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstanceKey; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.Iterate; -import net.minecraft.block.BlockState; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 87e6c6708..509f15ef2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -5,7 +5,6 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.Iterate; @@ -32,69 +31,4 @@ public class GearboxRenderer extends KineticTileEntityRenderer { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); } - @Override - public void addInstanceData(InstanceContext ctx) { - KineticTileEntity te = ctx.te; - final BlockPos pos = te.getPos(); - - int blockLight; - int skyLight; - - if (ctx.checkWorldLight()) { - blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()); - skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos()); - } else { - blockLight = 0; - skyLight = 0; - } - - for (Pair> shaft : getBuffers(ctx)) { - shaft.getSecond().setupInstance(data -> { - float speed = te.getSpeed(); - Direction direction = shaft.getFirst(); - Axis axis = direction.getAxis(); - - if (te.getSpeed() != 0 && te.hasSource()) { - BlockPos source = te.source.subtract(te.getPos()); - Direction sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); - if (sourceFacing.getAxis() == axis) - speed *= sourceFacing == direction ? 1 : -1; - else if (sourceFacing.getAxisDirection() == direction.getAxisDirection()) - speed *= -1; - } - - data.setBlockLight(blockLight) - .setSkyLight(skyLight) - .setRotationalSpeed(speed) - .setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setTileEntity(te); - }); - } - } - - @Override - public void markForRebuild(InstanceContext ctx) { - getBuffers(ctx).stream().map(Pair::getSecond).forEach(InstancedModel::clearInstanceData); - } - - private List>> getBuffers(InstanceContext ctx) { - KineticTileEntity te = ctx.te; - final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); - - List>> buffers = Lists.newArrayListWithCapacity(4); - - for (Direction direction : Iterate.directions) { - final Axis axis = direction.getAxis(); - if (boxAxis == axis) - continue; - - InstancedModel buffer = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(ctx, te.getBlockState(), direction); - Pair> pair = Pair.of(direction, buffer); - - buffers.add(pair); - } - - return buffers; - } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index 82655699c..a34cff992 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.InstancedTileRenderer; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.instancing.RotatingData; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 4e2b715d9..e039892be 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -7,7 +7,6 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstanceContext; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -124,9 +123,4 @@ public class ArmRenderer extends KineticTileEntityRenderer { ms.pop(); } - @Override - protected InstancedModel getRotatedModel(InstanceContext ctx) { - return AllBlockPartials.ARM_COG.renderOnRotating(ctx, ctx.te.getBlockState()); - } - } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java new file mode 100644 index 000000000..93ae82d72 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -0,0 +1,34 @@ +package com.simibubi.create.foundation.render; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.render.contraption.ContraptionProgram; +import com.simibubi.create.foundation.render.gl.BasicProgram; +import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; +import com.simibubi.create.foundation.render.gl.shader.ShaderConstants; +import net.minecraft.util.ResourceLocation; + +import static com.simibubi.create.foundation.render.gl.shader.ShaderHelper.register; + +public class AllProgramSpecs { + public static final ProgramSpec ROTATING = register(new ProgramSpec<>("rotating", Locations.ROTATING, Locations.INSTANCED, BasicProgram::new)); + public static final ProgramSpec BELT = register(new ProgramSpec<>("belt", Locations.BELT, Locations.INSTANCED, BasicProgram::new)); + public static final ProgramSpec CONTRAPTION_STRUCTURE = register(new ProgramSpec<>("contraption_structure", Locations.CONTRAPTION_STRUCTURE, Locations.CONTRAPTION, ContraptionProgram::new)); + public static final ProgramSpec CONTRAPTION_ROTATING = register(new ProgramSpec<>("contraption_rotating", Locations.ROTATING, Locations.CONTRAPTION, ContraptionProgram::new, ShaderConstants.define("CONTRAPTION"))); + public static final ProgramSpec CONTRAPTION_BELT = register(new ProgramSpec<>("contraption_belt", Locations.BELT, Locations.CONTRAPTION, ContraptionProgram::new, ShaderConstants.define("CONTRAPTION"))); + public static final ProgramSpec CONTRAPTION_ACTOR = register(new ProgramSpec<>("contraption_actor", Locations.CONTRAPTION_ACTOR, Locations.CONTRAPTION, ContraptionProgram::new)); + + public static class Locations { + public static final ResourceLocation INSTANCED = loc("instanced.frag"); + public static final ResourceLocation CONTRAPTION = loc("contraption.frag"); + + public static final ResourceLocation ROTATING = loc("rotating.vert"); + public static final ResourceLocation BELT = loc("belt.vert"); + public static final ResourceLocation CONTRAPTION_STRUCTURE = loc("contraption_structure.vert"); + public static final ResourceLocation CONTRAPTION_ACTOR = loc("contraption_actor.vert"); + + + private static ResourceLocation loc(String name) { + return new ResourceLocation(Create.ID, "shader/" + name); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/AllVertexSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllVertexSpecs.java new file mode 100644 index 000000000..4e860fefe --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/AllVertexSpecs.java @@ -0,0 +1,54 @@ +package com.simibubi.create.foundation.render; + +import com.simibubi.create.foundation.render.gl.GlPrimitiveType; +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.VertexSpec; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribute; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; + +import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribute.copy; +import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.*; + +public class AllVertexSpecs { + + public static final VertexAttribute ROTATION_CENTER = copy("rotationCenter", CommonAttributes.VEC3); + public static final VertexAttribute SPEED = copy("speed", CommonAttributes.FLOAT); + public static final VertexAttribute OFFSET = copy("offset", CommonAttributes.FLOAT); + public static final VertexAttribute TARGET_UV = copy("scrollTexture", CommonAttributes.VEC4); + public static final VertexAttribute SCROLL_MULT = new VertexAttribute("scrollMult", GlPrimitiveType.BYTE, 1, true); + + + public static final VertexFormat FORMAT = new VertexFormat(CommonAttributes.INSTANCE_POSITION, CommonAttributes.LIGHT, CommonAttributes.RGB, SPEED, OFFSET); + + public static final VertexSpec KINETIC = new VertexSpec() + .attrib(POSITION) + .attrib(NORMAL) + .attrib(UV) + .pushGroup(1) // instance data + .attrib(INSTANCE_POSITION) + .attrib(LIGHT) + .attrib(RGB) + .attrib(SPEED) + .attrib(OFFSET); + + public static final VertexSpec BELT = new VertexSpec(KINETIC) + .attrib(ROTATION) + .attrib("uv", UV) + .attrib(TARGET_UV) + .attrib(SCROLL_MULT); + + public static final VertexSpec ROTATING = new VertexSpec(KINETIC) + .attrib("rotationAxis", NORMAL); + + public static final VertexSpec ACTOR = new VertexSpec() + .attrib(POSITION) + .attrib(NORMAL) + .attrib(UV) + .pushGroup(1) // instance data + .attrib(INSTANCE_POSITION) + .attrib(LIGHT) + .attrib(OFFSET) + .attrib("localRotationAxis", NORMAL) + .attrib("localRotation", ROTATION) + .attrib(ROTATION_CENTER); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java index 134b3bdf0..37348904d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.render; import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; import com.simibubi.create.foundation.render.gl.GlVertexArray; -import com.simibubi.create.foundation.render.instancing.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 56b6d523b..271b0accb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -68,20 +68,20 @@ public class FastRenderDispatcher { } public static void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ) { - Matrix4f view = Matrix4f.translate((float) -cameraX, (float) -cameraY, (float) -cameraZ); - view.multiplyBackward(stack.peek().getModel()); + Matrix4f viewProjection = Matrix4f.translate((float) -cameraX, (float) -cameraY, (float) -cameraZ); + viewProjection.multiplyBackward(stack.peek().getModel()); + viewProjection.multiplyBackward(getProjectionMatrix()); - Matrix4f projection = getProjectionMatrix(); type.startDrawing(); RenderSystem.enableDepthTest(); RenderSystem.enableCull(); GL11.glCullFace(GL11.GL_BACK); - CreateClient.kineticRenderer.render(type, projection, view); + CreateClient.kineticRenderer.render(type, viewProjection); RenderSystem.disableCull(); //RenderSystem.disableDepthTest(); - ContraptionRenderDispatcher.renderLayer(type, projection, view); + ContraptionRenderDispatcher.renderLayer(type, viewProjection); ShaderHelper.releaseShader(); type.endDrawing(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java new file mode 100644 index 000000000..1cbfac59f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java @@ -0,0 +1,12 @@ +package com.simibubi.create.foundation.render; + +import com.simibubi.create.foundation.render.gl.BasicProgram; +import com.simibubi.create.foundation.render.instancing.*; + +public class KineticRenderer extends InstancedTileRenderer { + @Override + public void registerMaterials() { + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllProgramSpecs.BELT, BeltModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllProgramSpecs.ROTATING, RotatingModel::new)); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java index 36f57f343..6569046e5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java @@ -1,19 +1,19 @@ package com.simibubi.create.foundation.render.contraption; -import com.simibubi.create.foundation.render.InstancedTileRenderer; -import com.simibubi.create.foundation.render.gl.shader.AllShaderPrograms; +import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.instancing.BeltModel; import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; import com.simibubi.create.foundation.render.instancing.RenderMaterial; import com.simibubi.create.foundation.render.instancing.RotatingModel; import com.simibubi.create.foundation.render.instancing.actors.RotatingActorModel; -public class ContraptionKineticRenderer extends InstancedTileRenderer { +public class ContraptionKineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllShaderPrograms.CONTRAPTION_BELT, BeltModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllShaderPrograms.CONTRAPTION_ROTATING, RotatingModel::new)); - materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(AllShaderPrograms.CONTRAPTION_ACTOR, RotatingActorModel::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_BELT, BeltModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_ROTATING, RotatingModel::new)); + materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_ACTOR, RotatingActorModel::new)); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java index ec89f9df2..2fa63f9a0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.render.contraption; import com.simibubi.create.foundation.render.BufferedModel; import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.LightTexture; import org.lwjgl.opengl.GL11; @@ -10,8 +10,8 @@ import org.lwjgl.opengl.GL40; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.LIGHT; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.RGBA; +import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.LIGHT; +import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.RGBA; public class ContraptionModel extends BufferedModel { public static final VertexFormat FORMAT = new VertexFormat(InstancedModel.FORMAT, RGBA, LIGHT); diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java new file mode 100644 index 000000000..2f111162d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java @@ -0,0 +1,35 @@ +package com.simibubi.create.foundation.render.contraption; + +import com.simibubi.create.foundation.render.gl.BasicProgram; +import com.simibubi.create.foundation.render.light.GridAlignedBB; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL20; + +public class ContraptionProgram extends BasicProgram { + protected final int uLightBoxSize; + protected final int uLightBoxMin; + protected final int uModel; + + protected int uLightVolume; + + public ContraptionProgram(ResourceLocation name, int handle) { + super(name, handle); + uLightBoxSize = getUniformLocation("uLightBoxSize"); + uLightBoxMin = getUniformLocation("uLightBoxMin"); + uModel = getUniformLocation("uModel"); + } + + @Override + protected void registerSamplers() { + super.registerSamplers(); + uLightVolume = setSamplerBinding("uLightVolume", 4); + } + + public void bind(Matrix4f model, GridAlignedBB lightVolume) { + bind(); + GL20.glUniform3f(uLightBoxSize, lightVolume.sizeX(), lightVolume.sizeY(), lightVolume.sizeZ()); + GL20.glUniform3f(uLightBoxMin, lightVolume.minX, lightVolume.minY, lightVolume.minZ); + uploadMatrixUniform(uModel, model); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index 7d968a390..ceae5bb40 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; -import com.simibubi.create.foundation.render.gl.shader.AllShaderPrograms; +import com.simibubi.create.foundation.render.AllProgramSpecs; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -86,7 +86,7 @@ public class ContraptionRenderDispatcher { return renderer; } - public static void renderLayer(RenderType layer, Matrix4f projectionMat, Matrix4f viewMat) { + public static void renderLayer(RenderType layer, Matrix4f viewProjection) { removeDeadContraptions(); if (renderers.isEmpty()) return; @@ -95,15 +95,14 @@ public class ContraptionRenderDispatcher { GL11.glEnable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 - ShaderCallback callback = ShaderHelper.getViewProjectionCallback(projectionMat, viewMat); - - int structureShader = ShaderHelper.useShader(AllShaderPrograms.CONTRAPTION_STRUCTURE, callback); + ContraptionProgram structureShader = ShaderHelper.getProgram(AllProgramSpecs.CONTRAPTION_STRUCTURE); + structureShader.bind(viewProjection, 0); for (RenderedContraption renderer : renderers.values()) { renderer.doRenderLayer(layer, structureShader); } for (RenderedContraption renderer : renderers.values()) { - renderer.kinetics.render(layer, projectionMat, viewMat, renderer::setup); + renderer.kinetics.render(layer, viewProjection, renderer::setup); renderer.teardown(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java index 1d59aaded..93c174ff6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java @@ -1,12 +1,10 @@ package com.simibubi.create.foundation.render.contraption; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.render.light.ContraptionLighter; @@ -28,7 +26,6 @@ import net.minecraftforge.client.model.data.EmptyModelData; import org.apache.commons.lang3.tuple.MutablePair; import org.lwjgl.opengl.GL11; -import java.nio.FloatBuffer; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -70,11 +67,11 @@ public class RenderedContraption { return lighter; } - public RenderMaterial> getActorMaterial() { - return kinetics.get(KineticRenderMaterials.ACTORS); + public RenderMaterial> getActorMaterial() { + return kinetics.getMaterial(KineticRenderMaterials.ACTORS); } - public void doRenderLayer(RenderType layer, int shader) { + public void doRenderLayer(RenderType layer, ContraptionProgram shader) { ContraptionModel buffer = renderLayers.get(layer); if (buffer != null) { setup(shader); @@ -131,8 +128,8 @@ public class RenderedContraption { this.model = model; } - void setup(int shader) { - setupShaderUniforms(shader); + void setup(ContraptionProgram shader) { + shader.bind(model, lighter.lightVolume.getTextureVolume()); lighter.lightVolume.use(); } @@ -140,29 +137,6 @@ public class RenderedContraption { lighter.lightVolume.release(); } - void setupShaderUniforms(int shader) { - FloatBuffer buf = ShaderHelper.VEC3_BUFFER; - - int lightBoxSize = GlStateManager.getUniformLocation(shader, "lightBoxSize"); - buf.put(0, (float) lighter.lightVolume.getSizeX()); - buf.put(1, (float) lighter.lightVolume.getSizeY()); - buf.put(2, (float) lighter.lightVolume.getSizeZ()); - buf.rewind(); - GlStateManager.uniform3(lightBoxSize, buf); - - int lightBoxMin = GlStateManager.getUniformLocation(shader, "lightBoxMin"); - buf.put(0, (float) lighter.lightVolume.getMinX()); - buf.put(1, (float) lighter.lightVolume.getMinY()); - buf.put(2, (float) lighter.lightVolume.getMinZ()); - buf.rewind(); - GlStateManager.uniform3(lightBoxMin, buf); - - int model = GlStateManager.getUniformLocation(shader, "model"); - this.model.write(ShaderHelper.MATRIX_BUFFER); - ShaderHelper.MATRIX_BUFFER.rewind(); - GlStateManager.uniformMatrix4(model, false, ShaderHelper.MATRIX_BUFFER); - } - void invalidate() { for (ContraptionModel buffer : renderLayers.values()) { buffer.delete(); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java new file mode 100644 index 000000000..9677af03e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java @@ -0,0 +1,51 @@ +package com.simibubi.create.foundation.render.gl; + +import com.simibubi.create.foundation.render.gl.shader.GlProgram; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL20; + +public class BasicProgram extends GlProgram { + protected final int uTicks; + protected final int uTime; + protected final int uViewProjection; + protected final int uDebug; + + protected int uBlockAtlas; + protected int uLightMap; + + public BasicProgram(ResourceLocation name, int handle) { + super(name, handle); + uTicks = getUniformLocation("uTicks"); + uTime = getUniformLocation("uTime"); + uViewProjection = getUniformLocation("uViewProjection"); + uDebug = getUniformLocation("uDebug"); + + bind(); + registerSamplers(); + unbind(); + } + + protected void registerSamplers() { + uBlockAtlas = setSamplerBinding("uBlockAtlas", 0); + uLightMap = setSamplerBinding("uLightMap", 2); + } + + public void bind(Matrix4f viewProjection, int debugMode) { + super.bind(); + + GL20.glUniform1i(uTicks, AnimationTickHolder.ticks); + GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTick()); + uploadMatrixUniform(uViewProjection, viewProjection); + GL20.glUniform1i(uDebug, debugMode); + } + + protected static void uploadMatrixUniform(int uniform, Matrix4f mat) { + ShaderHelper.MATRIX_BUFFER.position(0); + mat.write(ShaderHelper.MATRIX_BUFFER); + ShaderHelper.MATRIX_BUFFER.rewind(); + GL20.glUniformMatrix4fv(uniform, false, ShaderHelper.MATRIX_BUFFER); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/SamplerBinding.java b/src/main/java/com/simibubi/create/foundation/render/gl/SamplerBinding.java new file mode 100644 index 000000000..70eddad0b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/SamplerBinding.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.render.gl; + +public class SamplerBinding { + + private final SamplerType type; + private final String variableName; + private final int binding; + + public SamplerBinding(SamplerType type, String variableName, int binding) { + this.type = type; + this.variableName = variableName; + this.binding = binding; + } + + public SamplerType getType() { + return type; + } + + public String getVariableName() { + return variableName; + } + + public int getBinding() { + return binding; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/SamplerType.java b/src/main/java/com/simibubi/create/foundation/render/gl/SamplerType.java new file mode 100644 index 000000000..cb57c5a28 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/SamplerType.java @@ -0,0 +1,25 @@ +package com.simibubi.create.foundation.render.gl; + +import org.lwjgl.opengl.GL20; + +public enum SamplerType { + SAMPLER2D(GL20.GL_TEXTURE_2D, "sampler2D"), + SAMPLER3D(GL20.GL_TEXTURE_3D, "sampler3D"), + ; + + private final int glEnum; + private final String shaderToken; + + SamplerType(int glEnum, String shaderToken) { + this.glEnum = glEnum; + this.shaderToken = shaderToken; + } + + public int getGlEnum() { + return glEnum; + } + + public String getShaderToken() { + return shaderToken; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java new file mode 100644 index 000000000..3546e3552 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java @@ -0,0 +1,27 @@ +package com.simibubi.create.foundation.render.gl.attrib; + +import java.util.ArrayList; + +public class AttributeGroup { + private final int divisor; + + private final ArrayList attributes; + + public AttributeGroup(int divisor) { + this.divisor = divisor; + this.attributes = new ArrayList<>(); + } + + public AttributeGroup attrib(VertexAttribute attrib) { + attributes.add(attrib); + return this; + } + + public int getDivisor() { + return divisor; + } + + public ArrayList getAttributes() { + return attributes; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java new file mode 100644 index 000000000..d690334da --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.render.gl.attrib; + +import com.simibubi.create.foundation.render.gl.GlPrimitiveType; + +public class CommonAttributes { + + public static final VertexAttribute MAT4 = new VertexAttribute("aMat4", GlPrimitiveType.FLOAT, 16); + public static final VertexAttribute VEC4 = new VertexAttribute("aVec4", GlPrimitiveType.FLOAT, 4); + public static final VertexAttribute VEC3 = new VertexAttribute("aVec3", GlPrimitiveType.FLOAT, 3); + public static final VertexAttribute VEC2 = new VertexAttribute("aVec2", GlPrimitiveType.FLOAT, 2); + public static final VertexAttribute FLOAT = new VertexAttribute("aFloat", GlPrimitiveType.FLOAT, 1); + + public static final VertexAttribute POSITION = VertexAttribute.copy("aPos", VEC3); + public static final VertexAttribute NORMAL = new VertexAttribute("aNormal", GlPrimitiveType.BYTE, 3, true); + public static final VertexAttribute UV = VertexAttribute.copy("aTexCoords", VEC2); + + public static final VertexAttribute ROTATION = VertexAttribute.copy("eulerAngles", VEC3); + public static final VertexAttribute INSTANCE_POSITION = VertexAttribute.copy("instancePos", VEC3); + + public static final VertexAttribute RGBA = new VertexAttribute("rgba", GlPrimitiveType.UBYTE, 4, true); + public static final VertexAttribute RGB = new VertexAttribute("rgb", GlPrimitiveType.UBYTE, 3, true); + public static final VertexAttribute LIGHT = new VertexAttribute("light", GlPrimitiveType.UBYTE, 2, true); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribute.java similarity index 54% rename from src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java rename to src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribute.java index 1994c2ba4..94386821b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribute.java @@ -1,23 +1,9 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.gl.attrib; import com.simibubi.create.foundation.render.gl.GlPrimitiveType; import org.lwjgl.opengl.GL20; public class VertexAttribute { - public static final VertexAttribute MAT4 = new VertexAttribute("mat4", GlPrimitiveType.FLOAT, 16); - public static final VertexAttribute VEC4 = new VertexAttribute("vec4", GlPrimitiveType.FLOAT, 4); - public static final VertexAttribute VEC3 = new VertexAttribute("vec3", GlPrimitiveType.FLOAT, 3); - public static final VertexAttribute VEC2 = new VertexAttribute("vec2", GlPrimitiveType.FLOAT, 2); - public static final VertexAttribute FLOAT = new VertexAttribute("float", GlPrimitiveType.FLOAT, 1); - - public static final VertexAttribute POSITION = copy("pos", VEC3); - public static final VertexAttribute INSTANCE_POSITION = copy("instancePos", VEC3); - public static final VertexAttribute ROTATION = copy("eulerAngles", VEC3); - public static final VertexAttribute NORMAL = new VertexAttribute("normal", GlPrimitiveType.BYTE, 3, true); - public static final VertexAttribute RGBA = new VertexAttribute("rgba", GlPrimitiveType.UBYTE, 4, true); - public static final VertexAttribute RGB = new VertexAttribute("rgb", GlPrimitiveType.UBYTE, 3, true); - public static final VertexAttribute UV = copy("uv", VEC2); - public static final VertexAttribute LIGHT = new VertexAttribute("light", GlPrimitiveType.UBYTE, 2, true); private final String name; private final GlPrimitiveType type; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java similarity index 96% rename from src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java rename to src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java index 55003dc2e..aa4de2447 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.gl.attrib; public class VertexFormat { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexSpec.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexSpec.java new file mode 100644 index 000000000..0b56596fb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexSpec.java @@ -0,0 +1,61 @@ +package com.simibubi.create.foundation.render.gl.attrib; + +import com.google.common.collect.Lists; + +import java.util.ArrayList; +import java.util.function.Consumer; + +public class VertexSpec { + + private final ArrayList groups; + + public VertexSpec() { + groups = Lists.newArrayList(new AttributeGroup(0)); + } + + public VertexSpec(VertexSpec that) { + groups = new ArrayList<>(); + for (AttributeGroup group : that.groups) { + AttributeGroup copy = new AttributeGroup(group.getDivisor()); + + for (VertexAttribute attribute : group.getAttributes()) { + copy.attrib(attribute); + } + + groups.add(copy); + } + } + + public VertexSpec pushGroup() { + return pushGroup(0); + } + + public VertexSpec group(int divisor, Consumer builder) { + AttributeGroup group = new AttributeGroup(divisor); + builder.accept(group); + return group(group); + } + + public VertexSpec pushGroup(int divisor) { + return group(new AttributeGroup(divisor)); + } + + public VertexSpec group(AttributeGroup group) { + groups.add(group); + return this; + } + + public VertexSpec attrib(String name, VertexAttribute attrib) { + return attrib(VertexAttribute.copy(name, attrib)); + } + + public VertexSpec attrib(VertexAttribute attrib) { + last().attrib(attrib); + return this; + } + + + private AttributeGroup last() { + return groups.get(groups.size() - 1); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java deleted file mode 100644 index d6ab91d97..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/AllShaderPrograms.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.simibubi.create.foundation.render.gl.shader; - -import com.simibubi.create.Create; -import net.minecraft.util.ResourceLocation; - -public enum AllShaderPrograms { - ROTATING("shader/rotating.vert", "shader/instanced.frag"), - BELT("shader/belt.vert", "shader/instanced.frag"), - CONTRAPTION_STRUCTURE("shader/contraption_structure.vert", "shader/contraption.frag"), - CONTRAPTION_ROTATING("shader/contraption_rotating.vert", "shader/contraption.frag"), - CONTRAPTION_BELT("shader/contraption_belt.vert", "shader/contraption.frag"), - CONTRAPTION_ACTOR("shader/contraption_actor.vert", "shader/contraption.frag"), - ; - - public final String vert; - public final String frag; - - AllShaderPrograms(String vert, String frag) { - this.vert = vert; - this.frag = frag; - } -} - -//public class AllShaderPrograms { -// public static final ProgramBuilder ROTATING = new ProgramBuilder(name("rotating")) -// .vert(vert("rotating")) -// .frag(frag("instanced")); -// public static final ProgramBuilder BELT = new ProgramBuilder(name("belt")) -// .vert(vert("belt")) -// .frag(frag("instanced")); -// public static final ProgramBuilder CONTRAPTION_STRUCTURE = new ProgramBuilder(name("contraption_structure")) -// .vert(vert("contraption_structure")) -// .frag(frag("contraption_structure")); -// public static final ProgramBuilder CONTRAPTION_ROTATING = new ProgramBuilder(name("contraption_rotating")) -// .vert(vert("contraption_rotating")) -// .frag(frag("contraption")); -// public static final ProgramBuilder CONTRAPTION_BELT = new ProgramBuilder(name("contraption_belt")) -// .vert(vert("contraption_belt")) -// .frag(frag("contraption")); -// public static final ProgramBuilder CONTRAPTION_ACTOR = new ProgramBuilder(name("contraption_actor")) -// .vert(vert("contraption_actor")) -// .frag(frag("contraption")); -// -// private static ResourceLocation vert(String file) { -// return new ResourceLocation(Create.ID, "shader/" + file + ".vert"); -// } -// -// private static ResourceLocation frag(String file) { -// return new ResourceLocation(Create.ID, "shader/" + file + ".vert"); -// } -// -// private static ResourceLocation name(String name) { -// return new ResourceLocation(Create.ID, name); -// } -//} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java new file mode 100644 index 000000000..f4c89d3b4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java @@ -0,0 +1,119 @@ +package com.simibubi.create.foundation.render.gl.shader; + +import com.simibubi.create.foundation.render.gl.GlObject; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL20; + +public abstract class GlProgram extends GlObject { + + public final ResourceLocation name; + + protected GlProgram(ResourceLocation name, int handle) { + setHandle(handle); + this.name = name; + } + + public static Builder builder(ResourceLocation name) { + return new Builder(name); + } + + public void bind() { + GL20.glUseProgram(handle()); + } + + public void unbind() { + GL20.glUseProgram(0); + } + + /** + * Retrieves the index of the uniform with the given name. + * @param uniform The name of the uniform to find the index of + * @return The uniform's index + * @throws NullPointerException If no uniform exists with the given name + */ + public int getUniformLocation(String uniform) { + int index = GL20.glGetUniformLocation(this.handle(), uniform); + + if (index < 0) { + ShaderHelper.log.error("No uniform exists in program '" + this.name + "' with name: " + uniform); + } + + return index; + } + + /** + * Binds a sampler uniform to the given texture unit. + * @param name The name of the sampler uniform. + * @param binding The index of the texture unit. + * @return The sampler uniform's index. + * @throws NullPointerException If no uniform exists with the given name. + */ + public int setSamplerBinding(String name, int binding) { + int samplerUniform = getUniformLocation(name); + + if (samplerUniform >= 0) { + GL20.glUniform1i(samplerUniform, binding); + } + + return samplerUniform; + } + + @Override + protected void deleteInternal(int handle) { + GL20.glDeleteProgram(handle); + } + + public static class Builder { + private final ResourceLocation name; + private final int program; + + public Builder(ResourceLocation name) { + this.name = name; + this.program = GL20.glCreateProgram(); + } + + public Builder attachShader(GlShader shader) { + GL20.glAttachShader(this.program, shader.handle()); + + return this; + } + + /** + * Links the attached shaders to this program and returns a user-defined container which wraps the shader + * program. This container can, for example, provide methods for updating the specific uniforms of that shader + * set. + * + * @param factory The factory which will create the shader program's container + * @param

The type which should be instantiated with the new program's handle + * @return An instantiated shader container as provided by the factory + */ + public

P build(ProgramFactory

factory) { + GL20.glLinkProgram(this.program); + + String log = GL20.glGetProgramInfoLog(this.program); + + if (!log.isEmpty()) { + ShaderHelper.log.warn("Program link log for " + this.name + ": " + log); + } + + int result = GL20.glGetProgrami(this.program, GL20.GL_LINK_STATUS); + + if (result != GL20.GL_TRUE) { + throw new RuntimeException("Shader program linking failed, see log for details"); + } + + return factory.create(this.name, this.program); + } + +// public Builder bindAttribute(String name, GlVertexAttribute attribute) { +// GL20.glBindAttribLocation(this.program, attribute.getIndex(), name); +// +// return this; +// } + } + + @FunctionalInterface + public interface ProgramFactory

{ + P create(ResourceLocation name, int handle); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java new file mode 100644 index 000000000..8352d159c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java @@ -0,0 +1,53 @@ +package com.simibubi.create.foundation.render.gl.shader; + +import com.simibubi.create.foundation.render.gl.GlObject; +import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; +import com.simibubi.create.foundation.render.gl.shader.ShaderType; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL20; + +public class GlShader extends GlObject { + + public final ResourceLocation name; + public final ShaderType type; + + public GlShader(ShaderType type, ResourceLocation name, String source, PreProcessor preProcessor) { + this.type = type; + this.name = name; + int handle = GL20.glCreateShader(type.glEnum); + + if (preProcessor != null) { + source = preProcessor.process(source); + ShaderHelper.log.info("Preprocessor run on " + name + ":\n" + source); + } + + GL20.glShaderSource(handle, source); + GL20.glCompileShader(handle); + + String log = GL20.glGetShaderInfoLog(handle); + + if (!log.isEmpty()) { + ShaderHelper.log.warn("Shader compilation log for " + name + ": " + log); + } + + if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) { + throw new RuntimeException("Could not compile shader"); + } + + setHandle(handle); + } + + @Override + protected void deleteInternal(int handle) { + GL20.glDeleteShader(handle); + } + + @FunctionalInterface + public interface PreProcessor { + String process(String source); + + default PreProcessor andThen(PreProcessor that) { + return source -> that.process(this.process(source)); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramBuilder.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramBuilder.java deleted file mode 100644 index a427f02fb..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramBuilder.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.simibubi.create.foundation.render.gl.shader; - -import net.minecraft.util.ResourceLocation; - -import java.util.EnumMap; -import java.util.Map; - -public class ProgramBuilder { - - private final ResourceLocation name; - private final Map shaders; - - private ShaderConstants constants; - - public ProgramBuilder(ResourceLocation name) { - this.name = name; - shaders = new EnumMap<>(ShaderType.class); - } - - public ResourceLocation getName() { - return name; - } - - public Map getShaders() { - return shaders; - } - - public ShaderConstants getConstants() { - return constants; - } - - public ProgramBuilder setConstants(ShaderConstants constants) { - this.constants = constants; - return this; - } - - public ProgramBuilder vert(ResourceLocation file) { - return shader(ShaderType.VERTEX, file); - } - - public ProgramBuilder frag(ResourceLocation file) { - return shader(ShaderType.FRAGMENT, file); - } - - public ProgramBuilder shader(ShaderType type, ResourceLocation file) { - shaders.put(type, file); - return this; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java new file mode 100644 index 000000000..bdf25dece --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java @@ -0,0 +1,37 @@ +package com.simibubi.create.foundation.render.gl.shader; + +import com.simibubi.create.Create; +import net.minecraft.util.ResourceLocation; + +public class ProgramSpec

{ + + public final ResourceLocation name; + public final ResourceLocation vert; + public final ResourceLocation frag; + + public final ShaderConstants defines; + + public final GlProgram.ProgramFactory

factory; + + public ProgramSpec(String name, ResourceLocation vert, ResourceLocation frag, GlProgram.ProgramFactory

factory) { + this(name, vert, frag, factory, null); + } + + public ProgramSpec(String name, ResourceLocation vert, ResourceLocation frag, GlProgram.ProgramFactory

factory, ShaderConstants defines) { + this.name = new ResourceLocation(Create.ID, name); + this.vert = vert; + this.frag = frag; + this.defines = defines; + + this.factory = factory; + } + + public ResourceLocation getVert() { + return vert; + } + + public ResourceLocation getFrag() { + return frag; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java index d894b70b2..793e02e85 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java @@ -4,14 +4,14 @@ package com.simibubi.create.foundation.render.gl.shader; * A Callback for when a shader is called. Used to define shader uniforms. */ @FunctionalInterface -public interface ShaderCallback { +public interface ShaderCallback

{ - void call(int shader); + void call(P program); - default ShaderCallback andThen(ShaderCallback other) { - return i -> { - call(i); - other.call(i); + default ShaderCallback

andThen(ShaderCallback

other) { + return program -> { + call(program); + other.call(program); }; } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java index 77fdabba6..87986a2e3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java @@ -1,8 +1,13 @@ package com.simibubi.create.foundation.render.gl.shader; +import java.io.BufferedReader; +import java.io.StringReader; import java.util.ArrayList; +import java.util.Spliterator; +import java.util.stream.Collectors; +import java.util.stream.Stream; -public class ShaderConstants { +public class ShaderConstants implements GlShader.PreProcessor { private final ArrayList defines; @@ -10,7 +15,11 @@ public class ShaderConstants { defines = new ArrayList<>(); } - public ShaderConstants define(String def) { + public static ShaderConstants define(String def) { + return new ShaderConstants().def(def); + } + + public ShaderConstants def(String def) { defines.add(def); return this; } @@ -18,4 +27,21 @@ public class ShaderConstants { public ArrayList getDefines() { return defines; } + + public Stream directives() { + return defines.stream().map(it -> "#define " + it); + } + + @Override + public String process(String source) { + return new BufferedReader(new StringReader(source)).lines().flatMap(line -> { + Stream map = Stream.of(line); + + if (line.startsWith("#version")) { + map = Stream.concat(map, directives()); + } + + return map; + }).collect(Collectors.joining("\n")); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java index 5a107a058..b3742e7ec 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java @@ -1,14 +1,13 @@ package com.simibubi.create.foundation.render.gl.shader; import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.KineticDebugger; +import com.simibubi.create.foundation.render.gl.BasicProgram; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.shader.IShaderManager; +import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.shader.ShaderLinkHelper; -import net.minecraft.client.shader.ShaderLoader; import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; import net.minecraft.util.ResourceLocation; @@ -16,6 +15,7 @@ import net.minecraftforge.resource.ISelectiveResourceReloadListener; import net.minecraftforge.resource.VanillaResourceType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.lwjgl.opengl.GL20; import org.lwjgl.system.MemoryUtil; import javax.annotation.Nullable; @@ -23,143 +23,87 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.FloatBuffer; -import java.util.EnumMap; +import java.util.HashMap; import java.util.Map; public class ShaderHelper { - public static final Logger log = LogManager.getLogger("shader"); + public static final Logger log = LogManager.getLogger(ShaderHelper.class); public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); // TODO: these leak 80 bytes of memory per program launch public static final FloatBuffer VEC3_BUFFER = MemoryUtil.memAllocFloat(3); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); - private static final Map PROGRAMS = new EnumMap<>(AllShaderPrograms.class); + private static final Map> REGISTRY = new HashMap<>(); + private static final Map, GlProgram> PROGRAMS = new HashMap<>(); + + public static

> S register(S spec) { + ResourceLocation name = spec.name; + if (REGISTRY.containsKey(name)) { + throw new IllegalStateException("Program spec '" + name + "' already registered."); + } + REGISTRY.put(name, spec); + return spec; + } - @SuppressWarnings("deprecation") public static void initShaders() { // Can be null when running datagenerators due to the unfortunate time we call this - if (Minecraft.getInstance() != null - && Minecraft.getInstance().getResourceManager() instanceof IReloadableResourceManager) { - ((IReloadableResourceManager) Minecraft.getInstance().getResourceManager()).addReloadListener( - (ISelectiveResourceReloadListener) (manager, predicate) -> { - if (predicate.test(VanillaResourceType.SHADERS)) { - PROGRAMS.values().forEach(ShaderLinkHelper::deleteShader); - PROGRAMS.clear(); - for (AllShaderPrograms shader : AllShaderPrograms.values()) { - createProgram(manager, shader); - } - } - }); + Minecraft mc = Minecraft.getInstance(); + if (mc != null && mc.getResourceManager() instanceof IReloadableResourceManager) { + ISelectiveResourceReloadListener listener = (manager, predicate) -> { + if (predicate.test(VanillaResourceType.SHADERS)) { + PROGRAMS.values().forEach(GlProgram::delete); + PROGRAMS.clear(); + for (ProgramSpec shader : REGISTRY.values()) { + loadProgram(manager, shader); + } + } + }; + ((IReloadableResourceManager) mc.getResourceManager()).addReloadListener(listener); } } - public static int getShaderHandle(AllShaderPrograms shader) { - ShaderProgram shaderProgram = PROGRAMS.get(shader); - - return shaderProgram.getProgram(); - } - - public static ShaderCallback getViewProjectionCallback(Matrix4f projectionMat, Matrix4f viewMat) { - return shader -> { - ShaderHelper.MATRIX_BUFFER.position(0); - projectionMat.write(ShaderHelper.MATRIX_BUFFER); - int projection = GlStateManager.getUniformLocation(shader, "projection"); - GlStateManager.uniformMatrix4(projection, false, ShaderHelper.MATRIX_BUFFER); - - ShaderHelper.MATRIX_BUFFER.position(0); - viewMat.write(ShaderHelper.MATRIX_BUFFER); - int view = GlStateManager.getUniformLocation(shader, "view"); - GlStateManager.uniformMatrix4(view, false, ShaderHelper.MATRIX_BUFFER); - }; - } - - public static int useShader(AllShaderPrograms shader) { - return useShader(shader, null); - } - - public static int useShader(AllShaderPrograms shader, @Nullable ShaderCallback cb) { - ShaderProgram prog = PROGRAMS.get(shader); - if (prog == null) { - return -1; - } - - int program = prog.getProgram(); - ShaderLinkHelper.useProgram(program); - - int time = GlStateManager.getUniformLocation(program, "time"); - FLOAT_BUFFER.position(0); - FLOAT_BUFFER.put(0, AnimationTickHolder.getRenderTick()); - GlStateManager.uniform1(time, FLOAT_BUFFER); - - int ticks = GlStateManager.getUniformLocation(program, "ticks"); - GlStateManager.uniform1(ticks, AnimationTickHolder.ticks); - - int debug = GlStateManager.getUniformLocation(program, "debug"); - GlStateManager.uniform1(debug, KineticDebugger.isActive() ? 1 : 0); - - if (cb != null) { - cb.call(program); - } - - return program; + @SuppressWarnings("unchecked") + public static

> P getProgram(S spec) { + return (P) PROGRAMS.get(spec); } public static void releaseShader() { - ShaderLinkHelper.useProgram(0); + GL20.glUseProgram(0); } - private static void createProgram(IResourceManager manager, AllShaderPrograms shader) { + private static

> void loadProgram(IResourceManager manager, S programSpec) { + GlShader vert = null; + GlShader frag = null; try { - ShaderLoader vert = createShader(manager, shader.vert, ShaderLoader.ShaderType.VERTEX); - ShaderLoader frag = createShader(manager, shader.frag, ShaderLoader.ShaderType.FRAGMENT); - int progId = ShaderLinkHelper.createProgram(); - ShaderProgram prog = new ShaderProgram(progId, vert, frag); - ShaderLinkHelper.linkProgram(prog); - PROGRAMS.put(shader, prog); + vert = loadShader(manager, programSpec.getVert(), ShaderType.VERTEX, programSpec.defines); + frag = loadShader(manager, programSpec.getFrag(), ShaderType.FRAGMENT, programSpec.defines); - log.info("Loaded program {}", shader.name()); + P program = GlProgram.builder(programSpec.name) + .attachShader(vert) + .attachShader(frag) + .build(programSpec.factory); + + PROGRAMS.put(programSpec, program); + + log.info("Loaded program {}", programSpec.name); } catch (IOException ex) { - log.error("Failed to load program {}", shader.name(), ex); + log.error("Failed to load program {}", programSpec.name, ex); + } finally { + if (vert != null) vert.delete(); + if (frag != null) frag.delete(); } } - private static ShaderLoader createShader(IResourceManager manager, String filename, ShaderLoader.ShaderType shaderType) throws IOException { - ResourceLocation loc = new ResourceLocation(Create.ID, filename); - try (InputStream is = new BufferedInputStream(manager.getResource(loc).getInputStream())) { - return ShaderLoader.func_216534_a(shaderType, loc.toString(), is); // , shaderType.name().toLowerCase(Locale.ROOT)); - } - } + private static GlShader loadShader(IResourceManager manager, ResourceLocation name, ShaderType type, GlShader.PreProcessor preProcessor) throws IOException { + try (InputStream is = new BufferedInputStream(manager.getResource(name).getInputStream())) { + String source = TextureUtil.func_225687_b_(is); - private static class ShaderProgram implements IShaderManager { - private final int program; - private final ShaderLoader vert; - private final ShaderLoader frag; - - private ShaderProgram(int program, ShaderLoader vert, ShaderLoader frag) { - this.program = program; - this.vert = vert; - this.frag = frag; - } - - @Override - public int getProgram() { - return program; - } - - @Override - public void markDirty() { - - } - - @Override - public ShaderLoader getVertexShaderLoader() { - return vert; - } - - @Override - public ShaderLoader getFragmentShaderLoader() { - return frag; + if (source == null) { + throw new IOException("Could not load program " + name); + } else { + return new GlShader(type, name, source, preProcessor); + } } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java index ebab415df..ff186f819 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java @@ -1,6 +1,15 @@ package com.simibubi.create.foundation.render.gl.shader; +import org.lwjgl.opengl.GL20; + public enum ShaderType { - VERTEX, - FRAGMENT, + VERTEX(GL20.GL_VERTEX_SHADER), + FRAGMENT(GL20.GL_FRAGMENT_SHADER), + ; + + public final int glEnum; + + ShaderType(int glEnum) { + this.glEnum = glEnum; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java index c202c5c8f..75ef968ad 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java @@ -2,18 +2,20 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.gl.GlPrimitiveType; +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribute; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.VertexFormatElement; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribute.*; public class BeltData extends KineticData { - public static final VertexAttribute TARGET_UV = copy("scrollTexture", VEC4); + public static final VertexAttribute TARGET_UV = copy("scrollTexture", CommonAttributes.VEC4); public static final VertexAttribute SCROLL_MULT = new VertexAttribute("scrollMult", GlPrimitiveType.BYTE, 1, true); - public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, ROTATION, UV, TARGET_UV, SCROLL_MULT); + public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, CommonAttributes.ROTATION, CommonAttributes.UV, TARGET_UV, SCROLL_MULT); private float rotX; private float rotY; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java index d323101a4..19430743d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.render.instancing; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; public class BeltModel extends InstancedModel { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java index ebe8844e2..0b40e50af 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.gl.GlBuffer; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; public abstract class DynamicInstancedModel extends InstancedModel { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java index 263b4af17..aceff9855 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.render.InstancedTileRenderer; import net.minecraft.tileentity.TileEntity; @FunctionalInterface diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java deleted file mode 100644 index 1d1ef8c3f..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceContext.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.render.InstancedTileRenderer; -import net.minecraft.tileentity.TileEntity; - -@Deprecated -public abstract class InstanceContext { - - public final T te; - - public InstanceContext(T te) { - this.te = te; - } - - public RenderMaterial> getRotating() { - return getKinetics().get(KineticRenderMaterials.ROTATING); - } - - public RenderMaterial> getBelts() { - return getKinetics().get(KineticRenderMaterials.BELTS); - } - - public abstract InstancedTileRenderer getKinetics(); - - public abstract boolean checkWorldLight(); - - public static class World extends InstanceContext { - - public World(T te) { - super(te); - } - - @Override - public InstancedTileRenderer getKinetics() { - return CreateClient.kineticRenderer; - } - - @Override - public boolean checkWorldLight() { - return true; - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java index bddec4394..b6b70e6e2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java @@ -3,6 +3,8 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.BufferedModel; import com.simibubi.create.foundation.render.RenderMath; +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; @@ -15,10 +17,8 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.function.Consumer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; - public abstract class InstancedModel extends BufferedModel { - public static final VertexFormat FORMAT = new VertexFormat(POSITION, NORMAL, UV); + public static final VertexFormat FORMAT = new VertexFormat(CommonAttributes.POSITION, CommonAttributes.NORMAL, CommonAttributes.UV); protected GlBuffer instanceVBO; protected int glBufferSize = -1; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java index 64c0012db..3e8d402f8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java @@ -1,7 +1,6 @@ package com.simibubi.create.foundation.render.instancing; import com.google.common.collect.Maps; -import com.simibubi.create.foundation.render.InstancedTileRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java similarity index 63% rename from src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java rename to src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java index 8f11476b0..52d15de52 100644 --- a/src/main/java/com/simibubi/create/foundation/render/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java @@ -1,9 +1,9 @@ -package com.simibubi.create.foundation.render; +package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.render.gl.shader.AllShaderPrograms; +import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.gl.BasicProgram; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; -import com.simibubi.create.foundation.render.instancing.*; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; @@ -13,23 +13,20 @@ import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; -public class InstancedTileRenderer { - protected Map> renderers = new HashMap<>(); +public abstract class InstancedTileRenderer

{ + protected Map> instances = new HashMap<>(); - protected Map, RenderMaterial> materials = new HashMap<>(); + protected Map, RenderMaterial> materials = new HashMap<>(); - public InstancedTileRenderer() { + protected InstancedTileRenderer() { registerMaterials(); } - public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllShaderPrograms.BELT, BeltModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllShaderPrograms.ROTATING, RotatingModel::new)); - } + public abstract void registerMaterials(); @SuppressWarnings("unchecked") - public > RenderMaterial get(MaterialType materialType) { - return (RenderMaterial) materials.get(materialType); + public > RenderMaterial getMaterial(MaterialType materialType) { + return (RenderMaterial) materials.get(materialType); } @Nullable @@ -40,7 +37,7 @@ public class InstancedTileRenderer { @SuppressWarnings("unchecked") @Nullable public TileEntityInstance getInstance(T tile, boolean create) { - TileEntityInstance instance = renderers.get(tile); + TileEntityInstance instance = instances.get(tile); if (instance != null) { return (TileEntityInstance) instance; @@ -49,7 +46,7 @@ public class InstancedTileRenderer { if (renderer != null) { FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(tile); - renderers.put(tile, renderer); + instances.put(tile, renderer); } return renderer; @@ -88,7 +85,7 @@ public class InstancedTileRenderer { if (instance != null) { instance.remove(); - renderers.remove(tile); + instances.remove(tile); } } } @@ -97,25 +94,25 @@ public class InstancedTileRenderer { // Clean up twice a second. This doesn't have to happen every tick, // but this does need to be run to ensure we don't miss anything. if (AnimationTickHolder.ticks % 10 == 0) { - renderers.keySet().stream().filter(TileEntity::isRemoved).forEach(renderers::remove); + instances.keySet().stream().filter(TileEntity::isRemoved).forEach(instances::remove); } } public void invalidate() { - for (RenderMaterial material : materials.values()) { + for (RenderMaterial material : materials.values()) { material.delete(); } - renderers.clear(); + instances.clear(); } - public void render(RenderType layer, Matrix4f projection, Matrix4f view) { - render(layer, projection, view, null); + public void render(RenderType layer, Matrix4f viewProjection) { + render(layer, viewProjection, null); } - public void render(RenderType layer, Matrix4f projection, Matrix4f view, ShaderCallback callback) { - for (RenderMaterial material : materials.values()) { + public void render(RenderType layer, Matrix4f viewProjection, ShaderCallback

callback) { + for (RenderMaterial material : materials.values()) { if (material.canRenderInLayer(layer)) - material.render(layer, projection, view, callback); + material.render(layer, viewProjection, callback); } ShaderHelper.releaseShader(); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java index 41ff3d0ab..99d33cf8c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java @@ -1,19 +1,22 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribute; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import com.simibubi.create.foundation.utility.ColorHelper; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; +import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribute.*; public class KineticData> extends InstanceData { - public static final VertexAttribute ROTATION_CENTER = copy("rotationCenter", VEC3); - public static final VertexAttribute SPEED = copy("speed", FLOAT); - public static final VertexAttribute OFFSET = copy("offset", FLOAT); - public static final VertexFormat FORMAT = new VertexFormat(INSTANCE_POSITION, LIGHT, RGB, SPEED, OFFSET); + public static final VertexAttribute ROTATION_CENTER = copy("rotationCenter", CommonAttributes.VEC3); + public static final VertexAttribute SPEED = copy("speed", CommonAttributes.FLOAT); + public static final VertexAttribute OFFSET = copy("offset", CommonAttributes.FLOAT); + public static final VertexFormat FORMAT = new VertexFormat(CommonAttributes.INSTANCE_POSITION, CommonAttributes.LIGHT, CommonAttributes.RGB, SPEED, OFFSET); private float x; private float y; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java index 14242ad75..9a0520071 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java @@ -7,7 +7,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.render.gl.shader.AllShaderPrograms; +import com.simibubi.create.foundation.render.gl.BasicProgram; +import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import net.minecraft.block.BlockState; @@ -29,24 +30,24 @@ import java.util.function.Supplier; import static com.simibubi.create.foundation.render.Compartment.PARTIAL; -public class RenderMaterial> { +public class RenderMaterial

> { protected final Map, Cache> models; protected final ModelFactory factory; - protected final AllShaderPrograms shader; + protected final ProgramSpec

programSpec; protected final Predicate layerPredicate; /** * Creates a material that renders in the default layer (CUTOUT_MIPPED) */ - public RenderMaterial(AllShaderPrograms shader, ModelFactory factory) { - this(shader, factory, type -> type == RenderType.getCutoutMipped()); + public RenderMaterial(ProgramSpec

programSpec, ModelFactory factory) { + this(programSpec, factory, type -> type == RenderType.getCutoutMipped()); } - public RenderMaterial(AllShaderPrograms shader, ModelFactory factory, Predicate layerPredicate) { + public RenderMaterial(ProgramSpec

programSpec, ModelFactory factory, Predicate layerPredicate) { this.models = new HashMap<>(); this.factory = factory; - this.shader = shader; + this.programSpec = programSpec; this.layerPredicate = layerPredicate; registerCompartment(Compartment.PARTIAL); registerCompartment(Compartment.DIRECTIONAL_PARTIAL); @@ -57,16 +58,16 @@ public class RenderMaterial> { return layerPredicate.test(layer); } - public void render(RenderType layer, Matrix4f projection, Matrix4f view) { - render(layer, projection, view, null); + public void render(RenderType layer, Matrix4f projection) { + render(layer, projection, null); } - public void render(RenderType layer, Matrix4f projection, Matrix4f view, ShaderCallback setup) { - ShaderCallback cb = ShaderHelper.getViewProjectionCallback(projection, view); + public void render(RenderType layer, Matrix4f viewProjection, ShaderCallback

setup) { + P program = ShaderHelper.getProgram(programSpec); + program.bind(viewProjection, 0); - if (setup != null) cb = cb.andThen(setup); + if (setup != null) setup.call(program); - ShaderHelper.useShader(shader, cb); makeRenderCalls(); teardown(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java index 2d2dc99e1..d3a1540c7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java @@ -1,11 +1,12 @@ package com.simibubi.create.foundation.render.instancing; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.Direction; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.NORMAL; +import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.NORMAL; public class RotatingData extends KineticData { public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, NORMAL); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java index 4b6a47150..8c1d2de81 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.render.instancing; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; public class RotatingModel extends InstancedModel { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java index 1d1762e3a..b4e9db47c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.render.instancing; -import com.simibubi.create.foundation.render.InstancedTileRenderer; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -8,13 +7,13 @@ import net.minecraft.world.World; public abstract class TileEntityInstance { - protected final InstancedTileRenderer modelManager; + protected final InstancedTileRenderer modelManager; protected final T tile; protected final World world; protected final BlockPos pos; protected BlockState lastState; - public TileEntityInstance(InstancedTileRenderer modelManager, T tile) { + public TileEntityInstance(InstancedTileRenderer modelManager, T tile) { this.modelManager = modelManager; this.tile = tile; this.world = tile.getWorld(); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java index 613ff90bd..e19c5e1db 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java @@ -1,13 +1,12 @@ package com.simibubi.create.foundation.render.instancing.actors; import com.simibubi.create.foundation.render.instancing.InstanceData; -import com.simibubi.create.foundation.render.instancing.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.Vector3f; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.NORMAL; +import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.NORMAL; public class DynamicRotatingActorData extends InstanceData { public static VertexFormat FORMAT = new VertexFormat(NORMAL); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java index 5bdfe4c9b..672798d7b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.render.instancing.actors; import com.simibubi.create.foundation.render.instancing.DynamicInstancedModel; -import com.simibubi.create.foundation.render.instancing.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; public class RotatingActorModel extends DynamicInstancedModel { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java index 16ee52c25..8e2a3c255 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java @@ -1,16 +1,15 @@ package com.simibubi.create.foundation.render.instancing.actors; +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; import com.simibubi.create.foundation.render.instancing.InstanceData; -import com.simibubi.create.foundation.render.instancing.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.instancing.VertexAttribute.*; - public class StaticRotatingActorData extends InstanceData { - public static VertexFormat FORMAT = new VertexFormat(POSITION, LIGHT, FLOAT, NORMAL, VEC3, NORMAL); + public static VertexFormat FORMAT = new VertexFormat(CommonAttributes.POSITION, CommonAttributes.LIGHT, CommonAttributes.FLOAT, CommonAttributes.NORMAL, CommonAttributes.VEC3, CommonAttributes.NORMAL); private float x; private float y; diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index de852ff85..423c41cb4 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -16,15 +16,23 @@ layout (location = 10) in vec4 scrollTexture; layout (location = 11) in float scrollMult; out vec2 TexCoords; -out vec2 Light; -out float Diffuse; out vec4 Color; +out float Diffuse; +out vec2 Light; + +#if defined(CONTRAPTION) +out vec3 BoxCoord; + +uniform vec3 uLightBoxSize; +uniform vec3 uLightBoxMin; +uniform mat4 uModel; +#endif + +uniform int uTicks; +uniform float uTime; +uniform mat4 uViewProjection; +uniform int uDebug; -uniform float time; -uniform int ticks; -uniform mat4 projection; -uniform mat4 view; -uniform int debug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -37,10 +45,6 @@ mat4 rotate(vec3 axis, float angle) { 0, 0, 0, 1); } -mat4 rotation(vec3 rot) { - return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); -} - float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; @@ -48,6 +52,10 @@ float diffuse(vec3 normal) { return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); } +mat4 rotation(vec3 rot) { + return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); +} + mat4 localRotation() { vec3 rot = fract(eulerAngles / 360) * PI * 2; return rotation(rot); @@ -55,23 +63,41 @@ mat4 localRotation() { void main() { mat4 localRotation = localRotation(); - vec4 renderPos = localRotation * vec4(aPos - vec3(.5), 1) + vec4(instancePos + vec3(.5), 0); + vec4 worldPos = localRotation * vec4(aPos - .5, 1) + vec4(instancePos + .5, 0); + + #ifdef CONTRAPTION + + worldPos = uModel * worldPos; + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + + mat4 normalMat = uModel * localRotation; + #else + mat4 normalMat = localRotation; + #endif + + vec3 norm = normalize(normalMat * vec4(aNormal, 0)).xyz; float scrollSize = scrollTexture.w - scrollTexture.y; - float scroll = fract(speed * time / (36 * 16) + offset) * scrollSize * scrollMult; - - vec3 norm = (localRotation * vec4(aNormal, 0)).xyz; + float scroll = fract(speed * uTime / (36 * 16) + offset) * scrollSize * scrollMult; Diffuse = diffuse(norm); - Light = light; TexCoords = aTexCoords - uv + scrollTexture.xy + vec2(0, scroll); - gl_Position = projection * view * renderPos; + Light = light; + gl_Position = uViewProjection * worldPos; - if (debug == 1) { - Color = vec4(networkTint, 1); - } else if (debug == 2) { + #ifdef CONTRAPTION + if (uDebug == 2) { Color = vec4(norm, 1); } else { Color = vec4(1); } + #else + if (uDebug == 1) { + Color = vec4(networkTint, 1); + } else if (uDebug == 2) { + Color = vec4(norm, 1); + } else { + Color = vec4(1); + } + #endif } diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index b8a07b4dc..8628a2d1f 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -1,24 +1,25 @@ -#version 440 core +#version 330 core in vec2 TexCoords; in vec4 Color; in float Diffuse; +in vec2 Light; + in vec3 BoxCoord; -in vec2 ModelLight; out vec4 fragColor; -layout(binding=0) uniform sampler2D BlockAtlas; -layout(binding=2) uniform sampler2D LightMap; -layout(binding=4) uniform sampler3D LightVolume; +uniform sampler2D uBlockAtlas; +uniform sampler2D uLightMap; +uniform sampler3D uLightVolume; vec4 light() { - vec2 lm = texture(LightVolume, BoxCoord).rg * 0.9375 + 0.03125; - return texture2D(LightMap, max(lm, ModelLight)); + vec2 lm = texture(uLightVolume, BoxCoord).rg * 0.9375 + 0.03125; + return texture2D(uLightMap, max(lm, Light)); } void main() { - vec4 tex = texture2D(BlockAtlas, TexCoords); + vec4 tex = texture2D(uBlockAtlas, TexCoords); fragColor = vec4(tex.rgb * light().rgb * Diffuse * Color.rgb, tex.a); } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index e0f1b59ef..f5d4f25ce 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -20,17 +20,16 @@ out float Diffuse; out vec2 TexCoords; out vec4 Color; out vec3 BoxCoord; -out vec2 ModelLight; +out vec2 Light; -uniform vec3 lightBoxSize; -uniform vec3 lightBoxMin; -uniform mat4 model; +uniform vec3 uLightBoxSize; +uniform vec3 uLightBoxMin; +uniform mat4 uModel; -uniform float time; -uniform int ticks; -uniform mat4 projection; -uniform mat4 view; -uniform int debug; +uniform int uTicks; +uniform float uTime; +uniform mat4 uViewProjection; +uniform int uDebug; mat4 rotate(vec3 axis, float angle) { @@ -57,7 +56,7 @@ mat4 rotation(vec3 rot) { mat4 kineticRotation() { const float speed = -20; - float degrees = rotationOffset + time * speed * -3/10; + float degrees = rotationOffset + uTime * speed * -3/10; float angle = fract(degrees / 360) * PI * 2; return rotate(normalize(localRotationAxis), angle); @@ -72,17 +71,17 @@ void main() { mat4 localRot = rotation(rot); localPos = localRot * vec4(localPos.xyz - .5, 1) + vec4(instancePos + .5, 0); - vec4 worldPos = model * localPos; + vec4 worldPos = uModel * localPos; - vec3 norm = normalize(model * localRot * kineticRotation * vec4(aNormal, 0)).xyz; + vec3 norm = normalize(uModel * localRot * kineticRotation * vec4(aNormal, 0)).xyz; - BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; Diffuse = diffuse(norm); TexCoords = aTexCoords; - ModelLight = modelLight; - gl_Position = projection * view * worldPos; + Light = modelLight; + gl_Position = uViewProjection * worldPos; - if (debug == 2) { + if (uDebug == 2) { Color = vec4(norm, 1); } else { Color = vec4(1); diff --git a/src/main/resources/assets/create/shader/contraption_belt.vert b/src/main/resources/assets/create/shader/contraption_belt.vert deleted file mode 100644 index 520e5ce72..000000000 --- a/src/main/resources/assets/create/shader/contraption_belt.vert +++ /dev/null @@ -1,84 +0,0 @@ -#version 420 core -#define PI 3.1415926538 - -layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aNormal; -layout (location = 2) in vec2 aTexCoords; - -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 light; -layout (location = 5) in vec3 networkTint; -layout (location = 6) in float speed; -layout (location = 7) in float offset; -layout (location = 8) in vec3 eulerAngles; -layout (location = 9) in vec2 uv; -layout (location = 10) in vec4 scrollTexture; -layout (location = 11) in float scrollMult; - -out float Diffuse; -out vec2 TexCoords; -out vec4 Color; -out vec3 BoxCoord; -out vec2 ModelLight; - -uniform vec3 lightBoxSize; -uniform vec3 lightBoxMin; -uniform mat4 model; - -uniform float time; -uniform int ticks; -uniform mat4 projection; -uniform mat4 view; -uniform int debug; - - -mat4 rotate(vec3 axis, float angle) { - float s = sin(angle); - float c = cos(angle); - float oc = 1 - c; - - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, - 0, 0, 0, 1); -} - -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); -} - -mat4 rotation(vec3 rot) { - return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); -} - -mat4 localRotation() { - vec3 rot = fract(eulerAngles / 360) * PI * 2; - return rotation(rot); -} - -void main() { - mat4 localRotation = localRotation(); - vec4 localPos = localRotation * vec4(aPos - .5, 1) + vec4(instancePos + .5, 0); - - vec4 worldPos = model * localPos; - - float scrollSize = scrollTexture.w - scrollTexture.y; - float scroll = fract(speed * time / (36 * 16) + offset) * scrollSize * scrollMult; - - vec3 norm = normalize(model * localRotation * vec4(aNormal, 0)).xyz; - - BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(norm); - TexCoords = aTexCoords - uv + scrollTexture.xy + vec2(0, scroll); - ModelLight = light; - gl_Position = projection * view * worldPos; - - if (debug == 2) { - Color = vec4(norm, 1); - } else { - Color = vec4(1); - } -} diff --git a/src/main/resources/assets/create/shader/contraption_rotating.vert b/src/main/resources/assets/create/shader/contraption_rotating.vert deleted file mode 100644 index 6b91caf3e..000000000 --- a/src/main/resources/assets/create/shader/contraption_rotating.vert +++ /dev/null @@ -1,79 +0,0 @@ -#version 330 core -#define PI 3.1415926538 -layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aNormal; -layout (location = 2) in vec2 aTexCoords; - -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 light; -layout (location = 5) in vec3 networkTint; -layout (location = 6) in float speed; -layout (location = 7) in float offset; -layout (location = 8) in vec3 rotationAxis; - -out float Diffuse; -out vec2 TexCoords; -out vec4 Color; -out vec3 BoxCoord; -out vec2 ModelLight; - -uniform vec3 lightBoxSize; -uniform vec3 lightBoxMin; -uniform mat4 model; - -uniform float time; -uniform int ticks; -uniform mat4 projection; -uniform mat4 view; -uniform int debug; - - -mat4 rotate(vec3 axis, float angle) { - float s = sin(angle); - float c = cos(angle); - float oc = 1 - c; - - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, - 0, 0, 0, 1); -} - -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); -} - -mat4 rotation(vec3 rot) { - return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); -} - -mat4 kineticRotation() { - float degrees = offset + time * speed * -3/10; - float angle = fract(degrees / 360) * PI * 2; - - return rotate(rotationAxis, angle); -} - -void main() { - mat4 kineticRotation = kineticRotation(); - vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1) + vec4(instancePos + .5, 0); - - vec4 worldPos = model * localPos; - - vec3 norm = normalize(model * kineticRotation * vec4(aNormal, 0)).xyz; - - BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; - Diffuse = diffuse(norm); - TexCoords = aTexCoords; - ModelLight = light; - gl_Position = projection * view * worldPos; - - if (debug == 2) { - Color = vec4(norm, 1); - } else { - Color = vec4(1); - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_structure.vert b/src/main/resources/assets/create/shader/contraption_structure.vert index 9547cf0bd..c88226023 100644 --- a/src/main/resources/assets/create/shader/contraption_structure.vert +++ b/src/main/resources/assets/create/shader/contraption_structure.vert @@ -1,4 +1,4 @@ -#version 440 core +#version 330 core #define PI 3.1415926538 layout (location = 0) in vec3 aPos; @@ -11,17 +11,16 @@ out float Diffuse; out vec2 TexCoords; out vec4 Color; out vec3 BoxCoord; -out vec2 ModelLight; +out vec2 Light; -uniform vec3 lightBoxSize; -uniform vec3 lightBoxMin; -uniform mat4 model; +uniform vec3 uLightBoxSize; +uniform vec3 uLightBoxMin; +uniform mat4 uModel; -uniform float time; -uniform int ticks; -uniform mat4 projection; -uniform mat4 view; -uniform int debug; +uniform int uTicks; +uniform float uTime; +uniform mat4 uViewProjection; +uniform int uDebug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -42,18 +41,18 @@ float diffuse(vec3 normal) { } void main() { - vec4 worldPos = model * vec4(aPos, 1); + vec4 worldPos = uModel * vec4(aPos, 1); - vec3 norm = (model * vec4(aNormal, 0)).xyz; + vec3 norm = (uModel * vec4(aNormal, 0)).xyz; - BoxCoord = (worldPos.xyz - lightBoxMin) / lightBoxSize; + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; Diffuse = diffuse(norm); Color = aColor / diffuse(aNormal); TexCoords = aTexCoords; - ModelLight = modelLight; - gl_Position = projection * view * worldPos; + Light = modelLight; + gl_Position = uViewProjection * worldPos; - if (debug == 2) { + if (uDebug == 2) { Color = vec4(norm, 1); } else { Color = aColor / diffuse(aNormal); diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index 1dc3b376b..626c0d055 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -1,4 +1,4 @@ -#version 440 core +#version 330 core in vec2 TexCoords; in vec2 Light; @@ -7,16 +7,16 @@ in vec4 Color; out vec4 fragColor; -layout(binding=0) uniform sampler2D BlockAtlas; -layout(binding=2) uniform sampler2D LightMap; +uniform sampler2D uBlockAtlas; +uniform sampler2D uLightMap; vec4 light() { vec2 lm = Light * 0.9375 + 0.03125; - return texture2D(LightMap, lm); + return texture2D(uLightMap, lm); } void main() { - vec4 tex = texture2D(BlockAtlas, TexCoords); + vec4 tex = texture2D(uBlockAtlas, TexCoords); fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a) * Color; } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index 42d22357d..f87dc02b4 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -12,15 +12,22 @@ layout (location = 7) in float offset; layout (location = 8) in vec3 rotationAxis; out vec2 TexCoords; -out vec2 Light; -out float Diffuse; out vec4 Color; +out float Diffuse; +out vec2 Light; -uniform float time; -uniform int ticks; -uniform mat4 projection; -uniform mat4 view; -uniform int debug; +#if defined(CONTRAPTION) +out vec3 BoxCoord; + +uniform vec3 uLightBoxSize; +uniform vec3 uLightBoxMin; +uniform mat4 uModel; +#endif + +uniform int uTicks; +uniform float uTime; +uniform mat4 uViewProjection; +uniform int uDebug; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -45,7 +52,7 @@ mat4 rotation(vec3 rot) { } mat4 kineticRotation() { - float degrees = offset + time * speed * -3/10; + float degrees = offset + uTime * speed * -3/10; float angle = fract(degrees / 360) * PI * 2; return rotate(rotationAxis, angle); @@ -53,20 +60,38 @@ mat4 kineticRotation() { void main() { mat4 kineticRotation = kineticRotation(); - vec4 localPos = kineticRotation * vec4(aPos - 0.5, 1) + vec4(instancePos + .5, 0); + vec4 worldPos = kineticRotation * vec4(aPos - 0.5, 1) + vec4(instancePos + .5, 0); - vec3 norm = (kineticRotation * vec4(aNormal, 0)).xyz; + #ifdef CONTRAPTION + + worldPos = uModel * worldPos; + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + + mat4 normalMat = uModel * kineticRotation; + #else + mat4 normalMat = kineticRotation; + #endif + + vec3 norm = normalize(normalMat * vec4(aNormal, 0)).xyz; Diffuse = diffuse(norm); TexCoords = aTexCoords; - gl_Position = projection * view * localPos; Light = light; + gl_Position = uViewProjection * worldPos; - if (debug == 1) { - Color = vec4(networkTint, 1); - } else if (debug == 2) { + #ifdef CONTRAPTION + if (uDebug == 2) { Color = vec4(norm, 1); } else { Color = vec4(1); } + #else + if (uDebug == 1) { + Color = vec4(networkTint, 1); + } else if (uDebug == 2) { + Color = vec4(norm, 1); + } else { + Color = vec4(1); + } + #endif } \ No newline at end of file From 456ed364a41545e3e1cd41ba62f584641e7e0690 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 4 Feb 2021 00:03:37 -0800 Subject: [PATCH 070/147] Fix another issue with ghost instances. Hopefully fix belt lighting issues. --- .../contraptions/relays/belt/BeltTileEntity.java | 14 +++++++++++--- .../render/instancing/InstancedModel.java | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index acb2d0865..84a60d265 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -125,6 +125,9 @@ public class BeltTileEntity extends KineticTileEntity { BeltMovementHandler.transportEntity(this, entity, info); }); toRemove.forEach(passengers::remove); + + if (blockLight == -1) + updateLight(); } @Override @@ -216,7 +219,7 @@ public class BeltTileEntity extends KineticTileEntity { if (!clientPacket) return; - updateLight(); + if (casingBefore == casing) return; requestModelDataUpdate(); @@ -484,7 +487,12 @@ public class BeltTileEntity extends KineticTileEntity { } private void updateLight() { - skyLight = (byte) world.getLightLevel(LightType.SKY, pos); - blockLight = (byte) world.getLightLevel(LightType.BLOCK, pos); + if (world != null) { + skyLight = (byte) world.getLightLevel(LightType.SKY, pos); + blockLight = (byte) world.getLightLevel(LightType.BLOCK, pos); + } else { + skyLight = -1; + blockLight = -1; + } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java index b6b70e6e2..7253675dd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java @@ -92,8 +92,8 @@ public abstract class InstancedModel extends BufferedMod keys.get(i).index--; } - markIndexChanged(index - 1); maxIndexChanged = keys.size() - 1; + markIndexChanged(Math.min(maxIndexChanged, index)); key.invalidate(); } From d50e07369bf04c064a65b43defbb6fde4f026b79 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 4 Feb 2021 19:21:25 -0800 Subject: [PATCH 071/147] flywheels render with the new tech, and therefore have more accurate lighting --- .../com/simibubi/create/AllTileEntities.java | 3 +- .../contraptions/base/HalfShaftInstance.java | 7 +- .../base/HorizontalHalfShaftInstance.java | 4 +- .../components/flywheel/FlyWheelInstance.java | 72 +++++++++++++++++++ .../components/flywheel/FlywheelRenderer.java | 6 +- 5 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 8fb212476..fcf40110d 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -17,6 +17,7 @@ import com.simibubi.create.content.contraptions.components.fan.EncasedFanRendere import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity; import com.simibubi.create.content.contraptions.components.fan.FanInstance; import com.simibubi.create.content.contraptions.components.fan.NozzleTileEntity; +import com.simibubi.create.content.contraptions.components.flywheel.FlyWheelInstance; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; import com.simibubi.create.content.contraptions.components.flywheel.engine.EngineRenderer; @@ -372,7 +373,7 @@ public class AllTileEntities { .tileEntity("flywheel", FlywheelTileEntity::new) .validBlocks(AllBlocks.FLYWHEEL) .renderer(() -> FlywheelRenderer::new) - .onRegister(HorizontalHalfShaftInstance::register) + .onRegister(FlyWheelInstance::register) .register(); public static final TileEntityEntry FURNACE_ENGINE = Create.registrate() diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java index d25b28b73..fc85c9193 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -18,18 +18,17 @@ public class HalfShaftInstance extends SingleRotatingInstance { InstancedTileRenderRegistry.instance.register(type, HalfShaftInstance::new)); } - public HalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public HalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } @Override protected InstancedModel getModel() { - BlockState state = tile.getBlockState(); Direction dir = getShaftDirection(); - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, state, dir); + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, dir); } protected Direction getShaftDirection() { - return tile.getBlockState().get(BlockStateProperties.FACING); + return lastState.get(BlockStateProperties.FACING); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java index 4c4af041f..7c20f6959 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java @@ -14,12 +14,12 @@ public class HorizontalHalfShaftInstance extends HalfShaftInstance { InstancedTileRenderRegistry.instance.register(type, HorizontalHalfShaftInstance::new)); } - public HorizontalHalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public HorizontalHalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } @Override protected Direction getShaftDirection() { - return tile.getBlockState().get(BlockStateProperties.HORIZONTAL_FACING).getOpposite(); + return lastState.get(BlockStateProperties.HORIZONTAL_FACING).getOpposite(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java new file mode 100644 index 000000000..c0b7405e8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -0,0 +1,72 @@ +package com.simibubi.create.content.contraptions.components.flywheel; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.base.KineticTileInstance; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.instancing.*; +import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.Rotation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +import java.util.function.Consumer; + +public class FlyWheelInstance extends KineticTileInstance { + public static void register(TileEntityType type) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, FlyWheelInstance::new)); + } + + protected Direction facing; + + protected InstanceKey shaft; + protected InstanceKey wheel; + + public FlyWheelInstance(InstancedTileRenderer modelManager, FlywheelTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + facing = lastState.get(BlockStateProperties.HORIZONTAL_FACING); + + Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); + Consumer setup = setupFunc(tile.getSpeed(), axis); + shaft = shaftModel().setupInstance(setup); + wheel = wheelModel().setupInstance(setup); + } + + @Override + protected void onUpdate() { + Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); + updateRotation(shaft, axis); + updateRotation(wheel, axis); + } + + @Override + public void updateLight() { + shaft.modifyInstance(this::relight); + wheel.modifyInstance(this::relight); + } + + @Override + public void remove() { + shaft.delete(); + wheel.delete(); + shaft = null; + wheel = null; + } + + protected InstancedModel shaftModel() { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, facing.getOpposite()); + } + + protected InstancedModel wheelModel() { + BlockState rotate = lastState.rotate(Rotation.CLOCKWISE_90); + return AllBlockPartials.FLYWHEEL.renderOnDirectionalSouthRotating(modelManager, rotate, rotate.get(BlockStateProperties.HORIZONTAL_FACING)); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 9c4d6b6be..97a9828f0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -69,9 +69,9 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { .renderInto(ms, vb); } - kineticRotationTransform(wheel, te, blockState.get(HORIZONTAL_FACING) - .getAxis(), AngleHelper.rad(angle), light); - wheel.renderInto(ms, vb); +// kineticRotationTransform(wheel, te, blockState.get(HORIZONTAL_FACING) +// .getAxis(), AngleHelper.rad(angle), light); +// wheel.renderInto(ms, vb); } From 90993ce8e1fd6a7082bf049c9f74a08dff6e39fc Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 5 Feb 2021 22:48:55 -0800 Subject: [PATCH 072/147] start working on schematic rendering --- .../com/simibubi/create/CreateClient.java | 2 ++ .../components/flywheel/FlyWheelInstance.java | 12 +++---- .../components/flywheel/FlywheelRenderer.java | 6 ++-- .../schematics/client/SchematicHandler.java | 2 +- .../schematics/client/SchematicRenderer.java | 4 +-- .../SchematicRendererWithInstancing.java | 36 +++++++++++++++++++ .../render/FastRenderDispatcher.java | 2 +- .../render/instancing/InstancedModel.java | 4 --- 8 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 143e5eec5..074e28b31 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -31,6 +31,8 @@ import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import java.util.ArrayList; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index c0b7405e8..d98cd513e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -24,7 +24,7 @@ public class FlyWheelInstance extends KineticTileInstance { protected Direction facing; protected InstanceKey shaft; - protected InstanceKey wheel; +// protected InstanceKey wheel; public FlyWheelInstance(InstancedTileRenderer modelManager, FlywheelTileEntity tile) { super(modelManager, tile); @@ -37,28 +37,28 @@ public class FlyWheelInstance extends KineticTileInstance { Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); Consumer setup = setupFunc(tile.getSpeed(), axis); shaft = shaftModel().setupInstance(setup); - wheel = wheelModel().setupInstance(setup); +// wheel = wheelModel().setupInstance(setup); } @Override protected void onUpdate() { Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); updateRotation(shaft, axis); - updateRotation(wheel, axis); +// updateRotation(wheel, axis); } @Override public void updateLight() { shaft.modifyInstance(this::relight); - wheel.modifyInstance(this::relight); +// wheel.modifyInstance(this::relight); } @Override public void remove() { shaft.delete(); - wheel.delete(); shaft = null; - wheel = null; +// wheel.delete(); +// wheel = null; } protected InstancedModel shaftModel() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 97a9828f0..9c4d6b6be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -69,9 +69,9 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { .renderInto(ms, vb); } -// kineticRotationTransform(wheel, te, blockState.get(HORIZONTAL_FACING) -// .getAxis(), AngleHelper.rad(angle), light); -// wheel.renderInto(ms, vb); + kineticRotationTransform(wheel, te, blockState.get(HORIZONTAL_FACING) + .getAxis(), AngleHelper.rad(angle), light); + wheel.renderInto(ms, vb); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 87df3b517..87e69f75b 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -56,7 +56,7 @@ public class SchematicHandler { public SchematicHandler() { renderers = new Vector<>(3); for (int i = 0; i < renderers.capacity(); i++) - renderers.add(new SchematicRenderer()); + renderers.add(new SchematicRendererWithInstancing()); overlay = new SchematicHotbarSlotOverlay(); currentTool = Tools.Deploy; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 8796b451b..2f9159897 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -34,7 +34,7 @@ public class SchematicRenderer { private final Set startedBufferBuilders = new HashSet<>(getLayerCount()); private boolean active; private boolean changed; - private SchematicWorld schematic; + protected SchematicWorld schematic; private BlockPos anchor; public SchematicRenderer() { @@ -81,7 +81,7 @@ public class SchematicRenderer { buffer); } - private void redraw(Minecraft minecraft) { + protected void redraw(Minecraft minecraft) { usedBlockRenderLayers.clear(); startedBufferBuilders.clear(); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java new file mode 100644 index 000000000..504940a03 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java @@ -0,0 +1,36 @@ +package com.simibubi.create.content.schematics.client; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.contraption.ContraptionKineticRenderer; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.loading.FMLClientLaunchProvider; + +public class SchematicRendererWithInstancing extends SchematicRenderer { + public final ContraptionKineticRenderer tiles; + + public SchematicRendererWithInstancing() { + this.tiles = new ContraptionKineticRenderer(); + } + + @Override + protected void redraw(Minecraft minecraft) { + super.redraw(minecraft); + + tiles.invalidate(); + + schematic.getRenderedTileEntities().forEach(tiles::add); + } + + @Override + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { + super.render(ms, buffer); + + //tiles.render(RenderType.getCutoutMipped(), FastRenderDispatcher.getProjectionMatrix(), ); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 271b0accb..c704a15bd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -106,7 +106,7 @@ public class FastRenderDispatcher { } // copied from GameRenderer.renderWorld - private static Matrix4f getProjectionMatrix() { + public static Matrix4f getProjectionMatrix() { if (projectionMatrixThisFrame != null) return projectionMatrixThisFrame; float partialTicks = AnimationTickHolder.getPartialTicks(); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java index 7253675dd..1163e0f4c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java @@ -68,10 +68,6 @@ public abstract class InstancedModel extends BufferedMod return instanceCount() == 0; } - public void clearInstanceData() { - - } - protected void deleteInternal() { super.deleteInternal(); instanceVBO.delete(); From 2aa06b078613245445faf75881a4abe29e7a59d3 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 5 Feb 2021 22:50:07 -0800 Subject: [PATCH 073/147] useful debug arg in build.gradle --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 049422317..db6c95ee1 100644 --- a/build.gradle +++ b/build.gradle @@ -39,6 +39,7 @@ minecraft { workingDirectory project.file('run') // property 'mixin.env.disableRefMap', 'true' arg '-mixin.config=create.mixins.json' +// jvmArgs '-XX:+UnlockCommercialFeatures' property 'forge.logging.console.level', 'info' property 'fml.earlyprogresswindow', 'false' mods { From 5ba4477adaf468bd7410d4ea189ae0d7556a4f50 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 6 Feb 2021 02:26:56 -0800 Subject: [PATCH 074/147] restore old tile rendering from 3336778052f7b18bd42de028246dfd5979dbbc81 --- .../base/KineticTileEntityRenderer.java | 32 ++++-- .../components/actors/DrillInstance.java | 30 ++++- .../actors/DrillMovementBehaviour.java | 2 +- .../components/actors/DrillRenderer.java | 36 ++---- .../components/actors/HarvesterRenderer.java | 10 +- .../components/clock/CuckooClockRenderer.java | 16 ++- .../crafter/MechanicalCrafterRenderer.java | 13 ++- .../components/deployer/DeployerRenderer.java | 33 +++--- .../components/fan/EncasedFanRenderer.java | 39 +++++-- .../components/flywheel/FlywheelRenderer.java | 15 ++- .../millstone/MillstoneRenderer.java | 9 +- .../mixer/MechanicalMixerRenderer.java | 14 +-- .../motor/CreativeMotorRenderer.java | 8 +- .../press/MechanicalPressRenderer.java | 5 - .../components/saw/SawRenderer.java | 25 ++-- .../bearing/BearingRenderer.java | 13 ++- .../contraptions/fluids/PumpRenderer.java | 10 +- .../relays/belt/BeltRenderer.java | 107 ++++++++++++++++-- .../relays/encased/SplitShaftRenderer.java | 34 +++++- .../relays/gearbox/GearboxRenderer.java | 40 +++++-- .../block/mechanicalArm/ArmRenderer.java | 15 ++- .../mixin/CancelTileEntityRenderMixin.java | 6 +- .../foundation/render/SuperByteBuffer.java | 49 ++++---- .../instancing/InstancedTileRenderer.java | 17 +-- .../resources/assets/create/shader/belt.vert | 4 +- 25 files changed, 408 insertions(+), 174 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 8bd192394..99e2b08ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -1,25 +1,27 @@ package com.simibubi.create.content.contraptions.base; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlocks; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; -import com.simibubi.create.foundation.render.Compartment; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.Compartment; + import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -36,11 +38,20 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer(te)); + public static void renderRotatingKineticBlock(KineticTileEntity te, BlockState renderedState, MatrixStack ms, + IVertexBuilder buffer, int light) { + SuperByteBuffer superByteBuffer = CreateClient.bufferCache.renderBlockIn(KINETIC_TILE, renderedState); + renderRotatingBuffer(te, superByteBuffer, ms, buffer, light); + } + + public static void renderRotatingBuffer(KineticTileEntity te, SuperByteBuffer superBuffer, MatrixStack ms, + IVertexBuilder buffer, int light) { + standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, buffer); } public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { @@ -105,5 +116,8 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer> renderMaterial = contraption.getActorMaterial(); + + BlockState state = context.state; + InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); + + model.setupInstance(data -> { + Direction facing = state.get(DrillBlock.FACING); + float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); + float eulerY = facing.getHorizontalAngle(); + data.setPosition(context.localPos) + .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) + .setRotationOffset(0) + .setRotationAxis(0, 0, 1) + .setLocalRotation(eulerX, eulerY, 0); + }); + } + @Override protected InstancedModel getModel() { return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index 2ec0ed260..9aed18005 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -42,7 +42,7 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { @Override public void addInstance(RenderedContraption contraption, MovementContext context) { - DrillRenderer.addInstanceForContraption(contraption, context); + DrillInstance.addInstanceForContraption(contraption, context); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 5a124d5a2..57e858cde 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -1,28 +1,23 @@ package com.simibubi.create.content.contraptions.components.actors; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.contraption.ContraptionProgram; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RenderMaterial; -import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; -import net.minecraft.world.LightType; - -import static net.minecraft.state.properties.BlockStateProperties.FACING; public class DrillRenderer extends KineticTileEntityRenderer { @@ -30,26 +25,13 @@ public class DrillRenderer extends KineticTileEntityRenderer { super(dispatcher); } - protected static SuperByteBuffer getRotatingModel(BlockState state) { - return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(state); + @Override + protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(te.getBlockState()); } - public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) { - RenderMaterial> renderMaterial = contraption.getActorMaterial(); - - BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); - - model.setupInstance(data -> { - Direction facing = state.get(DrillBlock.FACING); - float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); - float eulerY = facing.getHorizontalAngle(); - data.setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationAxis(0, 0, 1) - .setLocalRotation(eulerX, eulerY, 0); - }); + protected static SuperByteBuffer getRotatingModel(BlockState state) { + return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(state); } public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 8c706264b..7311e30c7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -1,9 +1,10 @@ package com.simibubi.create.content.contraptions.components.actors; +import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.contraption.RenderedContraption; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RenderMaterial; @@ -11,7 +12,9 @@ import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingAct import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -22,8 +25,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.LightType; -import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; - public class HarvesterRenderer extends SafeTileEntityRenderer { public HarvesterRenderer(TileEntityRendererDispatcher dispatcher) { @@ -82,4 +83,7 @@ public class HarvesterRenderer extends SafeTileEntityRenderer { @@ -151,12 +152,12 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer { public DeployerRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } - @Override - public boolean isGlobalRenderer(DeployerTileEntity te) { - return true; - } - @Override protected void renderSafe(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { renderItem(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); renderComponents(te, partialTicks, ms, buffer, light, overlay); - } protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { + int light, int overlay) { BlockState deployerState = te.getBlockState(); Vec3d offset = getHandOffset(te, partialTicks, deployerState).add(VecHelper.getCenterOf(BlockPos.ZERO)); ms.push(); @@ -102,6 +102,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), ms, vb, light); BlockState blockState = te.getBlockState(); BlockPos pos = te.getPos(); @@ -111,10 +112,10 @@ public class DeployerRenderer extends SafeTileEntityRenderer SuperByteBuffer hand = te.getHandPose() .renderOn(blockState); - transform(te.getWorld(), (SuperByteBuffer) pole.translate(offset.x, offset.y, offset.z), blockState, pos, true).renderInto(ms, - vb); - transform(te.getWorld(), (SuperByteBuffer) hand.translate(offset.x, offset.y, offset.z), blockState, pos, false).renderInto(ms, - vb); + transform(te.getWorld(), pole.translate(offset.x, offset.y, offset.z), blockState, pos, true).renderInto(ms, + vb); + transform(te.getWorld(), hand.translate(offset.x, offset.y, offset.z), blockState, pos, false).renderInto(ms, + vb); } protected Vec3d getHandOffset(DeployerTileEntity te, float partialTicks, BlockState blockState) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 6c857986c..cf65e08f5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -1,20 +1,21 @@ package com.simibubi.create.content.contraptions.components.fan; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.world.LightType; - -import static net.minecraft.state.properties.BlockStateProperties.FACING; public class EncasedFanRenderer extends KineticTileEntityRenderer { @@ -25,7 +26,29 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + Direction direction = te.getBlockState() + .get(FACING); + IVertexBuilder vb = buffer.getBuffer(RenderType.getCutoutMipped()); + + int lightBehind = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction.getOpposite())); + int lightInFront = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction)); + + SuperByteBuffer shaftHalf = + AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); + SuperByteBuffer fanInner = + AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); + + float time = AnimationTickHolder.getRenderTick(); + float speed = te.getSpeed() * 5; + if (speed > 0) + speed = MathHelper.clamp(speed, 80, 64 * 20); + if (speed < 0) + speed = MathHelper.clamp(speed, -64 * 20, -80); + float angle = (time * speed * 3 / 10f) % 360; + angle = angle / 180f * (float) Math.PI; + + standardKineticRotationTransform(shaftHalf, te, lightBehind).renderInto(ms, vb); + kineticRotationTransform(fanInner, te, direction.getAxis(), angle, lightInFront).renderInto(ms, vb); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 9c4d6b6be..76453c14e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -1,15 +1,16 @@ package com.simibubi.create.content.contraptions.components.flywheel; +import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -21,8 +22,6 @@ import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.Rotation; import net.minecraft.util.math.MathHelper; -import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; - public class FlywheelRenderer extends KineticTileEntityRenderer { public FlywheelRenderer(TileEntityRendererDispatcher dispatcher) { @@ -74,6 +73,12 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { wheel.renderInto(ms, vb); } + @Override + protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), te.getBlockState() + .get(HORIZONTAL_FACING) + .getOpposite()); + } protected SuperByteBuffer transformConnector(SuperByteBuffer buffer, boolean upper, boolean rotating, float angle, boolean flip) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index 624c58fa5..f9fa65b7b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -1,10 +1,11 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class MillstoneRenderer extends KineticTileEntityRenderer { @@ -13,5 +14,9 @@ public class MillstoneRenderer extends KineticTileEntityRenderer { super(dispatcher); } + @Override + protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + return CreateClient.bufferCache.renderPartial(AllBlockPartials.MILLSTONE_COG, te.getBlockState()); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 859e0528b..04231f98d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -5,10 +5,9 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -23,11 +22,6 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { super(dispatcher); } - @Override - public boolean isGlobalRenderer(KineticTileEntity te) { - return true; - } - @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { @@ -37,6 +31,9 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState); + standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); + int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); float speed = mixer.getRenderedHeadRotationSpeed(partialTicks); @@ -54,4 +51,5 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { .light(packedLightmapCoords) .renderInto(ms, vb); } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 127e1b754..215cf1b57 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.components.motor; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class CreativeMotorRenderer extends KineticTileEntityRenderer { @@ -13,5 +13,9 @@ public class CreativeMotorRenderer extends KineticTileEntityRenderer { super(dispatcher); } + @Override + protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState()); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index 60f7d437f..58a7a6c83 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -19,11 +19,6 @@ public class MechanicalPressRenderer extends KineticTileEntityRenderer { super(dispatcher); } - @Override - public boolean isGlobalRenderer(KineticTileEntity tile) { - return true; - } - @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index b59db0d26..0f2f52189 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -1,18 +1,20 @@ package com.simibubi.create.content.contraptions.components.saw; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -28,8 +30,6 @@ import net.minecraft.util.Rotation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -import static net.minecraft.state.properties.BlockStateProperties.FACING; - public class SawRenderer extends SafeTileEntityRenderer { public SawRenderer(TileEntityRendererDispatcher dispatcher) { @@ -42,7 +42,7 @@ public class SawRenderer extends SafeTileEntityRenderer { renderBlade(te, ms, buffer, light); renderItems(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); - + renderShaft(te, ms, buffer, light, overlay); } protected void renderBlade(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light){ @@ -79,8 +79,9 @@ public class SawRenderer extends SafeTileEntityRenderer { ms.pop(); } - protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - //KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te)); + protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, + int overlay) { + KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te), ms, buffer.getBuffer(RenderType.getSolid()), light); } protected void renderItems(SawTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, @@ -124,6 +125,14 @@ public class SawRenderer extends SafeTileEntityRenderer { } } + protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + BlockState state = te.getBlockState(); + if (state.get(FACING).getAxis().isHorizontal()) + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(state.rotate(Rotation.CLOCKWISE_180)); + return CreateClient.bufferCache.renderBlockIn(KineticTileEntityRenderer.KINETIC_TILE, + getRenderedBlockState(te)); + } + protected BlockState getRenderedBlockState(KineticTileEntity te) { return KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index 90fbb0a77..b1c071ea3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -4,11 +4,9 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; -import net.minecraft.block.BlockState; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -44,4 +42,11 @@ public class BearingRenderer extends KineticTileEntityRenderer { superBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } + @Override + protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), te.getBlockState() + .get(BearingBlock.FACING) + .getOpposite()); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 35f53c01d..b14b30539 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -4,11 +4,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -51,4 +50,9 @@ public class PumpRenderer extends KineticTileEntityRenderer { } } + @Override + protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouth(te.getBlockState()); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 448d97cac..c33b9770e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -1,23 +1,29 @@ package com.simibubi.create.content.contraptions.relays.belt; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.ShadowRenderHelper; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.instancing.BeltData; import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -39,21 +45,108 @@ public class BeltRenderer extends SafeTileEntityRenderer { super(dispatcher); } + @Override + public boolean isGlobalRenderer(BeltTileEntity te) { + return BeltBlock.canTransportObjects(te.getBlockState()); + } + @Override protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { + int light, int overlay) { BlockState blockState = te.getBlockState(); if (!AllBlocks.BELT.has(blockState)) return; -// addInstanceData(new InstanceContext.World<>(te)); - renderItems(te, partialTicks, ms, buffer, light, overlay); - } + BeltSlope beltSlope = blockState.get(BeltBlock.SLOPE); + BeltPart part = blockState.get(BeltBlock.PART); + Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); + AxisDirection axisDirection = facing.getAxisDirection(); - @Override - public boolean isGlobalRenderer(BeltTileEntity te) { - return te.isController(); + boolean downward = beltSlope == BeltSlope.DOWNWARD; + boolean upward = beltSlope == BeltSlope.UPWARD; + boolean diagonal = downward || upward; + boolean start = part == BeltPart.START; + boolean end = part == BeltPart.END; + boolean sideways = beltSlope == BeltSlope.SIDEWAYS; + boolean alongX = facing.getAxis() == Axis.X; + + MatrixStacker msr = MatrixStacker.of(ms); + IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + float renderTick = AnimationTickHolder.getRenderTick(); + + ms.push(); + msr.centre(); + msr.rotateY(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)); + msr.rotateZ(sideways ? 90 : 0); + msr.rotateX(!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0); + msr.unCentre(); + + if (downward || beltSlope == BeltSlope.VERTICAL && axisDirection == AxisDirection.POSITIVE) { + boolean b = start; + start = end; + end = b; + } + + for (boolean bottom : Iterate.trueAndFalse) { + + AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); + + SuperByteBuffer beltBuffer = beltPartial.renderOn(blockState) + .light(light); + + SpriteShiftEntry spriteShift = getSpriteShiftEntry(diagonal, bottom); + + // UV shift + float speed = te.getSpeed(); + if (speed != 0) { + float time = renderTick * axisDirection.getOffset(); + if (diagonal && (downward ^ alongX) || !sideways && !diagonal && alongX + || sideways && axisDirection == AxisDirection.NEGATIVE) + speed = -speed; + + float scrollMult = diagonal ? 3f / 8f : 0.5f; + + float spriteSize = spriteShift.getTarget().getMaxV() - spriteShift.getTarget().getMinV(); + + double scroll = speed * time / (36 * 16); + scroll = scroll - Math.floor(scroll); + scroll = scroll * spriteSize * scrollMult; + + beltBuffer.shiftUVScrolling(spriteShift, (float) scroll); + } + + beltBuffer.renderInto(ms, vb); + + // Diagonal belt do not have a separate bottom model + if (diagonal) + break; + } + ms.pop(); + + if (te.hasPulley()) { + // TODO 1.15 find a way to cache this model matrix computation + MatrixStack modelTransform = new MatrixStack(); + Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) + .rotateY(); + if (sideways) + dir = Direction.UP; + msr = MatrixStacker.of(modelTransform); + msr.centre(); + if (dir.getAxis() == Axis.X) + msr.rotateY(90); + if (dir.getAxis() == Axis.Y) + msr.rotateX(90); + msr.rotateX(90); + msr.unCentre(); + + SuperByteBuffer superBuffer = CreateClient.bufferCache + .renderDirectionalPartial(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + KineticTileEntityRenderer.standardKineticRotationTransform(superBuffer, te, light) + .renderInto(ms, vb); + } + + renderItems(te, partialTicks, ms, buffer, light, overlay); } public static SpriteShiftEntry getSpriteShiftEntry(boolean diagonal, boolean bottom) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 67897372e..c0f10c1e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,16 +5,17 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; public class SplitShaftRenderer extends KineticTileEntityRenderer { @@ -25,7 +26,32 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + Block block = te.getBlockState().getBlock(); + final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); + final BlockPos pos = te.getPos(); + float time = AnimationTickHolder.getRenderTick(); + + for (Direction direction : Iterate.directions) { + Axis axis = direction.getAxis(); + if (boxAxis != axis) + continue; + + float offset = getRotationOffsetForPosition(te, pos, axis); + float angle = (time * te.getSpeed() * 3f / 10) % 360; + float modifier = 1; + + if (te instanceof SplitShaftTileEntity) + modifier = ((SplitShaftTileEntity) te).getRotationSpeedModifier(direction); + + angle *= modifier; + angle += offset; + angle = angle / 180f * (float) Math.PI; + + SuperByteBuffer superByteBuffer = + AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction); + kineticRotationTransform(superByteBuffer, te, axis, angle, light); + superByteBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 509f15ef2..5279893fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -1,23 +1,20 @@ package com.simibubi.create.content.contraptions.relays.gearbox; -import com.google.common.collect.Lists; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; - -import java.util.List; public class GearboxRenderer extends KineticTileEntityRenderer { @@ -28,7 +25,34 @@ public class GearboxRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); + final BlockPos pos = te.getPos(); + float time = AnimationTickHolder.getRenderTick(); + + for (Direction direction : Iterate.directions) { + final Axis axis = direction.getAxis(); + if (boxAxis == axis) + continue; + + SuperByteBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction); + float offset = getRotationOffsetForPosition(te, pos, axis); + float angle = (time * te.getSpeed() * 3f / 10) % 360; + + if (te.getSpeed() != 0 && te.hasSource()) { + BlockPos source = te.source.subtract(te.getPos()); + Direction sourceFacing = Direction.getFacingFromVector(source.getX(), source.getY(), source.getZ()); + if (sourceFacing.getAxis() == direction.getAxis()) + angle *= sourceFacing == direction ? 1 : -1; + else if (sourceFacing.getAxisDirection() == direction.getAxisDirection()) + angle *= -1; + } + + angle += offset; + angle = angle / 180f * (float) Math.PI; + + kineticRotationTransform(shaft, te, axis, angle, light); + shaft.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + } } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index e039892be..4c38e7b14 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -6,13 +6,12 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -30,11 +29,6 @@ public class ArmRenderer extends KineticTileEntityRenderer { super(dispatcher); } - @Override - public boolean isGlobalRenderer(KineticTileEntity te) { - return true; - } - @Override protected void renderSafe(KineticTileEntity te, float pt, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { @@ -123,4 +117,9 @@ public class ArmRenderer extends KineticTileEntityRenderer { ms.pop(); } + @Override + protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { + return AllBlockPartials.ARM_COG.renderOn(te.getBlockState()); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java index f95e3cfa6..8f4c954fc 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java @@ -25,8 +25,8 @@ public class CancelTileEntityRenderMixin { */ @Inject(at = @At("RETURN"), method = "getTileEntities", cancellable = true) private void noRenderInstancedTiles(CallbackInfoReturnable> cir) { - List tiles = cir.getReturnValue(); - - tiles.removeIf(tile -> tile instanceof IInstanceRendered && !((IInstanceRendered) tile).shouldRenderAsTE()); +// List tiles = cir.getReturnValue(); +// +// tiles.removeIf(tile -> tile instanceof IInstanceRendered && !((IInstanceRendered) tile).shouldRenderAsTE()); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index dde2c5a9d..bdd6c9ae1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render; import java.nio.Buffer; import java.nio.ByteBuffer; +import java.util.function.Consumer; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; @@ -29,9 +30,7 @@ public class SuperByteBuffer extends TemplateBuffer { private MatrixStack transforms; // Vertex Texture Coords - private boolean shouldShiftUV; - private SpriteShiftEntry spriteShift; - private float uTarget, vTarget; + private SpriteShiftFunc spriteShiftFunc; // Vertex Lighting private boolean shouldLight; @@ -105,12 +104,8 @@ public class SuperByteBuffer extends TemplateBuffer { float u = getU(buffer, i); float v = getV(buffer, i); - if (shouldShiftUV) { - float targetU = spriteShift.getTarget() - .getInterpolatedU((getUnInterpolatedU(spriteShift.getOriginal(), u) / sheetSize) + uTarget * 16); - float targetV = spriteShift.getTarget() - .getInterpolatedV((getUnInterpolatedV(spriteShift.getOriginal(), v) / sheetSize) + vTarget * 16); - builder.texture(targetU, targetV); + if (spriteShiftFunc != null) { + spriteShiftFunc.shift(builder, u, v); } else builder.texture(u, v); @@ -131,7 +126,7 @@ public class SuperByteBuffer extends TemplateBuffer { } transforms = new MatrixStack(); - shouldShiftUV = false; + spriteShiftFunc = null; shouldColor = false; shouldLight = false; } @@ -159,20 +154,29 @@ public class SuperByteBuffer extends TemplateBuffer { } public SuperByteBuffer shiftUV(SpriteShiftEntry entry) { - shouldShiftUV = true; - spriteShift = entry; - uTarget = 0; - vTarget = 0; - sheetSize = 1; + this.spriteShiftFunc = (builder, u, v) -> { + float targetU = entry.getTarget().getInterpolatedU((getUnInterpolatedU(entry.getOriginal(), u))); + float targetV = entry.getTarget().getInterpolatedV((getUnInterpolatedV(entry.getOriginal(), v))); + builder.texture(targetU, targetV); + }; + return this; + } + + public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollV) { + this.spriteShiftFunc = (builder, u, v) -> { + float targetU = u - entry.getOriginal().getMinU() + entry.getTarget().getMinU(); + float targetV = v - entry.getOriginal().getMinV() + entry.getTarget().getMinV() + scrollV; + builder.texture(targetU, targetV); + }; return this; } public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) { - shouldShiftUV = true; - spriteShift = entry; - this.uTarget = uTarget; - this.vTarget = vTarget; - this.sheetSize = sheetSize; + this.spriteShiftFunc = (builder, u, v) -> { + float targetU = entry.getTarget().getInterpolatedU((getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16); + float targetV = entry.getTarget().getInterpolatedV((getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16); + builder.texture(targetU, targetV); + }; return this; } @@ -220,4 +224,9 @@ public class SuperByteBuffer extends TemplateBuffer { return ((Buffer) template).limit() == 0; } + @FunctionalInterface + public interface SpriteShiftFunc { + void shift(IVertexBuilder builder, float u, float v); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java index 52d15de52..c7d0aad5a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java @@ -42,14 +42,15 @@ public abstract class InstancedTileRenderer

{ if (instance != null) { return (TileEntityInstance) instance; } else if (create) { - TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); - - if (renderer != null) { - FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(tile); - instances.put(tile, renderer); - } - - return renderer; + return null; +// TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); +// +// if (renderer != null) { +// FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(tile); +// instances.put(tile, renderer); +// } +// +// return renderer; } else { return null; } diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 423c41cb4..25bb34fd1 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -11,7 +11,7 @@ layout (location = 5) in vec3 networkTint; layout (location = 6) in float speed; layout (location = 7) in float offset; layout (location = 8) in vec3 eulerAngles; -layout (location = 9) in vec2 uv; +layout (location = 9) in vec2 sourceTexture; layout (location = 10) in vec4 scrollTexture; layout (location = 11) in float scrollMult; @@ -81,7 +81,7 @@ void main() { float scroll = fract(speed * uTime / (36 * 16) + offset) * scrollSize * scrollMult; Diffuse = diffuse(norm); - TexCoords = aTexCoords - uv + scrollTexture.xy + vec2(0, scroll); + TexCoords = aTexCoords - sourceTexture + scrollTexture.xy + vec2(0, scroll); Light = light; gl_Position = uViewProjection * worldPos; From 83df83d4be03841d88e573886dd9f974b9aefc60 Mon Sep 17 00:00:00 2001 From: Chexet48 Date: Sat, 6 Feb 2021 19:09:29 +0100 Subject: [PATCH 075/147] Update it_it.json Added Gantry Pinion and Gantry Shaft, missing in unlocalized entries --- src/main/resources/assets/create/lang/it_it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/it_it.json b/src/main/resources/assets/create/lang/it_it.json index 3874ad485..e6caf7d7a 100644 --- a/src/main/resources/assets/create/lang/it_it.json +++ b/src/main/resources/assets/create/lang/it_it.json @@ -1,5 +1,4 @@ { - "_": "Missing Localizations: 849", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,6 +161,8 @@ "block.create.gabbro_cobblestone_stairs": "Scalini di pietrisco di gabbro", "block.create.gabbro_cobblestone_wall": "Muretto di pietrisco di gabbro", "block.create.gabbro_pillar": "Pilastro di gabbro", + "block.create.gantry_pinion": "Pignone a portale", + "block.create.gantry_shaft": "Albero a portale", "block.create.gearbox": "Riduttore", "block.create.gearshift": "Cambio", "block.create.glass_fluid_pipe": "Tubo per fluidi con vetrata", From 44a3313c1269a2d02390f6951210197782c274ee Mon Sep 17 00:00:00 2001 From: Nick Smit Date: Sat, 30 Jan 2021 22:39:09 +0100 Subject: [PATCH 076/147] Added the 'Paused' instruction for sequenced gearshift, which waits for another redstone pulse to continue. --- .../resources/assets/create/lang/en_us.json | 1 + .../advanced/sequencer/Instruction.java | 13 +++++++++++++ .../advanced/sequencer/OnIsPoweredResult.java | 6 ++++++ .../sequencer/SequencedGearshiftBlock.java | 5 ++++- .../SequencedGearshiftTileEntity.java | 16 ++++++++++++++++ .../sequencer/SequencerInstructions.java | 1 + .../create/foundation/gui/AllGuiTextures.java | 1 + .../assets/create/textures/gui/sequencer.png | Bin 1696 -> 17289 bytes 8 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/OnIsPoweredResult.java diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index fb30e864a..da439e34c 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -844,6 +844,7 @@ "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distance", "create.gui.sequenced_gearshift.instruction.wait": "Wait", "create.gui.sequenced_gearshift.instruction.wait.duration": "Duration", + "create.gui.sequenced_gearshift.instruction.paused": "Paused", "create.gui.sequenced_gearshift.instruction.end": "End", "create.gui.sequenced_gearshift.speed": "Speed, Direction", "create.gui.sequenced_gearshift.speed.forward": "Input speed, Forwards", diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java index b28c352f2..fc9e53bb0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java @@ -41,6 +41,9 @@ public class Instruction { case WAIT: return (int) ((1 - initialProgress) * value + 1); + case PAUSED: + return -1; + case END: default: break; @@ -58,6 +61,7 @@ public class Instruction { case END: case WAIT: + case PAUSED: default: break; @@ -65,6 +69,15 @@ public class Instruction { return 0; } + OnIsPoweredResult onIsPowered() { + switch (instruction) + { + case PAUSED: + return OnIsPoweredResult.CONTINUE; + } + return OnIsPoweredResult.NOTHING; + } + public static ListNBT serializeAll(Vector instructions) { ListNBT list = new ListNBT(); instructions.forEach(i -> list.add(i.serialize())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/OnIsPoweredResult.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/OnIsPoweredResult.java new file mode 100644 index 000000000..e942da652 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/OnIsPoweredResult.java @@ -0,0 +1,6 @@ +package com.simibubi.create.content.contraptions.relays.advanced.sequencer; + +public enum OnIsPoweredResult { + NOTHING, + CONTINUE +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java index 2974f2a3a..a5b2d3157 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java @@ -64,8 +64,11 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen return; boolean previouslyPowered = state.get(STATE) != 0; - if (previouslyPowered != worldIn.isBlockPowered(pos)) + boolean isPowered = worldIn.isBlockPowered(pos); + if (previouslyPowered != isPowered) withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onRedstoneUpdate); + else if (isPowered) + withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onIsPowered); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java index b52e47ee2..ff73551d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java @@ -32,6 +32,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { return; if (world.isRemote) return; + if (currentInstructionDuration < 0) + return; if (timer < currentInstructionDuration) { timer++; return; @@ -66,6 +68,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { public void onRedstoneUpdate() { if (!isIdle()) return; + if (!world.isBlockPowered(pos)) { world.setBlockState(pos, getBlockState().with(SequencedGearshiftBlock.STATE, 0), 3); return; @@ -75,6 +78,19 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { run(0); } + public void onIsPowered() { + + Instruction instruction = getInstruction(currentInstruction); + if (instruction == null) + return; + + switch (instruction.onIsPowered()) + { + case CONTINUE: + run(currentInstruction + 1); + } + } + protected void run(int instructionIndex) { Instruction instruction = getInstruction(instructionIndex); if (instruction == null || instruction.instruction == SequencerInstructions.END) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java index 3bb06ba8e..ba3ee45d7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java @@ -11,6 +11,7 @@ public enum SequencerInstructions { TURN_ANGLE("angle", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 360, 45, 90), TURN_DISTANCE("distance", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 128, 5, 5), WAIT("duration", AllGuiTextures.SEQUENCER_WAIT, true, false, 600, 20, 10), + PAUSED("", AllGuiTextures.SEQUENCER_PAUSED), END("", AllGuiTextures.SEQUENCER_END), ; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 5528f791b..87fc23222 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -54,6 +54,7 @@ public enum AllGuiTextures { SEQUENCER_WAIT("sequencer.png", 0, 58, 162, 22), SEQUENCER_END("sequencer.png", 0, 80, 162, 22), SEQUENCER_EMPTY("sequencer.png", 0, 102, 162, 22), + SEQUENCER_PAUSED("sequencer.png", 0, 160, 162, 22), // JEI JEI_SLOT("jei/widgets.png", 18, 18), diff --git a/src/main/resources/assets/create/textures/gui/sequencer.png b/src/main/resources/assets/create/textures/gui/sequencer.png index 5dcbea527b17911cdc72bbf8be0f96e607950def..a06270d229ee28312255b55c8410c7d88c844276 100644 GIT binary patch literal 17289 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 literal 1696 zcmdT^do+}37=OR{W}2`KhjCmoYFF7vR1)FvjYJ~NG7}{t9h1;bX4KH)E0uLuY1>eT zT-w|#BfB+blx9vBc9v?UNWwA<>oP({&3;pR`fJbrzwbHEd4A9HKJRmW=efKYG=J}9 z+NRn7fMq`0Jp%xMFbILAFs5Q^g6SHI9pLQ&>N?CuFayt|?xX^6Gf!tRf`HkfG(Y+_ zOcMwM91gc+$&%^TI0%9oFL(x70YRZ>*hUDC$LHtgbGh8+=4P6k71e&FqoX5-!^z6Z zQmfTvWn~WEl0_mBgTaW3it6w0m&snrWHPB#T3%j`Wj63wYm2EBoB;noEdDx9OGB&<4L7+!^W@V?Cy5bJHywB-LZ9V%8n8wQ7x`9dt+%a zu$}kQqip-RBDQgNRm{kOS3qTYSDos*>W;#;Gq1q^ihEdryQ(L2U%C5iowqb};rdpl zgS^hxPOWS|T(M4Q^hT}&D)=5m3B&=;)euFm7mBvPSMYD`4K2NGx(ceR56V!qJyOn} zU)(ZCsUpo6dcFbY?WtK2p_ zPCxaIeMZpR<%|2#enqJr$~C1R#6ePX+&~?d$#c*RB=+<=PSNh&epQ%W3#V-Q48>ZM zhTc`sX2plZq(J#|zlG!3545Uk6N@EK(QDDxq>^_QpPq=VhS9K-WA+kjWIQnJNc)3$ z(jhbThYxX69S5p!z@0Yv?Lgk;b29;1*vN6RHxcmQBd1|=Nk!KIS7PkoZ3XZk!Jq1xb`$QS^;;Se(m|b zV{eRkC23MmBOE|MTdHVBfi;gE!Dw!huDvr9p#Wq4Q30f-e0O<#7%(Jw9z(=$L}4OD|3B3JokmjYN##n z7HbI1BwF%emQ!m7G;Ou9hLZmr&U9(gf6l)eLOf_#N={;woF4>KsdD;^=ELY)yTbMq(vLwgVhh2pTI>Dg*^NB zMO*reTg*xrhF;^5`tKLr{3v~2YeWv5K{BJXA3Qrc98jz35C42AX)&-_$KkzjjisRc zCw^5Y_`s!AcR(iY1Bu&2FURn|KZK0`@aqskIRpD^V3EL1;{5TUbNGx3*FLcS7Oa1Q z*eLb9E3Iu^%__i~|TAF^Z)0&bFJ8l1bq zNyAbSX6Tg=dH&zJI#ltpV4{XM6fuh4k7pdX)48JJ)41kN$aZX~nVHVa#>PZM%4eo7 zf5#8|)j`)8B_aD6n&x0gZ&#THAjKDZ=~i-d)TI(`OEmvzCb>VEoA+H@`-2xy&Ohma zZp0|irDDq{uh#ZK`_z99eS={8>b%IVWHu6HuatCoo6??u`APs;cn-LWd)@_EXt5lx zDeB$a1#7Gu0Muk>SD&P9Lq*3G)mL#@dPpE7z?ECE?9gktBLuk=O#|Ih$JK;;+6~JE zdf}?s*~)8ZAar)h7iuI=S_;>*vfT~(MnIt=iqPLL4*k;Q_g&?d0}57EUFzNibmRd?*wCJl^U0|+HRUb7^0P7zcX um0Y$~sE_fNEZ#MO2nb2%e=Ltxs_#82gW%mo{8{V=2R_^UJ?lKePyG%4>(g5R From 3e6ef3499338daf3d1e2447f69ee7d8911dc796c Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 6 Feb 2021 14:39:58 -0800 Subject: [PATCH 077/147] restore arm rendering --- .../content/logistics/block/mechanicalArm/ArmRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 4c38e7b14..73f747b57 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -44,7 +44,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { float upperArmAngle = arm.upperArmAngle.get(pt) - 90; float headAngle = arm.headAngle.get(pt); - boolean rave = te instanceof ArmTileEntity && ((ArmTileEntity) te).phase == Phase.DANCING; + boolean rave = arm.phase == Phase.DANCING; float renderTick = AnimationTickHolder.getRenderTick() + (te.hashCode() % 64); if (rave) { baseAngle = (renderTick * 10) % 360; From f3b6a684f929c713c3d4e5c50a23d711bbd2a5ec Mon Sep 17 00:00:00 2001 From: s0127943 Date: Sun, 7 Feb 2021 01:01:48 +0100 Subject: [PATCH 078/147] Added check to see if a user is allowed to place blocks in the given position to counteract issues with FTBChunks --- .../zapper/blockzapper/BlockzapperItem.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java index 21d555b6b..c4f6d1d07 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java @@ -109,7 +109,7 @@ public class BlockzapperItem extends ZapperItem { continue; if (!selectedState.isValidPosition(world, placed)) continue; - if (!player.isCreative() && !canBreak(stack, world.getBlockState(placed), world, placed)) + if (!player.isCreative() && !canBreak(stack, world.getBlockState(placed), world, placed,player)) continue; if (!player.isCreative() && BlockHelper.findAndRemoveInInventory(selectedState, player, 1) == 0) { player.getCooldownTracker() @@ -278,10 +278,13 @@ public class BlockzapperItem extends ZapperItem { return list; } - public static boolean canBreak(ItemStack stack, BlockState state, World world, BlockPos pos) { + public static boolean canBreak(ItemStack stack, BlockState state, World world, BlockPos pos,PlayerEntity player) { ComponentTier tier = getTier(Components.Body, stack); float blockHardness = state.getBlockHardness(world, pos); - + //If we can't change the block (e.g chunk protection) + if (!isAllowedToPlace(world,pos,player)){ + return false; + } if (blockHardness == -1) return false; if (tier == ComponentTier.None) @@ -294,6 +297,15 @@ public class BlockzapperItem extends ZapperItem { return false; } + public static boolean isAllowedToPlace(World world, BlockPos pos,PlayerEntity player){ + BlockSnapshot blocksnapshot = BlockSnapshot.getBlockSnapshot(world, pos); + if (ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP)) { + blocksnapshot.restore(true, false); + return false; + } + return true; + } + public static int getMaxAoe(ItemStack stack) { ComponentTier tier = getTier(Components.Amplifier, stack); if (tier == ComponentTier.None) From d8054775d5cb28db9bfe2f92512d2deb985a5c74 Mon Sep 17 00:00:00 2001 From: s0127943 Date: Sun, 7 Feb 2021 01:03:53 +0100 Subject: [PATCH 079/147] Removed unnecessary blocksnapshot.restore --- .../content/curiosities/zapper/blockzapper/BlockzapperItem.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java index c4f6d1d07..416a7c597 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java @@ -300,7 +300,6 @@ public class BlockzapperItem extends ZapperItem { public static boolean isAllowedToPlace(World world, BlockPos pos,PlayerEntity player){ BlockSnapshot blocksnapshot = BlockSnapshot.getBlockSnapshot(world, pos); if (ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP)) { - blocksnapshot.restore(true, false); return false; } return true; From 16991c2ce816d7ad4e11a411a6bf440093dc4d55 Mon Sep 17 00:00:00 2001 From: Snownee Date: Sun, 7 Feb 2021 15:49:25 +0800 Subject: [PATCH 080/147] Fix NPE while deployer on a contraption trying to disassemble self --- .../AbstractContraptionEntity.java | 19 +++++++++++++++++-- .../foundation/utility/NBTProcessors.java | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index c863f4372..4d3a67406 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -58,6 +58,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit protected Contraption contraption; protected boolean initialized; private boolean prevPosInvalid; + private boolean ticking; public AbstractContraptionEntity(EntityType entityTypeIn, World worldIn) { super(entityTypeIn, worldIn); @@ -245,6 +246,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit if (!world.isRemote) contraption.stalled = false; + ticking = true; for (MutablePair pair : contraption.getActors()) { MovementContext context = pair.right; BlockInfo blockInfo = pair.left; @@ -264,13 +266,25 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit continue; if (newPosVisited && !context.stall) { actor.visitNewPosition(context, gridPosition); + if (!isAlive()) + break; context.firstMovement = false; } - if (!oldMotion.equals(context.motion)) + if (!oldMotion.equals(context.motion)) { actor.onSpeedChanged(context, oldMotion, context.motion); + if (!isAlive()) + break; + } actor.tick(context); + if (!isAlive()) + break; contraption.stalled |= context.stall; } + if (!isAlive()) { + contraption.stop(world); + return; + } + ticking = false; for (Entity entity : getPassengers()) { if (!(entity instanceof OrientedContraptionEntity)) @@ -444,7 +458,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit @Override public void remove(boolean keepData) { if (!world.isRemote && !removed && contraption != null) { - contraption.stop(world); + if (!ticking) + contraption.stop(world); } super.remove(keepData); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java b/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java index 1524913fb..4cbf86483 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java +++ b/src/main/java/com/simibubi/create/foundation/utility/NBTProcessors.java @@ -59,7 +59,7 @@ public final class NBTProcessors { TileEntityType type = tileEntity.getType(); if (survival && survivalProcessors.containsKey(type)) compound = survivalProcessors.get(type).apply(compound); - if (processors.containsKey(type)) + if (compound != null && processors.containsKey(type)) return processors.get(type).apply(compound); if (tileEntity.onlyOpsCanSetNbt()) return null; From 05e62ced51d35bc6e2d5bd161b5ac7dcb59f0ebb Mon Sep 17 00:00:00 2001 From: Chexet48 Date: Sun, 7 Feb 2021 22:51:43 +0100 Subject: [PATCH 081/147] Update it_it.json --- src/main/resources/assets/create/lang/it_it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/it_it.json b/src/main/resources/assets/create/lang/it_it.json index e6caf7d7a..7b4edec9a 100644 --- a/src/main/resources/assets/create/lang/it_it.json +++ b/src/main/resources/assets/create/lang/it_it.json @@ -1365,7 +1365,7 @@ "item.create.schematic_and_quill.tooltip.condition1": "Passo 1", "item.create.schematic_and_quill.tooltip.behaviour1": "Seleziona due punti d'angolo usando il clic destro.", "item.create.schematic_and_quill.tooltip.condition2": "Passo 2", - "item.create.schematic_and_quill.tooltip.behaviour2": "Premi _Ctrl_ e _scorri_ sui volti per regolare le dimensioni. Clic destro di nuovo per salvare.", + "item.create.schematic_and_quill.tooltip.behaviour2": "Premi _Ctrl_ e _scorri_ sulle facciate per regolare le dimensioni. Clic destro di nuovo per salvare.", "item.create.schematic_and_quill.tooltip.control1": "Clic-Destro", "item.create.schematic_and_quill.tooltip.action1": "Seleziona un punto d'angolo / conferma il salvataggio.", "item.create.schematic_and_quill.tooltip.control2": "Ctrl premuto", From c9ff31b099cbe10d38f9daf43b5c70a493adfc8a Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sun, 7 Feb 2021 14:15:52 -0800 Subject: [PATCH 082/147] hot swappable rendering kind of detects optifine still some kinks to work out --- .../com/simibubi/create/CreateClient.java | 12 +- .../contraptions/base/KineticTileEntity.java | 6 +- .../base/KineticTileEntityRenderer.java | 5 + .../crafter/MechanicalCrafterRenderer.java | 15 +- .../components/deployer/DeployerRenderer.java | 6 +- .../deployer/DeployerTileEntity.java | 5 + .../components/fan/EncasedFanRenderer.java | 4 + .../mixer/MechanicalMixerRenderer.java | 8 +- .../components/saw/SawRenderer.java | 5 + .../processing/BasinOperatingTileEntity.java | 4 + .../advanced/SpeedControllerRenderer.java | 19 +- .../relays/belt/BeltRenderer.java | 163 ++++++++--------- .../relays/encased/SplitShaftRenderer.java | 4 + .../relays/gearbox/GearboxRenderer.java | 3 + .../foundation/command/AllCommands.java | 1 + .../command/ConfigureConfigPacket.java | 15 ++ .../ToggleExperimentalRenderingCommand.java | 35 ++++ .../create/foundation/config/CClient.java | 33 ++++ .../mixin/CancelTileEntityRenderMixin.java | 9 +- .../foundation/render/AllProgramSpecs.java | 8 +- .../render/FastRenderDispatcher.java | 34 +++- .../foundation/render/OptifineHandler.java | 57 ++++++ .../ContraptionRenderDispatcher.java | 5 +- .../foundation/render/gl/BasicProgram.java | 10 +- .../foundation/render/gl/backend/Backend.java | 169 +++++++++++++++++- .../render/gl/backend/GlVersioned.java | 8 + .../render/gl/backend/MapBuffer.java | 27 ++- .../gl/backend/RenderingAvailability.java | 27 +++ .../render/gl/shader/GlProgram.java | 6 +- .../foundation/render/gl/shader/GlShader.java | 7 +- .../render/gl/shader/ShaderHelper.java | 109 ----------- .../InstancedTileRenderRegistry.java | 2 +- .../instancing/InstancedTileRenderer.java | 21 ++- .../render/instancing/RenderMaterial.java | 4 +- .../foundation/render/light/LightVolume.java | 1 - 35 files changed, 579 insertions(+), 268 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/OptifineHandler.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/backend/GlVersioned.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/backend/RenderingAvailability.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 074e28b31..515429057 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -12,9 +12,10 @@ import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; import com.simibubi.create.foundation.render.KineticRenderer; +import com.simibubi.create.foundation.render.OptifineHandler; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; +import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.utility.outliner.Outliner; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -31,8 +32,6 @@ import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import java.util.ArrayList; @@ -62,10 +61,13 @@ public class CreateClient { modEventBus.addListener(CreateClient::onTextureStitch); modEventBus.addListener(AllParticleTypes::registerFactories); - ShaderHelper.initShaders(); + Backend.init(); + OptifineHandler.init(); } public static void clientInit(FMLClientSetupEvent event) { + kineticRenderer = new KineticRenderer(); + schematicSender = new ClientSchematicLoader(); schematicHandler = new SchematicHandler(); schematicAndQuillHandler = new SchematicAndQuillHandler(); @@ -74,8 +76,6 @@ public class CreateClient { bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); - kineticRenderer = new KineticRenderer(); - AllKeys.register(); AllContainerTypes.registerScreenFactories(); //AllTileEntities.registerRenderers(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 92ab725c9..2eaa1c517 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -30,6 +30,8 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; import javax.annotation.Nullable; import java.util.List; @@ -475,13 +477,13 @@ public abstract class KineticTileEntity extends SmartTileEntity public void onLoad() { super.onLoad(); if (world != null && world.isRemote) - CreateClient.kineticRenderer.add(this); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); } @Override public void onChunkUnloaded() { if (world != null && world.isRemote) - CreateClient.kineticRenderer.remove(this); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.remove(this)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 99e2b08ec..fa4853051 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -6,6 +6,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.config.ConfigBase; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; @@ -38,6 +41,8 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), ms, vb, light); + if (!FastRenderDispatcher.available()) { + KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), ms, vb, light); + } BlockState blockState = te.getBlockState(); BlockPos pos = te.getPos(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 52c8ec809..0dfd92f12 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -376,4 +376,9 @@ public class DeployerTileEntity extends KineticTileEntity { TooltipHelper.addHint(tooltip, "hint.full_deployer"); return true; } + + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index cf65e08f5..3d11bccde 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -7,6 +7,8 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -26,6 +28,8 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + if (FastRenderDispatcher.available()) return; + Direction direction = te.getBlockState() .get(FACING); IVertexBuilder vb = buffer.getBuffer(RenderType.getCutoutMipped()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 04231f98d..ca1b39d8b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -5,6 +5,8 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -31,8 +33,10 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState); - standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); + if (!FastRenderDispatcher.available()) { + SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState); + standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); + } int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 0f2f52189..aebbe7ef3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -8,6 +8,8 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -42,6 +44,9 @@ public class SawRenderer extends SafeTileEntityRenderer { renderBlade(te, ms, buffer, light); renderItems(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); + + if (FastRenderDispatcher.available()) return; + renderShaft(te, ms, buffer, light, overlay); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java index 52e77bae2..7c711358f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java @@ -143,4 +143,8 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { protected abstract Object getRecipeCacheKey(); + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 80c19026e..819503c0e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -1,11 +1,14 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; + import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; public class SpeedControllerRenderer extends SmartTileEntityRenderer { @@ -18,7 +21,17 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer(tileEntityIn)); + + if (FastRenderDispatcher.available()) return; + + KineticTileEntityRenderer.renderRotatingBuffer(tileEntityIn, getRotatedModel(tileEntityIn), ms, + buffer.getBuffer(RenderType.getSolid()), light); + } + + private SuperByteBuffer getRotatedModel(SpeedControllerTileEntity te) { + return CreateClient.bufferCache.renderBlockIn(KineticTileEntityRenderer.KINETIC_TILE, + KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(te))); } } + diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index c33b9770e..3a815b1d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -9,11 +9,9 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.ShadowRenderHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.BeltData; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RotatingData; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -34,10 +32,8 @@ import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; -import net.minecraft.world.LightType; import java.util.Random; -import java.util.function.Supplier; public class BeltRenderer extends SafeTileEntityRenderer { @@ -54,96 +50,89 @@ public class BeltRenderer extends SafeTileEntityRenderer { protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - BlockState blockState = te.getBlockState(); - if (!AllBlocks.BELT.has(blockState)) - return; + if (!FastRenderDispatcher.available()) { - BeltSlope beltSlope = blockState.get(BeltBlock.SLOPE); - BeltPart part = blockState.get(BeltBlock.PART); - Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); - AxisDirection axisDirection = facing.getAxisDirection(); + BlockState blockState = te.getBlockState(); + if (!AllBlocks.BELT.has(blockState)) return; - boolean downward = beltSlope == BeltSlope.DOWNWARD; - boolean upward = beltSlope == BeltSlope.UPWARD; - boolean diagonal = downward || upward; - boolean start = part == BeltPart.START; - boolean end = part == BeltPart.END; - boolean sideways = beltSlope == BeltSlope.SIDEWAYS; - boolean alongX = facing.getAxis() == Axis.X; + BeltSlope beltSlope = blockState.get(BeltBlock.SLOPE); + BeltPart part = blockState.get(BeltBlock.PART); + Direction facing = blockState.get(BeltBlock.HORIZONTAL_FACING); + AxisDirection axisDirection = facing.getAxisDirection(); - MatrixStacker msr = MatrixStacker.of(ms); - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - float renderTick = AnimationTickHolder.getRenderTick(); + boolean downward = beltSlope == BeltSlope.DOWNWARD; + boolean upward = beltSlope == BeltSlope.UPWARD; + boolean diagonal = downward || upward; + boolean start = part == BeltPart.START; + boolean end = part == BeltPart.END; + boolean sideways = beltSlope == BeltSlope.SIDEWAYS; + boolean alongX = facing.getAxis() == Axis.X; - ms.push(); - msr.centre(); - msr.rotateY(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)); - msr.rotateZ(sideways ? 90 : 0); - msr.rotateX(!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0); - msr.unCentre(); + MatrixStacker msr = MatrixStacker.of(ms); + IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + float renderTick = AnimationTickHolder.getRenderTick(); - if (downward || beltSlope == BeltSlope.VERTICAL && axisDirection == AxisDirection.POSITIVE) { - boolean b = start; - start = end; - end = b; - } - - for (boolean bottom : Iterate.trueAndFalse) { - - AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); - - SuperByteBuffer beltBuffer = beltPartial.renderOn(blockState) - .light(light); - - SpriteShiftEntry spriteShift = getSpriteShiftEntry(diagonal, bottom); - - // UV shift - float speed = te.getSpeed(); - if (speed != 0) { - float time = renderTick * axisDirection.getOffset(); - if (diagonal && (downward ^ alongX) || !sideways && !diagonal && alongX - || sideways && axisDirection == AxisDirection.NEGATIVE) - speed = -speed; - - float scrollMult = diagonal ? 3f / 8f : 0.5f; - - float spriteSize = spriteShift.getTarget().getMaxV() - spriteShift.getTarget().getMinV(); - - double scroll = speed * time / (36 * 16); - scroll = scroll - Math.floor(scroll); - scroll = scroll * spriteSize * scrollMult; - - beltBuffer.shiftUVScrolling(spriteShift, (float) scroll); - } - - beltBuffer.renderInto(ms, vb); - - // Diagonal belt do not have a separate bottom model - if (diagonal) - break; - } - ms.pop(); - - if (te.hasPulley()) { - // TODO 1.15 find a way to cache this model matrix computation - MatrixStack modelTransform = new MatrixStack(); - Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING) - .rotateY(); - if (sideways) - dir = Direction.UP; - msr = MatrixStacker.of(modelTransform); + ms.push(); msr.centre(); - if (dir.getAxis() == Axis.X) - msr.rotateY(90); - if (dir.getAxis() == Axis.Y) - msr.rotateX(90); - msr.rotateX(90); + msr.rotateY(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)); + msr.rotateZ(sideways ? 90 : 0); + msr.rotateX(!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0); msr.unCentre(); - SuperByteBuffer superBuffer = CreateClient.bufferCache - .renderDirectionalPartial(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); - KineticTileEntityRenderer.standardKineticRotationTransform(superBuffer, te, light) - .renderInto(ms, vb); + if (downward || beltSlope == BeltSlope.VERTICAL && axisDirection == AxisDirection.POSITIVE) { + boolean b = start; + start = end; + end = b; + } + + for (boolean bottom : Iterate.trueAndFalse) { + + AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); + + SuperByteBuffer beltBuffer = beltPartial.renderOn(blockState).light(light); + + SpriteShiftEntry spriteShift = getSpriteShiftEntry(diagonal, bottom); + + // UV shift + float speed = te.getSpeed(); + if (speed != 0) { + float time = renderTick * axisDirection.getOffset(); + if (diagonal && (downward ^ alongX) || !sideways && !diagonal && alongX || sideways && axisDirection == AxisDirection.NEGATIVE) + speed = -speed; + + float scrollMult = diagonal ? 3f / 8f : 0.5f; + + float spriteSize = spriteShift.getTarget().getMaxV() - spriteShift.getTarget().getMinV(); + + double scroll = speed * time / (36 * 16); + scroll = scroll - Math.floor(scroll); + scroll = scroll * spriteSize * scrollMult; + + beltBuffer.shiftUVScrolling(spriteShift, (float) scroll); + } + + beltBuffer.renderInto(ms, vb); + + // Diagonal belt do not have a separate bottom model + if (diagonal) break; + } + ms.pop(); + + if (te.hasPulley()) { + // TODO 1.15 find a way to cache this model matrix computation + MatrixStack modelTransform = new MatrixStack(); + Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING).rotateY(); + if (sideways) dir = Direction.UP; + msr = MatrixStacker.of(modelTransform); + msr.centre(); + if (dir.getAxis() == Axis.X) msr.rotateY(90); + if (dir.getAxis() == Axis.Y) msr.rotateX(90); + msr.rotateX(90); + msr.unCentre(); + + SuperByteBuffer superBuffer = CreateClient.bufferCache.renderDirectionalPartial(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + KineticTileEntityRenderer.standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); + } } renderItems(te, partialTicks, ms, buffer, light, overlay); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index c0f10c1e3..12fed3ad1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -16,6 +17,7 @@ import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; +import sun.nio.cs.FastCharsetProvider; public class SplitShaftRenderer extends KineticTileEntityRenderer { @@ -26,6 +28,8 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + if (FastRenderDispatcher.available()) return; + Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final BlockPos pos = te.getPos(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 5279893fd..2d5dd9a70 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -25,6 +26,8 @@ public class GearboxRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + if (FastRenderDispatcher.available()) return; + final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); float time = AnimationTickHolder.getRenderTick(); diff --git a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java index d28ec3bd8..58f90ff50 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -13,6 +13,7 @@ public class AllCommands { .then(ToggleDebugCommand.register()) .then(OverlayConfigCommand.register()) .then(FixLightingCommand.register()) + .then(ToggleExperimentalRenderingCommand.register()) //dev-util //Comment out for release diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java index b6790ab4b..2154690df 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -3,6 +3,9 @@ package com.simibubi.create.foundation.command; import java.util.function.Consumer; import java.util.function.Supplier; +import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.gl.backend.Backend; +import javafx.scene.layout.Background; import org.apache.logging.log4j.LogManager; import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; @@ -61,6 +64,7 @@ public class ConfigureConfigPacket extends SimplePacketBase { overlayScreen(() -> Actions::overlayScreen), fixLighting(() -> Actions::experimentalLighting), overlayReset(() -> Actions::overlayReset), + experimentalRendering(() -> Actions::experimentalRendering), ; @@ -79,6 +83,17 @@ public class ConfigureConfigPacket extends SimplePacketBase { private static void rainbowDebug(String value) { AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value)); } + + @OnlyIn(Dist.CLIENT) + private static void experimentalRendering(String value) { + boolean last = AllConfigs.CLIENT.experimentalRendering.get(); + AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value)); + Backend.refreshAvailability(); + + if (last != AllConfigs.CLIENT.experimentalRendering.get()) { + FastRenderDispatcher.refresh(); + } + } @OnlyIn(Dist.CLIENT) private static void overlayReset(String value) { diff --git a/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java b/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java new file mode 100644 index 000000000..82f5442df --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java @@ -0,0 +1,35 @@ +package com.simibubi.create.foundation.command; + +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.simibubi.create.foundation.networking.AllPackets; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.network.PacketDistributor; + +public class ToggleExperimentalRenderingCommand { + + static ArgumentBuilder register() { + return Commands.literal("experimentalRendering") + .requires(cs -> cs.hasPermissionLevel(0)) + .then(Commands.argument("value", BoolArgumentType.bool()) + .executes(ctx -> { + boolean value = BoolArgumentType.getBool(ctx, "value"); + //DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.experimentalRendering.performAction(String.valueOf(value))); + + DistExecutor.runWhenOn(Dist.DEDICATED_SERVER, () -> () -> + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.experimentalRendering.name(), String.valueOf(value)))); + + ctx.getSource().sendFeedback(new StringTextComponent((value ? "enabled" : "disabled") + " experimental rendering"), true); + + return 1; + })); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index b4aabef30..25fcc3fea 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.config; +import com.simibubi.create.foundation.render.gl.backend.Backend; + public class CClient extends ConfigBase { public ConfigGroup client = group(0, "client", @@ -13,6 +15,9 @@ public class CClient extends ConfigBase { public ConfigBool rainbowDebug = b(true, "enableRainbowDebug", "Show colourful debug information while the F3-Menu is open."); + public ConfigRender experimentalRendering = + new ConfigRender("experimentalRendering", true, "Use modern OpenGL features to drastically increase performance."); + public ConfigInt overlayOffsetX = i(20, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX", "Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay"); public ConfigInt overlayOffsetY = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetY", "Offset the overlay from goggle- and hover- information by this many pixels on the Y axis; Use /create overlay"); @@ -21,4 +26,32 @@ public class CClient extends ConfigBase { return "client"; } + public class ConfigRender extends ConfigBool { + + public ConfigRender(String name, boolean def, String... comment) { + super(name, def, comment); + } + + /** + * Gets the configured value and checks if the rendering is actually supported. + * @return True if fast rendering is enabled and the current system/configuration is capable. + */ + @Override + public Boolean get() { + boolean enabled = super.get(); + + if (enabled) { + switch (Backend.getAvailability()) { + case FULL: + case PARTIAL: + return true; + default: + return false; + } + } else { + return false; + } + } + } + } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java index 8f4c954fc..2bdc39f96 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.mixin; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.instancing.IInstanceRendered; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.tileentity.TileEntity; @@ -25,8 +26,10 @@ public class CancelTileEntityRenderMixin { */ @Inject(at = @At("RETURN"), method = "getTileEntities", cancellable = true) private void noRenderInstancedTiles(CallbackInfoReturnable> cir) { -// List tiles = cir.getReturnValue(); -// -// tiles.removeIf(tile -> tile instanceof IInstanceRendered && !((IInstanceRendered) tile).shouldRenderAsTE()); + if (FastRenderDispatcher.available()) { + List tiles = cir.getReturnValue(); + + tiles.removeIf(tile -> tile instanceof IInstanceRendered && !((IInstanceRendered) tile).shouldRenderAsTE()); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index 93ae82d72..c571f6ee8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -3,12 +3,12 @@ package com.simibubi.create.foundation.render; import com.simibubi.create.Create; import com.simibubi.create.foundation.render.contraption.ContraptionProgram; import com.simibubi.create.foundation.render.gl.BasicProgram; +import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.gl.shader.GlProgram; import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.gl.shader.ShaderConstants; import net.minecraft.util.ResourceLocation; -import static com.simibubi.create.foundation.render.gl.shader.ShaderHelper.register; - public class AllProgramSpecs { public static final ProgramSpec ROTATING = register(new ProgramSpec<>("rotating", Locations.ROTATING, Locations.INSTANCED, BasicProgram::new)); public static final ProgramSpec BELT = register(new ProgramSpec<>("belt", Locations.BELT, Locations.INSTANCED, BasicProgram::new)); @@ -17,6 +17,10 @@ public class AllProgramSpecs { public static final ProgramSpec CONTRAPTION_BELT = register(new ProgramSpec<>("contraption_belt", Locations.BELT, Locations.CONTRAPTION, ContraptionProgram::new, ShaderConstants.define("CONTRAPTION"))); public static final ProgramSpec CONTRAPTION_ACTOR = register(new ProgramSpec<>("contraption_actor", Locations.CONTRAPTION_ACTOR, Locations.CONTRAPTION, ContraptionProgram::new)); + private static

> S register(S spec) { + return Backend.register(spec); + } + public static class Locations { public static final ResourceLocation INSTANCED = loc("instanced.frag"); public static final ResourceLocation CONTRAPTION = loc("contraption.frag"); diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index c704a15bd..ad75f735b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -3,9 +3,8 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; -import com.simibubi.create.foundation.render.instancing.TileEntityInstance; import com.simibubi.create.foundation.render.light.ILightListener; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; @@ -25,6 +24,7 @@ import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; import javax.annotation.Nullable; import java.util.ArrayList; @@ -56,18 +56,36 @@ public class FastRenderDispatcher { runQueue(queuedUpdates.get(world), CreateClient.kineticRenderer::update); } + public static boolean available() { + return AllConfigs.CLIENT.experimentalRendering.get(); + } + + public static void refresh() { + RenderWork.enqueue(() -> { + CreateClient.kineticRenderer.invalidate(); + Minecraft.getInstance().worldRenderer.loadRenderers(); + ClientWorld world = Minecraft.getInstance().world; + if (world != null) world.loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); + }); + } + private static void runQueue(@Nullable ConcurrentHashMap.KeySetView changed, Consumer action) { if (changed == null) return; - // because of potential concurrency issues, we make a copy of what's in the set at the time we get here - ArrayList tiles = new ArrayList<>(changed); + if (available()) { + // because of potential concurrency issues, we make a copy of what's in the set at the time we get here + ArrayList tiles = new ArrayList<>(changed); - tiles.forEach(action); - - changed.removeAll(tiles); + tiles.forEach(action); + changed.removeAll(tiles); + } else { + changed.clear(); + } } public static void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ) { + if (!available()) return; + Matrix4f viewProjection = Matrix4f.translate((float) -cameraX, (float) -cameraY, (float) -cameraZ); viewProjection.multiplyBackward(stack.peek().getModel()); viewProjection.multiplyBackward(getProjectionMatrix()); @@ -82,7 +100,7 @@ public class FastRenderDispatcher { //RenderSystem.disableDepthTest(); ContraptionRenderDispatcher.renderLayer(type, viewProjection); - ShaderHelper.releaseShader(); + GL20.glUseProgram(0); type.endDrawing(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/OptifineHandler.java b/src/main/java/com/simibubi/create/foundation/render/OptifineHandler.java new file mode 100644 index 000000000..55665fcee --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/OptifineHandler.java @@ -0,0 +1,57 @@ +package com.simibubi.create.foundation.render; + +import com.simibubi.create.foundation.render.gl.backend.Backend; +import net.minecraft.client.Minecraft; + +import java.io.*; +import java.util.Optional; + +public class OptifineHandler { + private static Package optifine; + private static OptifineHandler handler; + + public final boolean usingShaders; + + public OptifineHandler(boolean usingShaders) { + this.usingShaders = usingShaders; + } + + public static Optional get() { + return Optional.ofNullable(handler); + } + + public static void init() { + optifine = Package.getPackage("net.optifine"); + + if (optifine == null) { + Backend.log.info("Optifine not detected."); + } else { + Backend.log.info("Optifine detected."); + + refresh(); + } + } + + public static void refresh() { + if (optifine == null) return; + + File dir = Minecraft.getInstance().gameDir; + + File shaderOptions = new File(dir, "optionsshaders.txt"); + + boolean shadersOff = true; + try { + BufferedReader reader = new BufferedReader(new FileReader(shaderOptions)); + + shadersOff = reader.lines().anyMatch(it -> it.replaceAll("\\s", "").equals("shaderPack=OFF")); + } catch (FileNotFoundException e) { + Backend.log.info("No shader config found."); + } + + handler = new OptifineHandler(!shadersOff); + } + + public boolean isUsingShaders() { + return usingShaders; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index ceae5bb40..ab6075114 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -6,8 +6,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.foundation.render.AllProgramSpecs; -import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; +import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; @@ -95,7 +94,7 @@ public class ContraptionRenderDispatcher { GL11.glEnable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 - ContraptionProgram structureShader = ShaderHelper.getProgram(AllProgramSpecs.CONTRAPTION_STRUCTURE); + ContraptionProgram structureShader = Backend.getProgram(AllProgramSpecs.CONTRAPTION_STRUCTURE); structureShader.bind(viewProjection, 0); for (RenderedContraption renderer : renderers.values()) { renderer.doRenderLayer(layer, structureShader); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java index 9677af03e..f00c9b443 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.render.gl; +import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.shader.GlProgram; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.util.ResourceLocation; @@ -43,9 +43,9 @@ public class BasicProgram extends GlProgram { } protected static void uploadMatrixUniform(int uniform, Matrix4f mat) { - ShaderHelper.MATRIX_BUFFER.position(0); - mat.write(ShaderHelper.MATRIX_BUFFER); - ShaderHelper.MATRIX_BUFFER.rewind(); - GL20.glUniformMatrix4fv(uniform, false, ShaderHelper.MATRIX_BUFFER); + Backend.MATRIX_BUFFER.position(0); + mat.write(Backend.MATRIX_BUFFER); + Backend.MATRIX_BUFFER.rewind(); + GL20.glUniformMatrix4fv(uniform, false, Backend.MATRIX_BUFFER); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java index bbadc9fce..62c258479 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java @@ -1,20 +1,179 @@ package com.simibubi.create.foundation.render.gl.backend; +import com.simibubi.create.foundation.render.OptifineHandler; +import com.simibubi.create.foundation.render.gl.shader.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.resources.IReloadableResourceManager; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.resource.IResourceType; +import net.minecraftforge.resource.ISelectiveResourceReloadListener; +import net.minecraftforge.resource.VanillaResourceType; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.lwjgl.opengl.GL; +import org.lwjgl.opengl.GLCapabilities; +import org.lwjgl.system.MemoryUtil; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import java.util.function.Consumer; +import java.util.function.Predicate; public class Backend { - private static final MapBuffer MAP_BUFFER = MapBuffer.GL30_RANGE; + public static final Logger log = LogManager.getLogger(Backend.class); + public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); // TODO: these leak 80 bytes of memory per program launch + public static final FloatBuffer VEC3_BUFFER = MemoryUtil.memAllocFloat(3); + public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); - private Backend() { - throw new UnsupportedOperationException(); + private static final Backend instance = new Backend(); + public static Backend instance() { + return instance; } + private static final Map> registry = new HashMap<>(); + private static final Map, GlProgram> programs = new HashMap<>(); + + public static GLCapabilities capabilities; + private static RenderingAvailability availability; + private static MapBuffer mapBuffer; + + + public static void mapBuffer(int target, int offset, int length, Consumer upload) { - MAP_BUFFER.mapBuffer(target, offset, length, upload); + mapBuffer.mapBuffer(target, offset, length, upload); } public static void mapBuffer(int target, int size, Consumer upload) { - MAP_BUFFER.mapBuffer(target, 0, size, upload); + mapBuffer.mapBuffer(target, 0, size, upload); + } + + /** + * Register a shader program. TODO: replace with forge registry? + */ + public static

> S register(S spec) { + ResourceLocation name = spec.name; + if (registry.containsKey(name)) { + throw new IllegalStateException("Program spec '" + name + "' already registered."); + } + registry.put(name, spec); + return spec; + } + + @SuppressWarnings("unchecked") + public static

> P getProgram(S spec) { + return (P) programs.get(spec); + } + + /** + * Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order. + * + * @param clazz The class of the versioning enum. + * @param The type of the versioning enum. + * @return The first defined enum variant to return true. + */ + public static & GlVersioned> V getLatest(Class clazz) { + return getLatest(clazz, capabilities); + } + + /** + * Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order. + * + * @param clazz The class of the versioning enum. + * @param caps The current system's supported features. + * @param The type of the versioning enum. + * @return The first defined enum variant to return true. + */ + public static & GlVersioned> V getLatest(Class clazz, GLCapabilities caps) { + V[] constants = clazz.getEnumConstants(); + V last = constants[constants.length - 1]; + if (!last.supported(caps)) { + throw new IllegalStateException(""); + } + + return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().orElse(last); + } + + public static RenderingAvailability getAvailability() { + return availability; + } + + public static void init() { + // Can be null when running datagenerators due to the unfortunate time we call this + Minecraft mc = Minecraft.getInstance(); + if (mc != null && mc.getResourceManager() instanceof IReloadableResourceManager) { + ISelectiveResourceReloadListener listener = Backend::onResourceManagerReload; + ((IReloadableResourceManager) mc.getResourceManager()).addReloadListener(listener); + } + } + + public static void onResourceManagerReload(IResourceManager manager, Predicate predicate) { + if (predicate.test(VanillaResourceType.SHADERS)) { + capabilities = GL.createCapabilities(); + mapBuffer = getLatest(MapBuffer.class); + + OptifineHandler.refresh(); + refreshAvailability(); + + programs.values().forEach(GlProgram::delete); + programs.clear(); + for (ProgramSpec shader : registry.values()) { + loadProgram(manager, shader); + } + } + } + + private static

> void loadProgram(IResourceManager manager, S programSpec) { + GlShader vert = null; + GlShader frag = null; + try { + vert = loadShader(manager, programSpec.getVert(), ShaderType.VERTEX, programSpec.defines); + frag = loadShader(manager, programSpec.getFrag(), ShaderType.FRAGMENT, programSpec.defines); + + P program = GlProgram.builder(programSpec.name) + .attachShader(vert) + .attachShader(frag) + .build(programSpec.factory); + + programs.put(programSpec, program); + + log.info("Loaded program {}", programSpec.name); + } catch (IOException ex) { + log.error("Failed to load program {}", programSpec.name, ex); + } finally { + if (vert != null) vert.delete(); + if (frag != null) frag.delete(); + } + } + + private static GlShader loadShader(IResourceManager manager, ResourceLocation name, ShaderType type, GlShader.PreProcessor preProcessor) throws IOException { + try (InputStream is = new BufferedInputStream(manager.getResource(name).getInputStream())) { + String source = TextureUtil.func_225687_b_(is); + + if (source == null) { + throw new IOException("Could not load program " + name); + } else { + return new GlShader(type, name, source, preProcessor); + } + } + } + + public static void refreshAvailability() { + if (capabilities.OpenGL33) { + availability = RenderingAvailability.FULL; + + OptifineHandler.get() + .filter(OptifineHandler::isUsingShaders) + .ifPresent(it -> availability = RenderingAvailability.OPTIFINE_SHADERS); + } else { + availability = RenderingAvailability.INCAPABLE; + } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/GlVersioned.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/GlVersioned.java new file mode 100644 index 000000000..5f69d0ee0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/GlVersioned.java @@ -0,0 +1,8 @@ +package com.simibubi.create.foundation.render.gl.backend; + +import org.lwjgl.opengl.GLCapabilities; + + +public interface GlVersioned { + boolean supported(GLCapabilities caps); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java index 2d50966b0..17b83785e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java @@ -1,15 +1,19 @@ package com.simibubi.create.foundation.render.gl.backend; -import org.lwjgl.opengl.ARBMapBufferRange; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.*; import java.nio.ByteBuffer; +import java.util.Arrays; import java.util.function.Consumer; -public enum MapBuffer { +public enum MapBuffer implements GlVersioned { GL30_RANGE { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL30; + } + @Override public void mapBuffer(int target, int offset, int length, Consumer upload) { ByteBuffer buffer = GL30.glMapBufferRange(target, offset, length, GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_RANGE_BIT); @@ -21,6 +25,11 @@ public enum MapBuffer { } }, ARB_RANGE { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_ARB_map_buffer_range; + } + @Override public void mapBuffer(int target, int offset, int length, Consumer upload) { ByteBuffer buffer = ARBMapBufferRange.glMapBufferRange(target, offset, length, GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_RANGE_BIT); @@ -32,6 +41,11 @@ public enum MapBuffer { } }, GL15_MAP { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL15; + } + @Override public void mapBuffer(int target, int offset, int length, Consumer upload) { ByteBuffer buffer = GL15.glMapBuffer(target, GL15.GL_WRITE_ONLY); @@ -43,6 +57,11 @@ public enum MapBuffer { } }, UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } + @Override public void mapBuffer(int target, int offset, int length, Consumer upload) { throw new UnsupportedOperationException("glMapBuffer not supported"); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/RenderingAvailability.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/RenderingAvailability.java new file mode 100644 index 000000000..23841149b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/RenderingAvailability.java @@ -0,0 +1,27 @@ +package com.simibubi.create.foundation.render.gl.backend; + +public enum RenderingAvailability { + /** + * The current system does not support enough + * OpenGL features to enable fast rendering. + */ + INCAPABLE, + + /** + * The current system supports OpenGL 3.3. + */ + FULL, + + /** + * The current system supports OpenGL 2.0, + * or some ARBs that make it equivalent. + */ + PARTIAL, + + /** + * It doesn't matter what the current system + * supports because Optifine is installed and + * a shaderpack is enabled. + */ + OPTIFINE_SHADERS, +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java index f4c89d3b4..8a47796d8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.gl.shader; import com.simibubi.create.foundation.render.gl.GlObject; +import com.simibubi.create.foundation.render.gl.backend.Backend; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; @@ -29,13 +30,12 @@ public abstract class GlProgram extends GlObject { * Retrieves the index of the uniform with the given name. * @param uniform The name of the uniform to find the index of * @return The uniform's index - * @throws NullPointerException If no uniform exists with the given name */ public int getUniformLocation(String uniform) { int index = GL20.glGetUniformLocation(this.handle(), uniform); if (index < 0) { - ShaderHelper.log.error("No uniform exists in program '" + this.name + "' with name: " + uniform); + Backend.log.warn("No active uniform '{}' exists in program '{}'. Could be unused.", uniform, this.name); } return index; @@ -93,7 +93,7 @@ public abstract class GlProgram extends GlObject { String log = GL20.glGetProgramInfoLog(this.program); if (!log.isEmpty()) { - ShaderHelper.log.warn("Program link log for " + this.name + ": " + log); + Backend.log.warn("Program link log for " + this.name + ": " + log); } int result = GL20.glGetProgrami(this.program, GL20.GL_LINK_STATUS); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java index 8352d159c..210878419 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java @@ -1,8 +1,7 @@ package com.simibubi.create.foundation.render.gl.shader; import com.simibubi.create.foundation.render.gl.GlObject; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; -import com.simibubi.create.foundation.render.gl.shader.ShaderType; +import com.simibubi.create.foundation.render.gl.backend.Backend; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; @@ -18,7 +17,7 @@ public class GlShader extends GlObject { if (preProcessor != null) { source = preProcessor.process(source); - ShaderHelper.log.info("Preprocessor run on " + name + ":\n" + source); + Backend.log.info("Preprocessor run on " + name);// + ":\n" + source); } GL20.glShaderSource(handle, source); @@ -27,7 +26,7 @@ public class GlShader extends GlObject { String log = GL20.glGetShaderInfoLog(handle); if (!log.isEmpty()) { - ShaderHelper.log.warn("Shader compilation log for " + name + ": " + log); + Backend.log.warn("Shader compilation log for " + name + ": " + log); } if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java deleted file mode 100644 index b3742e7ec..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderHelper.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.simibubi.create.foundation.render.gl.shader; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.content.contraptions.KineticDebugger; -import com.simibubi.create.foundation.render.gl.BasicProgram; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.texture.TextureUtil; -import net.minecraft.client.shader.ShaderLinkHelper; -import net.minecraft.resources.IReloadableResourceManager; -import net.minecraft.resources.IResourceManager; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.resource.ISelectiveResourceReloadListener; -import net.minecraftforge.resource.VanillaResourceType; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.lwjgl.opengl.GL20; -import org.lwjgl.system.MemoryUtil; - -import javax.annotation.Nullable; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.FloatBuffer; -import java.util.HashMap; -import java.util.Map; - -public class ShaderHelper { - - public static final Logger log = LogManager.getLogger(ShaderHelper.class); - - public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); // TODO: these leak 80 bytes of memory per program launch - public static final FloatBuffer VEC3_BUFFER = MemoryUtil.memAllocFloat(3); - public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); - - private static final Map> REGISTRY = new HashMap<>(); - private static final Map, GlProgram> PROGRAMS = new HashMap<>(); - - public static

> S register(S spec) { - ResourceLocation name = spec.name; - if (REGISTRY.containsKey(name)) { - throw new IllegalStateException("Program spec '" + name + "' already registered."); - } - REGISTRY.put(name, spec); - return spec; - } - - public static void initShaders() { - // Can be null when running datagenerators due to the unfortunate time we call this - Minecraft mc = Minecraft.getInstance(); - if (mc != null && mc.getResourceManager() instanceof IReloadableResourceManager) { - ISelectiveResourceReloadListener listener = (manager, predicate) -> { - if (predicate.test(VanillaResourceType.SHADERS)) { - PROGRAMS.values().forEach(GlProgram::delete); - PROGRAMS.clear(); - for (ProgramSpec shader : REGISTRY.values()) { - loadProgram(manager, shader); - } - } - }; - ((IReloadableResourceManager) mc.getResourceManager()).addReloadListener(listener); - } - } - - @SuppressWarnings("unchecked") - public static

> P getProgram(S spec) { - return (P) PROGRAMS.get(spec); - } - - public static void releaseShader() { - GL20.glUseProgram(0); - } - - private static

> void loadProgram(IResourceManager manager, S programSpec) { - GlShader vert = null; - GlShader frag = null; - try { - vert = loadShader(manager, programSpec.getVert(), ShaderType.VERTEX, programSpec.defines); - frag = loadShader(manager, programSpec.getFrag(), ShaderType.FRAGMENT, programSpec.defines); - - P program = GlProgram.builder(programSpec.name) - .attachShader(vert) - .attachShader(frag) - .build(programSpec.factory); - - PROGRAMS.put(programSpec, program); - - log.info("Loaded program {}", programSpec.name); - } catch (IOException ex) { - log.error("Failed to load program {}", programSpec.name, ex); - } finally { - if (vert != null) vert.delete(); - if (frag != null) frag.delete(); - } - } - - private static GlShader loadShader(IResourceManager manager, ResourceLocation name, ShaderType type, GlShader.PreProcessor preProcessor) throws IOException { - try (InputStream is = new BufferedInputStream(manager.getResource(name).getInputStream())) { - String source = TextureUtil.func_225687_b_(is); - - if (source == null) { - throw new IOException("Could not load program " + name); - } else { - return new GlShader(type, name, source, preProcessor); - } - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java index 3e8d402f8..a454828f6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java @@ -18,7 +18,7 @@ public class InstancedTileRenderRegistry { @SuppressWarnings("unchecked") @Nullable - public TileEntityInstance create(InstancedTileRenderer manager, T tile) { + public TileEntityInstance create(InstancedTileRenderer manager, T tile) { TileEntityType type = tile.getType(); IRendererFactory factory = (IRendererFactory) this.renderers.get(type); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java index c7d0aad5a..6037e97fd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java @@ -3,11 +3,11 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.gl.BasicProgram; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL20; import javax.annotation.Nullable; import java.util.HashMap; @@ -42,15 +42,14 @@ public abstract class InstancedTileRenderer

{ if (instance != null) { return (TileEntityInstance) instance; } else if (create) { - return null; -// TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); -// -// if (renderer != null) { -// FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(tile); -// instances.put(tile, renderer); -// } -// -// return renderer; + TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); + + if (renderer != null) { + FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(tile); + instances.put(tile, renderer); + } + + return renderer; } else { return null; } @@ -116,6 +115,6 @@ public abstract class InstancedTileRenderer

{ material.render(layer, viewProjection, callback); } - ShaderHelper.releaseShader(); + GL20.glUseProgram(0); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java index 9a0520071..4feaa3e8f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.gl.BasicProgram; +import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockRendererDispatcher; @@ -63,7 +63,7 @@ public class RenderMaterial

setup) { - P program = ShaderHelper.getProgram(programSpec); + P program = Backend.getProgram(programSpec); program.bind(viewProjection, 0); if (setup != null) setup.call(program); diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java index 9ec917814..4109f49e6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.render.light; import com.simibubi.create.foundation.render.RenderWork; import com.simibubi.create.foundation.render.gl.GlTexture; -import com.simibubi.create.foundation.render.gl.shader.ShaderHelper; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; From ee9962b27b3bede0ce33ff4e16c49dd7a69c6468 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sun, 7 Feb 2021 22:11:29 -0800 Subject: [PATCH 083/147] fix some new rendering issues that popped up after the revert proper? optifine shader handling. could use more testing --- .../com/simibubi/create/CreateClient.java | 2 +- .../mixer/MechanicalMixerRenderer.java | 5 ++ .../press/MechanicalPressRenderer.java | 5 ++ .../block/mechanicalArm/ArmRenderer.java | 5 ++ .../block/mechanicalArm/ArmTileEntity.java | 5 ++ .../command/ConfigureConfigPacket.java | 7 +- .../create/foundation/config/CClient.java | 14 +--- .../foundation/mixin/ShaderCloseMixin.java | 29 +++++++ .../render/FastRenderDispatcher.java | 3 + .../foundation/render/OptifineHandler.java | 57 ------------- .../foundation/render/gl/backend/Backend.java | 57 +++++++------ .../render/gl/backend/OptifineHandler.java | 82 +++++++++++++++++++ .../gl/backend/RenderingAvailability.java | 27 ------ .../render/gl/backend/SystemCapability.java | 19 +++++ src/main/resources/create.mixins.json | 4 +- 15 files changed, 188 insertions(+), 133 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/OptifineHandler.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/backend/OptifineHandler.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/backend/RenderingAvailability.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/backend/SystemCapability.java diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 515429057..ddab555eb 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -12,7 +12,7 @@ import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; import com.simibubi.create.foundation.render.KineticRenderer; -import com.simibubi.create.foundation.render.OptifineHandler; +import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.gl.backend.Backend; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index ca1b39d8b..9937e6cfa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -24,6 +24,11 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { super(dispatcher); } + @Override + public boolean isGlobalRenderer(KineticTileEntity te) { + return true; + } + @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index 58a7a6c83..18f2353a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -19,6 +19,11 @@ public class MechanicalPressRenderer extends KineticTileEntityRenderer { super(dispatcher); } + @Override + public boolean isGlobalRenderer(KineticTileEntity te) { + return true; + } + @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 73f747b57..3e38b8abb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -29,6 +29,11 @@ public class ArmRenderer extends KineticTileEntityRenderer { super(dispatcher); } + @Override + public boolean isGlobalRenderer(KineticTileEntity te) { + return true; + } + @Override protected void renderSafe(KineticTileEntity te, float pt, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index e088c50d0..c4370c2b4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -466,6 +466,11 @@ public class ArmTileEntity extends KineticTileEntity { return true; } + @Override + public boolean shouldRenderAsTE() { + return true; + } + private class SelectionModeValueBox extends CenteredSideValueBoxTransform { public SelectionModeValueBox() { diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java index 2154690df..945166a97 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -5,7 +5,6 @@ import java.util.function.Supplier; import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.gl.backend.Backend; -import javafx.scene.layout.Background; import org.apache.logging.log4j.LogManager; import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; @@ -88,11 +87,7 @@ public class ConfigureConfigPacket extends SimplePacketBase { private static void experimentalRendering(String value) { boolean last = AllConfigs.CLIENT.experimentalRendering.get(); AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value)); - Backend.refreshAvailability(); - - if (last != AllConfigs.CLIENT.experimentalRendering.get()) { - FastRenderDispatcher.refresh(); - } + FastRenderDispatcher.refresh(); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index 25fcc3fea..a1f3fbc13 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -38,19 +38,7 @@ public class CClient extends ConfigBase { */ @Override public Boolean get() { - boolean enabled = super.get(); - - if (enabled) { - switch (Backend.getAvailability()) { - case FULL: - case PARTIAL: - return true; - default: - return false; - } - } else { - return false; - } + return super.get() && Backend.canUse(); } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java new file mode 100644 index 000000000..e65a9774c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java @@ -0,0 +1,29 @@ +package com.simibubi.create.foundation.mixin; + +import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.VideoSettingsScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import javax.annotation.Nullable; + +@Mixin(Minecraft.class) +public class ShaderCloseMixin { + + @Shadow @Nullable public Screen currentScreen; + + @Inject(at = @At("HEAD"), method = "displayGuiScreen") + private void whenScreenChanges(Screen screen, CallbackInfo info) { + if (OptifineHandler.optifineInstalled() && screen instanceof VideoSettingsScreen) { + Screen old = this.currentScreen; + if (old != null && old.getClass().getName().startsWith(OptifineHandler.SHADER_PACKAGE)) { + OptifineHandler.refresh(); + } + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index ad75f735b..208e1474b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -5,6 +5,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; import com.simibubi.create.foundation.render.light.ILightListener; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; @@ -63,6 +65,7 @@ public class FastRenderDispatcher { public static void refresh() { RenderWork.enqueue(() -> { CreateClient.kineticRenderer.invalidate(); + OptifineHandler.refresh(); Minecraft.getInstance().worldRenderer.loadRenderers(); ClientWorld world = Minecraft.getInstance().world; if (world != null) world.loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); diff --git a/src/main/java/com/simibubi/create/foundation/render/OptifineHandler.java b/src/main/java/com/simibubi/create/foundation/render/OptifineHandler.java deleted file mode 100644 index 55665fcee..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/OptifineHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.simibubi.create.foundation.render; - -import com.simibubi.create.foundation.render.gl.backend.Backend; -import net.minecraft.client.Minecraft; - -import java.io.*; -import java.util.Optional; - -public class OptifineHandler { - private static Package optifine; - private static OptifineHandler handler; - - public final boolean usingShaders; - - public OptifineHandler(boolean usingShaders) { - this.usingShaders = usingShaders; - } - - public static Optional get() { - return Optional.ofNullable(handler); - } - - public static void init() { - optifine = Package.getPackage("net.optifine"); - - if (optifine == null) { - Backend.log.info("Optifine not detected."); - } else { - Backend.log.info("Optifine detected."); - - refresh(); - } - } - - public static void refresh() { - if (optifine == null) return; - - File dir = Minecraft.getInstance().gameDir; - - File shaderOptions = new File(dir, "optionsshaders.txt"); - - boolean shadersOff = true; - try { - BufferedReader reader = new BufferedReader(new FileReader(shaderOptions)); - - shadersOff = reader.lines().anyMatch(it -> it.replaceAll("\\s", "").equals("shaderPack=OFF")); - } catch (FileNotFoundException e) { - Backend.log.info("No shader config found."); - } - - handler = new OptifineHandler(!shadersOff); - } - - public boolean isUsingShaders() { - return usingShaders; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java index 62c258479..96fff17a3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.render.gl.backend; -import com.simibubi.create.foundation.render.OptifineHandler; import com.simibubi.create.foundation.render.gl.shader.*; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureUtil; @@ -33,19 +32,16 @@ public class Backend { public static final FloatBuffer VEC3_BUFFER = MemoryUtil.memAllocFloat(3); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); - private static final Backend instance = new Backend(); - public static Backend instance() { - return instance; - } - private static final Map> registry = new HashMap<>(); private static final Map, GlProgram> programs = new HashMap<>(); public static GLCapabilities capabilities; - private static RenderingAvailability availability; + private static SystemCapability capability; private static MapBuffer mapBuffer; - + public Backend() { + throw new IllegalStateException(); + } public static void mapBuffer(int target, int offset, int length, Consumer upload) { mapBuffer.mapBuffer(target, offset, length, upload); @@ -101,26 +97,37 @@ public class Backend { return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().orElse(last); } - public static RenderingAvailability getAvailability() { - return availability; + public static boolean canUse() { + return isCapable() && !OptifineHandler.usingShaders(); + } + + public static SystemCapability getCapability() { + return capability; + } + + public static boolean isCapable() { + return capability.isCapable(); } public static void init() { // Can be null when running datagenerators due to the unfortunate time we call this Minecraft mc = Minecraft.getInstance(); - if (mc != null && mc.getResourceManager() instanceof IReloadableResourceManager) { + if (mc == null) return; + + IResourceManager manager = mc.getResourceManager(); + + if (manager instanceof IReloadableResourceManager) { ISelectiveResourceReloadListener listener = Backend::onResourceManagerReload; - ((IReloadableResourceManager) mc.getResourceManager()).addReloadListener(listener); + ((IReloadableResourceManager) manager).addReloadListener(listener); } } - public static void onResourceManagerReload(IResourceManager manager, Predicate predicate) { + private static void onResourceManagerReload(IResourceManager manager, Predicate predicate) { if (predicate.test(VanillaResourceType.SHADERS)) { capabilities = GL.createCapabilities(); mapBuffer = getLatest(MapBuffer.class); - OptifineHandler.refresh(); - refreshAvailability(); + refresh(); programs.values().forEach(GlProgram::delete); programs.clear(); @@ -130,6 +137,14 @@ public class Backend { } } + public static void refresh() { + if (capabilities.OpenGL33) { + capability = SystemCapability.CAPABLE; + } else { + capability = SystemCapability.INCAPABLE; + } + } + private static

> void loadProgram(IResourceManager manager, S programSpec) { GlShader vert = null; GlShader frag = null; @@ -164,16 +179,4 @@ public class Backend { } } } - - public static void refreshAvailability() { - if (capabilities.OpenGL33) { - availability = RenderingAvailability.FULL; - - OptifineHandler.get() - .filter(OptifineHandler::isUsingShaders) - .ifPresent(it -> availability = RenderingAvailability.OPTIFINE_SHADERS); - } else { - availability = RenderingAvailability.INCAPABLE; - } - } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/OptifineHandler.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/OptifineHandler.java new file mode 100644 index 000000000..5143ba134 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/OptifineHandler.java @@ -0,0 +1,82 @@ +package com.simibubi.create.foundation.render.gl.backend; + +import net.minecraft.client.Minecraft; + +import java.io.*; +import java.util.Optional; + +public class OptifineHandler { + public static final String OPTIFINE_ROOT_PACKAGE = "net.optifine"; + public static final String SHADER_PACKAGE = "net.optifine.shaders"; + + private static Package optifine; + private static OptifineHandler handler; + + public final boolean usingShaders; + + public OptifineHandler(boolean usingShaders) { + this.usingShaders = usingShaders; + } + + /** + * Get information about the current Optifine configuration. + * @return {@link Optional#empty()} if Optifine is not installed. + */ + public static Optional get() { + return Optional.ofNullable(handler); + } + + public static boolean optifineInstalled() { + return optifine != null; + } + + public static boolean usingShaders() { + return OptifineHandler.get() + .map(OptifineHandler::isUsingShaders) + .orElse(false); + } + + public static void init() { + optifine = Package.getPackage(OPTIFINE_ROOT_PACKAGE); + + if (optifine == null) { + Backend.log.info("Optifine not detected."); + } else { + Backend.log.info("Optifine detected."); + + refresh(); + } + } + + public static void refresh() { + if (optifine == null) return; + + File dir = Minecraft.getInstance().gameDir; + + File shaderOptions = new File(dir, "optionsshaders.txt"); + + boolean shadersOff = true; + try { + BufferedReader reader = new BufferedReader(new FileReader(shaderOptions)); + + shadersOff = reader.lines() + .anyMatch(it -> { + String line = it.replaceAll("\\s", ""); + if (line.startsWith("shaderPack=")) { + String setting = line.substring("shaderPack=".length()); + + return setting.equals("OFF") || setting.equals("(internal)"); + } + return false; + }); + } catch (FileNotFoundException e) { + Backend.log.info("No shader config found."); + } + + handler = new OptifineHandler(!shadersOff); + } + + public boolean isUsingShaders() { + return usingShaders; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/RenderingAvailability.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/RenderingAvailability.java deleted file mode 100644 index 23841149b..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/RenderingAvailability.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.simibubi.create.foundation.render.gl.backend; - -public enum RenderingAvailability { - /** - * The current system does not support enough - * OpenGL features to enable fast rendering. - */ - INCAPABLE, - - /** - * The current system supports OpenGL 3.3. - */ - FULL, - - /** - * The current system supports OpenGL 2.0, - * or some ARBs that make it equivalent. - */ - PARTIAL, - - /** - * It doesn't matter what the current system - * supports because Optifine is installed and - * a shaderpack is enabled. - */ - OPTIFINE_SHADERS, -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/SystemCapability.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/SystemCapability.java new file mode 100644 index 000000000..4dcb5d9a4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/SystemCapability.java @@ -0,0 +1,19 @@ +package com.simibubi.create.foundation.render.gl.backend; + +public enum SystemCapability { + /** + * The current system does not support enough + * OpenGL features to enable fast rendering. + */ + INCAPABLE, + + /** + * The current system supports OpenGL 3.3. + */ + CAPABLE, + ; + + public boolean isCapable() { + return this == CAPABLE; + } +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index ae2f46a98..4f171a769 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -3,9 +3,9 @@ "package": "com.simibubi.create.foundation.mixin", "compatibilityLevel": "JAVA_8", "refmap": "create.refmap.json", - "client": ["CancelTileEntityRenderMixin", "LightUpdateMixin", "RenderInLayerMixin"], + "client": ["OnRemoveTileMixin", "ShaderCloseMixin", "CancelTileEntityRenderMixin", "LightUpdateMixin", "RenderInLayerMixin"], "injectors": { "defaultRequire": 1 }, - "minVersion": "0.8", "mixins": ["OnRemoveTileMixin"] + "minVersion": "0.8" } \ No newline at end of file From 607dbbfb90c60c39506120cb5f0cfce5dbde310c Mon Sep 17 00:00:00 2001 From: Snownee Date: Mon, 8 Feb 2021 22:40:55 +0800 Subject: [PATCH 084/147] Fix PSI item dupe --- .../actors/PortableFluidInterfaceTileEntity.java | 5 +++-- .../actors/PortableItemInterfaceTileEntity.java | 5 +++-- .../actors/PortableStorageInterfaceTileEntity.java | 13 ++++++++++++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableFluidInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableFluidInterfaceTileEntity.java index 981213c94..4c27df6f1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableFluidInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableFluidInterfaceTileEntity.java @@ -37,6 +37,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi LazyOptional oldcap = capability; capability = createEmptyHandler(); oldcap.invalidate(); + super.stopTransferring(); } private LazyOptional createEmptyHandler() { @@ -90,7 +91,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi @Override public FluidStack drain(FluidStack resource, FluidAction action) { - if (!isConnected()) + if (!canTransfer()) return FluidStack.EMPTY; FluidStack drain = wrapped.drain(resource, action); if (!drain.isEmpty() && action.execute()) @@ -100,7 +101,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi @Override public FluidStack drain(int maxDrain, FluidAction action) { - if (!isConnected()) + if (!canTransfer()) return FluidStack.EMPTY; FluidStack drain = wrapped.drain(maxDrain, action); if (!drain.isEmpty() && (action.execute() || drain.getAmount() == 1)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableItemInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableItemInterfaceTileEntity.java index 1642a30ed..227c42dee 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableItemInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableItemInterfaceTileEntity.java @@ -33,6 +33,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil LazyOptional oldCap = capability; capability = LazyOptional.of(() -> new InterfaceItemHandler(new ItemStackHandler(0))); oldCap.invalidate(); + super.stopTransferring(); } @Override @@ -55,7 +56,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil @Override public ItemStack extractItem(int slot, int amount, boolean simulate) { - if (!isConnected()) + if (!canTransfer()) return ItemStack.EMPTY; ItemStack extractItem = super.extractItem(slot, amount, simulate); if (!simulate && !extractItem.isEmpty()) @@ -65,7 +66,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil @Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - if (!isConnected()) + if (!canTransfer()) return stack; ItemStack insertItem = super.insertItem(slot, stack, simulate); if (!simulate && !insertItem.equals(stack, false)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java index de4043458..2fd42b5ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.LerpedFloat; +import net.minecraft.entity.Entity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.AxisAlignedBB; @@ -21,6 +22,7 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity protected float distance; protected LerpedFloat connectionAnimation; protected boolean powered; + protected Entity connectedEntity; public PortableStorageInterfaceTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); @@ -32,11 +34,20 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity public void startTransferringTo(Contraption contraption, float distance) { this.distance = distance; + connectedEntity = contraption.entity; startConnecting(); notifyUpdate(); } - protected abstract void stopTransferring(); + protected void stopTransferring() { + connectedEntity = null; + } + + public boolean canTransfer() { + if (connectedEntity != null && !connectedEntity.isAlive()) + stopTransferring(); + return connectedEntity != null && isConnected(); + } protected abstract void invalidateCapability(); From cfff806df48d79e10c881749654eeae08f4b0455 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 8 Feb 2021 21:17:25 -0800 Subject: [PATCH 085/147] some micro optimizations. cache hot getters. reduce number of calls to getBeltFacing() in BeltRenderer. preserve floating point accuracy over (insanely) long play times. rotate some normals and light some quads. --- .../category/animations/AnimatedKinetics.java | 2 +- .../category/animations/AnimatedSpout.java | 4 +- .../contraptions/base/KineticTileEntity.java | 6 -- .../clock/CuckooClockTileEntity.java | 4 +- .../crafter/MechanicalCrafterRenderer.java | 3 +- .../particle/RotationIndicatorParticle.java | 3 +- .../processing/BasinTileEntity.java | 23 ++------ .../relays/belt/BeltRenderer.java | 21 +++---- .../relays/belt/BeltTileEntity.java | 17 ++++-- .../tools/SandPaperItemRenderer.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 5 +- .../simibubi/create/events/ClientEvents.java | 5 +- .../create/foundation/config/CClient.java | 6 ++ .../render/FastRenderDispatcher.java | 3 +- .../foundation/render/SuperByteBuffer.java | 59 +++++++++++++------ .../foundation/render/gl/BasicProgram.java | 2 +- .../foundation/render/gl/backend/Backend.java | 10 +++- .../instancing/InstancedTileRenderer.java | 2 +- .../utility/AnimationTickHolder.java | 15 ++++- 19 files changed, 109 insertions(+), 83 deletions(-) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index 4339372d5..003cf9333 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -11,7 +11,7 @@ import net.minecraft.util.Direction.Axis; public abstract class AnimatedKinetics implements IDrawable { public static float getCurrentAngle() { - return ((AnimationTickHolder.ticks + AnimationTickHolder.getPartialTicks()) * 4f) % 360; + return ((AnimationTickHolder.getRenderTick()) * 4f) % 360; } protected BlockState shaft(Axis axis) { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index ad1ae4522..52eed284e 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -15,8 +15,6 @@ import net.minecraftforge.fluids.FluidStack; import java.util.List; -import static com.simibubi.create.foundation.utility.AnimationTickHolder.ticks; - public class AnimatedSpout extends AnimatedKinetics { private List fluids; @@ -38,7 +36,7 @@ public class AnimatedSpout extends AnimatedKinetics { .scale(scale) .render(); - float cycle = (ticks + AnimationTickHolder.getPartialTicks()) % 30; + float cycle = AnimationTickHolder.getRenderTick() % 30; float squeeze = cycle < 20 ? MathHelper.sin((float) (cycle / 20f * Math.PI)) : 0; squeeze *= 20; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 2eaa1c517..7ed35759a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -26,7 +26,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; @@ -463,11 +462,6 @@ public abstract class KineticTileEntity extends SmartTileEntity return overStressed; } - @Override - public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox(); - } - @Override public double getMaxRenderDistanceSquared() { return 16384.0D; // TODO: make this a config option diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java index 2d0a4c1ec..bc2d77826 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java @@ -92,9 +92,9 @@ public class CuckooClockTileEntity extends KineticTileEntity { moveHands(hours, minutes); if (animationType == Animation.NONE) { - if (AnimationTickHolder.ticks % 32 == 0) + if (AnimationTickHolder.getTicks() % 32 == 0) playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 2f); - else if (AnimationTickHolder.ticks % 16 == 0) + else if (AnimationTickHolder.getTicks() % 16 == 0) playSound(SoundEvents.BLOCK_NOTE_BLOCK_HAT, 1 / 16f, 1.5f); } else { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java index 5dd5581f7..6617e7a91 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java @@ -6,7 +6,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity.Phase; import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHandler.GroupedItems; -import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -178,7 +177,7 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer { ms.push(); - Vec3i directionVec = te.getBeltFacing() - .getDirectionVec(); + Direction beltFacing = te.getBeltFacing(); + Vec3i directionVec = beltFacing + .getDirectionVec(); Vec3d beltStartOffset = new Vec3d(directionVec).scale(-.5) .add(.5, 13 / 16f + .125f, .5); ms.translate(beltStartOffset.x, beltStartOffset.y, beltStartOffset.z); BeltSlope slope = te.getBlockState() .get(BeltBlock.SLOPE); int verticality = slope == BeltSlope.DOWNWARD ? -1 : slope == BeltSlope.UPWARD ? 1 : 0; - boolean slopeAlongX = te.getBeltFacing() - .getAxis() == Axis.X; + boolean slopeAlongX = beltFacing + .getAxis() == Axis.X; for (TransportedItemStack transported : te.getInventory() .getTransportedItems()) { @@ -205,16 +206,16 @@ public class BeltRenderer extends SafeTileEntityRenderer { .add(0, verticalMovement, 0); boolean onSlope = slope != BeltSlope.HORIZONTAL && MathHelper.clamp(offset, .5f, te.beltLength - .5f) == offset; - boolean tiltForward = (slope == BeltSlope.DOWNWARD ^ te.getBeltFacing() - .getAxisDirection() == AxisDirection.POSITIVE) == (te.getBeltFacing() - .getAxis() == Axis.Z); + boolean tiltForward = (slope == BeltSlope.DOWNWARD ^ beltFacing + .getAxisDirection() == AxisDirection.POSITIVE) == (beltFacing + .getAxis() == Axis.Z); float slopeAngle = onSlope ? tiltForward ? -45 : 45 : 0; ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); - boolean alongX = te.getBeltFacing() - .rotateY() - .getAxis() == Axis.X; + boolean alongX = beltFacing + .rotateY() + .getAxis() == Axis.X; if (!alongX) sideOffset *= -1; ms.translate(alongX ? sideOffset : 0, 0, alongX ? 0 : sideOffset); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 84a60d265..a8c45f527 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -63,8 +63,8 @@ public class BeltTileEntity extends KineticTileEntity { public CompoundNBT trackerUpdateTag; // client - public byte blockLight; - public byte skyLight; + public byte blockLight = -1; + public byte skyLight = -1; public static enum CasingType { NONE, ANDESITE, BRASS; @@ -137,11 +137,17 @@ public class BeltTileEntity extends KineticTileEntity { return super.calculateStressApplied(); } + private AxisAlignedBB cachedBoundingBox; @Override public AxisAlignedBB getRenderBoundingBox() { - if (!isController()) - return super.getRenderBoundingBox(); - return super.getRenderBoundingBox().grow(beltLength + 1); + if (cachedBoundingBox == null) { + if (!isController()) + cachedBoundingBox = super.getRenderBoundingBox(); + else + cachedBoundingBox = super.getRenderBoundingBox().grow(beltLength + 1); + } + + return cachedBoundingBox; } protected void initializeItemHandler() { @@ -261,6 +267,7 @@ public class BeltTileEntity extends KineticTileEntity { public void setController(BlockPos controller) { this.controller = controller; + cachedBoundingBox = null; } public BlockPos getController() { diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java index 8414e43c8..5be2fb467 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java @@ -48,7 +48,7 @@ public class SandPaperItemRenderer extends ItemStackTileEntityRenderer { // Reverse bobbing float time = (float) (!jeiMode ? player.getItemInUseCount() - : (-AnimationTickHolder.ticks) % stack.getUseDuration()) - partialTicks + 1.0F; + : (-AnimationTickHolder.getTicks()) % stack.getUseDuration()) - partialTicks + 1.0F; if (time / (float) stack.getUseDuration() < 0.8F) { float bobbing = -MathHelper.abs(MathHelper.cos(time / 4.0F * (float) Math.PI) * 0.1F); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 3e38b8abb..6d005cebc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -6,12 +6,11 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; - import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -56,7 +55,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15); upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95); headAngle = -lowerArmAngle; - color = ColorHelper.rainbowColor(AnimationTickHolder.ticks * 100); + color = ColorHelper.rainbowColor(AnimationTickHolder.getTicks() * 100); } ms.push(); diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index fe626d735..734babaf8 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -50,7 +50,6 @@ import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.RenderTickEvent; @@ -114,13 +113,13 @@ public class ClientEvents { @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { CreateClient.invalidateRenderers(); - AnimationTickHolder.ticks = 0; + AnimationTickHolder.reset(); } @SubscribeEvent public static void onUnloadWorld(WorldEvent.Unload event) { CreateClient.invalidateRenderers(); - AnimationTickHolder.ticks = 0; + AnimationTickHolder.reset(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index a1f3fbc13..e1043bca0 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -40,6 +40,12 @@ public class CClient extends ConfigBase { public Boolean get() { return super.get() && Backend.canUse(); } + + @Override + public void set(Boolean value) { + super.set(value); + Backend.enabled = get(); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 208e1474b..f1265e932 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -3,7 +3,6 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; @@ -59,7 +58,7 @@ public class FastRenderDispatcher { } public static boolean available() { - return AllConfigs.CLIENT.experimentalRendering.get(); + return Backend.enabled; } public static void refresh() { diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index bdd6c9ae1..40fcee652 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -1,24 +1,21 @@ package com.simibubi.create.foundation.render; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.util.function.Consumer; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; - import it.unimi.dsi.fastutil.longs.Long2DoubleMap; import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.Vector4f; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; import net.minecraft.world.World; +import net.minecraftforge.client.model.pipeline.LightUtil; + +import java.nio.Buffer; +import java.nio.ByteBuffer; public class SuperByteBuffer extends TemplateBuffer { @@ -60,6 +57,7 @@ public class SuperByteBuffer extends TemplateBuffer { private static final Long2DoubleMap skyLightCache = new Long2DoubleOpenHashMap(); private static final Long2DoubleMap blockLightCache = new Long2DoubleOpenHashMap(); Vector4f pos = new Vector4f(); + Vector3f normal = new Vector3f(); Vector4f lightPos = new Vector4f(); public void renderInto(MatrixStack input, IVertexBuilder builder) { @@ -68,12 +66,18 @@ public class SuperByteBuffer extends TemplateBuffer { return; ((Buffer) buffer).rewind(); - Matrix4f t = input.peek() - .getModel() - .copy(); + Matrix3f normalMat = transforms.peek() + .getNormal() + .copy(); + //normalMat.multiply(transforms.peek().getNormal()); + + Matrix4f modelMat = input.peek() + .getModel() + .copy(); + Matrix4f localTransforms = transforms.peek() - .getModel(); - t.multiply(localTransforms); + .getModel(); + modelMat.multiply(localTransforms); if (shouldLight && lightTransform != null) { skyLightCache.clear(); @@ -90,16 +94,33 @@ public class SuperByteBuffer extends TemplateBuffer { byte g = getG(buffer, i); byte b = getB(buffer, i); byte a = getA(buffer, i); + float normalX = getNX(buffer, i) / 127f; + float normalY = getNY(buffer, i) / 127f; + float normalZ = getNZ(buffer, i) / 127f; + + float staticDiffuse = LightUtil.diffuseLight(normalX, normalY, normalZ); + normal.set(normalX, normalY, normalZ); + normal.transform(normalMat); + float instanceDiffuse = LightUtil.diffuseLight(normal.getX(), normal.getY(), normal.getZ()); pos.set(x, y, z, 1F); - pos.transform(t); + pos.transform(modelMat); builder.vertex(pos.getX(), pos.getY(), pos.getZ()); + //builder.color((byte) Math.max(0, normal.getX() * 255), (byte) Math.max(0, normal.getY() * 255), (byte) Math.max(0, normal.getZ() * 255), a); if (shouldColor) { - float lum = (r < 0 ? 255 + r : r) / 256f; - builder.color((int) (this.r * lum), (int) (this.g * lum), (int) (this.b * lum), this.a); - } else - builder.color(r, g, b, a); + //float lum = (r < 0 ? 255 + r : r) / 256f; + int colorR = Math.min(255, (int) (((float) this.r) * instanceDiffuse)); + int colorG = Math.min(255, (int) (((float) this.g) * instanceDiffuse)); + int colorB = Math.min(255, (int) (((float) this.b) * instanceDiffuse)); + builder.color(colorR, colorG, colorB, this.a); + } else { + float diffuseMult = instanceDiffuse / staticDiffuse; + int colorR = Math.min(255, (int) (((float) Byte.toUnsignedInt(r)) * diffuseMult)); + int colorG = Math.min(255, (int) (((float) Byte.toUnsignedInt(g)) * diffuseMult)); + int colorB = Math.min(255, (int) (((float) Byte.toUnsignedInt(b)) * diffuseMult)); + builder.color(colorR, colorG, colorB, a); + } float u = getU(buffer, i); float v = getV(buffer, i); @@ -121,7 +142,7 @@ public class SuperByteBuffer extends TemplateBuffer { } else builder.light(getLight(buffer, i)); - builder.normal(getNX(buffer, i), getNY(buffer, i), getNZ(buffer, i)) + builder.normal(normal.getX(), normal.getY(), normal.getZ()) .endVertex(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java index f00c9b443..b39fff2b7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java @@ -36,7 +36,7 @@ public class BasicProgram extends GlProgram { public void bind(Matrix4f viewProjection, int debugMode) { super.bind(); - GL20.glUniform1i(uTicks, AnimationTickHolder.ticks); + GL20.glUniform1i(uTicks, AnimationTickHolder.getTicks()); GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTick()); uploadMatrixUniform(uViewProjection, viewProjection); GL20.glUniform1i(uDebug, debugMode); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java index 96fff17a3..4e47f8429 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java @@ -1,6 +1,10 @@ package com.simibubi.create.foundation.render.gl.backend; -import com.simibubi.create.foundation.render.gl.shader.*; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.render.gl.shader.GlProgram; +import com.simibubi.create.foundation.render.gl.shader.GlShader; +import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; +import com.simibubi.create.foundation.render.gl.shader.ShaderType; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.resources.IReloadableResourceManager; @@ -35,6 +39,8 @@ public class Backend { private static final Map> registry = new HashMap<>(); private static final Map, GlProgram> programs = new HashMap<>(); + public static boolean enabled; + public static GLCapabilities capabilities; private static SystemCapability capability; private static MapBuffer mapBuffer; @@ -143,6 +149,8 @@ public class Backend { } else { capability = SystemCapability.INCAPABLE; } + + enabled = AllConfigs.CLIENT.experimentalRendering.get(); } private static

> void loadProgram(IResourceManager manager, S programSpec) { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java index 6037e97fd..0ebf612f3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java @@ -93,7 +93,7 @@ public abstract class InstancedTileRenderer

{ public void clean() { // Clean up twice a second. This doesn't have to happen every tick, // but this does need to be run to ensure we don't miss anything. - if (AnimationTickHolder.ticks % 10 == 0) { + if (AnimationTickHolder.getTicks() % 10 == 0) { instances.keySet().stream().filter(TileEntity::isRemoved).forEach(instances::remove); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java index f8c654658..4b8f410c5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java @@ -4,14 +4,20 @@ import net.minecraft.client.Minecraft; public class AnimationTickHolder { - public static int ticks; + private static int ticks; + + public static void reset() { + ticks = 0; + } public static void tick() { - if (!Minecraft.getInstance().isGamePaused()) ticks++; + if (!Minecraft.getInstance().isGamePaused()) { + ticks = (ticks + 1) % 1_728_000; // wrap around every 24 hours so we maintain enough floating point precision + } } public static float getRenderTick() { - return ticks + getPartialTicks(); + return getTicks() + getPartialTicks(); } public static float getPartialTicks() { @@ -19,4 +25,7 @@ public class AnimationTickHolder { return (mc.isGamePaused() ? mc.renderPartialTicksPaused : mc.getRenderPartialTicks()); } + public static int getTicks() { + return ticks; + } } From 6736577e1bd9aa85523cfebcbb7d709c378397b4 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 8 Feb 2021 21:38:45 -0800 Subject: [PATCH 086/147] fix the rainbow debugger --- .../contraptions/base/KineticTileInstance.java | 3 ++- .../contraptions/components/fan/FanInstance.java | 3 ++- .../contraptions/relays/belt/BeltInstance.java | 2 +- .../relays/encased/SplitShaftInstance.java | 3 ++- .../relays/gearbox/GearboxInstance.java | 3 ++- .../foundation/render/FastRenderDispatcher.java | 5 +++++ .../contraption/ContraptionRenderDispatcher.java | 3 ++- .../render/instancing/KineticData.java | 16 ++++++++++++---- .../render/instancing/RenderMaterial.java | 3 ++- 9 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index c3b2bf4c1..5b79e2e06 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -19,7 +19,8 @@ public abstract class KineticTileInstance extends T protected final void updateRotation(InstanceKey key, Direction.Axis axis) { key.modifyInstance(data -> { - data.setRotationalSpeed(tile.getSpeed()) + data.setColor(tile.network) + .setRotationalSpeed(tile.getSpeed()) .setRotationOffset(getRotationOffset(axis)) .setRotationAxis(axis); }); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index 8ad1f6d52..e7dfcb8b5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -82,7 +82,8 @@ public class FanInstance extends KineticTileInstance { updateRotation(shaft, axis); fan.modifyInstance(data -> { - data.setRotationalSpeed(getFanSpeed()) + data.setColor(tile.network) + .setRotationalSpeed(getFanSpeed()) .setRotationOffset(getRotationOffset(axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); }); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 6de68adfb..145e44920 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -83,7 +83,7 @@ public class BeltInstance extends KineticTileInstance { @Override public void onUpdate() { for (InstanceKey key : keys) { - key.modifyInstance(data -> data.setRotationalSpeed(getScrollSpeed())); + key.modifyInstance(data -> data.setColor(tile.network).setRotationalSpeed(getScrollSpeed())); } if (pulleyKey != null) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index 5bb674062..dce5bac1c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -77,7 +77,8 @@ public class SplitShaftInstance extends KineticTileInstance { Direction.Axis axis = dir.getAxis(); - data.setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir)) + data.setColor(tile.network) + .setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir)) .setRotationOffset(getRotationOffset(axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); }); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index ae6cfb934..2644bf25c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -90,7 +90,8 @@ public class GearboxInstance extends KineticTileInstance { Direction direction = key.getKey(); Direction.Axis axis = direction.getAxis(); - data.setRotationalSpeed(getSpeed(direction)) + data.setColor(tile.network) + .setRotationalSpeed(getSpeed(direction)) .setRotationOffset(getRotationOffset(axis)) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); }); diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index f1265e932..4e0482a7d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; @@ -61,6 +62,10 @@ public class FastRenderDispatcher { return Backend.enabled; } + public static int getDebugMode() { + return KineticDebugger.isActive() ? 1 : 0; + } + public static void refresh() { RenderWork.enqueue(() -> { CreateClient.kineticRenderer.invalidate(); diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index ab6075114..b10d7ab85 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; @@ -95,7 +96,7 @@ public class ContraptionRenderDispatcher { GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 ContraptionProgram structureShader = Backend.getProgram(AllProgramSpecs.CONTRAPTION_STRUCTURE); - structureShader.bind(viewProjection, 0); + structureShader.bind(viewProjection, FastRenderDispatcher.getDebugMode()); for (RenderedContraption renderer : renderers.values()) { renderer.doRenderLayer(layer, structureShader); } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java index 99d33cf8c..b205596ac 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java @@ -64,11 +64,19 @@ public class KineticData> extends InstanceData { return (D) this; } - private void setColor(long l) { + public D setColor(Long l) { + if (l != null) + return setColor(l.longValue()); + else + return setColor(0xFF, 0xFF, 0xFF); + } + + private D setColor(long l) { int color = ColorHelper.colorFromLong(l); - r = (byte) ((color >> 16) & 0xFF); - g = (byte) ((color >> 8) & 0xFF); - b = (byte) (color & 0xFF); + byte r = (byte) ((color >> 16) & 0xFF); + byte g = (byte) ((color >> 8) & 0xFF); + byte b = (byte) (color & 0xFF); + return setColor(r, g, b); } public D setColor(int r, int g, int b) { diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java index 4feaa3e8f..11e8aebae 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.Compartment; +import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.gl.BasicProgram; import com.simibubi.create.foundation.render.gl.backend.Backend; @@ -64,7 +65,7 @@ public class RenderMaterial

setup) { P program = Backend.getProgram(programSpec); - program.bind(viewProjection, 0); + program.bind(viewProjection, FastRenderDispatcher.getDebugMode()); if (setup != null) setup.call(program); From 0cb909491316aaab312b51921a2a052142f066cb Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 9 Feb 2021 16:14:44 -0800 Subject: [PATCH 087/147] non experimental contraption rendering is back. schematic rendering is fixed. both of these are kinda ugly hacks, and there is definitely some rewriting necessary for when it's time to be more opengl compatible. maybe fix belt lighting, again. remove old belt assets. --- .../base/KineticTileEntityRenderer.java | 2 +- .../actors/DrillMovementBehaviour.java | 4 +++- .../actors/HarvesterMovementBehaviour.java | 4 +++- .../crafter/MechanicalCrafterRenderer.java | 2 +- .../components/deployer/DeployerRenderer.java | 2 +- .../components/fan/EncasedFanRenderer.java | 2 +- .../mixer/MechanicalMixerRenderer.java | 2 +- .../contraptions/components/saw/SawRenderer.java | 2 +- .../AbstractContraptionEntityRenderer.java | 9 +++++++-- .../structureMovement/ContraptionRenderer.java | 11 ++++++----- .../relays/advanced/SpeedControllerRenderer.java | 2 +- .../contraptions/relays/belt/BeltRenderer.java | 2 +- .../contraptions/relays/belt/BeltTileEntity.java | 6 +++--- .../relays/encased/SplitShaftRenderer.java | 2 +- .../relays/gearbox/GearboxRenderer.java | 2 +- .../schematics/client/SchematicHandler.java | 2 +- .../foundation/render/FastRenderDispatcher.java | 6 ++++++ .../render/instancing/InstancedTileRenderer.java | 3 +++ .../create/textures/block/belt_animated.png | Bin 9546 -> 0 bytes .../textures/block/belt_diagonal_animated.png | Bin 5680 -> 0 bytes 20 files changed, 42 insertions(+), 23 deletions(-) delete mode 100644 src/main/resources/assets/create/textures/block/belt_animated.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_diagonal_animated.png diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index fa4853051..7b8c3f092 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -41,7 +41,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - if (!FastRenderDispatcher.available()) { + if (!FastRenderDispatcher.available(te.getWorld())) { KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), ms, vb, light); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 3d11bccde..dfb054de6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -28,7 +28,7 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (FastRenderDispatcher.available()) return; + if (FastRenderDispatcher.available(te.getWorld())) return; Direction direction = te.getBlockState() .get(FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 9937e6cfa..1b76603b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -38,7 +38,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - if (!FastRenderDispatcher.available()) { + if (!FastRenderDispatcher.available(te.getWorld())) { SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState); standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index aebbe7ef3..84564ddfb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -45,7 +45,7 @@ public class SawRenderer extends SafeTileEntityRenderer { renderItems(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); - if (FastRenderDispatcher.available()) return; + if (FastRenderDispatcher.available(te.getWorld())) return; renderShaft(te, ms, buffer, light, overlay); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index 3d5801a0a..399741243 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; @@ -55,8 +57,11 @@ public abstract class AbstractContraptionEntityRenderer { protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (!FastRenderDispatcher.available()) { + if (!FastRenderDispatcher.available(te.getWorld())) { BlockState blockState = te.getBlockState(); if (!AllBlocks.BELT.has(blockState)) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index a8c45f527..34c972ae5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -99,6 +99,9 @@ public class BeltTileEntity extends KineticTileEntity { initializeItemHandler(); + if (blockLight == -1) + updateLight(); + // Move Items if (!isController()) return; @@ -125,9 +128,6 @@ public class BeltTileEntity extends KineticTileEntity { BeltMovementHandler.transportEntity(this, entity, info); }); toRemove.forEach(passengers::remove); - - if (blockLight == -1) - updateLight(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 12fed3ad1..a4ccdffc4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -28,7 +28,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (FastRenderDispatcher.available()) return; + if (FastRenderDispatcher.available(te.getWorld())) return; Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 2d5dd9a70..d97110116 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -26,7 +26,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (FastRenderDispatcher.available()) return; + if (FastRenderDispatcher.available(te.getWorld())) return; final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 87e69f75b..87df3b517 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -56,7 +56,7 @@ public class SchematicHandler { public SchematicHandler() { renderers = new Vector<>(3); for (int i = 0; i < renderers.capacity(); i++) - renderers.add(new SchematicRendererWithInstancing()); + renderers.add(new SchematicRenderer()); overlay = new SchematicHotbarSlotOverlay(); currentTool = Tools.Deploy; diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 4e0482a7d..0d7be045d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; +import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; @@ -24,6 +25,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; +import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL20; @@ -62,6 +64,10 @@ public class FastRenderDispatcher { return Backend.enabled; } + public static boolean available(World world) { + return Backend.enabled && !(world instanceof SchematicWorld); + } + public static int getDebugMode() { return KineticDebugger.isActive() ? 1 : 0; } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java index 0ebf612f3..03908fb4d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.FastRenderDispatcher; import com.simibubi.create.foundation.render.gl.BasicProgram; +import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.Matrix4f; @@ -37,6 +38,8 @@ public abstract class InstancedTileRenderer

{ @SuppressWarnings("unchecked") @Nullable public TileEntityInstance getInstance(T tile, boolean create) { + if (!Backend.enabled) return null; + TileEntityInstance instance = instances.get(tile); if (instance != null) { diff --git a/src/main/resources/assets/create/textures/block/belt_animated.png b/src/main/resources/assets/create/textures/block/belt_animated.png deleted file mode 100644 index 527b162fa7bac935285f4b8269c4f33e875f0fb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9546 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 diff --git a/src/main/resources/assets/create/textures/block/belt_diagonal_animated.png b/src/main/resources/assets/create/textures/block/belt_diagonal_animated.png deleted file mode 100644 index 29a5552d586ced1c9d33c3a51b35630873343be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5680 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 Date: Wed, 10 Feb 2021 13:07:41 +0900 Subject: [PATCH 088/147] Localize Fixes --- .../resources/assets/create/lang/ja_jp.json | 139 +++++++++--------- 1 file changed, 71 insertions(+), 68 deletions(-) diff --git a/src/main/resources/assets/create/lang/ja_jp.json b/src/main/resources/assets/create/lang/ja_jp.json index 870e1b1fd..eefebe880 100644 --- a/src/main/resources/assets/create/lang/ja_jp.json +++ b/src/main/resources/assets/create/lang/ja_jp.json @@ -147,8 +147,8 @@ "block.create.fluid_tank": "液体タンク", "block.create.fluid_valve": "液体バルブ", "block.create.flywheel": "勢車", - "block.create.framed_glass": "大きなガラス窓", - "block.create.framed_glass_pane": "大きなガラス窓板", + "block.create.framed_glass": "ガラス窓", + "block.create.framed_glass_pane": "ガラス窓板", "block.create.furnace_engine": "かまどエンジン", "block.create.gabbro": "斑れい岩", "block.create.gabbro_bricks": "斑れい岩レンガ", @@ -160,6 +160,8 @@ "block.create.gabbro_cobblestone_stairs": "斑れい岩の丸石の階段", "block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の壁", "block.create.gabbro_pillar": "斑れい岩の柱", + "block.create.gantry_pinion": "ガントリーピニオン", + "block.create.gantry_shaft": "ガントリーシャフト", "block.create.gearbox": "ギアボックス", "block.create.gearshift": "ギアシフト", "block.create.glass_fluid_pipe": "ガラスの液体パイプ", @@ -368,13 +370,13 @@ "block.create.shaft": "シャフト", "block.create.smart_chute": "スマートシュート", "block.create.smart_fluid_pipe": "スマート液体パイプ", - "block.create.speedometer": "スピードメーター", + "block.create.speedometer": "速度メーター", "block.create.spout": "アイテム注液口", "block.create.spruce_window": "マツの窓", "block.create.spruce_window_pane": "マツの窓パネル", "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", "block.create.stockpile_switch": "在庫スイッチ", - "block.create.stressometer": "ストレスメーター", + "block.create.stressometer": "応力メーター", "block.create.tiled_glass": "タイルガラス", "block.create.tiled_glass_pane": "タイルガラス板", "block.create.turntable": "ターンテーブル", @@ -403,6 +405,7 @@ "block.create.zinc_ore": "亜鉛鉱石", "entity.create.contraption": "からくり", + "entity.create.gantry_contraption": "ガントリーからくり", "entity.create.seat": "シート", "entity.create.stationary_contraption": "付設からくり", "entity.create.super_glue": "接着剤", @@ -522,9 +525,9 @@ "advancement.create.goggles": "応力をこの目で", "advancement.create.goggles.desc": "機械からより多くの情報を手に入れるために、エンジニアのゴーグルを作る", "advancement.create.speedometer": "正確な速度は?", - "advancement.create.speedometer.desc": "動作中のスピードメーターをゴーグルで見て、正確な値を読み取る", + "advancement.create.speedometer.desc": "動作中の速度メーターをゴーグルで見て、正確な値を読み取る", "advancement.create.stressometer": "正確な応力は?", - "advancement.create.stressometer.desc": "動作中のストレスメーターをゴーグルを通して見て、正確な値を読み取る", + "advancement.create.stressometer.desc": "動作中の応力メーターをゴーグルを通して見て、正確な値を読み取る", "advancement.create.aesthetics": "装飾ブーム!", "advancement.create.aesthetics.desc": "シャフト、パイプ、歯車に腕木や腕金を取り付ける", "advancement.create.reinforced": "補強ブーム!", @@ -586,7 +589,7 @@ "advancement.create.pipe_spill": "漏れてる!", "advancement.create.pipe_spill.desc": "パイプの端を露出させて液体が吹き出しているところを見る", "advancement.create.hose_pulley": "工業排水", - "advancement.create.hose_pulley.desc": "ホースプーリーを下げて、液体の排出や吸引を見る", + "advancement.create.hose_pulley.desc": "ホースプーリーを下げて、液体の放出や吸引を見る", "advancement.create.infinite_water": "海の水ぜんぶ抜く大作戦", "advancement.create.infinite_water.desc": "無限と言えるほどの大量の水を吸引する", "advancement.create.infinite_lava": "星の核ぜんぶ抜く大作戦", @@ -597,7 +600,7 @@ "advancement.create.crafter.desc": "メカニカルクラフターを設置して、回転力を与える", "advancement.create.clockwork_bearing": "時計仕掛け", "advancement.create.clockwork_bearing.desc": "時計仕掛けのベアリングの上に構造物を組み立てる", - "advancement.create.nixie_tube": "派手な看板", + "advancement.create.nixie_tube": "イカした看板", "advancement.create.nixie_tube.desc": "ニキシー管を手に入れて、設置する", "advancement.create.deployer": "突く、置く、殴る!", "advancement.create.deployer.desc": "自分の手と全く同じ動きをするデプロイヤーを設置して、稼働させる", @@ -605,7 +608,7 @@ "advancement.create.speed_controller.desc": "究極の伝動機、回転速度コントローラーを設置する", "advancement.create.flywheel": "工場の心臓部", "advancement.create.flywheel.desc": "かまどエンジンを勢車に繋ぐ", - "advancement.create.overstress_flywheel": "高レベル応力", + "advancement.create.overstress_flywheel": "ハイレベル応力", "advancement.create.overstress_flywheel.desc": "かまどエンジンに超過応力をかける", "advancement.create.integrated_circuit": "複素数の計算", "advancement.create.integrated_circuit.desc": "集積回路を組み立てる", @@ -675,7 +678,7 @@ "create.recipe.automatic_shapeless": "自動不定形クラフト", "create.recipe.automatic_brewing": "自動醸造", "create.recipe.packing": "圧縮", - "create.recipe.automatic_packing": "自動包装", + "create.recipe.automatic_packing": "自動圧縮クラフト", "create.recipe.sawing": "製材", "create.recipe.mechanical_crafting": "メカニカルクラフト", "create.recipe.automatic_shaped": "自動定形クラフト", @@ -825,7 +828,7 @@ "create.gui.stressometer.overstressed": "超過応力", "create.gui.stressometer.no_rotation": "回転なし", "create.gui.contraptions.not_fast_enough": "この %1$s は_十分な_回転を_していない_ようです。", - "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらに原動機を追加するか、_応力_の影響が大きい機械のスピードを_下げて_ください。", + "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらに原動機を追加するか、_応力_の影響が大きい機械の速度を_下げて_ください。", "create.gui.adjustable_crate.title": "可変クレート", "create.gui.adjustable_crate.storageSpace": "収納スペース", "create.gui.stockpile_switch.title": "在庫スイッチ", @@ -956,9 +959,9 @@ "create.materialChecklist.blocksNotLoaded": "*免責事項*\n\n素材チェックリストは関連するチャンクがロードされていないため、不正確な場合があります。", "create.gui.filter.deny_list": "ブラックリスト", - "create.gui.filter.deny_list.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。 空のブラックリストはすべてを受け入れます。", + "create.gui.filter.deny_list.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。空のブラックリストはすべてを受け入れます。", "create.gui.filter.allow_list": "ホワイトリスト", - "create.gui.filter.allow_list.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。 空のホワイトリストはすべてを拒否します。", + "create.gui.filter.allow_list.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。空のホワイトリストはすべてを拒否します。", "create.gui.filter.respect_data": "データを重視", "create.gui.filter.respect_data.description": "アイテムは、耐久性、エンチャント、その他の属性も一致する場合にのみ一致します。", "create.gui.filter.ignore_data": "データを無視", @@ -1017,7 +1020,7 @@ "create.gui.attribute_filter.selected_attributes": "選択された属性:", "create.gui.attribute_filter.add_attribute": "属性をリストに追加する", "create.gui.attribute_filter.add_inverted_attribute": "反属性をリストに追加する", - "create.gui.attribute_filter.allow_list_disjunctive": "ホワイトリスト(どれか)", + "create.gui.attribute_filter.allow_list_disjunctive": "ホワイトリスト(いずれか)", "create.gui.attribute_filter.allow_list_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", "create.gui.attribute_filter.allow_list_conjunctive": "ホワイトリスト(全て)", "create.gui.attribute_filter.allow_list_conjunctive.description": "選択した属性をすべてを持っている場合、アイテムは通り抜けます。", @@ -1033,12 +1036,12 @@ "create.tooltip.speedRequirement.none": "無し", "create.tooltip.speedRequirement.medium": "中速", "create.tooltip.speedRequirement.high": "高速", - "create.tooltip.stressImpact": "応力への影響: %1$s", + "create.tooltip.stressImpact": "応力の影響: %1$s", "create.tooltip.stressImpact.low": "低", "create.tooltip.stressImpact.medium": "中", "create.tooltip.stressImpact.high": "高", "create.tooltip.stressImpact.overstressed": "超過応力", - "create.tooltip.capacityProvided": "応力許容量: %1$s", + "create.tooltip.capacityProvided": "応力の容量: %1$s", "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", "create.tooltip.capacityProvided.high": "大", @@ -1106,7 +1109,7 @@ "create.command.killTPSCommand.argument.tickTime": "tickTime", "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", - "create.subtitle.schematicannon_finish": "概略図砲が完了する", + "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", "create.subtitle.mechanical_press_item_break": "金属がガチャンと鳴る", @@ -1167,11 +1170,11 @@ "block.create.brass_funnel.tooltip.behaviour3": "下向きホッパーのように、_アイテム_を_下方向_に_移動_させます。", "block.create.brass_tunnel.tooltip": "真鍮トンネル", - "block.create.brass_tunnel.tooltip.summary": "派手な_メカニカルベルト_の保護カバー!_真鍮トンネル_にはアイテムの_フィルター機能_や、_分割機能_の設定項目も多数用意されています。", + "block.create.brass_tunnel.tooltip.summary": "オシャレな_メカニカルベルト_の保護カバー!_真鍮トンネル_にはアイテムの_フィルター機能_や、_分割機能_の設定項目も多数用意されています。", "block.create.brass_tunnel.tooltip.condition1": "並べて設置したとき", "block.create.brass_tunnel.tooltip.behaviour1": "_真鍮トンネル_は相互に接続し、ある_メカニカルベルト_のアイテムを別の_メカニカルベルト_に送ったりできるようにします。", "block.create.brass_tunnel.tooltip.condition2": "フィルター機能", - "block.create.brass_tunnel.tooltip.behaviour2": "_真鍮トンネル_は_搬入_と_搬出_、両方のフィルターを搭載しています。 _トンネル_のフィルター付き出力から_アイテム_が出てくることが許可されていない場合、並べて設置された_トンネル_の出力に送られます。", + "block.create.brass_tunnel.tooltip.behaviour2": "_真鍮トンネル_は_搬入_と_搬出_、両方のフィルターを搭載しています。_トンネル_のフィルター付き出力から_アイテム_が出てくることが許可されていない場合、並べて設置された_トンネル_の出力に送られます。", "block.create.brass_tunnel.tooltip.condition3": "分割機能", "block.create.brass_tunnel.tooltip.behaviour3": "_真鍮トンネル_は、_アイテム_が接続された_メカニカルベルト_に分類して並べる方法を変更するように設定できます。", "block.create.brass_tunnel.tooltip.control1": "側面をレンチで右クリックしたとき。", @@ -1225,14 +1228,14 @@ "block.create.hose_pulley.tooltip": "ホースプーリー", "block.create.hose_pulley.tooltip.summary": "ワールドの大量の_液体_を_吸引_したり、_放出_したりするのに使います。", "block.create.hose_pulley.tooltip.condition1": "回転したとき", - "block.create.hose_pulley.tooltip.behaviour1": "ホースを_上げ下げ_して、どの程度の_高さ_まで_吸引_や_排出_を行うか決めます。", + "block.create.hose_pulley.tooltip.behaviour1": "ホースを_上げ下げ_して、どの程度の_高さ_まで_吸引_や_放出_を行うか決めます。", "block.create.hose_pulley.tooltip.condition2": "プーリーから液体が吸い込まれたとき", "block.create.hose_pulley.tooltip.behaviour2": "ホースの端がおろされた本体から_液体_ブロックを_吸引_し始めます。非常に_大量_の液体は_無限_と_みなされます_。", "block.create.hose_pulley.tooltip.condition3": "液体がプーリーに押しこまれたとき", "block.create.hose_pulley.tooltip.behaviour3": "ホースの端の_高さ_まで、_液体_の_放出_を始めます。", "block.create.fluid_tank.tooltip": "液体タンク", - "block.create.fluid_tank.tooltip.summary": "あなたのお気に入りの_液体_をすべて_貯蔵_します。縦横に並べて大きさを調整できます。", + "block.create.fluid_tank.tooltip.summary": "あなたのお気に入りのあらゆる_液体_を_貯蔵_できます。縦横に並べて大きさを調整できます。", "block.create.fluid_tank.tooltip.condition1": "レンチで右クリックしたとき", "block.create.fluid_tank.tooltip.behaviour1": "窓の設定を変更します。", @@ -1271,7 +1274,7 @@ "block.create.item_drain.tooltip": "アイテム排液口", "block.create.item_drain.tooltip.summary": "_液体アイテム_を空にする格子付きデポ。", - "block.create.item_drain.tooltip.condition1": "液体排液 ", + "block.create.item_drain.tooltip.condition1": "液体排液", "block.create.item_drain.tooltip.behaviour1": "_バケツ_や_ボトル_などの_液体入り容器_を横から搬入すると、アイテム排液口はその_液体入り容器_に空にしようとします。その後、アイテムは反対側に排出されます。", "block.create.mechanical_arm.tooltip": "メカニカルアーム", @@ -1297,7 +1300,7 @@ "item.create.handheld_blockzapper.tooltip": "携帯ブロックザッパー", "item.create.handheld_blockzapper.tooltip.summary": "離れた場所にブロックを設置または交換する新しいガジェット。", "item.create.handheld_blockzapper.tooltip.control1": "ブロックを左クリックしたとき", - "item.create.handheld_blockzapper.tooltip.action": "ターゲットのブロックをこのツールに設定します。", + "item.create.handheld_blockzapper.tooltip.action1": "ターゲットのブロックをこのツールに設定します。", "item.create.handheld_blockzapper.tooltip.control2": "ブロックを右クリックしたとき", "item.create.handheld_blockzapper.tooltip.action2": "ターゲットブロックを_配置_または_置換_します。", "item.create.handheld_blockzapper.tooltip.control3": "スニークしながら右クリックしたとき。", @@ -1343,7 +1346,7 @@ "item.create.empty_schematic.tooltip.summary": "レシピの材料、および_概略図テーブル_での書き込みに使用されます。", "item.create.schematic.tooltip": "概略図", - "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保持します。 ホログラムを必要に応じて配置し、_概略図砲_を使用して建築します。", + "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保持します。ホログラムを必要に応じて配置し、_概略図砲_を使用して建築します。", "item.create.schematic.tooltip.condition1": "持ったとき", "item.create.schematic.tooltip.behaviour1": "画面上のツールを使用して配置できます。", "item.create.schematic.tooltip.control1": "スニークしながら右クリックしたとき", @@ -1354,11 +1357,11 @@ "item.create.schematic_and_quill.tooltip.condition1": "ステップ1", "item.create.schematic_and_quill.tooltip.behaviour1": "右クリックして2つのコーナーポイントを選択します。", "item.create.schematic_and_quill.tooltip.condition2": "ステップ2", - "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrlキーを押しながらスクロール_して、サイズを調整します。 もう一度右クリックして保存します。", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrlキーを押しながらスクロール_して、サイズを調整します。もう一度右クリックして保存します。", "item.create.schematic_and_quill.tooltip.control1": "右クリックしたとき", "item.create.schematic_and_quill.tooltip.action1": "コーナーポイントを選択/保存を確認します。", "item.create.schematic_and_quill.tooltip.control2": "Ctrlを長押してるとき", - "item.create.schematic_and_quill.tooltip.action2": "_空中_でポイントを選択します。 _スクロール_して距離を調整します。", + "item.create.schematic_and_quill.tooltip.action2": "_空中_でポイントを選択します。_スクロール_して距離を調整します。", "item.create.schematic_and_quill.tooltip.control3": "スニークしながら右クリックしたとき", "item.create.schematic_and_quill.tooltip.action3": "選択を_リセット_して削除します。", @@ -1378,11 +1381,11 @@ "block.create.cogwheel.tooltip": "歯車", "block.create.cogwheel.tooltip.summary": "_回転_を直線で、または隣接する_歯車_に_伝達_します。", - "block.create.large_cogwheel.tooltip": "大型歯車", + "block.create.large_cogwheel.tooltip": "大きな歯車", "block.create.large_cogwheel.tooltip.summary": "小さな歯車に接続したときに_回転速度_を_変更_できる歯車の大型バージョン。", "block.create.encased_shaft.tooltip": "ケース入りシャフト", - "block.create.encased_shaft.tooltip.summary": "_回転_を直線で_伝達_します。 壁を通過する回転の伝達に適しています。", + "block.create.encased_shaft.tooltip.summary": "_回転_を直線で_伝達_します。壁を通過する回転の伝達に適しています。", "block.create.gearbox.tooltip": "ギアボックス", "block.create.gearbox.tooltip.summary": "接続された_4方向_の_回転_方向を逆にして_伝達_します。", @@ -1408,9 +1411,9 @@ "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "レッドストーン信号を受けて_いない_ときは、隣接するチェーンドライブと_同じ速度_で回転を伝達します。_レッドストーン信号強度が最大_のときは隣接するチェーンドライブは_その2倍_の速度で伝達します。その間にあるものは1-2倍の速度で伝達されます。", "item.create.belt_connector.tooltip": "メカニカルベルト", - "item.create.belt_connector.tooltip.summary": "2本以上の_シャフト_を_メカニカルベルト_で接続します。接続されたシャフトは全く同じ速度と方向で回転します。 メカニカルベルトは_アイテム_と_エンティティ_を_運搬_するベルトコンベアとして使えます。", + "item.create.belt_connector.tooltip.summary": "2本以上の_シャフト_を_メカニカルベルト_で接続します。接続されたシャフトは全く同じ速度と方向で回転します。メカニカルベルトは_アイテム_と_エンティティ_を_運搬_するベルトコンベアとして使えます。", "item.create.belt_connector.tooltip.control1": "シャフトを右クリックしたとき", - "item.create.belt_connector.tooltip.action1": "ベルトの片端のシャフトを選択します。 選択する2つのシャフトは_ベルトの方向_に向かって_縦_、_横_、または_斜め_に_並べる_必要があります。", + "item.create.belt_connector.tooltip.action1": "ベルトの片端のシャフトを選択します。選択する2つのシャフトは_ベルトの方向_に向かって_縦_、_横_、または_斜め_に_並べる_必要があります。", "item.create.belt_connector.tooltip.control2": "スニークしながら右クリックしたとき", "item.create.belt_connector.tooltip.action2": "ベルトの最初に選択した位置を_リセット_します。", @@ -1422,7 +1425,7 @@ "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの_速度_または_応力_に関する詳細情報を表示します。", "item.create.wrench.tooltip": "レンチ", - "item.create.wrench.tooltip.summary": "動的からくりに取り組むための便利なツール。 コンポーネントの_回転_、_解体_、_設定_に使用できます。", + "item.create.wrench.tooltip.summary": "動的からくりに取り組むための便利なツール。コンポーネントの_回転_、_解体_、_設定_に使用できます。", "item.create.wrench.tooltip.control1": "機械を右クリックしたとき", "item.create.wrench.tooltip.action1": "操作した面に向かって、または面から離れるように機械を_回転_させます。", "item.create.wrench.tooltip.control2": "スニークしながら右クリックしたとき", @@ -1437,7 +1440,7 @@ "block.create.encased_fan.tooltip": "ケース入りファン", "block.create.encased_fan.tooltip.summary": "_回転力_を_気流_に変換し往復させます。色んな使い方があります。", "block.create.encased_fan.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.encased_fan.tooltip.behaviour1": "真下の_熱源_から_回転力_を供給します。 ファンは下向きにする必要があります。", + "block.create.encased_fan.tooltip.behaviour1": "真下の_熱源_から_回転力_を供給します。ファンは下向きにする必要があります。", "block.create.encased_fan.tooltip.condition2": "回転したとき", "block.create.encased_fan.tooltip.behaviour2": "回転速度に応じてエンティティを_押し_たり、_吸い戻し_たりします。", "block.create.encased_fan.tooltip.condition3": "特別なブロックを吹き抜けるとき", @@ -1449,18 +1452,18 @@ "block.create.hand_crank.tooltip": "ハンドクランク", "block.create.hand_crank.tooltip.summary": "プレイヤーの相互作用を必要とする_シンプル_な_原動機_。", "block.create.hand_crank.tooltip.condition1": "使っているとき", - "block.create.hand_crank.tooltip.behaviour1": "接続したに_回転力_を供給します。 _スニークで回転を逆_にできます。", + "block.create.hand_crank.tooltip.behaviour1": "接続したに_回転力_を供給します。_スニークで回転を逆_にできます。", "block.create.cuckoo_clock.tooltip": "鳩時計", "block.create.cuckoo_clock.tooltip.summary": "空間を_彩り_、_時間を刻む_素晴らしい細工。", "block.create.cuckoo_clock.tooltip.condition1": "回転したとき", - "block.create.cuckoo_clock.tooltip.behaviour1": "_現在の時刻_を表示し、1日に2回曲を再生します。 、_正午_と夕暮れにプレイヤーが_眠れるようになるとすぐ_に_アクティブ_になります。", + "block.create.cuckoo_clock.tooltip.behaviour1": "_現在の時刻_を表示し、1日に2回曲を再生します。、_正午_と夕暮れにプレイヤーが_眠れるようになるとすぐ_に_アクティブ_になります。", "block.create.turntable.tooltip": "ターンテーブル", "block.create.turntable.tooltip.summary": "_回転力_を洗練された乗り物酔いに変えます。", "block.create.millstone.tooltip": "石臼", - "block.create.millstone.tooltip.summary": "搬入された_材料_の_研削_に適した機械。 隣接する歯車によって、または下部のシャフトに接続することによって、回転力を供給できます。 完成品は機械から搬出する必要があります。", + "block.create.millstone.tooltip.summary": "搬入された_材料_の_研削_に適した機械。隣接する歯車によって、または下部のシャフトに接続することによって、回転力を供給できます。完成品は機械から搬出する必要があります。", "block.create.millstone.tooltip.condition1": "回転したとき", "block.create.millstone.tooltip.behaviour1": "ブロックの側面または上面から搬入されたアイテムを_粉砕_を開始します。", "block.create.millstone.tooltip.condition2": "右クリックしたとき", @@ -1469,10 +1472,10 @@ "block.create.crushing_wheel.tooltip": "破砕ホイール", "block.create.crushing_wheel.tooltip.summary": "何かを_破砕_する大きな回転させられるホイール。", "block.create.crushing_wheel.tooltip.condition1": "他の破砕ホイールに取り付けたとき", - "block.create.crushing_wheel.tooltip.behaviour1": "様々な物を処理する破砕機を形成します。 ホイールの歯は、_同じ速度_で_反対方向_に回る必要があります。", + "block.create.crushing_wheel.tooltip.behaviour1": "様々な物を処理する破砕機を形成します。ホイールの歯は、_同じ速度_で_反対方向_に回る必要があります。", "block.create.mechanical_press.tooltip": "メカニカルプレス", - "block.create.mechanical_press.tooltip.summary": "その下のアイテムを圧縮する強力なピストン。 一定の_回転力_が必要です。", + "block.create.mechanical_press.tooltip.summary": "その下のアイテムを圧縮する強力なピストン。一定の_回転力_が必要です。", "block.create.mechanical_press.tooltip.condition1": "レッドストーン信号を受けたとき", "block.create.mechanical_press.tooltip.behaviour1": "その下にドロップされたアイテムの圧縮を_開始_します。", "block.create.mechanical_press.tooltip.condition2": "メカニカルベルトの上にあるとき", @@ -1507,9 +1510,9 @@ "block.create.mechanical_crafter.tooltip.condition2": "レッドストーンパルスがオンの時", "block.create.mechanical_crafter.tooltip.behaviour2": "現在与えられているすべての_アイテム_を使って、_強制的_に_クラフト_を開始します。", "block.create.mechanical_crafter.tooltip.control1": "正面をレンチで使ったとき", - "block.create.mechanical_crafter.tooltip.action1": "_個々のクラフターが_アイテムを移動_させる_方向_を循環させます。 クラフトグリッドを形成するには、すべてのアイテムを最後のクラフターに向かって_移動させる流れ_を作るように_ベルト_を設置する必要があります。最後のクラフターはグリッドから_離れる_方向を指す必要があります。", + "block.create.mechanical_crafter.tooltip.action1": "_個々のクラフターが_アイテムを移動_させる_方向_を循環させます。クラフトグリッドを形成するには、すべてのアイテムを最後のクラフターに向かって_移動させる流れ_を作るように_ベルト_を設置する必要があります。最後のクラフターはグリッドから_離れる_方向を指す必要があります。", "block.create.mechanical_crafter.tooltip.control2": "背面をレンチで使ったとき", - "block.create.mechanical_crafter.tooltip.action2": "隣接するクラフターの_搬入インベントリ_を_接続_します。 これを使用してクラフトグリッドの_スロットを_結合_し、_搬入作業_を_簡略化_できます。", + "block.create.mechanical_crafter.tooltip.action2": "隣接するクラフターの_搬入インベントリ_を_接続_します。これを使用してクラフトグリッドの_スロットを_結合_し、_搬入作業_を_簡略化_できます。", "block.create.furnace_engine.tooltip": "かまどエンジン", "block.create.furnace_engine.tooltip.summary": "_稼動しているかまど_で動く強力な_原動機_。", @@ -1536,14 +1539,14 @@ "block.create.portable_fluid_interface.tooltip.behaviour2": "アクティブな接続を即座に_切断_します。", "block.create.rotation_speed_controller.tooltip": "回転速度コントローラー", - "block.create.rotation_speed_controller.tooltip.summary": "回転を任意の速度にスピードアップまたはスローダウンさせることができる_設定_可能な_伝達機_。", + "block.create.rotation_speed_controller.tooltip.summary": "回転を任意の速度に上げたり下げたりさせることができる_設定_可能な_伝達機_。", "block.create.rotation_speed_controller.tooltip.condition1": "大きな歯車を取り付けたとき", "block.create.rotation_speed_controller.tooltip.behaviour1": "入ってくる回転力を歯車に伝達して、目標とする_速度_に_合わせ_ようとします。_歯車_はコントローラの_上_に_取り付ける_必要があります。", "block.create.mechanical_piston.tooltip": "メカニカルピストン", "block.create.mechanical_piston.tooltip.summary": "ピストンのさらに進化したバージョン。回転力を利用して前にある構造物を正確に移動させます。後部にあるピストン延長ポールは、このの稼働範囲を決めます。延長ポールがないと、ピストンは動きません。_シャーシ_や_スライムボール_、_接着剤_を使用して、1列以上のブロックを移動させることができます。", "block.create.mechanical_piston.tooltip.condition1": "回転したとき", - "block.create.mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。 速度と方向は、入力される回転速度と相関します。", + "block.create.mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。速度と方向は、入力される回転速度と相関します。", "block.create.piston_extension_pole.tooltip": "ピストン延長ポール", "block.create.piston_extension_pole.tooltip.summary": "メカニカルピストンの範囲を拡張します。", @@ -1571,7 +1574,7 @@ "block.create.clockwork_bearing.tooltip": "時計仕掛けのベアリング", "block.create.clockwork_bearing.tooltip.summary": "現在の_ゲーム内時間_に応じて最大2つの_時計の針_を回転させる、_メカニカルベアリング_の進化版。", "block.create.clockwork_bearing.tooltip.condition1": "回転したとき", - "block.create.clockwork_bearing.tooltip.behaviour1": "現在の時間に向かって取り付けた構造物の回転を開始します。 2番目の構造物が存在する場合、それは分針として機能します。", + "block.create.clockwork_bearing.tooltip.behaviour1": "現在の時間に向かって取り付けた構造物の回転を開始します。2番目の構造物が存在する場合、それは分針として機能します。", "block.create.sequenced_gearshift.tooltip": "シーケンスギアシフト", "block.create.sequenced_gearshift.tooltip.summary": "_プログラミング_できる_便利_な伝達機械。最大_5つ_の_連続_した_命令_に従って_回転処理_を変更することができます。高速になると精度が悪くなる可能性があります。", @@ -1598,7 +1601,7 @@ "block.create.rope_pulley.tooltip": "ローププーリー", "block.create.rope_pulley.tooltip.summary": "_取り付けられたブロック_や_構造物_を_垂直_方向に移動させます。_シャーシ_、_スライムボール_、_接着剤_を使用して、1つ以上のブロックを移動させることもできます。", "block.create.rope_pulley.tooltip.condition1": "回転したとき", - "block.create.rope_pulley.tooltip.behaviour1": "取り付けた構造物の移動を開始します。 速度と方向は、回転速度に相関します。", + "block.create.rope_pulley.tooltip.behaviour1": "取り付けた構造物の移動を開始します。速度と方向は、回転速度に相関します。", "block.create.linear_chassis.tooltip": "線形シャーシ", "block.create.linear_chassis.tooltip.summary": "移動用の構造物を接続する設定可能な土台ブロック。", @@ -1617,19 +1620,19 @@ "block.create.radial_chassis.tooltip.condition1": "動かしたとき", "block.create.radial_chassis.tooltip.behaviour1": "柱状に_接続_したすべての_シャーシ_と、周囲のブロックを_移動_させます。周囲のブロックは、範囲内にあり、かつ粘着面に面している場合にのみ_引っ張られ_ます([Ctrl]を参照)。", "block.create.radial_chassis.tooltip.condition2": "レンチを持ったとき", - "block.create.radial_chassis.tooltip.behaviour2": "このシャーシブロックの有効_範囲_を設定します。 Ctrlキーを押したままにすると、接続されているすべてのシャーシブロックの範囲も同時に変更できます。", + "block.create.radial_chassis.tooltip.behaviour2": "このシャーシブロックの有効_範囲_を設定します。Ctrlキーを押したままにすると、接続されているすべてのシャーシブロックの範囲も同時に変更できます。", "block.create.radial_chassis.tooltip.control1": "スライムボールで右クリックしたとき", - "block.create.radial_chassis.tooltip.action1": "クリックした面を_粘着面_にします。 シャーシが移動すると、粘着面に接続されているすべての指定のブロックも一緒に移動します。", + "block.create.radial_chassis.tooltip.action1": "クリックした面を_粘着面_にします。シャーシが移動すると、粘着面に接続されているすべての指定のブロックも一緒に移動します。", "block.create.mechanical_drill.tooltip": "メカニカルドリル", - "block.create.mechanical_drill.tooltip.summary": "_ブロックを壊す_のに適した作業機。 _メカニカルピストン_や_ベアリング_等で移動できます。", + "block.create.mechanical_drill.tooltip.summary": "_ブロックを壊す_のに適した作業機。_メカニカルピストン_や_ベアリング_等で移動できます。", "block.create.mechanical_drill.tooltip.condition1": "回転したとき", - "block.create.mechanical_drill.tooltip.behaviour1": "_固定式_のブロック破壊機として機能します。 また、有効範囲の_エンティティを傷つけます_。", + "block.create.mechanical_drill.tooltip.behaviour1": "_固定式_のブロック破壊機として機能します。また、有効範囲の_エンティティを傷つけます_。", "block.create.mechanical_drill.tooltip.condition2": "動かしたとき", "block.create.mechanical_drill.tooltip.behaviour2": "ドリルが衝突するブロックを壊します。", "block.create.mechanical_harvester.tooltip": "メカニカルハーベスター", - "block.create.mechanical_harvester.tooltip.summary": "中規模の作物の自動化に適した機械式植物カッター。 _メカニカルピストン_や_ベアリング_等で移動できます。", + "block.create.mechanical_harvester.tooltip.summary": "中規模の作物の自動化に適した機械式植物カッター。_メカニカルピストン_や_ベアリング_等で移動できます。", "block.create.mechanical_harvester.tooltip.condition1": "動かしたとき", "block.create.mechanical_harvester.tooltip.behaviour1": "ブレードが衝突する_すべての成熟した作物を収穫_し、それらを初期の成長状態にリセットします。", @@ -1639,9 +1642,9 @@ "block.create.mechanical_plough.tooltip.behaviour1": "松明や雪など、当たり判定がないブロックを壊します。エンティティを傷付けることはありません。また、クワを使うように土を耕します。", "block.create.mechanical_saw.tooltip": "メカニカルノコギリ", - "block.create.mechanical_saw.tooltip.summary": "_木_を効率的に_切り倒したり_、_ブロック_を_加工_したりするのに適しています。 _メカニカルピストン_や_ベアリング_等で移動できます。", + "block.create.mechanical_saw.tooltip.summary": "_木_を効率的に_切り倒したり_、_ブロック_を_加工_したりするのに適しています。_メカニカルピストン_や_ベアリング_等で移動できます。", "block.create.mechanical_saw.tooltip.condition1": "上向きのとき", - "block.create.mechanical_saw.tooltip.behaviour1": "そこにドロップまたは搬入されたアイテムに_製材_および石工レシピを適用します。 複数の出力が可能な場合、フィルターが割り当てられていない限り、出力が循環します。", + "block.create.mechanical_saw.tooltip.behaviour1": "そこにドロップまたは搬入されたアイテムに_製材_および石工レシピを適用します。複数の出力が可能な場合、フィルターが割り当てられていない限り、出力が循環します。", "block.create.mechanical_saw.tooltip.condition2": "横向きの場合", "block.create.mechanical_saw.tooltip.behaviour2": "その前の_原木_を_切り倒す_。その原木が木を支えていた場合、_木_は_崩壊_します。", "block.create.mechanical_saw.tooltip.condition3": "動かしたとき", @@ -1656,30 +1659,30 @@ "block.create.content_observer.tooltip.summary": "設定された_フィルター_に一致する_コンテナ_や_メカニカルベルト_内の_アイテム_を検出します。観察している_インベントリ_、_ベルト_、または_シュート_に一致するアイテムが含まれている場合、このは_レッドストーン信号_を発します。観察された_ファンネル_が一致するアイテムを_輸送_すると、このコンポーネントは_レッドストーンパルス_を発します。", "block.create.redstone_link.tooltip": "レッドストーンリンク", - "block.create.redstone_link.tooltip.summary": "_ワイヤレスレッドストーン_接続の終点。 任意のアイテムを使用して_周波数_を割り当てることができます。 通信距離は限られていますが、かなり離れても通信することができます。", + "block.create.redstone_link.tooltip.summary": "_ワイヤレスレッドストーン_接続の終点。任意のアイテムを使用して_周波数_を割り当てることができます。通信距離は限られていますが、かなり離れても通信することができます。", "block.create.redstone_link.tooltip.condition1": "信号を受信したとき", "block.create.redstone_link.tooltip.behaviour1": "同じ周波数のリンクから信号を受信すると、レッドストーン信号を出力します。", "block.create.redstone_link.tooltip.control1": "アイテムで右クリックしたとき", - "block.create.redstone_link.tooltip.action1": "_周波数_をそのアイテムに設定します。 周波数を定義するために、_合計2つの異なるアイテム_を組み合わせて使えます。", + "block.create.redstone_link.tooltip.action1": "_周波数_をそのアイテムに設定します。周波数を定義するために、_合計2つの異なるアイテム_を組み合わせて使えます。", "block.create.redstone_link.tooltip.control2": "スニークしながら右クリックしたとき", "block.create.redstone_link.tooltip.action2": "_受信_モードと_送信_モードを切り替えます。", "block.create.nixie_tube.tooltip": "ニキシー管", - "block.create.nixie_tube.tooltip.summary": "派手にレッドストーン強度と文字を表示します。", + "block.create.nixie_tube.tooltip.summary": "オシャレにレッドストーン強度と文字を表示します。", "block.create.nixie_tube.tooltip.condition1": "レッドストーン信号を受けたとき", "block.create.nixie_tube.tooltip.behaviour1": "現在のレッドストーンの_信号強度_を表示します。", "block.create.nixie_tube.tooltip.condition2": "名札を使ったとき", "block.create.nixie_tube.tooltip.behaviour2": "_名札_の_内容_を複数のニキシー管を並べて表示します。", "block.create.redstone_contact.tooltip": "レッドストーンコンタクト", - "block.create.redstone_contact.tooltip.summary": "レッドストーン信号をペアで出力します。 _メカニカルピストン_や_ベアリング_等で移動できます。", + "block.create.redstone_contact.tooltip.summary": "レッドストーン信号をペアで出力します。_メカニカルピストン_や_ベアリング_等で移動できます。", "block.create.redstone_contact.tooltip.condition1": "他のコンタクトと向かい合ったとき", "block.create.redstone_contact.tooltip.behaviour1": "レッドストーン信号を出力します。", "block.create.redstone_contact.tooltip.condition2": "動かしたとき", "block.create.redstone_contact.tooltip.behaviour2": "通過するすべての固定したレッドストーンコンタクトに反応します。", "block.create.adjustable_crate.tooltip": "可変クレート", - "block.create.adjustable_crate.tooltip.summary": "この_収納ブロック_は、容量を手動で制御できます。任意のアイテムを_16スタック_まで収納できます。 _レッドストーンコンパレーター_に対応しています。", + "block.create.adjustable_crate.tooltip.summary": "この_収納ブロック_は、容量を手動で制御できます。任意のアイテムを_16スタック_まで収納できます。_レッドストーンコンパレーター_に対応しています。", "block.create.adjustable_crate.tooltip.control1": "右クリックしたとき", "block.create.adjustable_crate.tooltip.action1": "_インターフェース_を開きます。", @@ -1689,7 +1692,7 @@ "block.create.creative_crate.tooltip.behaviour1": "このクレートから何かを_搬出_すると、指定されたアイテムが_無限_に_搬出_されます。このクレートに_搬入_されたアイテムは_消滅_します。", "block.create.deployer.tooltip": "デプロイヤー", - "block.create.deployer.tooltip.summary": "_殴る_、_使う_、_起動する_。この機械は、_プレイヤー_をできるだけ_真似_しようとします。_アイテムを自分のインベントリに入れたり_、_預けたり_できます。 持っているアイテムはブロックから直接搬入・搬出する必要があります。", + "block.create.deployer.tooltip.summary": "_殴る_、_使う_、_起動する_。この機械は、_プレイヤー_をできるだけ_真似_しようとします。_アイテムを自分のインベントリに入れたり_、_預けたり_できます。持っているアイテムはブロックから直接搬入・搬出する必要があります。", "block.create.deployer.tooltip.condition1": "回転したとき", "block.create.deployer.tooltip.behaviour1": "腕を機械の2m先まで伸ばし、アイテムを_発動_する。", "block.create.deployer.tooltip.condition2": "レンチで右クリックしたとき", @@ -1698,7 +1701,7 @@ "block.create.deployer.tooltip.behaviour3": "合わないアイテムは搬入できません。逆に合うアイテムは搬出できません。", "block.create.brass_casing.tooltip": "真ちゅうのケーシング", - "block.create.brass_casing.tooltip.summary": "さまざまな用途に使用できる頑丈な機械ケーシング。 装飾にも安心してお使いいただけます。", + "block.create.brass_casing.tooltip.summary": "さまざまな用途に使用できる頑丈な機械ケーシング。装飾にも安心してお使いいただけます。", "block.create.pulse_repeater.tooltip": "パルスリピーター", "block.create.pulse_repeater.tooltip.summary": "通過するレッドストーン信号を_1ティック_の長さにカットする簡単な回路。", @@ -1716,22 +1719,22 @@ "block.create.powered_toggle_latch.tooltip.summary": "レッドストーンパルスによって切替できるレバー。", "block.create.powered_latch.tooltip": "パワードラッチ", - "block.create.powered_latch.tooltip.summary": "_レッドストーン信号_で制御できるレバー。 _背面のレッドストーン信号_でオンになり、_側面からのレッドストーン信号_でリセットされます。", + "block.create.powered_latch.tooltip.summary": "_レッドストーン信号_で制御できるレバー。_背面のレッドストーン信号_でオンになり、_側面からのレッドストーン信号_でリセットされます。", "block.create.controller_rail.tooltip": "コントローラーレール", "block.create.controller_rail.tooltip.summary": "トロッコの_移動速度_を_細かく制御_できる一方通行の_パワード_レール", "block.create.controller_rail.tooltip.condition1": "レッドストーン信号を受けたとき", "block.create.controller_rail.tooltip.behaviour1": "通過する_トロッコ_を_信号の強度_に対応した速度に_加速_または_減速_します。また、隣接するコントローラレールにレッドストーン信号を伝達します。強度の異なる2つのコントローラレールにレッドストーン信号を供給すると、それらの間のレールはその信号の変化を補間します。", - "block.create.speedometer.tooltip": "スピードメーター", - "block.create.speedometer.tooltip.summary": "接続された機械の_回転速度_を測定して表示します。 _レッドストーンコンパレーター_に対応しています。", + "block.create.speedometer.tooltip": "速度メーター", + "block.create.speedometer.tooltip.summary": "接続された機械の_回転速度_を測定して表示します。_レッドストーンコンパレーター_に対応しています。", "block.create.speedometer.tooltip.condition1": "回転したとき", - "block.create.speedometer.tooltip.behaviour1": "速度レベルに対応する色を表示します。 _緑_は低速、_青_は中速、_紫_は高速を示します。 一部の機械は、稼働に十分なレベルの速度を必要とします。", + "block.create.speedometer.tooltip.behaviour1": "速度レベルに対応する色を表示します。_緑_は低速、_青_は中速、_紫_は高速を示します。一部の機械は、稼働に十分なレベルの速度を必要とします。", - "block.create.stressometer.tooltip": "ストレスメーター", - "block.create.stressometer.tooltip.summary": "接続された動力ネットワーク全体の応力を測定して表示します。 _レッドストーンコンパレーター_に対応しています。", + "block.create.stressometer.tooltip": "速度メーター", + "block.create.stressometer.tooltip.summary": "接続された動力ネットワーク全体の応力を測定して表示します。_レッドストーンコンパレーター_に対応しています。", "block.create.stressometer.tooltip.condition1": "回転したとき", - "block.create.stressometer.tooltip.behaviour1": "応力レベルに対応する色を表示します。 _過度に応力がかかった(超過応力)ネットワーク_の機械は全て停止します。応力は動力ネットワークに_原動機_を追加することで緩和することができます。", + "block.create.stressometer.tooltip.behaviour1": "応力レベルに対応する色を表示します。_過度に応力がかかった(超過応力)ネットワーク_の機械は全て停止します。応力は動力ネットワークに_原動機_を追加することで緩和することができます。", "item.create.sand_paper.tooltip": "紙やすり", "item.create.sand_paper.tooltip.summary": "_素材_を_磨く_のに使える荒い紙。デプロイヤーに自動的で磨かせることもできます。", @@ -1749,7 +1752,7 @@ "item.create.builders_tea.tooltip.summary": "_やる気_がみなぎる、一日の始まりに最適な飲み物。", "item.create.refined_radiance.tooltip": "洗練された輝き", - "item.create.refined_radiance.tooltip.summary": "_吸収した光_から鍛造した色彩素材。", + "item.create.refined_radiance.tooltip.summary": "_吸収した輝き_から鍛造した色彩素材。", "item.create.shadow_steel.tooltip": "シャドウスチール", "item.create.shadow_steel.tooltip.summary": "_奈落の虚無_から鍛造した色彩素材。", @@ -1760,7 +1763,7 @@ "item.create.minecart_coupling.tooltip.behaviour1": "2台のトロッコを連結します。それらは移動中に一定の距離を保とうします。", "item.create.crafter_slot_cover.tooltip": "スロットカバー", - "item.create.crafter_slot_cover.tooltip.summary": "取り付けた_メカニカルクラフター_をレシピの空のスロットとして示します。 クラフターは必ずしも正方形である必要はありません。 これは、_同じアイテムが離れた場所にある_レシピに便利です。", + "item.create.crafter_slot_cover.tooltip.summary": "取り付けた_メカニカルクラフター_をレシピの空のスロットとして示します。クラフターは必ずしも正方形である必要はありません。これは、_同じアイテムが離れた場所にある_レシピに便利です。", "create.tooltip.wip": "WIP", "create.tooltip.workInProgress": "作業中です!", @@ -1768,10 +1771,10 @@ "create.tooltip.randomWipDescription1": "赤ちゃんパンダは、このアイテムを使用するたびに死にます。そう、いつでもね。", "create.tooltip.randomWipDescription2": "自己責任。", "create.tooltip.randomWipDescription3": "これはあなたが探しているアイテムではありません。*人差し指を振って*ちっちっちっ、解散!", - "create.tooltip.randomWipDescription4": "このアイテムは10秒で自爆します。 10、9、8 ...", + "create.tooltip.randomWipDescription4": "このアイテムは10秒で自爆します。10、9、8 ...", "create.tooltip.randomWipDescription5": "私を信じて、それは無駄だ。", "create.tooltip.randomWipDescription6": "このアイテムを使用することにより、お客様はここに免責事項に同意し、その条件に同意するものとします。", - "create.tooltip.randomWipDescription7": "これは君に向いていないかもしれない。 あれはどう??", + "create.tooltip.randomWipDescription7": "これは君に向いていないかもしれない。あれはどう??", "create.tooltip.randomWipDescription8": "それを使ったことをすぐ後悔する。", "_": "Thank you for translating Create!" From e93562569bb21d01e2ee046acbc487d81088223e Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 9 Feb 2021 21:18:05 -0800 Subject: [PATCH 089/147] world fog works, fluid fog still doesn't. better dimension changes. --- .../com/simibubi/create/events/ClientEvents.java | 16 ++++++++++++---- .../foundation/mixin/RenderInLayerMixin.java | 4 ++-- .../foundation/render/FastRenderDispatcher.java | 11 ++++++----- .../contraption/ContraptionRenderDispatcher.java | 7 ++++--- .../foundation/render/gl/BasicProgram.java | 16 ++++++++++++++-- .../create/foundation/render/gl/GlFog.java | 13 +++++++++++++ .../foundation/render/gl/backend/Backend.java | 2 +- .../render/instancing/InstancedTileRenderer.java | 8 ++++---- .../render/instancing/RenderMaterial.java | 8 ++++---- .../resources/assets/create/shader/belt.vert | 3 +++ .../assets/create/shader/contraption.frag | 12 +++++++++++- .../assets/create/shader/contraption_actor.vert | 3 +++ .../create/shader/contraption_structure.vert | 4 ++++ .../assets/create/shader/instanced.frag | 12 +++++++++++- .../resources/assets/create/shader/rotating.vert | 4 ++++ 15 files changed, 96 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/GlFog.java diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 734babaf8..229f4431e 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -39,11 +39,13 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.world.ClientWorld; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.IFluidState; import net.minecraft.item.ItemStack; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityViewRenderEvent; @@ -112,14 +114,20 @@ public class ClientEvents { @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { - CreateClient.invalidateRenderers(); - AnimationTickHolder.reset(); + IWorld world = event.getWorld(); + if (world.isRemote() && world instanceof ClientWorld) { + CreateClient.invalidateRenderers(); + AnimationTickHolder.reset(); + ((ClientWorld) world).loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); + } } @SubscribeEvent public static void onUnloadWorld(WorldEvent.Unload event) { - CreateClient.invalidateRenderers(); - AnimationTickHolder.reset(); + if (event.getWorld().isRemote()) { + CreateClient.invalidateRenderers(); + AnimationTickHolder.reset(); + } } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index 171943f5c..ba05ba4e1 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -20,8 +20,8 @@ public class RenderInLayerMixin { * layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects. * This should probably be a forge event. */ - @Inject(at = @At("TAIL"), method = "renderLayer") + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/profiler/IProfiler;endSection()V", ordinal = 1), method = "renderLayer") private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { - FastRenderDispatcher.renderLayer(type, stack, cameraX, cameraY, cameraZ); + FastRenderDispatcher.renderLayer(type, stack, (float) cameraX, (float) cameraY, (float) cameraZ); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 0d7be045d..47649940f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -96,10 +96,10 @@ public class FastRenderDispatcher { } } - public static void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ) { + public static void renderLayer(RenderType type, MatrixStack stack, float cameraX, float cameraY, float cameraZ) { if (!available()) return; - Matrix4f viewProjection = Matrix4f.translate((float) -cameraX, (float) -cameraY, (float) -cameraZ); + Matrix4f viewProjection = Matrix4f.translate(-cameraX, -cameraY, -cameraZ); viewProjection.multiplyBackward(stack.peek().getModel()); viewProjection.multiplyBackward(getProjectionMatrix()); @@ -108,12 +108,13 @@ public class FastRenderDispatcher { RenderSystem.enableDepthTest(); RenderSystem.enableCull(); GL11.glCullFace(GL11.GL_BACK); - CreateClient.kineticRenderer.render(type, viewProjection); + CreateClient.kineticRenderer.render(type, viewProjection, cameraX, cameraY, cameraZ); RenderSystem.disableCull(); //RenderSystem.disableDepthTest(); - ContraptionRenderDispatcher.renderLayer(type, viewProjection); - GL20.glUseProgram(0); + ContraptionRenderDispatcher.renderLayer(type, viewProjection, cameraX, cameraY, cameraZ); + if (!OptifineHandler.usingShaders()) + GL20.glUseProgram(0); type.endDrawing(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java index b10d7ab85..4e5b28149 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.contraption; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; @@ -86,7 +87,7 @@ public class ContraptionRenderDispatcher { return renderer; } - public static void renderLayer(RenderType layer, Matrix4f viewProjection) { + public static void renderLayer(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ) { removeDeadContraptions(); if (renderers.isEmpty()) return; @@ -96,13 +97,13 @@ public class ContraptionRenderDispatcher { GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 ContraptionProgram structureShader = Backend.getProgram(AllProgramSpecs.CONTRAPTION_STRUCTURE); - structureShader.bind(viewProjection, FastRenderDispatcher.getDebugMode()); + structureShader.bind(viewProjection, camX, camY, camZ, FastRenderDispatcher.getDebugMode()); for (RenderedContraption renderer : renderers.values()) { renderer.doRenderLayer(layer, structureShader); } for (RenderedContraption renderer : renderers.values()) { - renderer.kinetics.render(layer, viewProjection, renderer::setup); + renderer.kinetics.render(layer, viewProjection, camX, camY, camZ, renderer::setup); renderer.teardown(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java index b39fff2b7..904e4c37e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java @@ -12,6 +12,9 @@ public class BasicProgram extends GlProgram { protected final int uTime; protected final int uViewProjection; protected final int uDebug; + protected final int uCameraPos; + protected final int uFogRange; + protected final int uFogColor; protected int uBlockAtlas; protected int uLightMap; @@ -22,6 +25,9 @@ public class BasicProgram extends GlProgram { uTime = getUniformLocation("uTime"); uViewProjection = getUniformLocation("uViewProjection"); uDebug = getUniformLocation("uDebug"); + uCameraPos = getUniformLocation("uCameraPos"); + uFogRange = getUniformLocation("uFogRange"); + uFogColor = getUniformLocation("uFogColor"); bind(); registerSamplers(); @@ -33,13 +39,19 @@ public class BasicProgram extends GlProgram { uLightMap = setSamplerBinding("uLightMap", 2); } - public void bind(Matrix4f viewProjection, int debugMode) { + public void bind(Matrix4f viewProjection, float camX, float camY, float camZ, int debugMode) { super.bind(); + GL20.glUniform1i(uDebug, debugMode); GL20.glUniform1i(uTicks, AnimationTickHolder.getTicks()); GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTick()); + uploadMatrixUniform(uViewProjection, viewProjection); - GL20.glUniform1i(uDebug, debugMode); + GL20.glUniform3f(uCameraPos, camX, camY, camZ); + + GL20.glUniform2f(uFogRange, GlFog.getFogStart(), GlFog.getFogEnd()); + GL20.glGetFloatv(GL20.GL_FOG_COLOR, Backend.VEC4_BUFFER); + GL20.glUniform4fv(uFogColor, Backend.VEC4_BUFFER); } protected static void uploadMatrixUniform(int uniform, Matrix4f mat) { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlFog.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlFog.java new file mode 100644 index 000000000..d13ae540c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlFog.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.render.gl; + +import org.lwjgl.opengl.GL20; + +public class GlFog { + public static float getFogEnd() { + return GL20.glGetFloat(GL20.GL_FOG_END); + } + + public static float getFogStart() { + return GL20.glGetFloat(GL20.GL_FOG_START); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java index 4e47f8429..36b198ad6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java @@ -33,7 +33,7 @@ import java.util.function.Predicate; public class Backend { public static final Logger log = LogManager.getLogger(Backend.class); public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); // TODO: these leak 80 bytes of memory per program launch - public static final FloatBuffer VEC3_BUFFER = MemoryUtil.memAllocFloat(3); + public static final FloatBuffer VEC4_BUFFER = MemoryUtil.memAllocFloat(4); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); private static final Map> registry = new HashMap<>(); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java index 03908fb4d..bce27b736 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java @@ -108,14 +108,14 @@ public abstract class InstancedTileRenderer

{ instances.clear(); } - public void render(RenderType layer, Matrix4f viewProjection) { - render(layer, viewProjection, null); + public void render(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ) { + render(layer, viewProjection, camX, camY, camZ, null); } - public void render(RenderType layer, Matrix4f viewProjection, ShaderCallback

callback) { + public void render(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ, ShaderCallback

callback) { for (RenderMaterial material : materials.values()) { if (material.canRenderInLayer(layer)) - material.render(layer, viewProjection, callback); + material.render(layer, viewProjection, camX, camY, camZ, callback); } GL20.glUseProgram(0); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java index 11e8aebae..d20e61d4e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java @@ -59,13 +59,13 @@ public class RenderMaterial

setup) { + public void render(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ, ShaderCallback

setup) { P program = Backend.getProgram(programSpec); - program.bind(viewProjection, FastRenderDispatcher.getDebugMode()); + program.bind(viewProjection, camX, camY, camZ, FastRenderDispatcher.getDebugMode()); if (setup != null) setup.call(program); diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 25bb34fd1..a6e5ecc06 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -33,6 +33,8 @@ uniform float uTime; uniform mat4 uViewProjection; uniform int uDebug; +uniform vec3 uCameraPos; +out float FragDistance; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -83,6 +85,7 @@ void main() { Diffuse = diffuse(norm); TexCoords = aTexCoords - sourceTexture + scrollTexture.xy + vec2(0, scroll); Light = light; + FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; #ifdef CONTRAPTION diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index 8628a2d1f..0cad9b4db 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -4,11 +4,15 @@ in vec2 TexCoords; in vec4 Color; in float Diffuse; in vec2 Light; +in float FragDistance; in vec3 BoxCoord; out vec4 fragColor; +uniform vec2 uFogRange; +uniform vec4 uFogColor; + uniform sampler2D uBlockAtlas; uniform sampler2D uLightMap; uniform sampler3D uLightVolume; @@ -21,5 +25,11 @@ vec4 light() { void main() { vec4 tex = texture2D(uBlockAtlas, TexCoords); - fragColor = vec4(tex.rgb * light().rgb * Diffuse * Color.rgb, tex.a); + vec4 color = vec4(tex.rgb * light().rgb * Diffuse * Color.rgb, tex.a); + + float fog = (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); + fog = clamp(fog, 0, 1); + + fragColor = mix(uFogColor, color, fog); + fragColor.a = color.a; } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index f5d4f25ce..de91f6143 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -31,6 +31,8 @@ uniform float uTime; uniform mat4 uViewProjection; uniform int uDebug; +uniform vec3 uCameraPos; +out float FragDistance; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -79,6 +81,7 @@ void main() { Diffuse = diffuse(norm); TexCoords = aTexCoords; Light = modelLight; + FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; if (uDebug == 2) { diff --git a/src/main/resources/assets/create/shader/contraption_structure.vert b/src/main/resources/assets/create/shader/contraption_structure.vert index c88226023..64a2a3759 100644 --- a/src/main/resources/assets/create/shader/contraption_structure.vert +++ b/src/main/resources/assets/create/shader/contraption_structure.vert @@ -22,6 +22,9 @@ uniform float uTime; uniform mat4 uViewProjection; uniform int uDebug; +uniform vec3 uCameraPos; +out float FragDistance; + mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); @@ -50,6 +53,7 @@ void main() { Color = aColor / diffuse(aNormal); TexCoords = aTexCoords; Light = modelLight; + FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; if (uDebug == 2) { diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index 626c0d055..0a0aca7cd 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -4,9 +4,13 @@ in vec2 TexCoords; in vec2 Light; in float Diffuse; in vec4 Color; +in float FragDistance; out vec4 fragColor; +uniform vec2 uFogRange; +uniform vec4 uFogColor; + uniform sampler2D uBlockAtlas; uniform sampler2D uLightMap; @@ -18,5 +22,11 @@ vec4 light() { void main() { vec4 tex = texture2D(uBlockAtlas, TexCoords); - fragColor = vec4(tex.rgb * light().rgb * Diffuse, tex.a) * Color; + vec4 color = vec4(tex.rgb * light().rgb * Diffuse, tex.a) * Color; + + float fog = (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); + fog = clamp(fog, 0, 1); + + fragColor = mix(uFogColor, color, fog); + fragColor.a = color.a; } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index f87dc02b4..89b76d975 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -29,6 +29,9 @@ uniform float uTime; uniform mat4 uViewProjection; uniform int uDebug; +uniform vec3 uCameraPos; +out float FragDistance; + mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); @@ -77,6 +80,7 @@ void main() { Diffuse = diffuse(norm); TexCoords = aTexCoords; Light = light; + FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; #ifdef CONTRAPTION From 02114b1d9ae4e9681cc22ef1bd5217bc89c1a253 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 10 Feb 2021 17:14:03 -0800 Subject: [PATCH 090/147] begin 2.0 compatibility push, probably not going to be ready for the next release --- .../foundation/mixin/RenderInLayerMixin.java | 2 +- .../foundation/render/AllProgramSpecs.java | 6 +- .../foundation/render/AllVertexSpecs.java | 54 ------- .../foundation/render/BufferedModel.java | 94 ++++++------ .../foundation/render/TemplateBuffer.java | 19 --- .../render/contraption/ContraptionModel.java | 6 +- .../create/foundation/render/gl/GlBuffer.java | 14 +- .../foundation/render/gl/GlPrimitiveType.java | 16 +-- .../render/gl/attrib/AttributeGroup.java | 6 +- .../render/gl/attrib/CommonAttributes.java | 26 ++-- .../render/gl/attrib/IVertexAttrib.java | 10 ++ .../gl/attrib/RotatingVertexAttributes.java | 43 ++++++ ...exAttribute.java => VertexAttribSpec.java} | 17 +-- .../render/gl/attrib/VertexFormat.java | 14 +- .../render/gl/attrib/VertexSpec.java | 61 -------- .../foundation/render/gl/backend/Backend.java | 11 +- .../render/instancing/BeltData.java | 8 +- .../instancing/DynamicInstancedModel.java | 12 +- .../render/instancing/InstancedModel.java | 135 ++++++++++-------- .../instancing/InstancedTileRenderer.java | 2 - .../render/instancing/KineticData.java | 10 +- 21 files changed, 249 insertions(+), 317 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/AllVertexSpecs.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java rename src/main/java/com/simibubi/create/foundation/render/gl/attrib/{VertexAttribute.java => VertexAttribSpec.java} (68%) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexSpec.java diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index ba05ba4e1..9073923dc 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -20,7 +20,7 @@ public class RenderInLayerMixin { * layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects. * This should probably be a forge event. */ - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/profiler/IProfiler;endSection()V", ordinal = 1), method = "renderLayer") + @Inject(at = @At(value = "TAIL"), method = "renderLayer") private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { FastRenderDispatcher.renderLayer(type, stack, (float) cameraX, (float) cameraY, (float) cameraZ); } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index c571f6ee8..344d41429 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -9,6 +9,8 @@ import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.gl.shader.ShaderConstants; import net.minecraft.util.ResourceLocation; +import static com.simibubi.create.foundation.render.gl.backend.Backend.register; + public class AllProgramSpecs { public static final ProgramSpec ROTATING = register(new ProgramSpec<>("rotating", Locations.ROTATING, Locations.INSTANCED, BasicProgram::new)); public static final ProgramSpec BELT = register(new ProgramSpec<>("belt", Locations.BELT, Locations.INSTANCED, BasicProgram::new)); @@ -17,10 +19,6 @@ public class AllProgramSpecs { public static final ProgramSpec CONTRAPTION_BELT = register(new ProgramSpec<>("contraption_belt", Locations.BELT, Locations.CONTRAPTION, ContraptionProgram::new, ShaderConstants.define("CONTRAPTION"))); public static final ProgramSpec CONTRAPTION_ACTOR = register(new ProgramSpec<>("contraption_actor", Locations.CONTRAPTION_ACTOR, Locations.CONTRAPTION, ContraptionProgram::new)); - private static

> S register(S spec) { - return Backend.register(spec); - } - public static class Locations { public static final ResourceLocation INSTANCED = loc("instanced.frag"); public static final ResourceLocation CONTRAPTION = loc("contraption.frag"); diff --git a/src/main/java/com/simibubi/create/foundation/render/AllVertexSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllVertexSpecs.java deleted file mode 100644 index 4e860fefe..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/AllVertexSpecs.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.simibubi.create.foundation.render; - -import com.simibubi.create.foundation.render.gl.GlPrimitiveType; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.VertexSpec; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribute; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; - -import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribute.copy; -import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.*; - -public class AllVertexSpecs { - - public static final VertexAttribute ROTATION_CENTER = copy("rotationCenter", CommonAttributes.VEC3); - public static final VertexAttribute SPEED = copy("speed", CommonAttributes.FLOAT); - public static final VertexAttribute OFFSET = copy("offset", CommonAttributes.FLOAT); - public static final VertexAttribute TARGET_UV = copy("scrollTexture", CommonAttributes.VEC4); - public static final VertexAttribute SCROLL_MULT = new VertexAttribute("scrollMult", GlPrimitiveType.BYTE, 1, true); - - - public static final VertexFormat FORMAT = new VertexFormat(CommonAttributes.INSTANCE_POSITION, CommonAttributes.LIGHT, CommonAttributes.RGB, SPEED, OFFSET); - - public static final VertexSpec KINETIC = new VertexSpec() - .attrib(POSITION) - .attrib(NORMAL) - .attrib(UV) - .pushGroup(1) // instance data - .attrib(INSTANCE_POSITION) - .attrib(LIGHT) - .attrib(RGB) - .attrib(SPEED) - .attrib(OFFSET); - - public static final VertexSpec BELT = new VertexSpec(KINETIC) - .attrib(ROTATION) - .attrib("uv", UV) - .attrib(TARGET_UV) - .attrib(SCROLL_MULT); - - public static final VertexSpec ROTATING = new VertexSpec(KINETIC) - .attrib("rotationAxis", NORMAL); - - public static final VertexSpec ACTOR = new VertexSpec() - .attrib(POSITION) - .attrib(NORMAL) - .attrib(UV) - .pushGroup(1) // instance data - .attrib(INSTANCE_POSITION) - .attrib(LIGHT) - .attrib(OFFSET) - .attrib("localRotationAxis", NORMAL) - .attrib("localRotation", ROTATION) - .attrib(ROTATION_CENTER); -} diff --git a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java index 37348904d..2df3d68ae 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java @@ -1,46 +1,40 @@ package com.simibubi.create.foundation.render; +import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; -import com.simibubi.create.foundation.render.gl.GlVertexArray; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; +import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; import java.nio.ByteBuffer; +import java.util.HashSet; public abstract class BufferedModel extends TemplateBuffer { - protected GlVertexArray vao; - - protected GlBuffer ebo; - protected GlBuffer invariantVBO; + protected GlBuffer modelVBO; protected boolean removed; public BufferedModel(BufferBuilder buf) { super(buf); - if (vertexCount > 0) setup(); + if (vertexCount > 0) init(); } - protected void setup() { + protected void init() { + + modelVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); + + modelVBO.bind(); + initModel(); + modelVBO.unbind(); + } + + protected void initModel() { int stride = getModelFormat().getStride(); - int invariantSize = vertexCount * stride; - vao = new GlVertexArray(); - invariantVBO = new GlBuffer(); - ebo = createEBO(); - - vao.bind(); - - int numAttributes = getTotalShaderAttributeCount(); - for (int i = 0; i <= numAttributes; i++) { - GL20.glEnableVertexAttribArray(i); - } - - invariantVBO.bind(GL15.GL_ARRAY_BUFFER); - // allocate the buffer on the gpu GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); @@ -50,12 +44,6 @@ public abstract class BufferedModel extends TemplateBuffer { copyVertex(buffer, i); } }); - - getModelFormat().informAttributes(0); - - invariantVBO.unbind(GL15.GL_ARRAY_BUFFER); - // Deselect (bind to 0) the VAO - vao.unbind(); } protected abstract void copyVertex(ByteBuffer to, int index); @@ -66,24 +54,46 @@ public abstract class BufferedModel extends TemplateBuffer { return getModelFormat().getShaderAttributeCount(); } - protected abstract void drawCall(); - - protected void preDrawTask() { - - } - - public void render() { + /** + * Renders this model, checking first if it should actually be rendered. + */ + public final void render() { if (vertexCount == 0 || removed) return; - vao.bind(); - preDrawTask(); + doRender(); + } - ebo.bind(GL15.GL_ELEMENT_ARRAY_BUFFER); + /** + * Override this + */ + protected void doRender() { + GL20.glDisableClientState(32884); + GL20.glDisableClientState(32885); + GL20.glDisableClientState(32886); + GL20.glDisableClientState(32888); + GL20.glEnable(GL20.GL_VERTEX_ARRAY); + modelVBO.bind(); - drawCall(); + setupAttributes(); + GL20.glDrawArrays(GL11.GL_QUADS, 0, vertexCount); - ebo.unbind(GL15.GL_ELEMENT_ARRAY_BUFFER); - vao.unbind(); + modelVBO.unbind(); + + int numAttributes = getTotalShaderAttributeCount(); + for (int i = 0; i <= numAttributes; i++) { + GL20.glDisableVertexAttribArray(i); + } + + GL20.glDisable(GL20.GL_VERTEX_ARRAY); + } + + protected void setupAttributes() { + getModelFormat().informAttributes(0); + + int numAttributes = getTotalShaderAttributeCount(); + for (int i = 0; i <= numAttributes; i++) { + GL20.glEnableVertexAttribArray(i); + } } public void delete() { @@ -94,8 +104,6 @@ public abstract class BufferedModel extends TemplateBuffer { } protected void deleteInternal() { - invariantVBO.delete(); - ebo.delete(); - vao.delete(); + modelVBO.delete(); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java index 1d81fe2dc..3b31227b3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java @@ -33,25 +33,6 @@ public class TemplateBuffer { ((Buffer)template).rewind(); } - protected final GlBuffer createEBO(){ - GlBuffer ebo = new GlBuffer(); - - int indicesSize = vertexCount * VertexFormatElement.Type.USHORT.getSize(); - - ebo.bind(GL15.GL_ELEMENT_ARRAY_BUFFER); - - GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); - Backend.mapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, indices -> { - for (int i = 0; i < vertexCount; i++) { - indices.putShort((short) i); - } - }); - - ebo.unbind(GL15.GL_ELEMENT_ARRAY_BUFFER); - - return ebo; - } - public boolean isEmpty() { return ((Buffer) template).limit() == 0; } diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java index 2fa63f9a0..e917c4234 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java @@ -6,6 +6,7 @@ import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.LightTexture; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL40; import java.nio.ByteBuffer; @@ -51,9 +52,4 @@ public class ContraptionModel extends BufferedModel { protected VertexFormat getModelFormat() { return FORMAT; } - - @Override - protected void drawCall() { - GL40.glDrawElements(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0); - } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java index 59d30067f..287ba6057 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java @@ -3,16 +3,20 @@ package com.simibubi.create.foundation.render.gl; import org.lwjgl.opengl.GL20; public class GlBuffer extends GlObject { - public GlBuffer() { + + protected final int bufferType; + + public GlBuffer(int bufferType) { setHandle(GL20.glGenBuffers()); + this.bufferType = bufferType; } - public void bind(int target) { - GL20.glBindBuffer(target, handle()); + public void bind() { + GL20.glBindBuffer(bufferType, handle()); } - public void unbind(int target) { - GL20.glBindBuffer(target, 0); + public void unbind() { + GL20.glBindBuffer(bufferType, 0); } protected void deleteInternal(int handle) { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java index cec97b41f..623164c08 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java @@ -5,19 +5,19 @@ import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public enum GlPrimitiveType { - FLOAT(4, "Float", 5126), - UBYTE(1, "Unsigned Byte", 5121), - BYTE(1, "Byte", 5120), - USHORT(2, "Unsigned Short", 5123), - SHORT(2, "Short", 5122), - UINT(4, "Unsigned Int", 5125), - INT(4, "Int", 5124); + FLOAT(4, "float", 5126), + UBYTE(1, "ubyte", 5121), + BYTE(1, "byte", 5120), + USHORT(2, "ushort", 5123), + SHORT(2, "short", 5122), + UINT(4, "uint", 5125), + INT(4, "int", 5124); private final int size; private final String displayName; private final int glConstant; - private GlPrimitiveType(int p_i46095_3_, String p_i46095_4_, int p_i46095_5_) { + GlPrimitiveType(int p_i46095_3_, String p_i46095_4_, int p_i46095_5_) { this.size = p_i46095_3_; this.displayName = p_i46095_4_; this.glConstant = p_i46095_5_; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java index 3546e3552..8a48ccb3c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java @@ -5,14 +5,14 @@ import java.util.ArrayList; public class AttributeGroup { private final int divisor; - private final ArrayList attributes; + private final ArrayList attributes; public AttributeGroup(int divisor) { this.divisor = divisor; this.attributes = new ArrayList<>(); } - public AttributeGroup attrib(VertexAttribute attrib) { + public AttributeGroup attrib(VertexAttribSpec attrib) { attributes.add(attrib); return this; } @@ -21,7 +21,7 @@ public class AttributeGroup { return divisor; } - public ArrayList getAttributes() { + public ArrayList getAttributes() { return attributes; } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java index d690334da..6b4f3fa57 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java @@ -4,20 +4,20 @@ import com.simibubi.create.foundation.render.gl.GlPrimitiveType; public class CommonAttributes { - public static final VertexAttribute MAT4 = new VertexAttribute("aMat4", GlPrimitiveType.FLOAT, 16); - public static final VertexAttribute VEC4 = new VertexAttribute("aVec4", GlPrimitiveType.FLOAT, 4); - public static final VertexAttribute VEC3 = new VertexAttribute("aVec3", GlPrimitiveType.FLOAT, 3); - public static final VertexAttribute VEC2 = new VertexAttribute("aVec2", GlPrimitiveType.FLOAT, 2); - public static final VertexAttribute FLOAT = new VertexAttribute("aFloat", GlPrimitiveType.FLOAT, 1); + public static final VertexAttribSpec MAT4 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 16); + public static final VertexAttribSpec VEC4 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 4); + public static final VertexAttribSpec VEC3 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 3); + public static final VertexAttribSpec VEC2 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); + public static final VertexAttribSpec FLOAT = new VertexAttribSpec(GlPrimitiveType.FLOAT, 1); - public static final VertexAttribute POSITION = VertexAttribute.copy("aPos", VEC3); - public static final VertexAttribute NORMAL = new VertexAttribute("aNormal", GlPrimitiveType.BYTE, 3, true); - public static final VertexAttribute UV = VertexAttribute.copy("aTexCoords", VEC2); + public static final VertexAttribSpec POSITION = VertexAttribSpec.copy(VEC3); + public static final VertexAttribSpec NORMAL = new VertexAttribSpec(GlPrimitiveType.BYTE, 3, true); + public static final VertexAttribSpec UV = VertexAttribSpec.copy(VEC2); - public static final VertexAttribute ROTATION = VertexAttribute.copy("eulerAngles", VEC3); - public static final VertexAttribute INSTANCE_POSITION = VertexAttribute.copy("instancePos", VEC3); + public static final VertexAttribSpec ROTATION = VertexAttribSpec.copy(VEC3); + public static final VertexAttribSpec INSTANCE_POSITION = VertexAttribSpec.copy(VEC3); - public static final VertexAttribute RGBA = new VertexAttribute("rgba", GlPrimitiveType.UBYTE, 4, true); - public static final VertexAttribute RGB = new VertexAttribute("rgb", GlPrimitiveType.UBYTE, 3, true); - public static final VertexAttribute LIGHT = new VertexAttribute("light", GlPrimitiveType.UBYTE, 2, true); + public static final VertexAttribSpec RGBA = new VertexAttribSpec(GlPrimitiveType.UBYTE, 4, true); + public static final VertexAttribSpec RGB = new VertexAttribSpec(GlPrimitiveType.UBYTE, 3, true); + public static final VertexAttribSpec LIGHT = new VertexAttribSpec(GlPrimitiveType.UBYTE, 2, true); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java new file mode 100644 index 000000000..30ef9ad45 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java @@ -0,0 +1,10 @@ +package com.simibubi.create.foundation.render.gl.attrib; + +public interface IVertexAttrib { + + String attribName(); + + VertexAttribSpec attribSpec(); + + int getDivisor(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java new file mode 100644 index 000000000..efd958688 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java @@ -0,0 +1,43 @@ +package com.simibubi.create.foundation.render.gl.attrib; + +public enum RotatingVertexAttributes implements IVertexAttrib { + VERTEX_POSITION("aPos", CommonAttributes.VEC3), + NORMAL("aNormal", CommonAttributes.VEC3), + TEXTURE("aInstancePos", CommonAttributes.VEC3), + INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3, 1), + LIGHT("aLight", CommonAttributes.LIGHT, 1), + NETWORK_COLOR("aNetworkTint", CommonAttributes.RGB, 1), + SPEED("aSpeed", CommonAttributes.FLOAT, 1), + OFFSET("aOffset", CommonAttributes.FLOAT, 1), + AXIS("aAxis", CommonAttributes.NORMAL, 1), + ; + + private final String name; + private final VertexAttribSpec spec; + private final int divisor; + + RotatingVertexAttributes(String name, VertexAttribSpec spec) { + this(name, spec, 0); + } + + RotatingVertexAttributes(String name, VertexAttribSpec spec, int divisor) { + this.name = name; + this.spec = spec; + this.divisor = divisor; + } + + @Override + public String attribName() { + return name; + } + + @Override + public VertexAttribSpec attribSpec() { + return spec; + } + + @Override + public int getDivisor() { + return divisor; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribute.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java similarity index 68% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribute.java rename to src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java index 94386821b..eb90102ee 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribute.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java @@ -3,21 +3,19 @@ package com.simibubi.create.foundation.render.gl.attrib; import com.simibubi.create.foundation.render.gl.GlPrimitiveType; import org.lwjgl.opengl.GL20; -public class VertexAttribute { +public class VertexAttribSpec { - private final String name; private final GlPrimitiveType type; private final int count; private final int size; private final int attributeCount; private final boolean normalized; - public static VertexAttribute copy(String name, VertexAttribute other) { - return new VertexAttribute(name, other); + public static VertexAttribSpec copy(VertexAttribSpec other) { + return new VertexAttribSpec(other); } - public VertexAttribute(String name, VertexAttribute that) { - this.name = name; + public VertexAttribSpec(VertexAttribSpec that) { this.type = that.type; this.count = that.count; this.size = that.size; @@ -25,12 +23,11 @@ public class VertexAttribute { this.normalized = that.normalized; } - public VertexAttribute(String name, GlPrimitiveType type, int count) { - this(name, type, count, false); + public VertexAttribSpec(GlPrimitiveType type, int count) { + this(type, count, false); } - public VertexAttribute(String name, GlPrimitiveType type, int count, boolean normalized) { - this.name = name; + public VertexAttribSpec(GlPrimitiveType type, int count, boolean normalized) { this.type = type; this.count = count; this.size = type.getSize() * count; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java index aa4de2447..f205826f3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java @@ -2,15 +2,15 @@ package com.simibubi.create.foundation.render.gl.attrib; public class VertexFormat { - private final VertexAttribute[] elements; + private final VertexAttribSpec[] elements; private final int numAttributes; private final int stride; - public VertexFormat(VertexAttribute... elements) { + public VertexFormat(VertexAttribSpec... elements) { this.elements = elements; int numAttributes = 0, stride = 0; - for (VertexAttribute element : elements) { + for (VertexAttribSpec element : elements) { numAttributes += element.getAttributeCount(); stride += element.getSize(); } @@ -18,15 +18,15 @@ public class VertexFormat { this.stride = stride; } - public VertexFormat(VertexFormat start, VertexAttribute... elements) { + public VertexFormat(VertexFormat start, VertexAttribSpec... elements) { int baseLength = start.elements.length; int addedLength = elements.length; - this.elements = new VertexAttribute[baseLength + addedLength]; + this.elements = new VertexAttribSpec[baseLength + addedLength]; System.arraycopy(start.elements, 0, this.elements, 0, baseLength); System.arraycopy(elements, 0, this.elements, baseLength, addedLength); int numAttributes = 0, stride = 0; - for (VertexAttribute element : this.elements) { + for (VertexAttribSpec element : this.elements) { numAttributes += element.getAttributeCount(); stride += element.getSize(); } @@ -44,7 +44,7 @@ public class VertexFormat { public void informAttributes(int index) { int offset = 0; - for (VertexAttribute element : this.elements) { + for (VertexAttribSpec element : this.elements) { element.registerForBuffer(stride, index, offset); index += element.getAttributeCount(); offset += element.getSize(); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexSpec.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexSpec.java deleted file mode 100644 index 0b56596fb..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexSpec.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.simibubi.create.foundation.render.gl.attrib; - -import com.google.common.collect.Lists; - -import java.util.ArrayList; -import java.util.function.Consumer; - -public class VertexSpec { - - private final ArrayList groups; - - public VertexSpec() { - groups = Lists.newArrayList(new AttributeGroup(0)); - } - - public VertexSpec(VertexSpec that) { - groups = new ArrayList<>(); - for (AttributeGroup group : that.groups) { - AttributeGroup copy = new AttributeGroup(group.getDivisor()); - - for (VertexAttribute attribute : group.getAttributes()) { - copy.attrib(attribute); - } - - groups.add(copy); - } - } - - public VertexSpec pushGroup() { - return pushGroup(0); - } - - public VertexSpec group(int divisor, Consumer builder) { - AttributeGroup group = new AttributeGroup(divisor); - builder.accept(group); - return group(group); - } - - public VertexSpec pushGroup(int divisor) { - return group(new AttributeGroup(divisor)); - } - - public VertexSpec group(AttributeGroup group) { - groups.add(group); - return this; - } - - public VertexSpec attrib(String name, VertexAttribute attrib) { - return attrib(VertexAttribute.copy(name, attrib)); - } - - public VertexSpec attrib(VertexAttribute attrib) { - last().attrib(attrib); - return this; - } - - - private AttributeGroup last() { - return groups.get(groups.size() - 1); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java index 36b198ad6..0912e9407 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java @@ -135,10 +135,13 @@ public class Backend { refresh(); - programs.values().forEach(GlProgram::delete); - programs.clear(); - for (ProgramSpec shader : registry.values()) { - loadProgram(manager, shader); + if (isCapable()) { + + programs.values().forEach(GlProgram::delete); + programs.clear(); + for (ProgramSpec shader : registry.values()) { + loadProgram(manager, shader); + } } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java index 75ef968ad..bbb302e72 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java @@ -3,17 +3,17 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.gl.GlPrimitiveType; import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribute; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribute.*; +import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec.*; public class BeltData extends KineticData { - public static final VertexAttribute TARGET_UV = copy("scrollTexture", CommonAttributes.VEC4); - public static final VertexAttribute SCROLL_MULT = new VertexAttribute("scrollMult", GlPrimitiveType.BYTE, 1, true); + public static final VertexAttribSpec TARGET_UV = copy(CommonAttributes.VEC4); + public static final VertexAttribSpec SCROLL_MULT = new VertexAttribSpec(GlPrimitiveType.BYTE, 1, true); public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, CommonAttributes.ROTATION, CommonAttributes.UV, TARGET_UV, SCROLL_MULT); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java index 0b40e50af..4e6bec405 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.gl.GlBuffer; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; +import org.lwjgl.opengl.GL20; public abstract class DynamicInstancedModel extends InstancedModel { @@ -15,9 +16,9 @@ public abstract class DynamicInstancedModel extends BufferedModel { public static final VertexFormat FORMAT = new VertexFormat(CommonAttributes.POSITION, CommonAttributes.NORMAL, CommonAttributes.UV); + protected GlVertexArray vao; protected GlBuffer instanceVBO; protected int glBufferSize = -1; protected int glInstanceCount = 0; @@ -34,32 +33,21 @@ public abstract class InstancedModel extends BufferedMod } @Override - protected void setup() { - super.setup(); - instanceVBO = new GlBuffer(); + protected void init() { + vao = new GlVertexArray(); + instanceVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); + + vao.bind(); + super.init(); + vao.unbind(); } @Override - protected VertexFormat getModelFormat() { - return FORMAT; + protected void initModel() { + super.initModel(); + setupAttributes(); } - @Override - protected void copyVertex(ByteBuffer constant, int i) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); - - constant.put(getNX(template, i)); - constant.put(getNY(template, i)); - constant.put(getNZ(template, i)); - - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); - } - - protected abstract VertexFormat getInstanceFormat(); - public int instanceCount() { return data.size(); } @@ -69,9 +57,11 @@ public abstract class InstancedModel extends BufferedMod } protected void deleteInternal() { - super.deleteInternal(); - instanceVBO.delete(); keys.forEach(InstanceKey::invalidate); + super.deleteInternal(); + + instanceVBO.delete(); + vao.delete(); } protected abstract D newInstance(); @@ -117,40 +107,14 @@ public abstract class InstancedModel extends BufferedMod return key; } - protected void markIndexChanged(int index) { - if (minIndexChanged < 0) { - minIndexChanged = index; - } else if (index < minIndexChanged) { - minIndexChanged = index; - } - - if (maxIndexChanged < 0) { - maxIndexChanged = index; - } else if (index > maxIndexChanged) { - maxIndexChanged = index; - } + protected void doRender() { + vao.bind(); + renderSetup(); + GL31.glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); + vao.unbind(); } - protected final void verifyKey(InstanceKey key) { - if (key.model != this) throw new IllegalStateException("Provided key does not belong to model."); - - if (!key.isValid()) throw new IllegalStateException("Provided key has been invalidated."); - - if (key.index >= data.size()) throw new IndexOutOfBoundsException("Key points out of bounds. (" + key.index + " > " + (data.size() - 1) + ")"); - - if (keys.get(key.index) != key) throw new IllegalStateException("Key desync!!"); - } - - protected int getTotalShaderAttributeCount() { - return getInstanceFormat().getShaderAttributeCount() + super.getTotalShaderAttributeCount(); - } - - @Override - protected void drawCall() { - GL31.glDrawElementsInstanced(GL11.GL_QUADS, vertexCount, GL11.GL_UNSIGNED_SHORT, 0, glInstanceCount); - } - - protected void preDrawTask() { + protected void renderSetup() { if (minIndexChanged < 0 || data.isEmpty()) return; VertexFormat instanceFormat = getInstanceFormat(); @@ -159,7 +123,7 @@ public abstract class InstancedModel extends BufferedMod int newInstanceCount = instanceCount(); int instanceSize = RenderMath.nextPowerOf2((newInstanceCount + 1) * stride); - instanceVBO.bind(GL15.GL_ARRAY_BUFFER); + instanceVBO.bind(); // this probably changes enough that it's not worth reallocating the entire buffer every time. if (instanceSize > glBufferSize) { @@ -197,9 +161,58 @@ public abstract class InstancedModel extends BufferedMod GL33.glVertexAttribDivisor(i + staticAttributes, 1); } - instanceVBO.unbind(GL15.GL_ARRAY_BUFFER); + instanceVBO.unbind(); minIndexChanged = -1; maxIndexChanged = -1; } + + protected void markIndexChanged(int index) { + if (minIndexChanged < 0) { + minIndexChanged = index; + } else if (index < minIndexChanged) { + minIndexChanged = index; + } + + if (maxIndexChanged < 0) { + maxIndexChanged = index; + } else if (index > maxIndexChanged) { + maxIndexChanged = index; + } + } + + protected final void verifyKey(InstanceKey key) { + if (key.model != this) throw new IllegalStateException("Provided key does not belong to model."); + + if (!key.isValid()) throw new IllegalStateException("Provided key has been invalidated."); + + if (key.index >= data.size()) throw new IndexOutOfBoundsException("Key points out of bounds. (" + key.index + " > " + (data.size() - 1) + ")"); + + if (keys.get(key.index) != key) throw new IllegalStateException("Key desync!!"); + } + + @Override + protected void copyVertex(ByteBuffer constant, int i) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); + + constant.put(getNX(template, i)); + constant.put(getNY(template, i)); + constant.put(getNZ(template, i)); + + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); + } + + @Override + protected VertexFormat getModelFormat() { + return FORMAT; + } + + protected abstract VertexFormat getInstanceFormat(); + + protected int getTotalShaderAttributeCount() { + return getInstanceFormat().getShaderAttributeCount() + super.getTotalShaderAttributeCount(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java index bce27b736..a5e84af0c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java @@ -117,7 +117,5 @@ public abstract class InstancedTileRenderer

{ if (material.canRenderInLayer(layer)) material.render(layer, viewProjection, camX, camY, camZ, callback); } - - GL20.glUseProgram(0); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java index b205596ac..2367b2f51 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribute; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import com.simibubi.create.foundation.utility.ColorHelper; import net.minecraft.client.renderer.Vector3f; @@ -10,12 +10,12 @@ import net.minecraft.util.math.BlockPos; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribute.*; +import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec.*; public class KineticData> extends InstanceData { - public static final VertexAttribute ROTATION_CENTER = copy("rotationCenter", CommonAttributes.VEC3); - public static final VertexAttribute SPEED = copy("speed", CommonAttributes.FLOAT); - public static final VertexAttribute OFFSET = copy("offset", CommonAttributes.FLOAT); + public static final VertexAttribSpec ROTATION_CENTER = copy(CommonAttributes.VEC3); + public static final VertexAttribSpec SPEED = copy(CommonAttributes.FLOAT); + public static final VertexAttribSpec OFFSET = copy(CommonAttributes.FLOAT); public static final VertexFormat FORMAT = new VertexFormat(CommonAttributes.INSTANCE_POSITION, CommonAttributes.LIGHT, CommonAttributes.RGB, SPEED, OFFSET); private float x; From 3820e119542293a2b89b3682aa01ae66c05dc369 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 11 Feb 2021 02:26:30 -0800 Subject: [PATCH 091/147] get it working again --- .../simibubi/create/foundation/mixin/RenderInLayerMixin.java | 2 +- .../com/simibubi/create/foundation/render/BufferedModel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index 9073923dc..ba05ba4e1 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -20,7 +20,7 @@ public class RenderInLayerMixin { * layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects. * This should probably be a forge event. */ - @Inject(at = @At(value = "TAIL"), method = "renderLayer") + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/profiler/IProfiler;endSection()V", ordinal = 1), method = "renderLayer") private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { FastRenderDispatcher.renderLayer(type, stack, (float) cameraX, (float) cameraY, (float) cameraZ); } diff --git a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java index 2df3d68ae..bad1df4d9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java @@ -88,12 +88,12 @@ public abstract class BufferedModel extends TemplateBuffer { } protected void setupAttributes() { - getModelFormat().informAttributes(0); int numAttributes = getTotalShaderAttributeCount(); for (int i = 0; i <= numAttributes; i++) { GL20.glEnableVertexAttribArray(i); } + getModelFormat().informAttributes(0); } public void delete() { From 5f6c94939c337ee769b7953f2d74853c079c7703 Mon Sep 17 00:00:00 2001 From: muffinbarde <76058321+muffinbarde@users.noreply.github.com> Date: Thu, 11 Feb 2021 17:21:05 +0100 Subject: [PATCH 092/147] Update de_de.json --- .../resources/assets/create/lang/de_de.json | 177 ++++++++++++++++-- 1 file changed, 157 insertions(+), 20 deletions(-) diff --git a/src/main/resources/assets/create/lang/de_de.json b/src/main/resources/assets/create/lang/de_de.json index 1e281fcde..3e9ca27e2 100644 --- a/src/main/resources/assets/create/lang/de_de.json +++ b/src/main/resources/assets/create/lang/de_de.json @@ -1,8 +1,8 @@ { "_": "->------------------------] Game Elements [------------------------<-", - "block.create.acacia_window": "Akazienfenster", - "block.create.acacia_window_pane": "Akazienfensterscheibe", + "block.create.acacia_window": "Akazienholzfenster", + "block.create.acacia_window_pane": "Akazienholzfensterscheibe", "block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe", "block.create.adjustable_crate": "Verstellbare Kiste", "block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker", @@ -24,6 +24,8 @@ "block.create.andesite_tunnel": "Andesittunnel", "block.create.basin": "Behälter", "block.create.belt": "Mechanischer Riemen", + "block.create.birch_window": "Birkenholzfenster", + "block.create.birch_window_pane": "Birkenholzfensterscheibe", "block.create.black_sail": "Schwarzes Segel", "block.create.black_seat": "Schwarzer Sitz", "block.create.black_valve_handle": "Schwarzer Ventilgriff", @@ -52,7 +54,7 @@ "block.create.clockwork_bearing": "Uhrwerk-Lager", "block.create.clutch": "Kupplung", "block.create.cogwheel": "Zahnrad", - "block.create.content_observer": "Inhalts Beobachter", + "block.create.content_observer": "Inhaltsbeobachter", "block.create.controller_rail": "Steureungsschiene", "block.create.copper_block": "Kupfer Block", "block.create.copper_casing": "Kupferrahmen", @@ -113,43 +115,138 @@ "block.create.fancy_dark_scoria_bricks_slab": "Schicke dunkle Schlackenziegelstufe", "block.create.fancy_dark_scoria_bricks_stairs": "Schicke dunkle Schlackenziegeltreppe", "block.create.fancy_dark_scoria_bricks_wall": "Schicke dunkle Schlackenziegelmauer", - "block.create.fluid_pipe": "Wasserrohr", - "block.create.fluid_tank": "Wassertank", + "block.create.fancy_diorite_bricks": "Schöne Dioritziegel", + "block.create.fancy_diorite_bricks_slab": "Schöne Dioritziegelstufe", + "block.create.fancy_diorite_bricks_stairs": "Schöne Dioritziegeltreppe", + "block.create.fancy_diorite_bricks_wall": "Schöne Dioritziegelmauer", + "block.create.fancy_dolomite_bricks": "Schöne Dolomitziegel", + "block.create.fancy_dolomite_bricks_slab": "Schöne Dolomitziegelstufe", + "block.create.fancy_dolomite_bricks_stairs": "Schöne Dolomitziegeltreppe", + "block.create.fancy_dolomite_bricks_wall": "Schöne Dolomitziegelmauer", + "block.create.fancy_gabbro_bricks": "Schöne Gabelsteinziegel", + "block.create.fancy_gabbro_bricks_slab": "Schöne Gabelsteinziegelstufe", + "block.create.fancy_gabbro_bricks_stairs": "Schöne Gabelsteinziegeltreppe", + "block.create.fancy_gabbro_bricks_wall": "Schöne Gabelsteinziegelmauer", + "block.create.fancy_granite_bricks": "Schöne Granitziegel", + "block.create.fancy_granite_bricks_slab": "Schöne Granitziegelstufe", + "block.create.fancy_granite_bricks_stairs": "Schöne Granitziegeltreppe", + "block.create.fancy_granite_bricks_wall": "Schöne Granitziegelmauer", + "block.create.fancy_limestone_bricks": "Schöne Kalksteinziegel", + "block.create.fancy_limestone_bricks_slab": "Schöne Kalksteinziegelstufe", + "block.create.fancy_limestone_bricks_stairs": "Schöne Kalksteinziegeltreppe", + "block.create.fancy_limestone_bricks_wall": "Schöne Kalksteinziegelmauer", + "block.create.fancy_scoria_bricks": "Schöne Schlackenziegel", + "block.create.fancy_scoria_bricks_slab": "Schöne Schlackenziegelstufe", + "block.create.fancy_scoria_bricks_stairs": "Schöne Schlackenziegeltreppe", + "block.create.fancy_scoria_bricks_wall": "Schöne Schlackenziegelmauer", + "block.create.fancy_weathered_limestone_bricks": "Schöne Verwitterte Kalksteinziegel", + "block.create.fancy_weathered_limestone_bricks_slab": "Schöne Verwitterte Kalksteinziegelstufe", + "block.create.fancy_weathered_limestone_bricks_stairs": "Schöne Verwitterte Kalksteinziegeltreppe", + "block.create.fancy_weathered_limestone_bricks_wall": "Schöne Verwitterte Kalksteinziegelmauer", + "block.create.fluid_pipe": "Flüssigkeitsrohr", + "block.create.fluid_tank": "Flüssigkeitstank", "block.create.fluid_valve": "Flüssigkeitsventil", "block.create.flywheel": "Schwungrad", "block.create.framed_glass": "Gerahmtes Glas", "block.create.framed_glass_pane": "Gerahmte Glasscheibe", - "block.create.gabbro": "Gabbro", - "block.create.gabbro_bricks": "Gabbroziegel", - "block.create.gabbro_bricks_stairs": "Gabbroziegeltreppe", - "block.create.gabbro_bricks_wall": "Gabbroziegelmauer", - "block.create.gabbro_bricks_slab": "Gabbroziegelstufe", + "block.create.furnace_engine": "Ofenmotor", + "block.create.gabbro": "Gabelstein", + "block.create.gabbro_bricks": "Gabelsteinziegel", + "block.create.gabbro_bricks_slab": "Gabelsteinziegelstufe", + "block.create.gabbro_bricks_stairs": "Gabelsteinziegeltreppe", + "block.create.gabbro_bricks_wall": "Gabelsteinziegelmauer", + "block.create.gabbro_cobblestone": "Gabelsteinbruchstein", + "block.create.gabbro_cobblestone_slab": "Gabelsteinbruchstein", + "block.create.gabbro_cobblestone_stairs": "Gabelsteinbruchstein", + "block.create.gabbro_cobblestone_wall": "Gabelsteinbruchstein", + "block.create.gabbro_pillar": "Gabelsteinsäule", "block.create.gearbox": "Getriebe", "block.create.gearshift": "Gangschaltung", "block.create.glass_fluid_pipe": "Glaswasserrohr", "block.create.granite_bricks": "Granitziegel", + "block.create.granite_bricks_slab": "Granitziegelstufe", + "block.create.granite_bricks_stairs": "Granitziegeltreppe", + "block.create.granite_bricks_wall": "Granitziegelmauer", + "block.create.granite_cobblestone": "Granitbruchstein", + "block.create.granite_cobblestone_slab": "Granitbruchsteinstufe", + "block.create.granite_cobblestone_stairs": "Granitbruchtreppe", + "block.create.granite_cobblestone_wall": "Granitbruchsteinmauer", + "block.create.granite_pillar": "Granitsäule", + "block.create.gray_sail": "Graues Segel", + "block.create.gray_seat": "Grauer Sitz", + "block.create.gray_valve_handle": "Grauer Ventilgriff", + "block.create.green_sail": "Grünes Segel", + "block.create.green_seat": "Grüner Sitz", + "block.create.green_valve_handle": "Grüner Ventilgriff", + "block.create.hand_crank": "Handkurbel", + "block.create.honey": "Honig", + "block.create.horizontal_framed_glass": "Horizontal Gerahmes Glas", + "block.create.horizontal_framed_glass_pane": "Horizontal Gerahmte Glasscheibe", + "block.create.hose_pulley": "Umlenkrolle", + "block.create.item_drain": "Abfluss", + "block.create.jungle_window": "Tropenholzfenster", + "block.create.jungle_window_pane": "Tropenholzfensterscheib", "block.create.large_cogwheel": "Großes Zahnrad", + "block.create.layered_andesite": "Geschichteter Andesit", + "block.create.layered_dark_scoria": "Geschichtete Dunkle Schlacke", + "block.create.layered_diorite": "Geschichteter Diorit", + "block.create.layered_dolomite": "Geschichteter Dolomit", + "block.create.layered_gabbro": "Geschichteter Gabelstein", + "block.create.layered_granite": "Geschichteter Granit", + "block.create.layered_limestone": "Geschichteter Kalkstein", + "block.create.layered_scoria": "Geschichtete Schlacke", + "block.create.layered_weathered_limestone": "Geschichteter Verwitterter Kalkstein", + "block.create.light_blue_sail": "Hellblaues Segel", + "block.create.light_blue_seat": "Hellblauer Sitz", + "block.create.light_blue_valve_handle": "Hellblauer Ventilgriff", + "block.create.light_gray_sail": "Hellgraues Segel", + "block.create.light_gray_seat": "Hellgrauer Sitz", + "block.create.light_gray_valve_handle": "Hellgrauer Ventilgriff", + "block.create.lime_sail": "Hellgrünes Segel", + "block.create.lime_seat": "Hellgrüner Sitz", + "block.create.lime_valve_handle": "Hellgrüner Ventilgriff", "block.create.limesand": "Kalksand", "block.create.limestone": "Kalkstein", "block.create.limestone_bricks": "Kalksteinziegel", "block.create.limestone_bricks_slab": "Kalksteinziegelstufe", "block.create.limestone_bricks_stairs": "Kalksteinziegeltreppe", "block.create.limestone_bricks_wall": "Kalksteinziegelmauer", + "block.create.limestone_cobblestone": "Kalkbruchstein", + "block.create.limestone_cobblestone_slab": "Kalkbruchsteinstufe", + "block.create.limestone_cobblestone_stairs": "Kalkbruchsteintreppe", + "block.create.limestone_cobblestone_wall": "Kalkbruchsteinmauer", "block.create.limestone_pillar": "Kalksteinsäule", "block.create.linear_chassis": "Schubgerüst", + "block.create.lit_blaze_burner": "Aktiver Lohenbrenner", + "block.create.magenta_sail": "Magenta Segel", + "block.create.magenta_seat": "Magenta Sitz", + "block.create.magenta_valve_handle": "Magenta Ventilgriff", + "block.create.mechanical_arm": "Mechanischer Arm", "block.create.mechanical_bearing": "Mechanisches Lager", + "block.create.mechanical_crafter": "Mechanische Handwerkseinheit", "block.create.mechanical_drill": "Mechanischer Bohrer", "block.create.mechanical_harvester": "Mechanische Erntemaschine", + "block.create.mechanical_mixer": "Mechanischer Mixer", "block.create.mechanical_piston": "Mechanischer Kolben", "block.create.mechanical_piston_head": "Mechanisches Kolbenende", + "block.create.mechanical_plough": "Mechanischer Pflug", "block.create.mechanical_press": "Mechanische Presse", + "block.create.mechanical_pump": "Mechanische Pumpe", + "block.create.mechanical_saw": "Mechanische Säge", + "block.create.metal_bracket": "Metallhalterung", + "block.create.millstone": "Mahlstein", + "block.create.pink_sail": "Rosa Segel", + "block.create.pink_seat": "Rosa Sitz", + "block.create.pink_valve_handle": "Rosa Ventilgriff", "block.create.piston_extension_pole": "Kolben-Pleuelverlängerung", "block.create.polished_dolomite": "Polierter Dolomit", - "block.create.polished_gabbro": "Polierter Gabbro", + "block.create.polished_gabbro": "Polierter Gabelstein", "block.create.polished_limestone": "Polierter Kalkstein", "block.create.polished_limestone_slab": "Polierte Kalksteinstufe", + "block.create.polished_scoria": "Polierte Schlacke", "block.create.polished_weathered_limestone": "Polierter Verwitterter Kalkstein", "block.create.polished_weathered_limestone_slab": "Polierte Verwitterte Kalksteinstufe", + "block.create.powered_latch": "UNLOCALIZED: Powered Latch", "block.create.pulse_repeater": "Pulsierender Verstärker", "block.create.radial_chassis": "Drehgerüst", "block.create.redstone_contact": "Redstone-Kontakt", @@ -170,19 +267,30 @@ "block.create.weathered_limestone_bricks_wall": "Verwitterte Kalksteinziegelmauer", "block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule", + "fluid.create.milk": "Milch", + "fluid.create.potion": "Trank", + "fluid.create.tea": "Bauherrentee", + + "item.create.bar_of_chocolate": "Schokoladetafel", "item.create.belt_connector": "Mechanischer Riemen", + "item.create.deforester": "Entforster", "item.create.dough": "Teig", "item.create.empty_schematic": "Leerer Bauplan", "item.create.filter": "Filter", "item.create.handheld_blockzapper": "Blockpistole", + "item.create.handheld_worldshaper": "Geländeformer", + "item.create.honey_bucket": "Honigeimer", "item.create.iron_sheet": "Eisenblech", "item.create.propeller": "Propeller", + "item.create.red_sand_paper": "Rotes Schmirgelpapier", "item.create.rose_quartz": "Rosenquarz", + "item.create.sand_paper": "Schmirgelpapier", "item.create.schematic": "Bauplan", "item.create.schematic_and_quill": "Bauplan und Feder", + "item.create.super_glue": "Superkleber", "item.create.tree_fertilizer": "Baumdünger", "item.create.wand_of_symmetry": "Symmetriestab", - + "item.create.wheat_flour": "Weizenmehl", "item.create.wrench": "Schraubenschlüssel", "item.create.zinc_ingot": "Zinkbarren", "item.create.zinc_nugget": "Zinkklumpen", @@ -203,19 +311,32 @@ "advancement.create.belt": "Befördere es alles", "advancement.create.belt.desc": "Verbinde zwei Wllen mit einem Mechanischem Riemen", + "_": "->------------------------] UI & Messages [------------------------<-", + "itemGroup.create.base": "Create", + "itemGroup.create.palettes": "Create Paletten", "death.attack.create.crush": "%1$s stolperte in ein Mahlwerk", "death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet", "death.attack.create.fan_lava": "%1$s wurde von Lava verweht", "death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert", + "death.attack.create.mechanical_saw": "%1$s wurde zersägt", + "death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt", + "create.block.deployer.damage_source_name": "einem Finger", - "create.recipe.crushing": "Mahlen", + "create.recipe.crushing": "Mahlen (Mahlwerk)", + "create.recipe.milling": "Mahlen (Mahlstein)", "create.recipe.pressing": "Mechanische Presse", + "create.recipe.mixing": "Mixen", + "create.recipe.sawing": "Sägen", "create.recipe.blockzapper_upgrade": "Blockpistole", + "create.recipe.sandpaper_polishing": "Schleifen", "create.recipe.processing.chance": "Chance: %1$s%%", + "create.recipe.heat_requirement.none": "Keine Hitze benötigt", + "create.recipe.heat_requirement.heated": "Wenig Hitze benötigt", + "create.recipe.heat_requirement.superheated": "Viel Hitze benötigt", "create.generic.range": "Reichweite", "create.generic.radius": "Radius", @@ -224,6 +345,12 @@ "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Sekunden", "create.generic.unit.minutes": "Minuten", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "Uhrzeigersinn", + "create.generic.counter_clockwise": "Gegen-Uhrzeigersinn", "create.action.scroll": "Wechseln", "create.action.confirm": "Bestätigen", @@ -266,7 +393,6 @@ "create.gui.blockzapper.pattern.chance50": "50%-Chance", "create.gui.blockzapper.pattern.chance75": "75%-Chance", - "create.blockzapper.usingBlock": "Auswahl: %1$s", "create.blockzapper.componentUpgrades": "Bauteil-Upgrades:", "create.blockzapper.component.body": "Rumpf", @@ -275,16 +401,16 @@ "create.blockzapper.component.retriever": "Empfänger", "create.blockzapper.component.scope": "Fernrohr", "create.blockzapper.componentTier.none": "Nichts", + "create.blockzapper.componentTier.brass": "Messing", "create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen", "create.blockzapper.empty": "Keine Blöcke übrig!", - - "create.logistics.filter": "Filter", + "create.logistics.recipe_filter": "Rezeptfilter", + "create.logistics.fluid_filter": "Flüssigkeitsfilter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", - "create.gui.adjustable_crate.title": "adjustable_crate", "create.gui.adjustable_crate.storageSpace": "Lagerraum", "create.gui.stockpile_switch.title": "Vorratssensor", @@ -293,6 +419,7 @@ "create.schematicAndQuill.secondPos": "Zweite Position festgelegt.", "create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.", "create.schematicAndQuill.abort": "Auswahl zurückgesetzt.", + "create.schematicAndQuill.title": "Bauplanname:", "create.schematicAndQuill.fallbackName": "Mein Bauplan", "create.schematicAndQuill.saved": "Gespeichert als %1$s", @@ -388,7 +515,7 @@ "create.tooltip.holdKey": "Halte [%1$s]", "create.tooltip.holdKeyOrKey": "Halte [%1$s] oder [%2$s]", "create.tooltip.keyShift": "Shift", - "create.tooltip.keyCtrl": "Strg", + "create.tooltip.keyCtrl": "Strg" "_": "->------------------------] Item Descriptions [------------------------<-", @@ -421,12 +548,11 @@ "item.create.handheld_blockzapper.tooltip.action2": "_Platziert_ oder _Ersetzt_ den ausgewählten Block.", "item.create.handheld_blockzapper.tooltip.control3": "R-Klick beim Schleichen", "item.create.handheld_blockzapper.tooltip.action3": "Öffnet das _Konfigurationsmenü_", - + "item.create.tree_fertilizer.tooltip": "BAUMDÜNGER", "item.create.tree_fertilizer.tooltip.summary": "Eine Mischung aus Mineralien, die sich für weit verbreitete Baumarten eignet", "item.create.tree_fertilizer.tooltip.condition1": "Wenn auf einen Setzling angewendet", "item.create.tree_fertilizer.tooltip.behaviour1": "Lässt Bäume unabhängig vom Platz um sie herum wachsen", - "item.create.empty_schematic.tooltip": "LEERER BAUPLAN", "item.create.empty_schematic.tooltip.summary": "Wird für die Herstellung und das Schreiben auf dem _Bauplantisch_ verwendet", @@ -518,6 +644,8 @@ "block.create.mechanical_press.tooltip.behaviour1": "_Fängt_ _an_, Gegenstände, die darunter liegen, zusammenzudrücken.", "block.create.mechanical_press.tooltip.condition2": "Wenn über einem Mechanischem Riemen", "block.create.mechanical_press.tooltip.behaviour2": "Presst _automatisch_ alle auf dem Riemen vorbeigeführten Gegenstände zusammen.", + "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact items_ in the basin whenever all necessary ingredients are present.", "block.create.mechanical_piston.tooltip": "MECHANISCHER KOLBEN", "block.create.mechanical_piston.tooltip.summary": "Eine fortgeschrittene Version des _Kolbens,_ welcher _Rotationsenergie_ benutzt, um verbundene Strukturen präzise zu bewegen. _Kolben-Pleuelverlängerungen_ auf der Hinterseite bestimmen die _Reichweite_ des Kolbens. Ohne Verlängerungen bewegt sich dieser nicht. Verwende ein _Schubgerüst,_ um mehr als nur eine Reihe von Blöcken zu bewegen.", @@ -538,6 +666,8 @@ "block.create.linear_chassis.tooltip.summary": "Eine konfigurierbare Basis für Strukturen, die durch _Mechanische_ _Kolben_ bewegt werden sollen. Diese Blöcke müssen die erste Reihe von Blöcken vor dem Kloben bilden.", "block.create.linear_chassis.tooltip.condition1": "Wenn durch einen Mechanischen Kolben bewegt", "block.create.linear_chassis.tooltip.behaviour1": "_Bewegt_ alle _verbundenen_ _Gerüste_ mit der gleichen Orientierung, und angebrachte Blöcke davor. Wenn der Kolben zurückgezogen wird, werden Blöcke nur zurückgezogen, wenn die Fläche des Gerüsts _klebrig_ ist (Siehe [Strg]).", + "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", "block.create.linear_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt", "block.create.linear_chassis.tooltip.action1": "Lässt die Oberfläche _klebrig_ werden. Wenn der Kolben zurückgezogen wird, _zieht_ das Gerüst alle verbundenen Blöcke _zurück_ in seine Spalte und innerhalb der konfigurierten Reichweite.", @@ -545,6 +675,8 @@ "block.create.radial_chassis.tooltip.summary": "Wird für das Drehen von Strukturen mit dem _Mechanischem_ _Lager_ benutzt.", "block.create.radial_chassis.tooltip.condition1": "Wenn durch ein Lager gedreht", "block.create.radial_chassis.tooltip.behaviour1": "_Dreht_ alle an _klebrigen_ Seiten angebrachten Blöcke (Siehe [Strg]) innerhalb der konfigurierten Reichweite um sich. _Überträgt_ die Rotation zu weiter angebrachten Rotationsgerüsten.", + "block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", + "block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", "block.create.radial_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt", "block.create.radial_chassis.tooltip.action1": "Lässt die geklickte Fläche _klebrig_ werden. Wenn das Gerüst gedreht wird, werden alle verbundenen Blöcke an dieser Seite mit dem Gerüst mitgedreht.", @@ -588,6 +720,8 @@ "block.create.creative_crate.tooltip": "BAUPLANKANONENMACHER", "block.create.creative_crate.tooltip.summary": "Stellt einen unendlichen Vorrat an Blöcken für benachbarte _Bauplaenkanonen_ bereit.", + "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", "block.create.pulse_repeater.tooltip": "PULSIERENDER VERSTÄRKER", "block.create.pulse_repeater.tooltip.summary": "Ein einfacher Schaltkreis, um durchgehende Redstone-Signale auf eine Länge von _1_ _tick_ zu reduzieren.", @@ -595,6 +729,9 @@ "block.create.adjustable_repeater.tooltip": "VERZÖGERNDER VERSTÄRKER", "block.create.adjustable_repeater.tooltip.summary": "Ein fortgeschrittener _Redstone-Verstärker_ mit einer _konfigurierbaren_ _Verzögerung_ von bis zu 30 Minuten.", + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Work in progress!", + "_": "Thank you for translating Create!" } From 576165e3d697b7d7845caf0237f36e0f6f1cc014 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 11 Feb 2021 14:31:50 -0800 Subject: [PATCH 093/147] some attrib stuff --- .../render/gl/attrib/IVertexAttrib.java | 2 + .../gl/attrib/ModelVertexAttributes.java | 36 +++++++++++++++++ .../gl/attrib/RotatingVertexAttributes.java | 28 ++++++------- .../render/gl/attrib/VertexFormat2.java | 39 +++++++++++++++++++ 4 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/ModelVertexAttributes.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat2.java diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java index 30ef9ad45..8996f14ac 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java @@ -7,4 +7,6 @@ public interface IVertexAttrib { VertexAttribSpec attribSpec(); int getDivisor(); + + int getBufferIndex(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/ModelVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/ModelVertexAttributes.java new file mode 100644 index 000000000..5b81e5a1f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/ModelVertexAttributes.java @@ -0,0 +1,36 @@ +package com.simibubi.create.foundation.render.gl.attrib; + +public enum ModelVertexAttributes implements IVertexAttrib { + VERTEX_POSITION("aPos", CommonAttributes.VEC3), + NORMAL("aNormal", CommonAttributes.NORMAL), + TEXTURE("aTexCoords", CommonAttributes.UV), + ; + + private final String name; + private final VertexAttribSpec spec; + + ModelVertexAttributes(String name, VertexAttribSpec spec) { + this.name = name; + this.spec = spec; + } + + @Override + public String attribName() { + return name; + } + + @Override + public VertexAttribSpec attribSpec() { + return spec; + } + + @Override + public int getDivisor() { + return 0; + } + + @Override + public int getBufferIndex() { + return 0; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java index efd958688..424700255 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java @@ -1,29 +1,20 @@ package com.simibubi.create.foundation.render.gl.attrib; public enum RotatingVertexAttributes implements IVertexAttrib { - VERTEX_POSITION("aPos", CommonAttributes.VEC3), - NORMAL("aNormal", CommonAttributes.VEC3), - TEXTURE("aInstancePos", CommonAttributes.VEC3), - INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3, 1), - LIGHT("aLight", CommonAttributes.LIGHT, 1), - NETWORK_COLOR("aNetworkTint", CommonAttributes.RGB, 1), - SPEED("aSpeed", CommonAttributes.FLOAT, 1), - OFFSET("aOffset", CommonAttributes.FLOAT, 1), - AXIS("aAxis", CommonAttributes.NORMAL, 1), + INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3), + LIGHT("aLight", CommonAttributes.LIGHT), + NETWORK_COLOR("aNetworkTint", CommonAttributes.RGB), + SPEED("aSpeed", CommonAttributes.FLOAT), + OFFSET("aOffset", CommonAttributes.FLOAT), + AXIS("aAxis", CommonAttributes.NORMAL), ; private final String name; private final VertexAttribSpec spec; - private final int divisor; RotatingVertexAttributes(String name, VertexAttribSpec spec) { - this(name, spec, 0); - } - - RotatingVertexAttributes(String name, VertexAttribSpec spec, int divisor) { this.name = name; this.spec = spec; - this.divisor = divisor; } @Override @@ -38,6 +29,11 @@ public enum RotatingVertexAttributes implements IVertexAttrib { @Override public int getDivisor() { - return divisor; + return 1; + } + + @Override + public int getBufferIndex() { + return 1; } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat2.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat2.java new file mode 100644 index 000000000..497b7e136 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat2.java @@ -0,0 +1,39 @@ +package com.simibubi.create.foundation.render.gl.attrib; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.stream.Stream; + +public class VertexFormat2 { + + private final ArrayList>> allAttributes; + + public VertexFormat2(ArrayList>> allAttributes) { + this.allAttributes = allAttributes; + } + + public static Builder builder() { + return new Builder(); + } + + public Stream getAttributeStream() { + return (Stream) allAttributes.stream().flatMap(it -> Arrays.stream(it.getEnumConstants())); + } + + public static class Builder { + private final ArrayList>> allAttributes; + + public Builder() { + allAttributes = new ArrayList<>(); + } + + public & IVertexAttrib> Builder addAttributes(Class attribEnum) { + allAttributes.add(attribEnum); + return this; + } + + public VertexFormat2 build() { + return new VertexFormat2(allAttributes); + } + } +} From 67408e0dff4954ff548c9539bb6cc506c223a6f4 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 11 Feb 2021 20:03:24 -0800 Subject: [PATCH 094/147] better vertex attributes. all shaders are now GL 2.0 compatible!!! contraption structure rendering is technically 2.0 compatible now, need some better handling for that. --- .../foundation/mixin/RenderInLayerMixin.java | 2 +- .../foundation/render/AllProgramSpecs.java | 55 +++++++++++-- .../foundation/render/BufferedModel.java | 49 +++++++----- .../render/FastRenderDispatcher.java | 10 +-- .../render/contraption/ContraptionModel.java | 10 +-- .../contraption/ContraptionProgram.java | 1 - .../foundation/render/gl/BasicProgram.java | 3 - .../create/foundation/render/gl/GlBuffer.java | 18 +++++ .../foundation/render/gl/GlVertexArray.java | 8 ++ .../render/gl/attrib/AttributeGroup.java | 27 ------- .../render/gl/attrib/CommonAttributes.java | 8 +- .../render/gl/attrib/VertexAttribSpec.java | 12 --- .../render/gl/attrib/VertexFormat.java | 62 +++++++++------ .../render/gl/attrib/VertexFormat2.java | 39 --------- .../gl/attrib/impl/ActorVertexAttributes.java | 43 ++++++++++ .../gl/attrib/impl/BeltVertexAttributes.java | 42 ++++++++++ .../impl/ContraptionVertexAttributes.java | 42 ++++++++++ .../attrib/impl/KineticVertexAttributes.java | 42 ++++++++++ .../{ => impl}/ModelVertexAttributes.java | 6 +- .../{ => impl}/RotatingVertexAttributes.java | 11 ++- .../foundation/render/gl/backend/Backend.java | 10 ++- .../render/gl/shader/GlProgram.java | 15 ++-- .../render/gl/shader/ProgramSpec.java | 59 +++++++++++++- .../render/instancing/BeltData.java | 10 ++- .../instancing/DynamicInstancedModel.java | 38 --------- .../render/instancing/InstancedModel.java | 79 +++++++++---------- .../render/instancing/KineticData.java | 6 -- .../render/instancing/RotatingData.java | 7 +- .../actors/DynamicRotatingActorData.java | 34 -------- .../instancing/actors/RotatingActorModel.java | 14 +--- .../actors/StaticRotatingActorData.java | 7 +- .../resources/assets/create/shader/belt.vert | 77 +++++++++--------- .../assets/create/shader/contraption.frag | 24 +++--- .../create/shader/contraption_actor.vert | 72 ++++++++--------- .../create/shader/contraption_structure.vert | 45 ++++++----- .../assets/create/shader/instanced.frag | 20 +++-- .../assets/create/shader/rotating.vert | 69 ++++++++-------- 37 files changed, 608 insertions(+), 468 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat2.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ActorVertexAttributes.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/BeltVertexAttributes.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ContraptionVertexAttributes.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/KineticVertexAttributes.java rename src/main/java/com/simibubi/create/foundation/render/gl/attrib/{ => impl}/ModelVertexAttributes.java (71%) rename src/main/java/com/simibubi/create/foundation/render/gl/attrib/{ => impl}/RotatingVertexAttributes.java (66%) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index ba05ba4e1..9073923dc 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -20,7 +20,7 @@ public class RenderInLayerMixin { * layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects. * This should probably be a forge event. */ - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/profiler/IProfiler;endSection()V", ordinal = 1), method = "renderLayer") + @Inject(at = @At(value = "TAIL"), method = "renderLayer") private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { FastRenderDispatcher.renderLayer(type, stack, (float) cameraX, (float) cameraY, (float) cameraZ); } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index 344d41429..0ba20c5f1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -3,8 +3,7 @@ package com.simibubi.create.foundation.render; import com.simibubi.create.Create; import com.simibubi.create.foundation.render.contraption.ContraptionProgram; import com.simibubi.create.foundation.render.gl.BasicProgram; -import com.simibubi.create.foundation.render.gl.backend.Backend; -import com.simibubi.create.foundation.render.gl.shader.GlProgram; +import com.simibubi.create.foundation.render.gl.attrib.impl.*; import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.gl.shader.ShaderConstants; import net.minecraft.util.ResourceLocation; @@ -12,12 +11,52 @@ import net.minecraft.util.ResourceLocation; import static com.simibubi.create.foundation.render.gl.backend.Backend.register; public class AllProgramSpecs { - public static final ProgramSpec ROTATING = register(new ProgramSpec<>("rotating", Locations.ROTATING, Locations.INSTANCED, BasicProgram::new)); - public static final ProgramSpec BELT = register(new ProgramSpec<>("belt", Locations.BELT, Locations.INSTANCED, BasicProgram::new)); - public static final ProgramSpec CONTRAPTION_STRUCTURE = register(new ProgramSpec<>("contraption_structure", Locations.CONTRAPTION_STRUCTURE, Locations.CONTRAPTION, ContraptionProgram::new)); - public static final ProgramSpec CONTRAPTION_ROTATING = register(new ProgramSpec<>("contraption_rotating", Locations.ROTATING, Locations.CONTRAPTION, ContraptionProgram::new, ShaderConstants.define("CONTRAPTION"))); - public static final ProgramSpec CONTRAPTION_BELT = register(new ProgramSpec<>("contraption_belt", Locations.BELT, Locations.CONTRAPTION, ContraptionProgram::new, ShaderConstants.define("CONTRAPTION"))); - public static final ProgramSpec CONTRAPTION_ACTOR = register(new ProgramSpec<>("contraption_actor", Locations.CONTRAPTION_ACTOR, Locations.CONTRAPTION, ContraptionProgram::new)); + public static final ProgramSpec ROTATING = register(ProgramSpec.builder("rotating", BasicProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(KineticVertexAttributes.class) + .addAttributes(RotatingVertexAttributes.class) + .setVert(Locations.ROTATING) + .setFrag(Locations.INSTANCED) + .createProgramSpec()); + + public static final ProgramSpec BELT = register(ProgramSpec.builder("belt", BasicProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(KineticVertexAttributes.class) + .addAttributes(BeltVertexAttributes.class) + .setVert(Locations.BELT) + .setFrag(Locations.INSTANCED) + .createProgramSpec()); + + public static final ProgramSpec CONTRAPTION_STRUCTURE = register(ProgramSpec.builder("contraption_structure", ContraptionProgram::new) + .addAttributes(ContraptionVertexAttributes.class) + .setVert(Locations.CONTRAPTION_STRUCTURE) + .setFrag(Locations.CONTRAPTION) + .createProgramSpec()); + + public static final ProgramSpec CONTRAPTION_ROTATING = register(ProgramSpec.builder("contraption_rotating", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(KineticVertexAttributes.class) + .addAttributes(RotatingVertexAttributes.class) + .setVert(Locations.ROTATING) + .setFrag(Locations.CONTRAPTION) + .setDefines(ShaderConstants.define("CONTRAPTION")) + .createProgramSpec()); + + public static final ProgramSpec CONTRAPTION_BELT = register(ProgramSpec.builder("contraption_belt", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(KineticVertexAttributes.class) + .addAttributes(BeltVertexAttributes.class) + .setVert(Locations.BELT) + .setFrag(Locations.CONTRAPTION) + .setDefines(ShaderConstants.define("CONTRAPTION")) + .createProgramSpec()); + + public static final ProgramSpec CONTRAPTION_ACTOR = register(ProgramSpec.builder("contraption_actor", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(ActorVertexAttributes.class) + .setVert(Locations.CONTRAPTION_ACTOR) + .setFrag(Locations.CONTRAPTION) + .createProgramSpec()); public static class Locations { public static final ResourceLocation INSTANCED = loc("instanced.frag"); diff --git a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java index bad1df4d9..c5bfe5509 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java @@ -1,19 +1,18 @@ package com.simibubi.create.foundation.render; -import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.render.gl.GlPrimitiveType; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; import java.nio.ByteBuffer; -import java.util.HashSet; public abstract class BufferedModel extends TemplateBuffer { + protected GlBuffer ebo; protected GlBuffer modelVBO; protected boolean removed; @@ -26,9 +25,9 @@ public abstract class BufferedModel extends TemplateBuffer { modelVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); - modelVBO.bind(); - initModel(); - modelVBO.unbind(); + modelVBO.with(vbo -> initModel()); + + ebo = createEBO(); } protected void initModel() { @@ -46,6 +45,25 @@ public abstract class BufferedModel extends TemplateBuffer { }); } + protected final GlBuffer createEBO() { + GlBuffer ebo = new GlBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER); + + int indicesSize = vertexCount * GlPrimitiveType.USHORT.getSize(); + + ebo.bind(); + + GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); + Backend.mapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, indices -> { + for (int i = 0; i < vertexCount; i++) { + indices.putShort((short) i); + } + }); + + ebo.unbind(); + + return ebo; + } + protected abstract void copyVertex(ByteBuffer to, int index); protected abstract VertexFormat getModelFormat(); @@ -64,35 +82,30 @@ public abstract class BufferedModel extends TemplateBuffer { } /** - * Override this + * Override this. */ protected void doRender() { - GL20.glDisableClientState(32884); - GL20.glDisableClientState(32885); - GL20.glDisableClientState(32886); - GL20.glDisableClientState(32888); - GL20.glEnable(GL20.GL_VERTEX_ARRAY); modelVBO.bind(); + ebo.bind(); setupAttributes(); - GL20.glDrawArrays(GL11.GL_QUADS, 0, vertexCount); - - modelVBO.unbind(); + GL20.glDrawElements(GL20.GL_QUADS, vertexCount, GlPrimitiveType.USHORT.getGlConstant(), 0); int numAttributes = getTotalShaderAttributeCount(); for (int i = 0; i <= numAttributes; i++) { GL20.glDisableVertexAttribArray(i); } - GL20.glDisable(GL20.GL_VERTEX_ARRAY); + ebo.unbind(); + modelVBO.unbind(); } protected void setupAttributes() { - int numAttributes = getTotalShaderAttributeCount(); for (int i = 0; i <= numAttributes; i++) { GL20.glEnableVertexAttribArray(i); } + getModelFormat().informAttributes(0); } diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java index 47649940f..f763c74b9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java @@ -96,26 +96,26 @@ public class FastRenderDispatcher { } } - public static void renderLayer(RenderType type, MatrixStack stack, float cameraX, float cameraY, float cameraZ) { + public static void renderLayer(RenderType layer, MatrixStack stack, float cameraX, float cameraY, float cameraZ) { if (!available()) return; Matrix4f viewProjection = Matrix4f.translate(-cameraX, -cameraY, -cameraZ); viewProjection.multiplyBackward(stack.peek().getModel()); viewProjection.multiplyBackward(getProjectionMatrix()); - type.startDrawing(); + layer.startDrawing(); RenderSystem.enableDepthTest(); RenderSystem.enableCull(); GL11.glCullFace(GL11.GL_BACK); - CreateClient.kineticRenderer.render(type, viewProjection, cameraX, cameraY, cameraZ); + CreateClient.kineticRenderer.render(layer, viewProjection, cameraX, cameraY, cameraZ); RenderSystem.disableCull(); //RenderSystem.disableDepthTest(); - ContraptionRenderDispatcher.renderLayer(type, viewProjection, cameraX, cameraY, cameraZ); + ContraptionRenderDispatcher.renderLayer(layer, viewProjection, cameraX, cameraY, cameraZ); if (!OptifineHandler.usingShaders()) GL20.glUseProgram(0); - type.endDrawing(); + layer.endDrawing(); } public static void notifyLightUpdate(ClientChunkProvider world, LightType type, SectionPos pos) { diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java index e917c4234..9e8f80b38 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java @@ -1,13 +1,11 @@ package com.simibubi.create.foundation.render.contraption; import com.simibubi.create.foundation.render.BufferedModel; -import com.simibubi.create.foundation.render.instancing.InstancedModel; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.impl.ContraptionVertexAttributes; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.LightTexture; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL40; import java.nio.ByteBuffer; @@ -15,7 +13,9 @@ import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.L import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.RGBA; public class ContraptionModel extends BufferedModel { - public static final VertexFormat FORMAT = new VertexFormat(InstancedModel.FORMAT, RGBA, LIGHT); + public static final VertexFormat FORMAT = VertexFormat.builder() + .addAttributes(ContraptionVertexAttributes.class) + .build(); public ContraptionModel(BufferBuilder buf) { super(buf); diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java index 2f111162d..62137177c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java @@ -27,7 +27,6 @@ public class ContraptionProgram extends BasicProgram { } public void bind(Matrix4f model, GridAlignedBB lightVolume) { - bind(); GL20.glUniform3f(uLightBoxSize, lightVolume.sizeX(), lightVolume.sizeY(), lightVolume.sizeZ()); GL20.glUniform3f(uLightBoxMin, lightVolume.minX, lightVolume.minY, lightVolume.minZ); uploadMatrixUniform(uModel, model); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java index 904e4c37e..ebe001bb5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java @@ -8,7 +8,6 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; public class BasicProgram extends GlProgram { - protected final int uTicks; protected final int uTime; protected final int uViewProjection; protected final int uDebug; @@ -21,7 +20,6 @@ public class BasicProgram extends GlProgram { public BasicProgram(ResourceLocation name, int handle) { super(name, handle); - uTicks = getUniformLocation("uTicks"); uTime = getUniformLocation("uTime"); uViewProjection = getUniformLocation("uViewProjection"); uDebug = getUniformLocation("uDebug"); @@ -43,7 +41,6 @@ public class BasicProgram extends GlProgram { super.bind(); GL20.glUniform1i(uDebug, debugMode); - GL20.glUniform1i(uTicks, AnimationTickHolder.getTicks()); GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTick()); uploadMatrixUniform(uViewProjection, viewProjection); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java index 287ba6057..064862d8b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java @@ -1,7 +1,11 @@ package com.simibubi.create.foundation.render.gl; +import com.simibubi.create.foundation.render.gl.backend.Backend; import org.lwjgl.opengl.GL20; +import java.nio.ByteBuffer; +import java.util.function.Consumer; + public class GlBuffer extends GlObject { protected final int bufferType; @@ -11,6 +15,10 @@ public class GlBuffer extends GlObject { this.bufferType = bufferType; } + public int getBufferType() { + return bufferType; + } + public void bind() { GL20.glBindBuffer(bufferType, handle()); } @@ -19,6 +27,16 @@ public class GlBuffer extends GlObject { GL20.glBindBuffer(bufferType, 0); } + public void with(Consumer action) { + bind(); + action.accept(this); + unbind(); + } + + public void map(int offset, int length, Consumer upload) { + Backend.mapBuffer(bufferType, offset, length, upload); + } + protected void deleteInternal(int handle) { GL20.glDeleteBuffers(handle); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java b/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java index 64215e113..8c6320447 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.render.gl; import org.lwjgl.opengl.GL30; +import java.util.function.Consumer; + public class GlVertexArray extends GlObject { public GlVertexArray() { setHandle(GL30.glGenVertexArrays()); @@ -15,6 +17,12 @@ public class GlVertexArray extends GlObject { GL30.glBindVertexArray(0); } + public void with(Consumer action) { + bind(); + action.accept(this); + unbind(); + } + protected void deleteInternal(int handle) { GL30.glDeleteVertexArrays(handle); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java deleted file mode 100644 index 8a48ccb3c..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/AttributeGroup.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.simibubi.create.foundation.render.gl.attrib; - -import java.util.ArrayList; - -public class AttributeGroup { - private final int divisor; - - private final ArrayList attributes; - - public AttributeGroup(int divisor) { - this.divisor = divisor; - this.attributes = new ArrayList<>(); - } - - public AttributeGroup attrib(VertexAttribSpec attrib) { - attributes.add(attrib); - return this; - } - - public int getDivisor() { - return divisor; - } - - public ArrayList getAttributes() { - return attributes; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java index 6b4f3fa57..b83bb9ad5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java @@ -10,14 +10,12 @@ public class CommonAttributes { public static final VertexAttribSpec VEC2 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); public static final VertexAttribSpec FLOAT = new VertexAttribSpec(GlPrimitiveType.FLOAT, 1); - public static final VertexAttribSpec POSITION = VertexAttribSpec.copy(VEC3); public static final VertexAttribSpec NORMAL = new VertexAttribSpec(GlPrimitiveType.BYTE, 3, true); - public static final VertexAttribSpec UV = VertexAttribSpec.copy(VEC2); - - public static final VertexAttribSpec ROTATION = VertexAttribSpec.copy(VEC3); - public static final VertexAttribSpec INSTANCE_POSITION = VertexAttribSpec.copy(VEC3); + public static final VertexAttribSpec UV = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); public static final VertexAttribSpec RGBA = new VertexAttribSpec(GlPrimitiveType.UBYTE, 4, true); public static final VertexAttribSpec RGB = new VertexAttribSpec(GlPrimitiveType.UBYTE, 3, true); public static final VertexAttribSpec LIGHT = new VertexAttribSpec(GlPrimitiveType.UBYTE, 2, true); + + public static final VertexAttribSpec NORMALIZED_BYTE = new VertexAttribSpec(GlPrimitiveType.BYTE, 1, true); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java index eb90102ee..5b50e9971 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java @@ -11,18 +11,6 @@ public class VertexAttribSpec { private final int attributeCount; private final boolean normalized; - public static VertexAttribSpec copy(VertexAttribSpec other) { - return new VertexAttribSpec(other); - } - - public VertexAttribSpec(VertexAttribSpec that) { - this.type = that.type; - this.count = that.count; - this.size = that.size; - this.attributeCount = that.attributeCount; - this.normalized = that.normalized; - } - public VertexAttribSpec(GlPrimitiveType type, int count) { this(type, count, false); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java index f205826f3..676ec7e13 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java @@ -1,34 +1,23 @@ package com.simibubi.create.foundation.render.gl.attrib; +import java.util.ArrayList; +import java.util.Arrays; + public class VertexFormat { - private final VertexAttribSpec[] elements; + private final ArrayList allAttributes; private final int numAttributes; private final int stride; - public VertexFormat(VertexAttribSpec... elements) { - this.elements = elements; - int numAttributes = 0, stride = 0; - for (VertexAttribSpec element : elements) { - numAttributes += element.getAttributeCount(); - stride += element.getSize(); - } - this.numAttributes = numAttributes; - this.stride = stride; - } - - public VertexFormat(VertexFormat start, VertexAttribSpec... elements) { - int baseLength = start.elements.length; - int addedLength = elements.length; - this.elements = new VertexAttribSpec[baseLength + addedLength]; - System.arraycopy(start.elements, 0, this.elements, 0, baseLength); - System.arraycopy(elements, 0, this.elements, baseLength, addedLength); + public VertexFormat(ArrayList allAttributes) { + this.allAttributes = allAttributes; int numAttributes = 0, stride = 0; - for (VertexAttribSpec element : this.elements) { - numAttributes += element.getAttributeCount(); - stride += element.getSize(); + for (IVertexAttrib attrib : allAttributes) { + VertexAttribSpec spec = attrib.attribSpec(); + numAttributes += spec.getAttributeCount(); + stride += spec.getSize(); } this.numAttributes = numAttributes; this.stride = stride; @@ -44,10 +33,33 @@ public class VertexFormat { public void informAttributes(int index) { int offset = 0; - for (VertexAttribSpec element : this.elements) { - element.registerForBuffer(stride, index, offset); - index += element.getAttributeCount(); - offset += element.getSize(); + for (IVertexAttrib attrib : this.allAttributes) { + VertexAttribSpec spec = attrib.attribSpec(); + spec.registerForBuffer(stride, index, offset); + index += spec.getAttributeCount(); + offset += spec.getSize(); + } + } + + public static Builder builder() { + return new Builder(); + } + + + public static class Builder { + private final ArrayList allAttributes; + + public Builder() { + allAttributes = new ArrayList<>(); + } + + public & IVertexAttrib> Builder addAttributes(Class attribEnum) { + allAttributes.addAll(Arrays.asList(attribEnum.getEnumConstants())); + return this; + } + + public VertexFormat build() { + return new VertexFormat(allAttributes); } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat2.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat2.java deleted file mode 100644 index 497b7e136..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat2.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.simibubi.create.foundation.render.gl.attrib; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.stream.Stream; - -public class VertexFormat2 { - - private final ArrayList>> allAttributes; - - public VertexFormat2(ArrayList>> allAttributes) { - this.allAttributes = allAttributes; - } - - public static Builder builder() { - return new Builder(); - } - - public Stream getAttributeStream() { - return (Stream) allAttributes.stream().flatMap(it -> Arrays.stream(it.getEnumConstants())); - } - - public static class Builder { - private final ArrayList>> allAttributes; - - public Builder() { - allAttributes = new ArrayList<>(); - } - - public & IVertexAttrib> Builder addAttributes(Class attribEnum) { - allAttributes.add(attribEnum); - return this; - } - - public VertexFormat2 build() { - return new VertexFormat2(allAttributes); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ActorVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ActorVertexAttributes.java new file mode 100644 index 000000000..6434f2106 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ActorVertexAttributes.java @@ -0,0 +1,43 @@ +package com.simibubi.create.foundation.render.gl.attrib.impl; + +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; + +public enum ActorVertexAttributes implements IVertexAttrib { + INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3), + LIGHT("aModelLight", CommonAttributes.LIGHT), + OFFSET("aOffset", CommonAttributes.FLOAT), + AXIS("aAxis", CommonAttributes.NORMAL), + INSTANCE_ROTATION("aInstanceRot", CommonAttributes.VEC3), + ROTATION_CENTER("aRotationCenter", CommonAttributes.NORMAL), + ; + + private final String name; + private final VertexAttribSpec spec; + + ActorVertexAttributes(String name, VertexAttribSpec spec) { + this.name = name; + this.spec = spec; + } + + @Override + public String attribName() { + return name; + } + + @Override + public VertexAttribSpec attribSpec() { + return spec; + } + + @Override + public int getDivisor() { + return 1; + } + + @Override + public int getBufferIndex() { + return 1; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/BeltVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/BeltVertexAttributes.java new file mode 100644 index 000000000..e8c8ab9cd --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/BeltVertexAttributes.java @@ -0,0 +1,42 @@ +package com.simibubi.create.foundation.render.gl.attrib.impl; + +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; +import com.simibubi.create.foundation.render.instancing.BeltData; + +public enum BeltVertexAttributes implements IVertexAttrib { + INSTANCE_ROTATION("aInstanceRot", CommonAttributes.VEC3), + SOURCE_TEX("aSourceTexture", CommonAttributes.UV), + SCROLL_TEX("aScrollTexture", CommonAttributes.VEC4), + SCROLL_MULT("aScrollMult", CommonAttributes.NORMALIZED_BYTE), + ; + + private final String name; + private final VertexAttribSpec spec; + + BeltVertexAttributes(String name, VertexAttribSpec spec) { + this.name = name; + this.spec = spec; + } + + @Override + public String attribName() { + return name; + } + + @Override + public VertexAttribSpec attribSpec() { + return spec; + } + + @Override + public int getDivisor() { + return 1; + } + + @Override + public int getBufferIndex() { + return 1; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ContraptionVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ContraptionVertexAttributes.java new file mode 100644 index 000000000..8109408ed --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ContraptionVertexAttributes.java @@ -0,0 +1,42 @@ +package com.simibubi.create.foundation.render.gl.attrib.impl; + +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; + +public enum ContraptionVertexAttributes implements IVertexAttrib { + VERTEX_POSITION("aPos", CommonAttributes.VEC3), + NORMAL("aNormal", CommonAttributes.NORMAL), + TEXTURE("aTexCoords", CommonAttributes.UV), + COLOR("aColor", CommonAttributes.RGBA), + MODEL_LIGHT("aModelLight", CommonAttributes.LIGHT), + ; + + private final String name; + private final VertexAttribSpec spec; + + ContraptionVertexAttributes(String name, VertexAttribSpec spec) { + this.name = name; + this.spec = spec; + } + + @Override + public String attribName() { + return name; + } + + @Override + public VertexAttribSpec attribSpec() { + return spec; + } + + @Override + public int getDivisor() { + return 0; + } + + @Override + public int getBufferIndex() { + return 0; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/KineticVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/KineticVertexAttributes.java new file mode 100644 index 000000000..ce5ddb9f3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/KineticVertexAttributes.java @@ -0,0 +1,42 @@ +package com.simibubi.create.foundation.render.gl.attrib.impl; + +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; + +public enum KineticVertexAttributes implements IVertexAttrib { + INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3), + LIGHT("aLight", CommonAttributes.LIGHT), + NETWORK_COLOR("aNetworkTint", CommonAttributes.RGB), + SPEED("aSpeed", CommonAttributes.FLOAT), + OFFSET("aOffset", CommonAttributes.FLOAT), + ; + + private final String name; + private final VertexAttribSpec spec; + + KineticVertexAttributes(String name, VertexAttribSpec spec) { + this.name = name; + this.spec = spec; + } + + @Override + public String attribName() { + return name; + } + + @Override + public VertexAttribSpec attribSpec() { + return spec; + } + + @Override + public int getDivisor() { + return 1; + } + + @Override + public int getBufferIndex() { + return 1; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/ModelVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ModelVertexAttributes.java similarity index 71% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/ModelVertexAttributes.java rename to src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ModelVertexAttributes.java index 5b81e5a1f..cd4b70d82 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/ModelVertexAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ModelVertexAttributes.java @@ -1,4 +1,8 @@ -package com.simibubi.create.foundation.render.gl.attrib; +package com.simibubi.create.foundation.render.gl.attrib.impl; + +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; public enum ModelVertexAttributes implements IVertexAttrib { VERTEX_POSITION("aPos", CommonAttributes.VEC3), diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/RotatingVertexAttributes.java similarity index 66% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java rename to src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/RotatingVertexAttributes.java index 424700255..12ff1afe1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/RotatingVertexAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/RotatingVertexAttributes.java @@ -1,11 +1,10 @@ -package com.simibubi.create.foundation.render.gl.attrib; +package com.simibubi.create.foundation.render.gl.attrib.impl; + +import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; public enum RotatingVertexAttributes implements IVertexAttrib { - INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3), - LIGHT("aLight", CommonAttributes.LIGHT), - NETWORK_COLOR("aNetworkTint", CommonAttributes.RGB), - SPEED("aSpeed", CommonAttributes.FLOAT), - OFFSET("aOffset", CommonAttributes.FLOAT), AXIS("aAxis", CommonAttributes.NORMAL), ; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java index 0912e9407..eb5fed9fb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.gl.backend; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.gl.shader.GlProgram; import com.simibubi.create.foundation.render.gl.shader.GlShader; import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; @@ -163,10 +164,11 @@ public class Backend { vert = loadShader(manager, programSpec.getVert(), ShaderType.VERTEX, programSpec.defines); frag = loadShader(manager, programSpec.getFrag(), ShaderType.FRAGMENT, programSpec.defines); - P program = GlProgram.builder(programSpec.name) - .attachShader(vert) - .attachShader(frag) - .build(programSpec.factory); + GlProgram.Builder builder = GlProgram.builder(programSpec.name).attachShader(vert).attachShader(frag); + + programSpec.attributes.forEach(builder::addAttribute); + + P program = builder.build(programSpec.factory); programs.put(programSpec, program); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java index 8a47796d8..d766ca730 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.gl.shader; import com.simibubi.create.foundation.render.gl.GlObject; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.gl.backend.Backend; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; @@ -67,6 +68,8 @@ public abstract class GlProgram extends GlObject { private final ResourceLocation name; private final int program; + private int attributeIndex; + public Builder(ResourceLocation name) { this.name = name; this.program = GL20.glCreateProgram(); @@ -78,6 +81,12 @@ public abstract class GlProgram extends GlObject { return this; } + public Builder addAttribute(A attrib) { + GL20.glBindAttribLocation(this.program, attributeIndex, attrib.attribName()); + attributeIndex += attrib.attribSpec().getAttributeCount(); + return this; + } + /** * Links the attached shaders to this program and returns a user-defined container which wraps the shader * program. This container can, for example, provide methods for updating the specific uniforms of that shader @@ -104,12 +113,6 @@ public abstract class GlProgram extends GlObject { return factory.create(this.name, this.program); } - -// public Builder bindAttribute(String name, GlVertexAttribute attribute) { -// GL20.glBindAttribLocation(this.program, attribute.getIndex(), name); -// -// return this; -// } } @FunctionalInterface diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java index bdf25dece..894131652 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java @@ -1,8 +1,12 @@ package com.simibubi.create.foundation.render.gl.shader; import com.simibubi.create.Create; +import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; import net.minecraft.util.ResourceLocation; +import java.util.ArrayList; +import java.util.Arrays; + public class ProgramSpec

{ public final ResourceLocation name; @@ -13,17 +17,25 @@ public class ProgramSpec

{ public final GlProgram.ProgramFactory

factory; - public ProgramSpec(String name, ResourceLocation vert, ResourceLocation frag, GlProgram.ProgramFactory

factory) { - this(name, vert, frag, factory, null); + public final ArrayList attributes; + + public static

Builder

builder(String name, GlProgram.ProgramFactory

factory) { + return builder(new ResourceLocation(Create.ID, name), factory); } - public ProgramSpec(String name, ResourceLocation vert, ResourceLocation frag, GlProgram.ProgramFactory

factory, ShaderConstants defines) { - this.name = new ResourceLocation(Create.ID, name); + public static

Builder

builder(ResourceLocation name, GlProgram.ProgramFactory

factory) { + return new Builder<>(name, factory); + } + + public ProgramSpec(ResourceLocation name, ResourceLocation vert, ResourceLocation frag, GlProgram.ProgramFactory

factory, ShaderConstants defines, ArrayList attributes) { + this.name = name; this.vert = vert; this.frag = frag; this.defines = defines; + this.factory = factory; + this.attributes = attributes; } public ResourceLocation getVert() { @@ -34,4 +46,43 @@ public class ProgramSpec

{ return frag; } + public static class Builder

{ + private ResourceLocation vert; + private ResourceLocation frag; + private ShaderConstants defines = null; + + private final ResourceLocation name; + private final GlProgram.ProgramFactory

factory; + private final ArrayList attributes; + + public Builder(ResourceLocation name, GlProgram.ProgramFactory

factory) { + this.name = name; + this.factory = factory; + attributes = new ArrayList<>(); + } + + public Builder

setVert(ResourceLocation vert) { + this.vert = vert; + return this; + } + + public Builder

setFrag(ResourceLocation frag) { + this.frag = frag; + return this; + } + + public Builder

setDefines(ShaderConstants defines) { + this.defines = defines; + return this; + } + + public & IVertexAttrib> Builder

addAttributes(Class attributeEnum) { + attributes.addAll(Arrays.asList(attributeEnum.getEnumConstants())); + return this; + } + + public ProgramSpec

createProgramSpec() { + return new ProgramSpec<>(name, vert, frag, factory, defines, attributes); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java index bbb302e72..6e63fc8fb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java @@ -5,6 +5,8 @@ import com.simibubi.create.foundation.render.gl.GlPrimitiveType; import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.impl.BeltVertexAttributes; +import com.simibubi.create.foundation.render.gl.attrib.impl.KineticVertexAttributes; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import java.nio.ByteBuffer; @@ -12,10 +14,10 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec.*; public class BeltData extends KineticData { - public static final VertexAttribSpec TARGET_UV = copy(CommonAttributes.VEC4); - public static final VertexAttribSpec SCROLL_MULT = new VertexAttribSpec(GlPrimitiveType.BYTE, 1, true); - - public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, CommonAttributes.ROTATION, CommonAttributes.UV, TARGET_UV, SCROLL_MULT); + public static VertexFormat FORMAT = VertexFormat.builder() + .addAttributes(KineticVertexAttributes.class) + .addAttributes(BeltVertexAttributes.class) + .build(); private float rotX; private float rotY; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java deleted file mode 100644 index 4e6bec405..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/DynamicInstancedModel.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -import com.simibubi.create.foundation.render.gl.GlBuffer; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.GL20; - -public abstract class DynamicInstancedModel extends InstancedModel { - - protected GlBuffer dynamicVBO; - - protected int dynamicBufferSize = -1; - - public DynamicInstancedModel(BufferBuilder buf) { - super(buf); - } - - @Override - protected void init() { - super.init(); - dynamicVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); - } - - protected abstract VertexFormat getDynamicFormat(); - - protected abstract D newDynamicPart(); - - @Override - protected int getTotalShaderAttributeCount() { - return super.getTotalShaderAttributeCount() + getDynamicFormat().getShaderAttributeCount(); - } - - @Override - protected void deleteInternal() { - super.deleteInternal(); - dynamicVBO.delete(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java index d86694505..7311562b9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java @@ -4,10 +4,9 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.BufferedModel; import com.simibubi.create.foundation.render.RenderMath; import com.simibubi.create.foundation.render.gl.GlVertexArray; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.gl.backend.Backend; import com.simibubi.create.foundation.render.gl.GlBuffer; +import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.impl.ModelVertexAttributes; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.*; @@ -16,7 +15,7 @@ import java.util.ArrayList; import java.util.function.Consumer; public abstract class InstancedModel extends BufferedModel { - public static final VertexFormat FORMAT = new VertexFormat(CommonAttributes.POSITION, CommonAttributes.NORMAL, CommonAttributes.UV); + public static final VertexFormat FORMAT = VertexFormat.builder().addAttributes(ModelVertexAttributes.class).build(); protected GlVertexArray vao; protected GlBuffer instanceVBO; @@ -37,9 +36,7 @@ public abstract class InstancedModel extends BufferedMod vao = new GlVertexArray(); instanceVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); - vao.bind(); - super.init(); - vao.unbind(); + vao.with(vao -> super.init()); } @Override @@ -108,10 +105,10 @@ public abstract class InstancedModel extends BufferedMod } protected void doRender() { - vao.bind(); - renderSetup(); - GL31.glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); - vao.unbind(); + vao.with(vao -> { + renderSetup(); + GL31.glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); + }); } protected void renderSetup() { @@ -123,45 +120,43 @@ public abstract class InstancedModel extends BufferedMod int newInstanceCount = instanceCount(); int instanceSize = RenderMath.nextPowerOf2((newInstanceCount + 1) * stride); - instanceVBO.bind(); - - // this probably changes enough that it's not worth reallocating the entire buffer every time. - if (instanceSize > glBufferSize) { - GL15.glBufferData(GL15.GL_ARRAY_BUFFER, instanceSize, GL15.GL_STATIC_DRAW); - glBufferSize = instanceSize; - minIndexChanged = 0; - maxIndexChanged = newInstanceCount - 1; - } - - int offset = minIndexChanged * stride; - int length = (1 + maxIndexChanged - minIndexChanged) * stride; - - Backend.mapBuffer(GL15.GL_ARRAY_BUFFER, offset, length, buffer -> { - for (int i = minIndexChanged; i <= maxIndexChanged; i++) { - data.get(i).write(buffer); + instanceVBO.with(vbo -> { + // this probably changes enough that it's not worth reallocating the entire buffer every time. + if (instanceSize > glBufferSize) { + GL15.glBufferData(vbo.getBufferType(), instanceSize, GL15.GL_STATIC_DRAW); + glBufferSize = instanceSize; + minIndexChanged = 0; + maxIndexChanged = newInstanceCount - 1; } - }); - if (newInstanceCount < glInstanceCount) { - int clearFrom = (maxIndexChanged + 1) * stride; - int clearTo = (glInstanceCount) * stride; - Backend.mapBuffer(GL15.GL_ARRAY_BUFFER, clearFrom, clearTo - clearFrom, buffer -> { - for (int i = clearFrom; i < clearTo; i++) { - buffer.put((byte) 0); + int offset = minIndexChanged * stride; + int length = (1 + maxIndexChanged - minIndexChanged) * stride; + + vbo.map(offset, length, buffer -> { + for (int i = minIndexChanged; i <= maxIndexChanged; i++) { + data.get(i).write(buffer); } }); - } - glInstanceCount = newInstanceCount; + if (newInstanceCount < glInstanceCount) { + int clearFrom = (maxIndexChanged + 1) * stride; + int clearTo = (glInstanceCount) * stride; + vbo.map(clearFrom, clearTo - clearFrom, buffer -> { + for (int i = clearFrom; i < clearTo; i++) { + buffer.put((byte) 0); + } + }); + } - int staticAttributes = getModelFormat().getShaderAttributeCount(); - instanceFormat.informAttributes(staticAttributes); + glInstanceCount = newInstanceCount; - for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { - GL33.glVertexAttribDivisor(i + staticAttributes, 1); - } + int staticAttributes = getModelFormat().getShaderAttributeCount(); + instanceFormat.informAttributes(staticAttributes); - instanceVBO.unbind(); + for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { + GL33.glVertexAttribDivisor(i + staticAttributes, 1); + } + }); minIndexChanged = -1; maxIndexChanged = -1; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java index 2367b2f51..0c7adb5c7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java @@ -3,7 +3,6 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; import com.simibubi.create.foundation.utility.ColorHelper; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; @@ -13,11 +12,6 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec.*; public class KineticData> extends InstanceData { - public static final VertexAttribSpec ROTATION_CENTER = copy(CommonAttributes.VEC3); - public static final VertexAttribSpec SPEED = copy(CommonAttributes.FLOAT); - public static final VertexAttribSpec OFFSET = copy(CommonAttributes.FLOAT); - public static final VertexFormat FORMAT = new VertexFormat(CommonAttributes.INSTANCE_POSITION, CommonAttributes.LIGHT, CommonAttributes.RGB, SPEED, OFFSET); - private float x; private float y; private float z; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java index d3a1540c7..dfbb7429f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java @@ -1,6 +1,8 @@ package com.simibubi.create.foundation.render.instancing; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.impl.KineticVertexAttributes; +import com.simibubi.create.foundation.render.gl.attrib.impl.RotatingVertexAttributes; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.Direction; @@ -9,7 +11,10 @@ import java.nio.ByteBuffer; import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.NORMAL; public class RotatingData extends KineticData { - public static VertexFormat FORMAT = new VertexFormat(KineticData.FORMAT, NORMAL); + public static VertexFormat FORMAT = VertexFormat.builder() + .addAttributes(KineticVertexAttributes.class) + .addAttributes(RotatingVertexAttributes.class) + .build(); private byte rotationAxisX; private byte rotationAxisY; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java deleted file mode 100644 index e19c5e1db..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/DynamicRotatingActorData.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.simibubi.create.foundation.render.instancing.actors; - -import com.simibubi.create.foundation.render.instancing.InstanceData; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import net.minecraft.client.renderer.Vector3f; - -import java.nio.ByteBuffer; - -import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.NORMAL; - -public class DynamicRotatingActorData extends InstanceData { - public static VertexFormat FORMAT = new VertexFormat(NORMAL); - - private byte relativeMotionX; - private byte relativeMotionY; - private byte relativeMotionZ; - - public DynamicRotatingActorData setRelativeMotion(Vector3f axis) { - setRelativeMotion(axis.getX(), axis.getY(), axis.getZ()); - return this; - } - - public DynamicRotatingActorData setRelativeMotion(float relativeMotionX, float relativeMotionY, float relativeMotionZ) { - this.relativeMotionX = (byte) (relativeMotionX * 127); - this.relativeMotionY = (byte) (relativeMotionY * 127); - this.relativeMotionZ = (byte) (relativeMotionZ * 127); - return this; - } - - @Override - public void write(ByteBuffer buf) { - putVec3(buf, relativeMotionX, relativeMotionY, relativeMotionZ); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java index 672798d7b..56dc282f6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java @@ -1,24 +1,14 @@ package com.simibubi.create.foundation.render.instancing.actors; -import com.simibubi.create.foundation.render.instancing.DynamicInstancedModel; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.instancing.InstancedModel; import net.minecraft.client.renderer.BufferBuilder; -public class RotatingActorModel extends DynamicInstancedModel { +public class RotatingActorModel extends InstancedModel { public RotatingActorModel(BufferBuilder buf) { super(buf); } - @Override - protected VertexFormat getDynamicFormat() { - return DynamicRotatingActorData.FORMAT; - } - - @Override - protected DynamicRotatingActorData newDynamicPart() { - return new DynamicRotatingActorData(); - } - @Override protected VertexFormat getInstanceFormat() { return StaticRotatingActorData.FORMAT; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java index 8e2a3c255..79494b22c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java +++ b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java @@ -1,15 +1,18 @@ package com.simibubi.create.foundation.render.instancing.actors; import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.instancing.InstanceData; import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.gl.attrib.impl.ActorVertexAttributes; +import com.simibubi.create.foundation.render.instancing.InstanceData; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; import java.nio.ByteBuffer; public class StaticRotatingActorData extends InstanceData { - public static VertexFormat FORMAT = new VertexFormat(CommonAttributes.POSITION, CommonAttributes.LIGHT, CommonAttributes.FLOAT, CommonAttributes.NORMAL, CommonAttributes.VEC3, CommonAttributes.NORMAL); + public static VertexFormat FORMAT = VertexFormat.builder() + .addAttributes(ActorVertexAttributes.class) + .build(); private float x; private float y; diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index a6e5ecc06..a8bfe94f5 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -1,71 +1,70 @@ -#version 330 core +#version 110 #define PI 3.1415926538 -layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aNormal; -layout (location = 2) in vec2 aTexCoords; +attribute vec3 aPos; +attribute vec3 aNormal; +attribute vec2 aTexCoords; -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 light; -layout (location = 5) in vec3 networkTint; -layout (location = 6) in float speed; -layout (location = 7) in float offset; -layout (location = 8) in vec3 eulerAngles; -layout (location = 9) in vec2 sourceTexture; -layout (location = 10) in vec4 scrollTexture; -layout (location = 11) in float scrollMult; +attribute vec3 aInstancePos; +attribute vec2 aLight; +attribute vec3 aNetworkTint; +attribute float aSpeed; +attribute float aOffset; +attribute vec3 aInstanceRot; +attribute vec2 aSourceTexture; +attribute vec4 aScrollTexture; +attribute float aScrollMult; -out vec2 TexCoords; -out vec4 Color; -out float Diffuse; -out vec2 Light; +varying vec2 TexCoords; +varying vec4 Color; +varying float Diffuse; +varying vec2 Light; #if defined(CONTRAPTION) -out vec3 BoxCoord; +varying vec3 BoxCoord; uniform vec3 uLightBoxSize; uniform vec3 uLightBoxMin; uniform mat4 uModel; #endif -uniform int uTicks; uniform float uTime; uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; -out float FragDistance; +varying float FragDistance; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1 - c; + float oc = 1. - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, - 0, 0, 0, 1); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); } float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; float z = normal.z; - return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); + return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); } mat4 rotation(vec3 rot) { - return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); + return rotate(vec3(0., 1., 0.), rot.y) * rotate(vec3(0., 0., 1.), rot.z) * rotate(vec3(1., 0., 0.), rot.x); } mat4 localRotation() { - vec3 rot = fract(eulerAngles / 360) * PI * 2; + vec3 rot = fract(aInstanceRot / 360.) * PI * 2.; return rotation(rot); } void main() { mat4 localRotation = localRotation(); - vec4 worldPos = localRotation * vec4(aPos - .5, 1) + vec4(instancePos + .5, 0); + vec4 worldPos = localRotation * vec4(aPos - .5, 1.) + vec4(aInstancePos + .5, 0.); #ifdef CONTRAPTION @@ -77,30 +76,30 @@ void main() { mat4 normalMat = localRotation; #endif - vec3 norm = normalize(normalMat * vec4(aNormal, 0)).xyz; + vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; - float scrollSize = scrollTexture.w - scrollTexture.y; - float scroll = fract(speed * uTime / (36 * 16) + offset) * scrollSize * scrollMult; + float scrollSize = aScrollTexture.w - aScrollTexture.y; + float scroll = fract(aSpeed * uTime / (36. * 16.) + aOffset) * scrollSize * aScrollMult; Diffuse = diffuse(norm); - TexCoords = aTexCoords - sourceTexture + scrollTexture.xy + vec2(0, scroll); - Light = light; + TexCoords = aTexCoords - aSourceTexture + aScrollTexture.xy + vec2(0, scroll); + Light = aLight; FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; #ifdef CONTRAPTION if (uDebug == 2) { - Color = vec4(norm, 1); + Color = vec4(norm, 1.); } else { - Color = vec4(1); + Color = vec4(1.); } #else if (uDebug == 1) { - Color = vec4(networkTint, 1); + Color = vec4(aNetworkTint, 1.); } else if (uDebug == 2) { - Color = vec4(norm, 1); + Color = vec4(norm, 1.); } else { - Color = vec4(1); + Color = vec4(1.); } #endif } diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index 0cad9b4db..5d90b40ff 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -1,14 +1,12 @@ -#version 330 core +#version 110 -in vec2 TexCoords; -in vec4 Color; -in float Diffuse; -in vec2 Light; -in float FragDistance; +varying vec2 TexCoords; +varying vec4 Color; +varying float Diffuse; +varying vec2 Light; +varying float FragDistance; -in vec3 BoxCoord; - -out vec4 fragColor; +varying vec3 BoxCoord; uniform vec2 uFogRange; uniform vec4 uFogColor; @@ -18,7 +16,7 @@ uniform sampler2D uLightMap; uniform sampler3D uLightVolume; vec4 light() { - vec2 lm = texture(uLightVolume, BoxCoord).rg * 0.9375 + 0.03125; + vec2 lm = texture3D(uLightVolume, BoxCoord).rg * 0.9375 + 0.03125; return texture2D(uLightMap, max(lm, Light)); } @@ -28,8 +26,8 @@ void main() { vec4 color = vec4(tex.rgb * light().rgb * Diffuse * Color.rgb, tex.a); float fog = (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); - fog = clamp(fog, 0, 1); + fog = clamp(fog, 0., 1.); - fragColor = mix(uFogColor, color, fog); - fragColor.a = color.a; + gl_FragColor = mix(uFogColor, color, fog); + gl_FragColor.a = color.a; } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index de91f6143..5623e01ca 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -1,92 +1,88 @@ -#version 330 core +#version 110 #define PI 3.1415926538 // model data -layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aNormal; -layout (location = 2) in vec2 aTexCoords; +attribute vec3 aPos; +attribute vec3 aNormal; +attribute vec2 aTexCoords; // instance data -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 modelLight; -layout (location = 5) in float rotationOffset; -layout (location = 6) in vec3 localRotationAxis; -layout (location = 7) in vec3 localRotation; -layout (location = 8) in vec3 rotationCenter; +attribute vec3 aInstancePos; +attribute vec2 aModelLight; +attribute float aOffset; +attribute vec3 aAxis; +attribute vec3 aInstanceRot; +attribute vec3 aRotationCenter; -// dynamic data -//layout (location = 9) in vec3 relativeMotion; -out float Diffuse; -out vec2 TexCoords; -out vec4 Color; -out vec3 BoxCoord; -out vec2 Light; +varying float Diffuse; +varying vec2 TexCoords; +varying vec4 Color; +varying vec3 BoxCoord; +varying vec2 Light; uniform vec3 uLightBoxSize; uniform vec3 uLightBoxMin; uniform mat4 uModel; -uniform int uTicks; uniform float uTime; uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; -out float FragDistance; +varying float FragDistance; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1 - c; + float oc = 1. - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, - 0, 0, 0, 1); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); } float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; float z = normal.z; - return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); + return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); } mat4 rotation(vec3 rot) { - return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); + return rotate(vec3(0., 1., 0.), rot.y) * rotate(vec3(0., 0., 1.), rot.z) * rotate(vec3(1., 0., 0.), rot.x); } mat4 kineticRotation() { - const float speed = -20; - float degrees = rotationOffset + uTime * speed * -3/10; - float angle = fract(degrees / 360) * PI * 2; + const float speed = -20.; + float degrees = aOffset + uTime * speed * -3./10.; + float angle = fract(degrees / 360.) * PI * 2.; - return rotate(normalize(localRotationAxis), angle); + return rotate(normalize(aAxis), angle); } void main() { mat4 kineticRotation = kineticRotation(); - vec4 localPos = kineticRotation * vec4(aPos - rotationCenter, 1) + vec4(rotationCenter, 0); - //localPos = vec4(localPos.xyz + instancePos, 1); + vec4 localPos = kineticRotation * vec4(aPos - aRotationCenter, 1.) + vec4(aRotationCenter, 0.); - vec3 rot = fract(localRotation / 360) * PI * 2; + vec3 rot = fract(aInstanceRot / 360.) * PI * 2.; mat4 localRot = rotation(rot); - localPos = localRot * vec4(localPos.xyz - .5, 1) + vec4(instancePos + .5, 0); + localPos = localRot * vec4(localPos.xyz - .5, 1.) + vec4(aInstancePos + .5, 0.); vec4 worldPos = uModel * localPos; - vec3 norm = normalize(uModel * localRot * kineticRotation * vec4(aNormal, 0)).xyz; + vec3 norm = normalize(uModel * localRot * kineticRotation * vec4(aNormal, 0.)).xyz; BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; Diffuse = diffuse(norm); TexCoords = aTexCoords; - Light = modelLight; + Light = aModelLight; FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; if (uDebug == 2) { - Color = vec4(norm, 1); + Color = vec4(norm, 1.); } else { - Color = vec4(1); + Color = vec4(1.); } } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_structure.vert b/src/main/resources/assets/create/shader/contraption_structure.vert index 64a2a3759..da8ef4cc8 100644 --- a/src/main/resources/assets/create/shader/contraption_structure.vert +++ b/src/main/resources/assets/create/shader/contraption_structure.vert @@ -1,63 +1,62 @@ -#version 330 core +#version 110 #define PI 3.1415926538 -layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aNormal; -layout (location = 2) in vec2 aTexCoords; -layout (location = 3) in vec4 aColor; -layout (location = 4) in vec2 modelLight; +attribute vec3 aPos; +attribute vec3 aNormal; +attribute vec2 aTexCoords; +attribute vec4 aColor; +attribute vec2 aModelLight; -out float Diffuse; -out vec2 TexCoords; -out vec4 Color; -out vec3 BoxCoord; -out vec2 Light; +varying float Diffuse; +varying vec2 TexCoords; +varying vec4 Color; +varying vec3 BoxCoord; +varying vec2 Light; uniform vec3 uLightBoxSize; uniform vec3 uLightBoxMin; uniform mat4 uModel; -uniform int uTicks; uniform float uTime; uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; -out float FragDistance; +varying float FragDistance; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1 - c; + float oc = 1. - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, - 0, 0, 0, 1); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); } float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; float z = normal.z; - return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); + return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); } void main() { - vec4 worldPos = uModel * vec4(aPos, 1); + vec4 worldPos = uModel * vec4(aPos, 1.); - vec3 norm = (uModel * vec4(aNormal, 0)).xyz; + vec3 norm = (uModel * vec4(aNormal, 0.)).xyz; BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; Diffuse = diffuse(norm); Color = aColor / diffuse(aNormal); TexCoords = aTexCoords; - Light = modelLight; + Light = aModelLight; FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; if (uDebug == 2) { - Color = vec4(norm, 1); + Color = vec4(norm, 1.); } else { Color = aColor / diffuse(aNormal); } diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index 0a0aca7cd..cb85241f5 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -1,12 +1,10 @@ -#version 330 core +#version 110 -in vec2 TexCoords; -in vec2 Light; -in float Diffuse; -in vec4 Color; -in float FragDistance; - -out vec4 fragColor; +varying vec2 TexCoords; +varying vec2 Light; +varying float Diffuse; +varying vec4 Color; +varying float FragDistance; uniform vec2 uFogRange; uniform vec4 uFogColor; @@ -25,8 +23,8 @@ void main() { vec4 color = vec4(tex.rgb * light().rgb * Diffuse, tex.a) * Color; float fog = (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); - fog = clamp(fog, 0, 1); + fog = clamp(fog, 0., 1.); - fragColor = mix(uFogColor, color, fog); - fragColor.a = color.a; + gl_FragColor = mix(uFogColor, color, fog); + gl_FragColor.a = color.a; } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index 89b76d975..3871b6d4f 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -1,69 +1,68 @@ -#version 330 core +#version 110 #define PI 3.1415926538 -layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aNormal; -layout (location = 2) in vec2 aTexCoords; +attribute vec3 aPos; +attribute vec3 aNormal; +attribute vec2 aTexCoords; -layout (location = 3) in vec3 instancePos; -layout (location = 4) in vec2 light; -layout (location = 5) in vec3 networkTint; -layout (location = 6) in float speed; -layout (location = 7) in float offset; -layout (location = 8) in vec3 rotationAxis; +attribute vec3 aInstancePos; +attribute vec2 aLight; +attribute vec3 aNetworkTint; +attribute float aSpeed; +attribute float aOffset; +attribute vec3 aAxis; -out vec2 TexCoords; -out vec4 Color; -out float Diffuse; -out vec2 Light; +varying vec2 TexCoords; +varying vec4 Color; +varying float Diffuse; +varying vec2 Light; #if defined(CONTRAPTION) -out vec3 BoxCoord; +varying vec3 BoxCoord; uniform vec3 uLightBoxSize; uniform vec3 uLightBoxMin; uniform mat4 uModel; #endif -uniform int uTicks; uniform float uTime; uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; -out float FragDistance; +varying float FragDistance; mat4 rotate(vec3 axis, float angle) { float s = sin(angle); float c = cos(angle); - float oc = 1 - c; + float oc = 1. - c; - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0, - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0, - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0, - 0, 0, 0, 1); + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); } float diffuse(vec3 normal) { float x = normal.x; float y = normal.y; float z = normal.z; - return min(x * x * .6 + y * y * ((3 + y) / 4) + z * z * .8, 1); + return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); } mat4 rotation(vec3 rot) { - return rotate(vec3(0, 1, 0), rot.y) * rotate(vec3(0, 0, 1), rot.z) * rotate(vec3(1, 0, 0), rot.x); + return rotate(vec3(0., 1., 0.), rot.y) * rotate(vec3(0., 0., 1.), rot.z) * rotate(vec3(1., 0., 0.), rot.x); } mat4 kineticRotation() { - float degrees = offset + uTime * speed * -3/10; - float angle = fract(degrees / 360) * PI * 2; + float degrees = aOffset + uTime * aSpeed * -3./10.; + float angle = fract(degrees / 360.) * PI * 2.; - return rotate(rotationAxis, angle); + return rotate(aAxis, angle); } void main() { mat4 kineticRotation = kineticRotation(); - vec4 worldPos = kineticRotation * vec4(aPos - 0.5, 1) + vec4(instancePos + .5, 0); + vec4 worldPos = kineticRotation * vec4(aPos - .5, 1.) + vec4(aInstancePos + .5, 0.); #ifdef CONTRAPTION @@ -75,27 +74,27 @@ void main() { mat4 normalMat = kineticRotation; #endif - vec3 norm = normalize(normalMat * vec4(aNormal, 0)).xyz; + vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; Diffuse = diffuse(norm); TexCoords = aTexCoords; - Light = light; + Light = aLight; FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; #ifdef CONTRAPTION if (uDebug == 2) { - Color = vec4(norm, 1); + Color = vec4(norm, 1.); } else { - Color = vec4(1); + Color = vec4(1.); } #else if (uDebug == 1) { - Color = vec4(networkTint, 1); + Color = vec4(aNetworkTint, 1.); } else if (uDebug == 2) { - Color = vec4(norm, 1); + Color = vec4(norm, 1.); } else { - Color = vec4(1); + Color = vec4(1.); } #endif } \ No newline at end of file From 31a1fd71ce1a6245a94fbbf8dbdb1b7ce35f6bcb Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 11 Feb 2021 23:36:05 -0800 Subject: [PATCH 095/147] everything is somewhere else --- .../com/simibubi/create/AllBlockPartials.java | 7 +++-- .../com/simibubi/create/CreateClient.java | 6 ++-- .../base/BackHalfShaftInstance.java | 4 +-- .../contraptions/base/HalfShaftInstance.java | 8 ++--- .../base/HorizontalHalfShaftInstance.java | 4 +-- .../contraptions/base}/KineticData.java | 8 ++--- .../base/KineticRenderMaterials.java | 13 ++++++++ .../contraptions/base/KineticTileEntity.java | 4 +-- .../base/KineticTileEntityRenderer.java | 4 +-- .../base/KineticTileInstance.java | 4 +-- .../base}/KineticVertexAttributes.java | 8 ++--- .../contraptions/base}/RotatingData.java | 8 ++--- .../base/RotatingInstancedModel.java | 22 ++++++++++++++ .../base}/RotatingVertexAttributes.java | 8 ++--- .../base/ShaftlessCogInstance.java | 7 ++--- .../base/SingleRotatingInstance.java | 9 +++--- .../actors}/ActorVertexAttributes.java | 8 ++--- .../actors/ContraptionActorData.java} | 30 +++++++++---------- .../components/actors/DrillInstance.java | 10 +++---- .../actors/DrillMovementBehaviour.java | 4 +-- .../actors/HarvesterMovementBehaviour.java | 4 +-- .../components/actors/HarvesterRenderer.java | 11 ++++--- .../components/actors/RotatingActorModel.java | 21 +++++++++++++ .../crafter/MechanicalCrafterInstance.java | 8 ++--- .../crafter/MechanicalCrafterRenderer.java | 2 +- .../components/deployer/DeployerRenderer.java | 3 +- .../components/fan/EncasedFanRenderer.java | 3 +- .../components/fan/FanInstance.java | 10 +++---- .../components/flywheel/FlyWheelInstance.java | 4 +-- .../millstone/MillStoneCogInstance.java | 8 ++--- .../mixer/MechanicalMixerRenderer.java | 3 +- .../components/saw/SawInstance.java | 8 ++--- .../components/saw/SawRenderer.java | 3 +- .../AbstractContraptionEntityRenderer.java | 3 +- .../structureMovement/Contraption.java | 3 +- .../ContraptionLighter.java | 7 +++-- .../ContraptionRenderer.java | 2 +- .../structureMovement/MovementBehaviour.java | 2 +- .../NonStationaryLighter.java | 5 ++-- .../bearing/BearingContraption.java | 2 +- .../bearing/BearingLighter.java | 4 +-- .../bearing/StabilizedContraption.java | 2 +- .../mounted/MountedContraption.java | 2 +- .../piston/PistonContraption.java | 2 +- .../piston/PistonLighter.java | 5 ++-- .../pulley/PulleyContraption.java | 2 +- .../pulley/PulleyLighter.java | 5 ++-- .../render/ContraptionKineticRenderer.java | 19 ++++++++++++ .../render}/ContraptionModel.java | 11 ++----- .../render}/ContraptionProgram.java | 6 ++-- .../render}/ContraptionRenderDispatcher.java | 7 ++--- .../render}/ContraptionVertexAttributes.java | 8 ++--- .../render}/RenderedContraption.java | 11 +++---- .../contraptions/fluids/PumpCogInstance.java | 8 ++--- .../advanced/SpeedControllerRenderer.java | 2 +- .../contraptions/relays/belt}/BeltData.java | 13 +++----- .../relays/belt/BeltInstance.java | 5 ++-- .../relays/belt/BeltInstancedModel.java | 22 ++++++++++++++ .../relays/belt/BeltRenderer.java | 2 +- .../relays/belt}/BeltVertexAttributes.java | 9 +++--- .../relays/encased/ShaftInstance.java | 4 +-- .../relays/encased/SplitShaftInstance.java | 10 +++---- .../relays/encased/SplitShaftRenderer.java | 3 +- .../relays/gearbox/GearboxInstance.java | 10 +++---- .../relays/gearbox/GearboxRenderer.java | 2 +- .../block/mechanicalArm/ArmInstance.java | 8 ++--- .../SchematicRendererWithInstancing.java | 8 +---- .../simibubi/create/events/ClientEvents.java | 4 +-- .../command/ConfigureConfigPacket.java | 3 +- .../create/foundation/config/CClient.java | 2 +- .../mixin/CancelTileEntityRenderMixin.java | 5 ++-- .../foundation/mixin/LightUpdateMixin.java | 2 +- .../foundation/mixin/OnRemoveTileMixin.java | 1 - .../foundation/mixin/RenderInLayerMixin.java | 2 +- .../foundation/mixin/ShaderCloseMixin.java | 2 +- .../foundation/render/AllProgramSpecs.java | 17 +++++++---- .../foundation/render/KineticRenderer.java | 11 ++++--- .../foundation/render/TemplateBuffer.java | 4 --- .../render/{gl => }/backend/Backend.java | 18 +++++------ .../render/{ => backend}/BufferedModel.java | 17 ++++++----- .../{ => backend}/FastRenderDispatcher.java | 11 +++---- .../{gl => }/backend/OptifineHandler.java | 2 +- .../{gl => }/backend/SystemCapability.java | 2 +- .../render/{ => backend}/gl/BasicProgram.java | 6 ++-- .../render/{ => backend}/gl/GlBuffer.java | 8 +++-- .../render/{ => backend}/gl/GlFog.java | 2 +- .../render/{ => backend}/gl/GlObject.java | 2 +- .../{ => backend}/gl/GlPrimitiveType.java | 2 +- .../render/{ => backend}/gl/GlTexture.java | 2 +- .../{ => backend}/gl/GlVertexArray.java | 2 +- .../gl/attrib/CommonAttributes.java | 4 +-- .../gl/attrib/IVertexAttrib.java | 2 +- .../gl/attrib}/ModelVertexAttributes.java | 6 +--- .../gl/attrib/VertexAttribSpec.java | 8 ++--- .../{ => backend}/gl/attrib/VertexFormat.java | 6 ++-- .../{ => backend}/gl/shader/GLSLType.java | 4 +-- .../{ => backend}/gl/shader/GlProgram.java | 8 ++--- .../{ => backend}/gl/shader/GlShader.java | 6 ++-- .../{ => backend}/gl/shader/ProgramSpec.java | 4 +-- .../gl/shader/ShaderCallback.java | 2 +- .../gl/shader/ShaderConstants.java | 3 +- .../{ => backend}/gl/shader/ShaderType.java | 2 +- .../gl/shader/ShaderUniforms.java | 3 +- .../backend/instancing/IInstanceRendered.java | 9 ++++++ .../instancing/IRendererFactory.java | 2 +- .../instancing/InstanceData.java | 2 +- .../{ => backend}/instancing/InstanceKey.java | 2 +- .../instancing/InstancedModel.java | 14 ++++----- .../InstancedTileRenderRegistry.java | 2 +- .../instancing/InstancedTileRenderer.java | 11 ++++--- .../backend/instancing/MaterialType.java | 3 ++ .../instancing/ModelFactory.java | 2 +- .../instancing/RenderMaterial.java | 12 ++++---- .../instancing/TileEntityInstance.java | 2 +- .../light/CoordinateConsumer.java | 2 +- .../{ => backend}/light/EmptyLighter.java | 3 +- .../{ => backend}/light/GridAlignedBB.java | 4 +-- .../{ => backend}/light/ILightListener.java | 2 +- .../{ => backend}/light/LightVolume.java | 4 +-- .../light/LightVolumeDebugger.java | 4 +-- .../ContraptionKineticRenderer.java | 19 ------------ .../foundation/render/gl/SamplerBinding.java | 26 ---------------- .../foundation/render/gl/SamplerType.java | 25 ---------------- .../render/instancing/BeltModel.java | 21 ------------- .../render/instancing/IInstanceRendered.java | 9 ------ .../instancing/KineticRenderMaterials.java | 10 ------- .../render/instancing/MaterialType.java | 3 -- .../render/instancing/RotatingModel.java | 21 ------------- .../instancing/actors/RotatingActorModel.java | 21 ------------- .../PlacementSimulationWorld.java | 6 ---- 130 files changed, 405 insertions(+), 499 deletions(-) rename src/main/java/com/simibubi/create/{foundation/render/instancing => content/contraptions/base}/KineticData.java (87%) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java rename src/main/java/com/simibubi/create/{foundation/render/gl/attrib/impl => content/contraptions/base}/KineticVertexAttributes.java (73%) rename src/main/java/com/simibubi/create/{foundation/render/instancing => content/contraptions/base}/RotatingData.java (79%) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java rename src/main/java/com/simibubi/create/{foundation/render/gl/attrib/impl => content/contraptions/base}/RotatingVertexAttributes.java (67%) rename src/main/java/com/simibubi/create/{foundation/render/gl/attrib/impl => content/contraptions/components/actors}/ActorVertexAttributes.java (74%) rename src/main/java/com/simibubi/create/{foundation/render/instancing/actors/StaticRotatingActorData.java => content/contraptions/components/actors/ContraptionActorData.java} (65%) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java rename src/main/java/com/simibubi/create/{foundation/render/light => content/contraptions/components/structureMovement}/ContraptionLighter.java (81%) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java rename src/main/java/com/simibubi/create/{foundation/render/contraption => content/contraptions/components/structureMovement/render}/ContraptionModel.java (73%) rename src/main/java/com/simibubi/create/{foundation/render/contraption => content/contraptions/components/structureMovement/render}/ContraptionProgram.java (82%) rename src/main/java/com/simibubi/create/{foundation/render/contraption => content/contraptions/components/structureMovement/render}/ContraptionRenderDispatcher.java (95%) rename src/main/java/com/simibubi/create/{foundation/render/gl/attrib/impl => content/contraptions/components/structureMovement/render}/ContraptionVertexAttributes.java (71%) rename src/main/java/com/simibubi/create/{foundation/render/contraption => content/contraptions/components/structureMovement/render}/RenderedContraption.java (93%) rename src/main/java/com/simibubi/create/{foundation/render/instancing => content/contraptions/relays/belt}/BeltData.java (75%) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java rename src/main/java/com/simibubi/create/{foundation/render/gl/attrib/impl => content/contraptions/relays/belt}/BeltVertexAttributes.java (70%) rename src/main/java/com/simibubi/create/foundation/render/{gl => }/backend/Backend.java (92%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/BufferedModel.java (84%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/FastRenderDispatcher.java (94%) rename src/main/java/com/simibubi/create/foundation/render/{gl => }/backend/OptifineHandler.java (97%) rename src/main/java/com/simibubi/create/foundation/render/{gl => }/backend/SystemCapability.java (84%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/BasicProgram.java (91%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/GlBuffer.java (78%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/GlFog.java (80%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/GlObject.java (94%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/GlPrimitiveType.java (93%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/GlTexture.java (89%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/GlVertexArray.java (90%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/attrib/CommonAttributes.java (89%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/attrib/IVertexAttrib.java (69%) rename src/main/java/com/simibubi/create/foundation/render/{gl/attrib/impl => backend/gl/attrib}/ModelVertexAttributes.java (72%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/attrib/VertexAttribSpec.java (72%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/attrib/VertexFormat.java (90%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/shader/GLSLType.java (90%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/shader/GlProgram.java (93%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/shader/GlShader.java (87%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/shader/ProgramSpec.java (94%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/shader/ShaderCallback.java (84%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/shader/ShaderConstants.java (92%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/shader/ShaderType.java (78%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/gl/shader/ShaderUniforms.java (71%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/IRendererFactory.java (75%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/InstanceData.java (93%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/InstanceKey.java (90%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/InstancedModel.java (92%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/InstancedTileRenderRegistry.java (93%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/InstancedTileRenderer.java (91%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/MaterialType.java rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/ModelFactory.java (72%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/RenderMaterial.java (92%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/instancing/TileEntityInstance.java (94%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/light/CoordinateConsumer.java (62%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/light/EmptyLighter.java (73%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/light/GridAlignedBB.java (98%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/light/ILightListener.java (52%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/light/LightVolume.java (98%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/light/LightVolumeDebugger.java (90%) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/SamplerBinding.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/gl/SamplerType.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/MaterialType.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index cee881770..7c1e46b0e 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -1,11 +1,14 @@ package com.simibubi.create; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; +import com.simibubi.create.content.contraptions.relays.belt.BeltData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index ddab555eb..18c3f054d 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -12,10 +12,10 @@ import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; import com.simibubi.create.foundation.render.KineticRenderer; -import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; +import com.simibubi.create.foundation.render.backend.OptifineHandler; import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.utility.outliner.Outliner; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java index 0ec0cda06..4a1875d28 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java index fc85c9193..0547b25fc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -1,11 +1,9 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; -import net.minecraft.block.BlockState; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java index 7c20f6959..a42524118 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java similarity index 87% rename from src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java rename to src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java index 0c7adb5c7..bf543f563 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java @@ -1,16 +1,12 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; +import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.utility.ColorHelper; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec.*; - public class KineticData> extends InstanceData { private float x; private float y; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java new file mode 100644 index 000000000..77a14eabb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java @@ -0,0 +1,13 @@ +package com.simibubi.create.content.contraptions.base; + +import com.simibubi.create.content.contraptions.relays.belt.BeltData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.MaterialType; +import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; + +public class KineticRenderMaterials { + public static final MaterialType> ROTATING = new MaterialType<>(); + public static final MaterialType> BELTS = new MaterialType<>(); + + public static final MaterialType> ACTORS = new MaterialType<>(); +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 7ed35759a..044cc2520 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Lang; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 7b8c3f092..836d63c66 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -6,9 +6,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.config.ConfigBase; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index 5b79e2e06..f94f5b959 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.*; import net.minecraft.block.BlockState; import net.minecraft.util.Direction; import net.minecraft.world.LightType; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/KineticVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticVertexAttributes.java similarity index 73% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/KineticVertexAttributes.java rename to src/main/java/com/simibubi/create/content/contraptions/base/KineticVertexAttributes.java index ce5ddb9f3..46f8740f4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/KineticVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticVertexAttributes.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.render.gl.attrib.impl; +package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; +import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; public enum KineticVertexAttributes implements IVertexAttrib { INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3), diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java similarity index 79% rename from src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java rename to src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java index dfbb7429f..c8afa2c35 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java @@ -1,15 +1,11 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.gl.attrib.impl.KineticVertexAttributes; -import com.simibubi.create.foundation.render.gl.attrib.impl.RotatingVertexAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.Direction; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.NORMAL; - public class RotatingData extends KineticData { public static VertexFormat FORMAT = VertexFormat.builder() .addAttributes(KineticVertexAttributes.class) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java new file mode 100644 index 000000000..420121124 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.contraptions.base; + +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import net.minecraft.client.renderer.BufferBuilder; + +public class RotatingInstancedModel extends InstancedModel { + public RotatingInstancedModel(BufferBuilder buf) { + super(buf); + } + + @Override + protected RotatingData newInstance() { + return new RotatingData(); + } + + @Override + protected VertexFormat getInstanceFormat() { + return RotatingData.FORMAT; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/RotatingVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingVertexAttributes.java similarity index 67% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/RotatingVertexAttributes.java rename to src/main/java/com/simibubi/create/content/contraptions/base/RotatingVertexAttributes.java index 12ff1afe1..677b18190 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/RotatingVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingVertexAttributes.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.render.gl.attrib.impl; +package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; +import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; public enum RotatingVertexAttributes implements IVertexAttrib { AXIS("aAxis", CommonAttributes.NORMAL), diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java index 0cec9d237..a64b049bd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java @@ -1,10 +1,9 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index fb951f8d5..3a717e5a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -1,10 +1,9 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceKey; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ActorVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java similarity index 74% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ActorVertexAttributes.java rename to src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java index 6434f2106..fdeae0d94 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ActorVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.render.gl.attrib.impl; +package com.simibubi.create.content.contraptions.components.actors; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; +import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; public enum ActorVertexAttributes implements IVertexAttrib { INSTANCE_POSITION("aInstancePos", CommonAttributes.VEC3), diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java similarity index 65% rename from src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java rename to src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java index 79494b22c..5f6494a62 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/StaticRotatingActorData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java @@ -1,15 +1,13 @@ -package com.simibubi.create.foundation.render.instancing.actors; +package com.simibubi.create.content.contraptions.components.actors; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.gl.attrib.impl.ActorVertexAttributes; -import com.simibubi.create.foundation.render.instancing.InstanceData; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; import java.nio.ByteBuffer; -public class StaticRotatingActorData extends InstanceData { +public class ContraptionActorData extends InstanceData { public static VertexFormat FORMAT = VertexFormat.builder() .addAttributes(ActorVertexAttributes.class) .build(); @@ -30,58 +28,58 @@ public class StaticRotatingActorData extends InstanceData { private byte rotationCenterY = 64; private byte rotationCenterZ = 64; - public StaticRotatingActorData setPosition(BlockPos pos) { + public ContraptionActorData setPosition(BlockPos pos) { this.x = pos.getX(); this.y = pos.getY(); this.z = pos.getZ(); return this; } - public StaticRotatingActorData setBlockLight(int blockLight) { + public ContraptionActorData setBlockLight(int blockLight) { this.blockLight = (byte) ((blockLight & 0xF) << 4); return this; } - public StaticRotatingActorData setSkyLight(int skyLight) { + public ContraptionActorData setSkyLight(int skyLight) { this.skyLight = (byte) ((skyLight & 0xF) << 4); return this; } - public StaticRotatingActorData setRotationOffset(float rotationOffset) { + public ContraptionActorData setRotationOffset(float rotationOffset) { this.rotationOffset = rotationOffset; return this; } - public StaticRotatingActorData setRotationAxis(Vector3f axis) { + public ContraptionActorData setRotationAxis(Vector3f axis) { setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); return this; } - public StaticRotatingActorData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { + public ContraptionActorData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) { this.rotationAxisX = (byte) (rotationAxisX * 127); this.rotationAxisY = (byte) (rotationAxisY * 127); this.rotationAxisZ = (byte) (rotationAxisZ * 127); return this; } - public StaticRotatingActorData setRotationCenter(Vector3f axis) { + public ContraptionActorData setRotationCenter(Vector3f axis) { setRotationCenter(axis.getX(), axis.getY(), axis.getZ()); return this; } - public StaticRotatingActorData setRotationCenter(float rotationCenterX, float rotationCenterY, float rotationCenterZ) { + public ContraptionActorData setRotationCenter(float rotationCenterX, float rotationCenterY, float rotationCenterZ) { this.rotationCenterX = (byte) (rotationCenterX * 127); this.rotationCenterY = (byte) (rotationCenterY * 127); this.rotationCenterZ = (byte) (rotationCenterZ * 127); return this; } - public StaticRotatingActorData setLocalRotation(Vector3f axis) { + public ContraptionActorData setLocalRotation(Vector3f axis) { setLocalRotation(axis.getX(), axis.getY(), axis.getZ()); return this; } - public StaticRotatingActorData setLocalRotation(float localRotationX, float localRotationY, float localRotationZ) { + public ContraptionActorData setLocalRotation(float localRotationX, float localRotationY, float localRotationZ) { this.localRotationX = localRotationX; this.localRotationY = localRotationY; this.localRotationZ = localRotationZ; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index e10201ae2..16fd9b7d4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -2,11 +2,11 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import com.simibubi.create.foundation.render.instancing.*; -import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; +import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; +import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; @@ -25,10 +25,10 @@ public class DrillInstance extends SingleRotatingInstance { } public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) { - RenderMaterial> renderMaterial = contraption.getActorMaterial(); + RenderMaterial> renderMaterial = contraption.getActorMaterial(); BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); + InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); model.setupInstance(data -> { Direction facing = state.get(DrillBlock.FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index b472cb9e8..a600cf9da 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index 5ee132c9a..c2d2b7880 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import org.apache.commons.lang3.mutable.MutableBoolean; import com.mojang.blaze3d.matrix.MatrixStack; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 7311e30c7..22b5fd9a4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -5,10 +5,9 @@ import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FAC import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.RenderMaterial; -import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; +import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -41,10 +40,10 @@ public class HarvesterRenderer extends SafeTileEntityRenderer> renderMaterial = contraption.getActorMaterial(); + RenderMaterial> renderMaterial = contraption.getActorMaterial(); BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); + InstancedModel model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); model.setupInstance(data -> { Direction facing = state.get(HORIZONTAL_FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java new file mode 100644 index 000000000..481df3061 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java @@ -0,0 +1,21 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import net.minecraft.client.renderer.BufferBuilder; + +public class RotatingActorModel extends InstancedModel { + public RotatingActorModel(BufferBuilder buf) { + super(buf); + } + + @Override + protected VertexFormat getInstanceFormat() { + return ContraptionActorData.FORMAT; + } + + @Override + protected ContraptionActorData newInstance() { + return new ContraptionActorData(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java index 6e1fc2203..8b7a327ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java @@ -4,10 +4,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java index bfe19d3ed..d94e5c35c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity.Phase; import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHandler.GroupedItems; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index d7d214cae..01faa80b3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -11,8 +11,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index dfb054de6..870aebca3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -7,8 +7,7 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.render.SuperByteBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index e7dfcb8b5..88a702f56 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -3,11 +3,11 @@ package com.simibubi.create.content.contraptions.components.fan; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceKey; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.content.contraptions.base.RotatingData; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index d98cd513e..f1f9cda0d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.components.flywheel; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.*; import net.minecraft.block.BlockState; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java index 7e198b68d..bcaddb716 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.content.contraptions.base.RotatingData; import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 1b76603b8..4d4477d9f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -5,8 +5,7 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.render.SuperByteBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java index 6769cedc9..0a04d43bb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java @@ -4,10 +4,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.content.contraptions.base.RotatingData; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Rotation; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 84564ddfb..03043241b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -8,8 +8,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index 399741243..cbb614bbb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index fba52fdd9..c475b620f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -24,8 +24,7 @@ import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBl import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; -import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.render.light.EmptyLighter; +import com.simibubi.create.foundation.render.backend.light.EmptyLighter; import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.NBTHelper; diff --git a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java similarity index 81% rename from src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java index 403fecee2..7708c5488 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java @@ -1,7 +1,8 @@ -package com.simibubi.create.foundation.render.light; +package com.simibubi.create.content.contraptions.components.structureMovement; -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; +import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; +import com.simibubi.create.foundation.render.backend.light.LightVolume; public abstract class ContraptionLighter { protected final C contraption; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index 251d2d559..af13ab7b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Random; import com.simibubi.create.foundation.render.*; -import net.minecraft.world.lighting.WorldLightManager; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index 82ae42088..72ede2acb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java index 54691d76c..141746638 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; -import com.simibubi.create.foundation.render.contraption.RenderedContraption; -import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.render.light.GridAlignedBB; +import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; +import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; public class NonStationaryLighter extends ContraptionLighter { public NonStationaryLighter(C contraption) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java index 37ea55934..b035bf445 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.tuple.Pair; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java index 31f3c79b8..6584cb2d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.render.light.GridAlignedBB; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java index fc1dd4420..508691fa3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; -import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java index f13e6cb39..f4279d816 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.All import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; -import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java index 7ed8ab535..57246a299 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Blo import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.CarpetBlock; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java index 28d86c6dc..94d4e25d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; -import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.render.light.GridAlignedBB; -import net.minecraft.util.Direction; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; import net.minecraft.util.math.Vec3i; public class PistonLighter extends ContraptionLighter { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java index 55bb14c93..13551c9e8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pu import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes; import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; -import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java index fc60b3e84..1541eb941 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java @@ -1,9 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pulley; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.render.light.ContraptionLighter; -import com.simibubi.create.foundation.render.light.GridAlignedBB; -import net.minecraft.util.math.AxisAlignedBB; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java new file mode 100644 index 000000000..c35a87c18 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -0,0 +1,19 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.render; + +import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; +import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; +import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel; + +public class ContraptionKineticRenderer extends InstancedTileRenderer { + + @Override + public void registerMaterials() { + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_BELT, BeltInstancedModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_ROTATING, RotatingInstancedModel::new)); + materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_ACTOR, RotatingActorModel::new)); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java similarity index 73% rename from src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java index 9e8f80b38..a332474a4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java @@ -1,17 +1,12 @@ -package com.simibubi.create.foundation.render.contraption; +package com.simibubi.create.content.contraptions.components.structureMovement.render; -import com.simibubi.create.foundation.render.BufferedModel; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.gl.attrib.impl.ContraptionVertexAttributes; -import com.simibubi.create.foundation.render.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.BufferedModel; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.LightTexture; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.LIGHT; -import static com.simibubi.create.foundation.render.gl.attrib.CommonAttributes.RGBA; - public class ContraptionModel extends BufferedModel { public static final VertexFormat FORMAT = VertexFormat.builder() .addAttributes(ContraptionVertexAttributes.class) diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java similarity index 82% rename from src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java index 62137177c..6a2ee017e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionProgram.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java @@ -1,7 +1,7 @@ -package com.simibubi.create.foundation.render.contraption; +package com.simibubi.create.content.contraptions.components.structureMovement.render; -import com.simibubi.create.foundation.render.gl.BasicProgram; -import com.simibubi.create.foundation.render.light.GridAlignedBB; +import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java similarity index 95% rename from src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index 4e5b28149..0c7441cbd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -1,14 +1,13 @@ -package com.simibubi.create.foundation.render.contraption; +package com.simibubi.create.content.contraptions.components.structureMovement.render; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.foundation.render.AllProgramSpecs; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ContraptionVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionVertexAttributes.java similarity index 71% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ContraptionVertexAttributes.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionVertexAttributes.java index 8109408ed..6bfbf8af7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ContraptionVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionVertexAttributes.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.render.gl.attrib.impl; +package com.simibubi.create.content.contraptions.components.structureMovement.render; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; +import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; public enum ContraptionVertexAttributes implements IVertexAttrib { VERTEX_POSITION("aPos", CommonAttributes.VEC3), diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java similarity index 93% rename from src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index 93c174ff6..bc0f33e48 100644 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -1,13 +1,14 @@ -package com.simibubi.create.foundation.render.contraption; +package com.simibubi.create.content.contraptions.components.structureMovement.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; +import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.instancing.*; -import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; -import com.simibubi.create.foundation.render.light.ContraptionLighter; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -67,7 +68,7 @@ public class RenderedContraption { return lighter; } - public RenderMaterial> getActorMaterial() { + public RenderMaterial> getActorMaterial() { return kinetics.getMaterial(KineticRenderMaterials.ACTORS); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index 6c2a88a70..a8e7f6c61 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.contraptions.fluids; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.content.contraptions.base.RotatingData; import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index 5b4bc7f8f..b2a1ca26d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java similarity index 75% rename from src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java rename to src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java index 6e63fc8fb..02fa03770 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java @@ -1,18 +1,13 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.content.contraptions.relays.belt; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.render.gl.GlPrimitiveType; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.gl.attrib.impl.BeltVertexAttributes; -import com.simibubi.create.foundation.render.gl.attrib.impl.KineticVertexAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.content.contraptions.base.KineticVertexAttributes; +import com.simibubi.create.content.contraptions.base.KineticData; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import java.nio.ByteBuffer; -import static com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec.*; - public class BeltData extends KineticData { public static VertexFormat FORMAT = VertexFormat.builder() .addAttributes(KineticVertexAttributes.class) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 145e44920..654847972 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -4,9 +4,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileInstance; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java new file mode 100644 index 000000000..b2e805d25 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.contraptions.relays.belt; + +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import net.minecraft.client.renderer.BufferBuilder; + +public class BeltInstancedModel extends InstancedModel { + public BeltInstancedModel(BufferBuilder buf) { + super(buf); + } + + @Override + protected BeltData newInstance() { + return new BeltData(); + } + + @Override + protected VertexFormat getInstanceFormat() { + return BeltData.FORMAT; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 9bd63b022..9c3311b0f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -9,7 +9,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.ShadowRenderHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/BeltVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java similarity index 70% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/BeltVertexAttributes.java rename to src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java index e8c8ab9cd..ca2125848 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/BeltVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java @@ -1,9 +1,8 @@ -package com.simibubi.create.foundation.render.gl.attrib.impl; +package com.simibubi.create.content.contraptions.relays.belt; -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; -import com.simibubi.create.foundation.render.instancing.BeltData; +import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; public enum BeltVertexAttributes implements IVertexAttrib { INSTANCE_ROTATION("aInstanceRot", CommonAttributes.VEC3), diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java index bb45e1c85..bebfb5763 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.relays.encased; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index dce5bac1c..860d267ba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -3,11 +3,11 @@ package com.simibubi.create.content.contraptions.relays.encased; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceKey; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index a4ccdffc4..2620aa018 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -17,7 +17,6 @@ import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; -import sun.nio.cs.FastCharsetProvider; public class SplitShaftRenderer extends KineticTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index 2644bf25c..36e2a7b79 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -2,11 +2,11 @@ package com.simibubi.create.content.contraptions.relays.gearbox; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstanceKey; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index d97110116..c0f3599c9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.render.SuperByteBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index a34cff992..53a8853d5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.instancing.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.content.contraptions.base.RotatingData; import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java index 504940a03..afbefca53 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java @@ -1,15 +1,9 @@ package com.simibubi.create.content.schematics.client; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.contraption.ContraptionKineticRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; -import net.minecraftforge.client.ForgeHooksClient; -import net.minecraftforge.client.MinecraftForgeClient; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.loading.FMLClientLaunchProvider; public class SchematicRendererWithInstancing extends SchematicRenderer { public final ContraptionKineticRenderer tiles; diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 229f4431e..580cedf9e 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -24,9 +24,9 @@ import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.RenderWork; -import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java index 945166a97..75f97dcce 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -3,8 +3,7 @@ package com.simibubi.create.foundation.command; import java.util.function.Consumer; import java.util.function.Supplier; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import org.apache.logging.log4j.LogManager; import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index e1043bca0..a7a0cb259 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.config; -import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.backend.Backend; public class CClient extends ConfigBase { diff --git a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java index 2bdc39f96..ba76ddb6d 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.mixin; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.api.distmarker.Dist; @@ -11,7 +11,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.ArrayList; import java.util.List; @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java index 38e2053d2..779c8e6d0 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.mixin; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.util.math.SectionPos; import net.minecraft.world.LightType; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java index 9c57a7551..1e9e13139 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java @@ -1,7 +1,6 @@ package com.simibubi.create.foundation.mixin; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.render.FastRenderDispatcher; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index 9073923dc..a52cbe181 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.mixin; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java index e65a9774c..c82406e20 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.mixin; -import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; +import com.simibubi.create.foundation.render.backend.OptifineHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.VideoSettingsScreen; diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index 0ba20c5f1..f447a156f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -1,14 +1,19 @@ package com.simibubi.create.foundation.render; import com.simibubi.create.Create; -import com.simibubi.create.foundation.render.contraption.ContraptionProgram; -import com.simibubi.create.foundation.render.gl.BasicProgram; -import com.simibubi.create.foundation.render.gl.attrib.impl.*; -import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; -import com.simibubi.create.foundation.render.gl.shader.ShaderConstants; +import com.simibubi.create.content.contraptions.base.KineticVertexAttributes; +import com.simibubi.create.content.contraptions.base.RotatingVertexAttributes; +import com.simibubi.create.content.contraptions.components.actors.ActorVertexAttributes; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionVertexAttributes; +import com.simibubi.create.content.contraptions.relays.belt.BeltVertexAttributes; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionProgram; +import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import com.simibubi.create.foundation.render.backend.gl.attrib.ModelVertexAttributes; +import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; +import com.simibubi.create.foundation.render.backend.gl.shader.ShaderConstants; import net.minecraft.util.ResourceLocation; -import static com.simibubi.create.foundation.render.gl.backend.Backend.register; +import static com.simibubi.create.foundation.render.backend.Backend.register; public class AllProgramSpecs { public static final ProgramSpec ROTATING = register(ProgramSpec.builder("rotating", BasicProgram::new) diff --git a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java index 1cbfac59f..2e75eeeca 100644 --- a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java @@ -1,12 +1,15 @@ package com.simibubi.create.foundation.render; -import com.simibubi.create.foundation.render.gl.BasicProgram; -import com.simibubi.create.foundation.render.instancing.*; +import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; +import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; +import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; +import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import com.simibubi.create.foundation.render.backend.instancing.*; public class KineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllProgramSpecs.BELT, BeltModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllProgramSpecs.ROTATING, RotatingModel::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllProgramSpecs.BELT, BeltInstancedModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllProgramSpecs.ROTATING, RotatingInstancedModel::new)); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java index 3b31227b3..d16702d08 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java @@ -1,11 +1,7 @@ package com.simibubi.create.foundation.render; import com.mojang.datafixers.util.Pair; -import com.simibubi.create.foundation.render.gl.backend.Backend; -import com.simibubi.create.foundation.render.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.vertex.VertexFormatElement; -import org.lwjgl.opengl.GL15; import java.nio.Buffer; import java.nio.ByteBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java similarity index 92% rename from src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java rename to src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index eb5fed9fb..d60f6dfc2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -1,11 +1,12 @@ -package com.simibubi.create.foundation.render.gl.backend; +package com.simibubi.create.foundation.render.backend; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.gl.shader.GlProgram; -import com.simibubi.create.foundation.render.gl.shader.GlShader; -import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; -import com.simibubi.create.foundation.render.gl.shader.ShaderType; +import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; +import com.simibubi.create.foundation.render.backend.gl.shader.GlShader; +import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; +import com.simibubi.create.foundation.render.backend.gl.shader.ShaderType; +import com.simibubi.create.foundation.render.backend.gl.versioned.GlVersioned; +import com.simibubi.create.foundation.render.backend.gl.versioned.MapBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.resources.IReloadableResourceManager; @@ -16,6 +17,7 @@ import net.minecraftforge.resource.ISelectiveResourceReloadListener; import net.minecraftforge.resource.VanillaResourceType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.lwjgl.opengl.ARBVertexProgram; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GLCapabilities; import org.lwjgl.system.MemoryUtil; @@ -54,10 +56,6 @@ public class Backend { mapBuffer.mapBuffer(target, offset, length, upload); } - public static void mapBuffer(int target, int size, Consumer upload) { - mapBuffer.mapBuffer(target, 0, size, upload); - } - /** * Register a shader program. TODO: replace with forge registry? */ diff --git a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java similarity index 84% rename from src/main/java/com/simibubi/create/foundation/render/BufferedModel.java rename to src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java index c5bfe5509..2e8c90e72 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java @@ -1,9 +1,10 @@ -package com.simibubi.create.foundation.render; +package com.simibubi.create.foundation.render.backend; -import com.simibubi.create.foundation.render.gl.GlPrimitiveType; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.gl.backend.Backend; -import com.simibubi.create.foundation.render.gl.GlBuffer; +import com.simibubi.create.foundation.render.RenderWork; +import com.simibubi.create.foundation.render.TemplateBuffer; +import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.gl.GlBuffer; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; @@ -38,7 +39,7 @@ public abstract class BufferedModel extends TemplateBuffer { GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); // mirror it in system memory so we can write to it - Backend.mapBuffer(GL15.GL_ARRAY_BUFFER, invariantSize, buffer -> { + modelVBO.map(invariantSize, buffer -> { for (int i = 0; i < vertexCount; i++) { copyVertex(buffer, i); } @@ -53,7 +54,7 @@ public abstract class BufferedModel extends TemplateBuffer { ebo.bind(); GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); - Backend.mapBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, indices -> { + ebo.map(indicesSize, indices -> { for (int i = 0; i < vertexCount; i++) { indices.putShort((short) i); } @@ -106,7 +107,7 @@ public abstract class BufferedModel extends TemplateBuffer { GL20.glEnableVertexAttribArray(i); } - getModelFormat().informAttributes(0); + getModelFormat().vertexAttribPointers(0); } public void delete() { diff --git a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java similarity index 94% rename from src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java rename to src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index f763c74b9..3f268de7f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -1,14 +1,15 @@ -package com.simibubi.create.foundation.render; +package com.simibubi.create.foundation.render.backend; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.schematics.SchematicWorld; -import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.gl.backend.Backend; -import com.simibubi.create.foundation.render.gl.backend.OptifineHandler; -import com.simibubi.create.foundation.render.light.ILightListener; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.RenderWork; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.OptifineHandler; +import com.simibubi.create.foundation.render.backend.light.ILightListener; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/OptifineHandler.java b/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java similarity index 97% rename from src/main/java/com/simibubi/create/foundation/render/gl/backend/OptifineHandler.java rename to src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java index 5143ba134..8e35a2016 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/OptifineHandler.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl.backend; +package com.simibubi.create.foundation.render.backend; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/SystemCapability.java b/src/main/java/com/simibubi/create/foundation/render/backend/SystemCapability.java similarity index 84% rename from src/main/java/com/simibubi/create/foundation/render/gl/backend/SystemCapability.java rename to src/main/java/com/simibubi/create/foundation/render/backend/SystemCapability.java index 4dcb5d9a4..9a4678e6f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/SystemCapability.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/SystemCapability.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl.backend; +package com.simibubi.create.foundation.render.backend; public enum SystemCapability { /** diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java similarity index 91% rename from src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java index ebe001bb5..c471945c2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java @@ -1,7 +1,7 @@ -package com.simibubi.create.foundation.render.gl; +package com.simibubi.create.foundation.render.backend.gl; -import com.simibubi.create.foundation.render.gl.backend.Backend; -import com.simibubi.create.foundation.render.gl.shader.GlProgram; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java similarity index 78% rename from src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java index 064862d8b..c94c38828 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java @@ -1,6 +1,6 @@ -package com.simibubi.create.foundation.render.gl; +package com.simibubi.create.foundation.render.backend.gl; -import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.backend.Backend; import org.lwjgl.opengl.GL20; import java.nio.ByteBuffer; @@ -33,6 +33,10 @@ public class GlBuffer extends GlObject { unbind(); } + public void map(int length, Consumer upload) { + Backend.mapBuffer(bufferType, 0, length, upload); + } + public void map(int offset, int length, Consumer upload) { Backend.mapBuffer(bufferType, offset, length, upload); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlFog.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java similarity index 80% rename from src/main/java/com/simibubi/create/foundation/render/gl/GlFog.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java index d13ae540c..29ed4432f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlFog.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl; +package com.simibubi.create.foundation.render.backend.gl; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlObject.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlObject.java similarity index 94% rename from src/main/java/com/simibubi/create/foundation/render/gl/GlObject.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/GlObject.java index 3921657bb..ef34e5ebe 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlObject.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlObject.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl; +package com.simibubi.create.foundation.render.backend.gl; // Utility class for safely dealing with gl object handles. public abstract class GlObject { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java similarity index 93% rename from src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java index 623164c08..5e069fabf 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlPrimitiveType.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl; +package com.simibubi.create.foundation.render.backend.gl; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlTexture.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlTexture.java similarity index 89% rename from src/main/java/com/simibubi/create/foundation/render/gl/GlTexture.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/GlTexture.java index 7c28e99c3..30b5d3f0f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlTexture.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlTexture.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl; +package com.simibubi.create.foundation.render.backend.gl; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java index 8c6320447..2d024c6d2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/GlVertexArray.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl; +package com.simibubi.create.foundation.render.backend.gl; import org.lwjgl.opengl.GL30; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java similarity index 89% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java index b83bb9ad5..d3fd9d48e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/CommonAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java @@ -1,6 +1,6 @@ -package com.simibubi.create.foundation.render.gl.attrib; +package com.simibubi.create.foundation.render.backend.gl.attrib; -import com.simibubi.create.foundation.render.gl.GlPrimitiveType; +import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; public class CommonAttributes { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java similarity index 69% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java index 8996f14ac..5c77620f9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/IVertexAttrib.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl.attrib; +package com.simibubi.create.foundation.render.backend.gl.attrib; public interface IVertexAttrib { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ModelVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/ModelVertexAttributes.java similarity index 72% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ModelVertexAttributes.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/ModelVertexAttributes.java index cd4b70d82..960289fd6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/impl/ModelVertexAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/ModelVertexAttributes.java @@ -1,8 +1,4 @@ -package com.simibubi.create.foundation.render.gl.attrib.impl; - -import com.simibubi.create.foundation.render.gl.attrib.CommonAttributes; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.gl.attrib.VertexAttribSpec; +package com.simibubi.create.foundation.render.backend.gl.attrib; public enum ModelVertexAttributes implements IVertexAttrib { VERTEX_POSITION("aPos", CommonAttributes.VEC3), diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java similarity index 72% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java index 5b50e9971..709508c90 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexAttribSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java @@ -1,6 +1,6 @@ -package com.simibubi.create.foundation.render.gl.attrib; +package com.simibubi.create.foundation.render.backend.gl.attrib; -import com.simibubi.create.foundation.render.gl.GlPrimitiveType; +import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; import org.lwjgl.opengl.GL20; public class VertexAttribSpec { @@ -23,8 +23,8 @@ public class VertexAttribSpec { this.normalized = normalized; } - public void registerForBuffer(int stride, int indexAcc, int offsetAcc) { - GL20.glVertexAttribPointer(indexAcc, count, type.getGlConstant(), normalized, stride, offsetAcc); + public void vertexAttribPointer(int stride, int index, int pointer) { + GL20.glVertexAttribPointer(index, count, type.getGlConstant(), normalized, stride, pointer); } public int getSize() { diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java index 676ec7e13..3929e3354 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/attrib/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl.attrib; +package com.simibubi.create.foundation.render.backend.gl.attrib; import java.util.ArrayList; import java.util.Arrays; @@ -31,11 +31,11 @@ public class VertexFormat { return stride; } - public void informAttributes(int index) { + public void vertexAttribPointers(int index) { int offset = 0; for (IVertexAttrib attrib : this.allAttributes) { VertexAttribSpec spec = attrib.attribSpec(); - spec.registerForBuffer(stride, index, offset); + spec.vertexAttribPointer(stride, index, offset); index += spec.getAttributeCount(); offset += spec.getSize(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GLSLType.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GLSLType.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/render/gl/shader/GLSLType.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GLSLType.java index 4cd2d8d56..80dc2fa16 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GLSLType.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GLSLType.java @@ -1,6 +1,6 @@ -package com.simibubi.create.foundation.render.gl.shader; +package com.simibubi.create.foundation.render.backend.gl.shader; -import com.simibubi.create.foundation.render.gl.GlPrimitiveType; +import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; public class GLSLType { public static final GLSLType FLOAT = new GLSLType("mat4", GlPrimitiveType.FLOAT, 16); diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java similarity index 93% rename from src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java index d766ca730..790bb4c5a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.render.gl.shader; +package com.simibubi.create.foundation.render.backend.gl.shader; -import com.simibubi.create.foundation.render.gl.GlObject; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.GlObject; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.backend.Backend; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java similarity index 87% rename from src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java index 210878419..fa0fa48f2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/GlShader.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java @@ -1,7 +1,7 @@ -package com.simibubi.create.foundation.render.gl.shader; +package com.simibubi.create.foundation.render.backend.gl.shader; -import com.simibubi.create.foundation.render.gl.GlObject; -import com.simibubi.create.foundation.render.gl.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.GlObject; +import com.simibubi.create.foundation.render.backend.Backend; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java similarity index 94% rename from src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java index 894131652..3e98a70df 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ProgramSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java @@ -1,7 +1,7 @@ -package com.simibubi.create.foundation.render.gl.shader; +package com.simibubi.create.foundation.render.backend.gl.shader; import com.simibubi.create.Create; -import com.simibubi.create.foundation.render.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import net.minecraft.util.ResourceLocation; import java.util.ArrayList; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderCallback.java similarity index 84% rename from src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderCallback.java index 793e02e85..b410d91ff 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderCallback.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderCallback.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl.shader; +package com.simibubi.create.foundation.render.backend.gl.shader; /** * A Callback for when a shader is called. Used to define shader uniforms. diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java similarity index 92% rename from src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java index 87986a2e3..3f1ed6c09 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderConstants.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java @@ -1,9 +1,8 @@ -package com.simibubi.create.foundation.render.gl.shader; +package com.simibubi.create.foundation.render.backend.gl.shader; import java.io.BufferedReader; import java.io.StringReader; import java.util.ArrayList; -import java.util.Spliterator; import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderType.java similarity index 78% rename from src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderType.java index ff186f819..b90f15cca 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderType.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderType.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl.shader; +package com.simibubi.create.foundation.render.backend.gl.shader; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderUniforms.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderUniforms.java similarity index 71% rename from src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderUniforms.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderUniforms.java index 8baa6e1c6..8a85d1c24 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/shader/ShaderUniforms.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderUniforms.java @@ -1,6 +1,5 @@ -package com.simibubi.create.foundation.render.gl.shader; +package com.simibubi.create.foundation.render.backend.gl.shader; -import java.util.ArrayList; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java new file mode 100644 index 000000000..a1558446f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java @@ -0,0 +1,9 @@ +package com.simibubi.create.foundation.render.backend.instancing; + +import com.simibubi.create.foundation.render.backend.light.ILightListener; + +public interface IInstanceRendered extends ILightListener { + default boolean shouldRenderAsTE() { + return false; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java similarity index 75% rename from src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java index aceff9855..196e029d8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/IRendererFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java similarity index 93% rename from src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java index d656ba948..f713b04c1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceData.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; import java.nio.ByteBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceKey.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/render/instancing/InstanceKey.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java index 9ba7f1141..166bf8e56 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstanceKey.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; import java.util.function.Consumer; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java similarity index 92% rename from src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index 7311562b9..42c7e2acf 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -1,12 +1,12 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; -import com.simibubi.create.foundation.render.BufferedModel; +import com.simibubi.create.foundation.render.backend.BufferedModel; import com.simibubi.create.foundation.render.RenderMath; -import com.simibubi.create.foundation.render.gl.GlVertexArray; -import com.simibubi.create.foundation.render.gl.GlBuffer; -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.gl.attrib.impl.ModelVertexAttributes; +import com.simibubi.create.foundation.render.backend.gl.GlVertexArray; +import com.simibubi.create.foundation.render.backend.gl.GlBuffer; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.gl.attrib.ModelVertexAttributes; import net.minecraft.client.renderer.BufferBuilder; import org.lwjgl.opengl.*; @@ -151,7 +151,7 @@ public abstract class InstancedModel extends BufferedMod glInstanceCount = newInstanceCount; int staticAttributes = getModelFormat().getShaderAttributeCount(); - instanceFormat.informAttributes(staticAttributes); + instanceFormat.vertexAttribPointers(staticAttributes); for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { GL33.glVertexAttribDivisor(i + staticAttributes, 1); diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java similarity index 93% rename from src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java index a454828f6..fd731a8e2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; import com.google.common.collect.Maps; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java similarity index 91% rename from src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index a5e84af0c..4e9bd2fee 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -1,14 +1,13 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; -import com.simibubi.create.foundation.render.FastRenderDispatcher; -import com.simibubi.create.foundation.render.gl.BasicProgram; -import com.simibubi.create.foundation.render.gl.backend.Backend; -import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.tileentity.TileEntity; -import org.lwjgl.opengl.GL20; import javax.annotation.Nullable; import java.util.HashMap; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/MaterialType.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/MaterialType.java new file mode 100644 index 000000000..48ade4b2a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/MaterialType.java @@ -0,0 +1,3 @@ +package com.simibubi.create.foundation.render.backend.instancing; + +public class MaterialType { } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java similarity index 72% rename from src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java index 3024abcf5..bc358f799 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/ModelFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; import net.minecraft.client.renderer.BufferBuilder; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java similarity index 92% rename from src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java index d20e61d4e..64e5eac46 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -6,12 +6,12 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.Compartment; -import com.simibubi.create.foundation.render.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.render.gl.BasicProgram; -import com.simibubi.create.foundation.render.gl.backend.Backend; -import com.simibubi.create.foundation.render.gl.shader.ProgramSpec; -import com.simibubi.create.foundation.render.gl.shader.ShaderCallback; +import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; +import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java similarity index 94% rename from src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java index b4e9db47c..a2c4ca8fb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.instancing; +package com.simibubi.create.foundation.render.backend.instancing; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/simibubi/create/foundation/render/light/CoordinateConsumer.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/CoordinateConsumer.java similarity index 62% rename from src/main/java/com/simibubi/create/foundation/render/light/CoordinateConsumer.java rename to src/main/java/com/simibubi/create/foundation/render/backend/light/CoordinateConsumer.java index ff9ee492b..4011c19e0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/CoordinateConsumer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/CoordinateConsumer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.light; +package com.simibubi.create.foundation.render.backend.light; @FunctionalInterface public interface CoordinateConsumer { diff --git a/src/main/java/com/simibubi/create/foundation/render/light/EmptyLighter.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/EmptyLighter.java similarity index 73% rename from src/main/java/com/simibubi/create/foundation/render/light/EmptyLighter.java rename to src/main/java/com/simibubi/create/foundation/render/backend/light/EmptyLighter.java index e942664c7..b58653899 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/EmptyLighter.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/EmptyLighter.java @@ -1,6 +1,7 @@ -package com.simibubi.create.foundation.render.light; +package com.simibubi.create.foundation.render.backend.light; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; // so other contraptions don't crash before they have a lighter public class EmptyLighter extends ContraptionLighter { diff --git a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java rename to src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java index fd54986f4..e9bf8b6ee 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java @@ -1,11 +1,9 @@ -package com.simibubi.create.foundation.render.light; +package com.simibubi.create.foundation.render.backend.light; import com.simibubi.create.foundation.render.RenderMath; -import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.SectionPos; -import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2; diff --git a/src/main/java/com/simibubi/create/foundation/render/light/ILightListener.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/ILightListener.java similarity index 52% rename from src/main/java/com/simibubi/create/foundation/render/light/ILightListener.java rename to src/main/java/com/simibubi/create/foundation/render/backend/light/ILightListener.java index 8b4a571f0..5fd2ff8bd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/ILightListener.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/ILightListener.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.light; +package com.simibubi.create.foundation.render.backend.light; public interface ILightListener { void onChunkLightUpdate(); diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java rename to src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java index 4109f49e6..8dd0bc5ab 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java @@ -1,7 +1,7 @@ -package com.simibubi.create.foundation.render.light; +package com.simibubi.create.foundation.render.backend.light; import com.simibubi.create.foundation.render.RenderWork; -import com.simibubi.create.foundation.render.gl.GlTexture; +import com.simibubi.create.foundation.render.backend.gl.GlTexture; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; diff --git a/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java rename to src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java index 651d0c5eb..63395a69a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/light/LightVolumeDebugger.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java @@ -1,7 +1,7 @@ -package com.simibubi.create.foundation.render.light; +package com.simibubi.create.foundation.render.backend.light; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.outliner.AABBOutline; diff --git a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java deleted file mode 100644 index 6569046e5..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/contraption/ContraptionKineticRenderer.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.simibubi.create.foundation.render.contraption; - -import com.simibubi.create.foundation.render.AllProgramSpecs; -import com.simibubi.create.foundation.render.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.instancing.BeltModel; -import com.simibubi.create.foundation.render.instancing.KineticRenderMaterials; -import com.simibubi.create.foundation.render.instancing.RenderMaterial; -import com.simibubi.create.foundation.render.instancing.RotatingModel; -import com.simibubi.create.foundation.render.instancing.actors.RotatingActorModel; - -public class ContraptionKineticRenderer extends InstancedTileRenderer { - - @Override - public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_BELT, BeltModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_ROTATING, RotatingModel::new)); - materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_ACTOR, RotatingActorModel::new)); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/SamplerBinding.java b/src/main/java/com/simibubi/create/foundation/render/gl/SamplerBinding.java deleted file mode 100644 index 70eddad0b..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/SamplerBinding.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.simibubi.create.foundation.render.gl; - -public class SamplerBinding { - - private final SamplerType type; - private final String variableName; - private final int binding; - - public SamplerBinding(SamplerType type, String variableName, int binding) { - this.type = type; - this.variableName = variableName; - this.binding = binding; - } - - public SamplerType getType() { - return type; - } - - public String getVariableName() { - return variableName; - } - - public int getBinding() { - return binding; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/SamplerType.java b/src/main/java/com/simibubi/create/foundation/render/gl/SamplerType.java deleted file mode 100644 index cb57c5a28..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/gl/SamplerType.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.simibubi.create.foundation.render.gl; - -import org.lwjgl.opengl.GL20; - -public enum SamplerType { - SAMPLER2D(GL20.GL_TEXTURE_2D, "sampler2D"), - SAMPLER3D(GL20.GL_TEXTURE_3D, "sampler3D"), - ; - - private final int glEnum; - private final String shaderToken; - - SamplerType(int glEnum, String shaderToken) { - this.glEnum = glEnum; - this.shaderToken = shaderToken; - } - - public int getGlEnum() { - return glEnum; - } - - public String getShaderToken() { - return shaderToken; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java deleted file mode 100644 index 19430743d..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/BeltModel.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import net.minecraft.client.renderer.BufferBuilder; - -public class BeltModel extends InstancedModel { - public BeltModel(BufferBuilder buf) { - super(buf); - } - - @Override - protected BeltData newInstance() { - return new BeltData(); - } - - @Override - protected VertexFormat getInstanceFormat() { - return BeltData.FORMAT; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java deleted file mode 100644 index f83e47001..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/IInstanceRendered.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -import com.simibubi.create.foundation.render.light.ILightListener; - -public interface IInstanceRendered extends ILightListener { - default boolean shouldRenderAsTE() { - return false; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java b/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java deleted file mode 100644 index 37ac5b379..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/KineticRenderMaterials.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData; - -public class KineticRenderMaterials { - public static final MaterialType> ROTATING = new MaterialType<>(); - public static final MaterialType> BELTS = new MaterialType<>(); - - public static final MaterialType> ACTORS = new MaterialType<>(); -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/MaterialType.java b/src/main/java/com/simibubi/create/foundation/render/instancing/MaterialType.java deleted file mode 100644 index d3ef03f94..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/MaterialType.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -public class MaterialType { } diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java deleted file mode 100644 index 8c1d2de81..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/RotatingModel.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.simibubi.create.foundation.render.instancing; - -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import net.minecraft.client.renderer.BufferBuilder; - -public class RotatingModel extends InstancedModel { - public RotatingModel(BufferBuilder buf) { - super(buf); - } - - @Override - protected RotatingData newInstance() { - return new RotatingData(); - } - - @Override - protected VertexFormat getInstanceFormat() { - return RotatingData.FORMAT; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java b/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java deleted file mode 100644 index 56dc282f6..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/instancing/actors/RotatingActorModel.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.simibubi.create.foundation.render.instancing.actors; - -import com.simibubi.create.foundation.render.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.instancing.InstancedModel; -import net.minecraft.client.renderer.BufferBuilder; - -public class RotatingActorModel extends InstancedModel { - public RotatingActorModel(BufferBuilder buf) { - super(buf); - } - - @Override - protected VertexFormat getInstanceFormat() { - return StaticRotatingActorData.FORMAT; - } - - @Override - protected StaticRotatingActorData newInstance() { - return new StaticRotatingActorData(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java index affececcf..e7f740ebe 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java @@ -5,18 +5,12 @@ import java.util.HashMap; import java.util.HashSet; import java.util.function.Predicate; -import com.simibubi.create.foundation.render.light.GridAlignedBB; -import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.SectionPos; -import net.minecraft.world.LightType; import net.minecraft.world.World; -import net.minecraft.world.chunk.NibbleArray; import net.minecraft.world.lighting.WorldLightManager; public class PlacementSimulationWorld extends WrappedWorld { From a8053ce4727f2354f4b20b44eca1eb1d4896a2b9 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 11 Feb 2021 23:41:52 -0800 Subject: [PATCH 096/147] these are somewhere else too --- .../{gl/backend => backend/gl/versioned}/GlVersioned.java | 2 +- .../render/{gl/backend => backend/gl/versioned}/MapBuffer.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) rename src/main/java/com/simibubi/create/foundation/render/{gl/backend => backend/gl/versioned}/GlVersioned.java (63%) rename src/main/java/com/simibubi/create/foundation/render/{gl/backend => backend/gl/versioned}/MapBuffer.java (96%) diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/GlVersioned.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java similarity index 63% rename from src/main/java/com/simibubi/create/foundation/render/gl/backend/GlVersioned.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java index 5f69d0ee0..53d929ea0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/GlVersioned.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render.gl.backend; +package com.simibubi.create.foundation.render.backend.gl.versioned; import org.lwjgl.opengl.GLCapabilities; diff --git a/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java similarity index 96% rename from src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java index 17b83785e..f1249223a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/gl/backend/MapBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java @@ -1,9 +1,8 @@ -package com.simibubi.create.foundation.render.gl.backend; +package com.simibubi.create.foundation.render.backend.gl.versioned; import org.lwjgl.opengl.*; import java.nio.ByteBuffer; -import java.util.Arrays; import java.util.function.Consumer; public enum MapBuffer implements GlVersioned { From d824304f12eb81ee45fe922a4232426f69ea29e3 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Feb 2021 00:13:39 -0800 Subject: [PATCH 097/147] tile entities on contraptions account for self lighting --- .../ContraptionRenderer.java | 3 +- .../render/ContraptionRenderDispatcher.java | 9 ++++++ .../render/RenderedContraption.java | 1 + .../render/TileEntityRenderHelper.java | 30 +++++++++++++++---- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index af13ab7b1..f8b0c8843 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import java.util.List; import java.util.Random; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.*; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import org.apache.commons.lang3.tuple.Pair; @@ -75,7 +76,7 @@ public class ContraptionRenderer { protected static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { if (FastRenderDispatcher.available()) { - TileEntityRenderHelper.renderTileEntities(world, c.specialRenderedTileEntities, ms, msLocal, buffer); + ContraptionRenderDispatcher.renderTileEntities(world, c, ms, msLocal, buffer); } else { TileEntityRenderHelper.renderTileEntities(world, c.maybeInstancedTileEntities, ms, msLocal, buffer); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index 0c7441cbd..c82a818bd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -6,10 +6,12 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderer; @@ -61,6 +63,13 @@ public class ContraptionRenderDispatcher { } } + public static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + RenderedContraption renderer = getRenderer(world, c); + + TileEntityRenderHelper.renderTileEntities(world, renderer.renderWorld, c.specialRenderedTileEntities, ms, msLocal, buffer); + } + private static void updateTransform(C c, AbstractContraptionEntityRenderer entityRenderer) { MatrixStack stack = entityRenderer.makeTransformMatrix(c, AnimationTickHolder.getPartialTicks()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index bc0f33e48..a45f5a75e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -130,6 +130,7 @@ public class RenderedContraption { } void setup(ContraptionProgram shader) { + if (model == null) return; shader.bind(model, lighter.lightVolume.getTextureVolume()); lighter.lightVolume.use(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index 641cfadd0..7cb280de4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -5,16 +5,16 @@ import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.Vector4f; -import net.minecraft.client.renderer.WorldRenderer; +import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; import net.minecraft.world.World; +import net.minecraftforge.client.model.pipeline.LightUtil; import java.util.Iterator; @@ -22,6 +22,12 @@ public class TileEntityRenderHelper { public static void renderTileEntities(World world, Iterable customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer) { + + renderTileEntities(world, null, customRenderTEs, ms, localTransform, buffer); + } + + public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld, Iterable customRenderTEs, MatrixStack ms, + MatrixStack localTransform, IRenderTypeBuffer buffer) { float pt = AnimationTickHolder.getPartialTicks(); Matrix4f matrix = localTransform.peek() .getModel(); @@ -45,8 +51,20 @@ public class TileEntityRenderHelper { Vector4f vec = new Vector4f(pos.getX() + .5f, pos.getY() + .5f, pos.getZ() + .5f, 1); vec.transform(matrix); BlockPos lightPos = new BlockPos(vec.getX(), vec.getY(), vec.getZ()); - renderer.render(tileEntity, pt, ms, buffer, WorldRenderer.getLightmapCoordinates(world, lightPos), - OverlayTexture.DEFAULT_UV); + int worldLight = WorldRenderer.getLightmapCoordinates(world, lightPos); + + if (renderWorld != null) { + int contraptionBlockLight = renderWorld.getLightLevel(LightType.BLOCK, pos); + + int worldBlockLight = LightTexture.getBlockLightCoordinates(worldLight); + + if (contraptionBlockLight > worldBlockLight) { + worldLight = (worldLight & 0xFFFF0000) | (contraptionBlockLight << 4); + } + } + + renderer.render(tileEntity, pt, ms, buffer, worldLight, + OverlayTexture.DEFAULT_UV); ms.pop(); } catch (Exception e) { From a5f3d799d1ef9d750b1e0a31bf13b86b77d80525 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Feb 2021 16:36:20 -0800 Subject: [PATCH 098/147] kinda separate system capability stuff, should probably clean this up more. fix lighting glitches on world load. --- .../AbstractContraptionEntityRenderer.java | 8 ++- .../ContraptionRenderer.java | 3 +- .../render/ContraptionRenderDispatcher.java | 25 ++++---- .../render/RenderedContraption.java | 7 ++- .../command/ConfigureConfigPacket.java | 5 +- .../create/foundation/config/CClient.java | 27 +-------- .../foundation/mixin/LightUpdateMixin.java | 26 +++++++- .../foundation/mixin/RenderInLayerMixin.java | 23 ++++++- .../foundation/render/backend/Backend.java | 35 +++++------ .../render/backend/FastRenderDispatcher.java | 60 +++++++++---------- .../render/backend/SystemCapability.java | 19 ------ .../instancing/InstancedTileRenderer.java | 10 +--- 12 files changed, 123 insertions(+), 125 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/SystemCapability.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index cbb614bbb..be02832b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -56,11 +57,12 @@ public abstract class AbstractContraptionEntityRenderer renderers = new HashMap<>(); - public static void markForRendering(Contraption c, MatrixStack model) { - getRenderer(c.entity.world, c).setRenderSettings(model.peek().getModel()); - } - public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) { for (RenderedContraption renderer : renderers.values()) { renderer.getLighter().lightVolume.notifyLightUpdate(world, type, pos); @@ -73,7 +69,8 @@ public class ContraptionRenderDispatcher { private static void updateTransform(C c, AbstractContraptionEntityRenderer entityRenderer) { MatrixStack stack = entityRenderer.makeTransformMatrix(c, AnimationTickHolder.getPartialTicks()); - markForRendering(c.getContraption(), stack); + Contraption c1 = c.getContraption(); + getRenderer(c1.entity.world, c1).setRenderSettings(stack.peek().getModel()); } public static void tick() { @@ -104,15 +101,19 @@ public class ContraptionRenderDispatcher { GL11.glEnable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 - ContraptionProgram structureShader = Backend.getProgram(AllProgramSpecs.CONTRAPTION_STRUCTURE); - structureShader.bind(viewProjection, camX, camY, camZ, FastRenderDispatcher.getDebugMode()); - for (RenderedContraption renderer : renderers.values()) { - renderer.doRenderLayer(layer, structureShader); + if (Backend.canUseVBOs()) { + ContraptionProgram structureShader = Backend.getProgram(AllProgramSpecs.CONTRAPTION_STRUCTURE); + structureShader.bind(viewProjection, camX, camY, camZ, FastRenderDispatcher.getDebugMode()); + for (RenderedContraption renderer : renderers.values()) { + renderer.doRenderLayer(layer, structureShader); + } } - for (RenderedContraption renderer : renderers.values()) { - renderer.kinetics.render(layer, viewProjection, camX, camY, camZ, renderer::setup); - renderer.teardown(); + if (Backend.canUseInstancing()) { + for (RenderedContraption renderer : renderers.values()) { + renderer.kinetics.render(layer, viewProjection, camX, camY, camZ, renderer::setup); + renderer.teardown(); + } } layer.endDrawing(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index a45f5a75e..1d8108e4e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; @@ -52,8 +53,10 @@ public class RenderedContraption { this.renderWorld = setupRenderWorld(world, contraption); buildLayers(); - buildInstancedTiles(); - buildActors(); + if (Backend.canUseInstancing()) { + buildInstancedTiles(); + buildActors(); + } } public int getEntityId() { diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java index 75f97dcce..b6fa8ca1a 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -84,8 +84,9 @@ public class ConfigureConfigPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) private static void experimentalRendering(String value) { - boolean last = AllConfigs.CLIENT.experimentalRendering.get(); - AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value)); + if (!"".equals(value)) { + AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value)); + } FastRenderDispatcher.refresh(); } diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index a7a0cb259..c4b2d7a1f 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -15,8 +15,8 @@ public class CClient extends ConfigBase { public ConfigBool rainbowDebug = b(true, "enableRainbowDebug", "Show colourful debug information while the F3-Menu is open."); - public ConfigRender experimentalRendering = - new ConfigRender("experimentalRendering", true, "Use modern OpenGL features to drastically increase performance."); + public ConfigBool experimentalRendering = + b(true, "experimentalRendering", "Use modern OpenGL features to drastically increase performance."); public ConfigInt overlayOffsetX = i(20, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX", "Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay"); public ConfigInt overlayOffsetY = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetY", "Offset the overlay from goggle- and hover- information by this many pixels on the Y axis; Use /create overlay"); @@ -25,27 +25,4 @@ public class CClient extends ConfigBase { public String getName() { return "client"; } - - public class ConfigRender extends ConfigBool { - - public ConfigRender(String name, boolean def, String... comment) { - super(name, def, comment); - } - - /** - * Gets the configured value and checks if the rendering is actually supported. - * @return True if fast rendering is enabled and the current system/configuration is capable. - */ - @Override - public Boolean get() { - return super.get() && Backend.canUse(); - } - - @Override - public void set(Boolean value) { - super.set(value); - Backend.enabled = get(); - } - } - } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java index 779c8e6d0..efc086daa 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java @@ -1,10 +1,13 @@ package com.simibubi.create.foundation.mixin; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.backend.light.ILightListener; import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.util.math.SectionPos; +import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; import net.minecraft.world.chunk.AbstractChunkProvider; +import net.minecraft.world.chunk.Chunk; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.spongepowered.asm.mixin.Mixin; @@ -12,6 +15,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Map; + @OnlyIn(Dist.CLIENT) @Mixin(ClientChunkProvider.class) public abstract class LightUpdateMixin extends AbstractChunkProvider { @@ -24,6 +29,23 @@ public abstract class LightUpdateMixin extends AbstractChunkProvider { */ @Inject(at = @At("HEAD"), method = "markLightChanged") private void onLightUpdate(LightType type, SectionPos pos, CallbackInfo ci) { - FastRenderDispatcher.notifyLightUpdate(((ClientChunkProvider) (Object) this), type, pos); + ClientChunkProvider thi = ((ClientChunkProvider) (Object) this); + + Chunk chunk = thi.getChunk(pos.getSectionX(), pos.getSectionZ(), false); + + int sectionY = pos.getSectionY(); + + if (chunk != null) { + chunk.getTileEntityMap() + .entrySet() + .stream() + .filter(entry -> SectionPos.toChunk(entry.getKey().getY()) == sectionY) + .map(Map.Entry::getValue) + .filter(tile -> tile instanceof ILightListener) + .map(tile -> (ILightListener) tile) + .forEach(ILightListener::onChunkLightUpdate); + } + + ContraptionRenderDispatcher.notifyLightUpdate((ILightReader) thi.getWorld(), type, pos); } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java index a52cbe181..d0fcb46ba 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java @@ -1,11 +1,16 @@ package com.simibubi.create.foundation.mixin; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.OptifineHandler; +import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.lwjgl.opengl.GL20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -21,7 +26,21 @@ public class RenderInLayerMixin { * This should probably be a forge event. */ @Inject(at = @At(value = "TAIL"), method = "renderLayer") - private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { - FastRenderDispatcher.renderLayer(type, stack, (float) cameraX, (float) cameraY, (float) cameraZ); + private void renderLayer(RenderType type, MatrixStack stack, double camX, double camY, double camZ, CallbackInfo ci) { + if (!Backend.available()) return; + + float cameraX = (float) camX; + float cameraY = (float) camY; + float cameraZ = (float) camZ; + + Matrix4f viewProjection = Matrix4f.translate(-cameraX, -cameraY, -cameraZ); + viewProjection.multiplyBackward(stack.peek().getModel()); + viewProjection.multiplyBackward(FastRenderDispatcher.getProjectionMatrix()); + + FastRenderDispatcher.renderLayer(type, viewProjection, cameraX, cameraY, cameraZ); + + ContraptionRenderDispatcher.renderLayer(type, viewProjection, cameraX, cameraY, cameraZ); + + GL20.glUseProgram(0); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index d60f6dfc2..597b22279 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -17,7 +17,6 @@ import net.minecraftforge.resource.ISelectiveResourceReloadListener; import net.minecraftforge.resource.VanillaResourceType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.lwjgl.opengl.ARBVertexProgram; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GLCapabilities; import org.lwjgl.system.MemoryUtil; @@ -42,10 +41,9 @@ public class Backend { private static final Map> registry = new HashMap<>(); private static final Map, GlProgram> programs = new HashMap<>(); - public static boolean enabled; + private static boolean enabled; public static GLCapabilities capabilities; - private static SystemCapability capability; private static MapBuffer mapBuffer; public Backend() { @@ -102,16 +100,24 @@ public class Backend { return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().orElse(last); } - public static boolean canUse() { - return isCapable() && !OptifineHandler.usingShaders(); + public static boolean canUseInstancing() { + return enabled && gl33(); } - public static SystemCapability getCapability() { - return capability; + public static boolean canUseVBOs() { + return enabled && gl20(); } - public static boolean isCapable() { - return capability.isCapable(); + public static boolean available() { + return enabled && gl20(); + } + + public static boolean gl33() { + return capabilities.OpenGL33; + } + + public static boolean gl20() { + return capabilities.OpenGL20; } public static void init() { @@ -132,9 +138,10 @@ public class Backend { capabilities = GL.createCapabilities(); mapBuffer = getLatest(MapBuffer.class); + OptifineHandler.refresh(); refresh(); - if (isCapable()) { + if (gl20()) { programs.values().forEach(GlProgram::delete); programs.clear(); @@ -146,13 +153,7 @@ public class Backend { } public static void refresh() { - if (capabilities.OpenGL33) { - capability = SystemCapability.CAPABLE; - } else { - capability = SystemCapability.INCAPABLE; - } - - enabled = AllConfigs.CLIENT.experimentalRendering.get(); + enabled = AllConfigs.CLIENT.experimentalRendering.get() && !OptifineHandler.usingShaders(); } private static

> void loadProgram(IResourceManager manager, S programSpec) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index 3f268de7f..883ee29bd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -30,6 +30,7 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL20; +import org.lwjgl.system.CallbackI; import javax.annotation.Nullable; import java.util.ArrayList; @@ -40,7 +41,7 @@ import java.util.function.Consumer; public class FastRenderDispatcher { public static WorldAttached> queuedUpdates = new WorldAttached<>(ConcurrentHashMap::newKeySet); - public static WorldAttached> addedLastTick = new WorldAttached<>(ConcurrentHashMap::newKeySet); + public static WorldAttached> addedLastTick = new WorldAttached<>(ConcurrentHashMap::new); private static Matrix4f projectionMatrixThisFrame = null; @@ -55,18 +56,36 @@ public class FastRenderDispatcher { public static void tick() { ClientWorld world = Minecraft.getInstance().world; - runQueue(addedLastTick.get(world), CreateClient.kineticRenderer::onLightUpdate); - CreateClient.kineticRenderer.clean(); + // Clean up twice a second. This doesn't have to happen every tick, + // but this does need to be run to ensure we don't miss anything. + int ticks = AnimationTickHolder.getTicks(); + + ConcurrentHashMap map = addedLastTick.get(world); + map + .entrySet() + .stream() + .filter(it -> ticks - it.getValue() > 10) + .map(Map.Entry::getKey) + .forEach(te -> { + map.remove(te); + + CreateClient.kineticRenderer.onLightUpdate(te); + }); + + + if (ticks % 10 == 0) { + CreateClient.kineticRenderer.clean(); + } runQueue(queuedUpdates.get(world), CreateClient.kineticRenderer::update); } public static boolean available() { - return Backend.enabled; + return Backend.canUseInstancing(); } public static boolean available(World world) { - return Backend.enabled && !(world instanceof SchematicWorld); + return Backend.canUseInstancing() && !(world instanceof SchematicWorld); } public static int getDebugMode() { @@ -77,6 +96,7 @@ public class FastRenderDispatcher { RenderWork.enqueue(() -> { CreateClient.kineticRenderer.invalidate(); OptifineHandler.refresh(); + Backend.refresh(); Minecraft.getInstance().worldRenderer.loadRenderers(); ClientWorld world = Minecraft.getInstance().world; if (world != null) world.loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); @@ -97,12 +117,8 @@ public class FastRenderDispatcher { } } - public static void renderLayer(RenderType layer, MatrixStack stack, float cameraX, float cameraY, float cameraZ) { - if (!available()) return; - - Matrix4f viewProjection = Matrix4f.translate(-cameraX, -cameraY, -cameraZ); - viewProjection.multiplyBackward(stack.peek().getModel()); - viewProjection.multiplyBackward(getProjectionMatrix()); + public static void renderLayer(RenderType layer, Matrix4f viewProjection, float cameraX, float cameraY, float cameraZ) { + if (!Backend.canUseInstancing()) return; layer.startDrawing(); @@ -113,31 +129,9 @@ public class FastRenderDispatcher { RenderSystem.disableCull(); //RenderSystem.disableDepthTest(); - ContraptionRenderDispatcher.renderLayer(layer, viewProjection, cameraX, cameraY, cameraZ); - if (!OptifineHandler.usingShaders()) - GL20.glUseProgram(0); layer.endDrawing(); } - public static void notifyLightUpdate(ClientChunkProvider world, LightType type, SectionPos pos) { - ContraptionRenderDispatcher.notifyLightUpdate((ILightReader) world.getWorld(), type, pos); - - Chunk chunk = world.getChunk(pos.getSectionX(), pos.getSectionZ(), false); - - int sectionY = pos.getSectionY(); - - if (chunk != null) { - chunk.getTileEntityMap() - .entrySet() - .stream() - .filter(entry -> SectionPos.toChunk(entry.getKey().getY()) == sectionY) - .map(Map.Entry::getValue) - .filter(tile -> tile instanceof ILightListener) - .map(tile -> (ILightListener) tile) - .forEach(ILightListener::onChunkLightUpdate); - } - } - // copied from GameRenderer.renderWorld public static Matrix4f getProjectionMatrix() { if (projectionMatrixThisFrame != null) return projectionMatrixThisFrame; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/SystemCapability.java b/src/main/java/com/simibubi/create/foundation/render/backend/SystemCapability.java deleted file mode 100644 index 9a4678e6f..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/backend/SystemCapability.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.simibubi.create.foundation.render.backend; - -public enum SystemCapability { - /** - * The current system does not support enough - * OpenGL features to enable fast rendering. - */ - INCAPABLE, - - /** - * The current system supports OpenGL 3.3. - */ - CAPABLE, - ; - - public boolean isCapable() { - return this == CAPABLE; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 4e9bd2fee..35507966f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -37,7 +37,7 @@ public abstract class InstancedTileRenderer

{ @SuppressWarnings("unchecked") @Nullable public TileEntityInstance getInstance(T tile, boolean create) { - if (!Backend.enabled) return null; + if (!Backend.canUseInstancing()) return null; TileEntityInstance instance = instances.get(tile); @@ -47,7 +47,7 @@ public abstract class InstancedTileRenderer

{ TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); if (renderer != null) { - FastRenderDispatcher.addedLastTick.get(tile.getWorld()).add(tile); + FastRenderDispatcher.addedLastTick.get(tile.getWorld()).put(tile, AnimationTickHolder.getTicks()); instances.put(tile, renderer); } @@ -93,11 +93,7 @@ public abstract class InstancedTileRenderer

{ } public void clean() { - // Clean up twice a second. This doesn't have to happen every tick, - // but this does need to be run to ensure we don't miss anything. - if (AnimationTickHolder.getTicks() % 10 == 0) { - instances.keySet().stream().filter(TileEntity::isRemoved).forEach(instances::remove); - } + instances.keySet().stream().filter(TileEntity::isRemoved).forEach(instances::remove); } public void invalidate() { From 485a0d2f9546df1027b4f17683273fb0908ba3ed Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Feb 2021 17:30:21 -0800 Subject: [PATCH 099/147] hotswapping is more sane now. --- .../simibubi/create/events/ClientEvents.java | 2 +- ...nLayerMixin.java => RenderHooksMixin.java} | 21 ++++++++++++++++++- .../render/backend/BufferedModel.java | 1 - .../render/backend/FastRenderDispatcher.java | 21 +------------------ .../render/{ => backend}/RenderWork.java | 2 +- .../render/backend/light/LightVolume.java | 2 +- src/main/resources/create.mixins.json | 2 +- 7 files changed, 25 insertions(+), 26 deletions(-) rename src/main/java/com/simibubi/create/foundation/mixin/{RenderInLayerMixin.java => RenderHooksMixin.java} (74%) rename src/main/java/com/simibubi/create/foundation/render/{ => backend}/RenderWork.java (89%) diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 580cedf9e..f4c4d6a01 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -25,7 +25,7 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; -import com.simibubi.create.foundation.render.RenderWork; +import com.simibubi.create.foundation.render.backend.RenderWork; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java similarity index 74% rename from src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java rename to src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java index d0fcb46ba..0014fea7c 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderInLayerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.mixin; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; @@ -8,17 +9,25 @@ import com.simibubi.create.foundation.render.backend.OptifineHandler; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.lwjgl.opengl.GL20; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Set; + @OnlyIn(Dist.CLIENT) @Mixin(WorldRenderer.class) -public class RenderInLayerMixin { +public class RenderHooksMixin { + + @Shadow private ClientWorld world; /** * JUSTIFICATION: This method is called once per layer per frame. It allows us to perform @@ -43,4 +52,14 @@ public class RenderInLayerMixin { GL20.glUseProgram(0); } + + @Inject(at = @At(value = "TAIL"), method = "loadRenderers") + private void refresh(CallbackInfo ci) { + CreateClient.kineticRenderer.invalidate(); + ContraptionRenderDispatcher.invalidateAll(); + OptifineHandler.refresh(); + Backend.refresh(); + + if (world != null) world.loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java index 2e8c90e72..d209fd857 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.render.backend; -import com.simibubi.create.foundation.render.RenderWork; import com.simibubi.create.foundation.render.TemplateBuffer; import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index 883ee29bd..e5f40c872 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -5,16 +5,10 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.schematics.SchematicWorld; -import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.RenderWork; -import com.simibubi.create.foundation.render.backend.Backend; -import com.simibubi.create.foundation.render.backend.OptifineHandler; -import com.simibubi.create.foundation.render.backend.light.ILightListener; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; @@ -23,14 +17,8 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.potion.Effects; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.SectionPos; -import net.minecraft.world.ILightReader; -import net.minecraft.world.LightType; import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL20; -import org.lwjgl.system.CallbackI; import javax.annotation.Nullable; import java.util.ArrayList; @@ -93,14 +81,7 @@ public class FastRenderDispatcher { } public static void refresh() { - RenderWork.enqueue(() -> { - CreateClient.kineticRenderer.invalidate(); - OptifineHandler.refresh(); - Backend.refresh(); - Minecraft.getInstance().worldRenderer.loadRenderers(); - ClientWorld world = Minecraft.getInstance().world; - if (world != null) world.loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); - }); + RenderWork.enqueue(Minecraft.getInstance().worldRenderer::loadRenderers); } private static void runQueue(@Nullable ConcurrentHashMap.KeySetView changed, Consumer action) { diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderWork.java b/src/main/java/com/simibubi/create/foundation/render/backend/RenderWork.java similarity index 89% rename from src/main/java/com/simibubi/create/foundation/render/RenderWork.java rename to src/main/java/com/simibubi/create/foundation/render/backend/RenderWork.java index 6fc1fd6cb..5a44845f6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderWork.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/RenderWork.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.render; +package com.simibubi.create.foundation.render.backend; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java index 8dd0bc5ab..94c2e5ac5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.render.backend.light; -import com.simibubi.create.foundation.render.RenderWork; +import com.simibubi.create.foundation.render.backend.RenderWork; import com.simibubi.create.foundation.render.backend.gl.GlTexture; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 4f171a769..ad05fd38b 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -3,7 +3,7 @@ "package": "com.simibubi.create.foundation.mixin", "compatibilityLevel": "JAVA_8", "refmap": "create.refmap.json", - "client": ["OnRemoveTileMixin", "ShaderCloseMixin", "CancelTileEntityRenderMixin", "LightUpdateMixin", "RenderInLayerMixin"], + "client": ["OnRemoveTileMixin", "ShaderCloseMixin", "CancelTileEntityRenderMixin", "LightUpdateMixin", "RenderHooksMixin"], "injectors": { "defaultRequire": 1 }, From e88dd89262c1b35afb937e9365d95f41d40b7bac Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Feb 2021 19:33:13 -0800 Subject: [PATCH 100/147] whoops null pointer is no more --- .../structureMovement/render/ContraptionRenderDispatcher.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index d555a13cf..2fbf9eb5a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -48,6 +48,8 @@ public class ContraptionRenderDispatcher { for (WeakReference weakReference : map.values()) { AbstractContraptionEntity entity = weakReference.get(); + if (entity == null) continue; + EntityRendererManager renderManager = Minecraft.getInstance().getRenderManager(); EntityRenderer renderer = renderManager.getRenderer(entity); From b1905ddfd4d5119ac4f366f3aa91e5ed77874314 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Feb 2021 21:11:35 -0800 Subject: [PATCH 101/147] probably fix issue with phosphor crashing contraptions --- .../structureMovement/ContraptionHandler.java | 3 ++ .../render/ContraptionRenderDispatcher.java | 22 ++++++++----- .../render/RenderedContraption.java | 2 +- .../PlacementSimulationWorld.java | 4 +++ .../worldWrappers/chunk/WrappedChunk.java | 28 ++++++++++------ .../chunk/WrappedChunkSection.java | 32 +++++++++++++++++++ 6 files changed, 72 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunkSection.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java index 21664ce2e..30f6a6a9d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java @@ -7,6 +7,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.WorldAttached; @@ -17,7 +18,9 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.fml.DistExecutor; public class ContraptionHandler { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index 2fbf9eb5a..ff7b72608 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -10,6 +10,10 @@ import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.Matrix4f; @@ -30,9 +34,12 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ForkJoinPool; public class ContraptionRenderDispatcher { - public static final HashMap renderers = new HashMap<>(); + public static final Int2ObjectMap renderers = new Int2ObjectOpenHashMap<>(); public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) { for (RenderedContraption renderer : renderers.values()) { @@ -82,16 +89,15 @@ public class ContraptionRenderDispatcher { } private static RenderedContraption getRenderer(World world, Contraption c) { - RenderedContraption renderer; int entityId = c.entity.getEntityId(); - if (renderers.containsKey(entityId)) { - renderer = renderers.get(entityId); - } else { - renderer = new RenderedContraption(world, c); - renderers.put(entityId, renderer); + RenderedContraption contraption = renderers.get(entityId); + + if (contraption == null) { + contraption = new RenderedContraption(world, c); + renderers.put(entityId, contraption); } - return renderer; + return contraption; } public static void renderLayer(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index 1d8108e4e..ddcf78be9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.Random; public class RenderedContraption { - private HashMap renderLayers = new HashMap<>(); + private final HashMap renderLayers = new HashMap<>(); public final PlacementSimulationWorld renderWorld; diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java index e7f740ebe..8e8d71b3c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java @@ -89,6 +89,10 @@ public class PlacementSimulationWorld extends WrappedWorld { return true; } + public BlockState getBlockState(int x, int y, int z) { + return getBlockState(scratch.setPos(x, y, z)); + } + @Override public BlockState getBlockState(BlockPos pos) { BlockState state = blocksAdded.get(pos); diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java index 521d5319d..e21d3d044 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java @@ -30,11 +30,13 @@ import java.util.stream.Stream; public class WrappedChunk implements IChunk { - private final PlacementSimulationWorld world; - private boolean needsLight; - private final int x; - private final int z; - private final ChunkPos pos; + final PlacementSimulationWorld world; + boolean needsLight; + final int x; + final int z; + final ChunkPos pos; + + private final ChunkSection[] sections; public WrappedChunk(PlacementSimulationWorld world, int x, int z) { this.world = world; @@ -42,6 +44,12 @@ public class WrappedChunk implements IChunk { this.x = x; this.z = z; this.pos = new ChunkPos(x, z); + + this.sections = new ChunkSection[16]; + + for (int i = 0; i < 16; i++) { + sections[i] = new WrappedChunkSection(this, i << 4); + } } @Override @@ -57,6 +65,11 @@ public class WrappedChunk implements IChunk { .map(Map.Entry::getKey); } + @Override + public ChunkSection[] getSections() { + return sections; + } + @Nullable @Override public BlockState setBlockState(BlockPos p_177436_1_, BlockState p_177436_2_, boolean p_177436_3_) { @@ -78,11 +91,6 @@ public class WrappedChunk implements IChunk { return null; } - @Override - public ChunkSection[] getSections() { - return new ChunkSection[0]; - } - @Override public Collection> func_217311_f() { return null; diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunkSection.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunkSection.java new file mode 100644 index 000000000..e5e90594d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunkSection.java @@ -0,0 +1,32 @@ +package com.simibubi.create.foundation.utility.worldWrappers.chunk; + +import net.minecraft.block.BlockState; +import net.minecraft.world.chunk.ChunkSection; + +public class WrappedChunkSection extends ChunkSection { + + public WrappedChunk owner; + + public final int xStart; + public final int yStart; + public final int zStart; + + public WrappedChunkSection(WrappedChunk owner, int yBase) { + super(yBase); + this.owner = owner; + this.xStart = owner.pos.getXStart(); + this.yStart = yBase; + this.zStart = owner.pos.getZStart(); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + // ChunkSection#getBlockState expects local chunk coordinates, so we add to get back into world coords. + return owner.world.getBlockState(x + xStart, y + yStart, z + zStart); + } + + @Override + public BlockState setBlockState(int p_177484_1_, int p_177484_2_, int p_177484_3_, BlockState p_177484_4_, boolean p_177484_5_) { + throw new IllegalStateException("Chunk sections should not be mutated in a fake world."); + } +} From 2d2c7e653f3db9ccce0c2557fee8fd182351916e Mon Sep 17 00:00:00 2001 From: Snownee Date: Sat, 13 Feb 2021 14:14:28 +0800 Subject: [PATCH 102/147] Avoid unnecessary piston contraption assembling --- .../structureMovement/piston/MechanicalPistonTileEntity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java index bb8c2ff7e..e64ed67e8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java @@ -46,6 +46,8 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { if (!(world.getBlockState(pos) .getBlock() instanceof MechanicalPistonBlock)) return; + if (getMovementSpeed() == 0) + return; Direction direction = getBlockState().get(BlockStateProperties.FACING); From 0ad6db4bf75211b36bb70c0ec7d14edc62fbe411 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Feb 2021 23:06:41 -0800 Subject: [PATCH 103/147] cache KTEs' renderBoundingBox --- .../contraptions/base/KineticTileEntity.java | 17 +++++++++++++++- .../PortableStorageInterfaceTileEntity.java | 6 +++++- .../crusher/CrushingWheelTileEntity.java | 2 +- .../deployer/DeployerTileEntity.java | 4 ++-- .../flywheel/FlywheelTileEntity.java | 4 ++-- .../flywheel/engine/EngineTileEntity.java | 9 ++++++++- .../mixer/MechanicalMixerTileEntity.java | 2 +- .../press/MechanicalPressTileEntity.java | 2 +- .../pulley/PulleyTileEntity.java | 4 ++-- .../waterwheel/WaterWheelTileEntity.java | 2 +- .../fluids/actors/SpoutTileEntity.java | 9 ++++++++- .../fluids/tank/FluidTankTileEntity.java | 16 +++++++++++---- .../relays/belt/BeltTileEntity.java | 20 +++++++++---------- .../elementary/SimpleKineticTileEntity.java | 2 +- .../block/mechanicalArm/ArmTileEntity.java | 4 ++-- 15 files changed, 71 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 044cc2520..c439ace0f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -26,10 +26,12 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import javax.annotation.Nullable; @@ -464,7 +466,7 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override public double getMaxRenderDistanceSquared() { - return 16384.0D; // TODO: make this a config option + return super.getMaxRenderDistanceSquared(); } @Override @@ -492,4 +494,17 @@ public abstract class KineticTileEntity extends SmartTileEntity public void onChunkLightUpdate() { CreateClient.kineticRenderer.onLightUpdate(this); } + + protected AxisAlignedBB cachedBoundingBox; + @OnlyIn(Dist.CLIENT) + public AxisAlignedBB getRenderBoundingBox() { + if (cachedBoundingBox == null) { + cachedBoundingBox = makeRenderBoundingBox(); + } + return cachedBoundingBox; + } + + protected AxisAlignedBB makeRenderBoundingBox() { + return super.getRenderBoundingBox(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java index de4043458..2972a1627 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -100,10 +100,14 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity return powered; } + protected AxisAlignedBB cachedBoundingBox; @Override @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().grow(2); + if (cachedBoundingBox == null) { + cachedBoundingBox = super.getRenderBoundingBox().grow(2); + } + return cachedBoundingBox; } public boolean isTransferring() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java index d14531a6c..8d94992d5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java @@ -36,7 +36,7 @@ public class CrushingWheelTileEntity extends KineticTileEntity { } @Override - public AxisAlignedBB getRenderBoundingBox() { + public AxisAlignedBB makeRenderBoundingBox() { return new AxisAlignedBB(pos).grow(1); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 0dfd92f12..e311d5f1e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -341,8 +341,8 @@ public class DeployerTileEntity extends KineticTileEntity { } @Override - public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().grow(3); + public AxisAlignedBB makeRenderBoundingBox() { + return super.makeRenderBoundingBox().grow(3); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index b55c81d63..830081dfb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -47,8 +47,8 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { } @Override - public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().grow(2); + public AxisAlignedBB makeRenderBoundingBox() { + return super.makeRenderBoundingBox().grow(2); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java index a0869af09..6a3988caa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java @@ -14,6 +14,8 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class EngineTileEntity extends SmartTileEntity { @@ -34,9 +36,14 @@ public class EngineTileEntity extends SmartTileEntity { return true; } + protected AxisAlignedBB cachedBoundingBox; @Override + @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().grow(1.5f); + if (cachedBoundingBox == null) { + cachedBoundingBox = super.getRenderBoundingBox().grow(1.5f); + } + return cachedBoundingBox; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java index b6037c0c7..6073f366e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java @@ -80,7 +80,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { } @Override - public AxisAlignedBB getRenderBoundingBox() { + public AxisAlignedBB makeRenderBoundingBox() { return new AxisAlignedBB(pos).expand(0, -1.5, 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index 3d320743a..91d4359fb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -102,7 +102,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { } @Override - public AxisAlignedBB getRenderBoundingBox() { + public AxisAlignedBB makeRenderBoundingBox() { return new AxisAlignedBB(pos).expand(0, -1.5, 0) .expand(0, 1, 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java index a416edadc..cfac43101 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java @@ -32,8 +32,8 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { } @Override - public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().expand(0, -offset, 0); + public AxisAlignedBB makeRenderBoundingBox() { + return super.makeRenderBoundingBox().expand(0, -offset, 0); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java index 882f2a15e..6b0fc0df9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java @@ -36,7 +36,7 @@ public class WaterWheelTileEntity extends GeneratingKineticTileEntity { } @Override - public AxisAlignedBB getRenderBoundingBox() { + public AxisAlignedBB makeRenderBoundingBox() { return new AxisAlignedBB(pos).grow(1); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index 564ae6a33..584204b4a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -29,6 +29,8 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; @@ -49,9 +51,14 @@ public class SpoutTileEntity extends SmartTileEntity { processingTicks = -1; } + protected AxisAlignedBB cachedBoundingBox; @Override + @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().expand(0, -2, 0); + if (cachedBoundingBox == null) { + cachedBoundingBox = super.getRenderBoundingBox().expand(0, -2, 0); + } + return cachedBoundingBox; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java index aa487a29b..bfa94720a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java @@ -104,7 +104,10 @@ public class FluidTankTileEntity extends SmartTileEntity { } public boolean isController() { - return controller == null || controller.equals(pos); + return controller == null || + pos.getX() == controller.getX() && + pos.getY() == controller.getY() && + pos.getZ() == controller.getZ(); } @Override @@ -281,12 +284,17 @@ public class FluidTankTileEntity extends SmartTileEntity { return isController() ? pos : controller; } + private AxisAlignedBB cachedBoundingBox; @Override @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { - if (isController()) - return super.getRenderBoundingBox().expand(width - 1, height - 1, width - 1); - return super.getRenderBoundingBox(); + if (cachedBoundingBox == null) { + if (isController()) + cachedBoundingBox = super.getRenderBoundingBox().expand(width - 1, height - 1, width - 1); + else + cachedBoundingBox = super.getRenderBoundingBox(); + } + return cachedBoundingBox; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 34c972ae5..26309905f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -137,17 +137,12 @@ public class BeltTileEntity extends KineticTileEntity { return super.calculateStressApplied(); } - private AxisAlignedBB cachedBoundingBox; @Override - public AxisAlignedBB getRenderBoundingBox() { - if (cachedBoundingBox == null) { - if (!isController()) - cachedBoundingBox = super.getRenderBoundingBox(); - else - cachedBoundingBox = super.getRenderBoundingBox().grow(beltLength + 1); - } - - return cachedBoundingBox; + public AxisAlignedBB makeRenderBoundingBox() { + if (!isController()) + return super.makeRenderBoundingBox(); + else + return super.makeRenderBoundingBox().grow(beltLength + 1); } protected void initializeItemHandler() { @@ -275,7 +270,10 @@ public class BeltTileEntity extends KineticTileEntity { } public boolean isController() { - return pos.equals(controller); + return controller != null && + pos.getX() == controller.getX() && + pos.getY() == controller.getY() && + pos.getZ() == controller.getZ(); } public float getBeltMovementSpeed() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java index 864b659f3..29c997c6b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java @@ -24,7 +24,7 @@ public class SimpleKineticTileEntity extends KineticTileEntity { } @Override - public AxisAlignedBB getRenderBoundingBox() { + public AxisAlignedBB makeRenderBoundingBox() { return new AxisAlignedBB(pos).grow(1); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index c4370c2b4..767639361 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -139,8 +139,8 @@ public class ArmTileEntity extends KineticTileEntity { @Override @OnlyIn(Dist.CLIENT) - public AxisAlignedBB getRenderBoundingBox() { - return super.getRenderBoundingBox().grow(3); + public AxisAlignedBB makeRenderBoundingBox() { + return super.makeRenderBoundingBox().grow(3); } private boolean checkForMusicAmong(List list) { From 951a0c4769c4938466f2843ce4e35cc0e5778da3 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 13 Feb 2021 13:10:14 -0800 Subject: [PATCH 104/147] contraption actors take into account self lighting --- .../com/simibubi/create/CreateClient.java | 3 +- .../components/actors/HarvesterRenderer.java | 3 +- .../PortableStorageInterfaceRenderer.java | 3 +- .../components/deployer/DeployerRenderer.java | 5 +- .../components/saw/SawRenderer.java | 3 +- .../AbstractContraptionEntityRenderer.java | 10 +- .../ContraptionRenderer.java | 173 --------------- .../StabilizedBearingMovementBehaviour.java | 3 +- .../render/ContraptionRenderDispatcher.java | 198 ++++++++++++++++-- .../render/ContraptionRenderer.java | 46 ++++ .../foundation/render/SuperByteBuffer.java | 14 ++ .../render/TileEntityRenderHelper.java | 15 +- 12 files changed, 258 insertions(+), 218 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 18c3f054d..473e4221a 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -1,7 +1,6 @@ package com.simibubi.create; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; import com.simibubi.create.content.schematics.ClientSchematicLoader; import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; @@ -74,7 +73,7 @@ public class CreateClient { bufferCache = new SuperByteBufferCache(); bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); - bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); + bufferCache.registerCompartment(ContraptionRenderDispatcher.CONTRAPTION, 20); AllKeys.register(); AllContainerTypes.registerScreenFactories(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 22b5fd9a4..7456140d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -5,6 +5,7 @@ import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FAC import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; @@ -79,7 +80,7 @@ public class HarvesterRenderer extends SafeTileEntityRenderer sbb.light(msLocal.peek() - .getModel()) + .getModel(), ContraptionRenderDispatcher.getLightOnContraption(context)) .renderInto(ms, vb), ms, msLocal); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 01faa80b3..6f94068af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -11,6 +11,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -191,9 +192,9 @@ public class DeployerRenderer extends SafeTileEntityRenderer .getModel(); for (MatrixStack m : matrixStacks) m.translate(offset.x, offset.y, offset.z); - pole.light(lighting) + pole.light(lighting, ContraptionRenderDispatcher.getLightOnContraption(context)) .renderInto(ms, builder); - hand.light(lighting) + hand.light(lighting, ContraptionRenderDispatcher.getLightOnContraption(context)) .renderInto(ms, builder); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 03043241b..fb9d56fc3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -183,7 +184,7 @@ public class SawRenderer extends SafeTileEntityRenderer { superBuffer .light(msLocal.peek() - .getModel()) + .getModel(), ContraptionRenderDispatcher.getLightOnContraption(context)) .renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java index be02832b9..92b0baf9a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.backend.Backend; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; @@ -57,12 +56,7 @@ public abstract class AbstractContraptionEntityRenderer> CONTRAPTION = new Compartment<>(); - protected static PlacementSimulationWorld renderWorld; - - public static void render(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - renderDynamic(world, c, ms, msLocal, buffer); - renderStructure(world, c, ms, msLocal, buffer); - } - - public static void renderDynamic(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - renderTileEntities(world, c, ms, msLocal, buffer); - if (buffer instanceof IRenderTypeBuffer.Impl) - ((IRenderTypeBuffer.Impl) buffer).draw(); - renderActors(world, c, ms, msLocal, buffer); - } - - protected static void renderStructure(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - SuperByteBufferCache bufferCache = CreateClient.bufferCache; - List blockLayers = RenderType.getBlockLayers(); - - buffer.getBuffer(RenderType.getSolid()); - for (int i = 0; i < blockLayers.size(); i++) { - RenderType layer = blockLayers.get(i); - Pair key = Pair.of(c, i); - SuperByteBuffer contraptionBuffer = bufferCache.get(CONTRAPTION, key, () -> buildStructureBuffer(c, layer)); - if (contraptionBuffer.isEmpty()) - continue; - Matrix4f model = msLocal.peek() - .getModel(); - contraptionBuffer.light(model) - .renderInto(ms, buffer.getBuffer(layer)); - } - } - - protected static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - if (Backend.canUseVBOs()) { - ContraptionRenderDispatcher.renderTileEntities(world, c, ms, msLocal, buffer); - } else { - TileEntityRenderHelper.renderTileEntities(world, c.maybeInstancedTileEntities, ms, msLocal, buffer); - } - } - - private static SuperByteBuffer buildStructureBuffer(Contraption c, RenderType layer) { - BufferBuilder builder = buildStructure(c, layer); - return new SuperByteBuffer(builder); - } - - public static BufferBuilder buildStructure(Contraption c, RenderType layer) { - if (renderWorld == null || renderWorld.getWorld() != Minecraft.getInstance().world) - renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world); - - ForgeHooksClient.setRenderLayer(layer); - MatrixStack ms = new MatrixStack(); - BlockRendererDispatcher dispatcher = Minecraft.getInstance() - .getBlockRendererDispatcher(); - BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); - Random random = new Random(); - BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); - builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - renderWorld.setTileEntities(c.presentTileEntities.values()); - - for (BlockInfo info : c.getBlocks() - .values()) - renderWorld.setBlockState(info.pos, info.state); - - for (BlockInfo info : c.getBlocks() - .values()) { - BlockState state = info.state; - - if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) - continue; - if (!RenderTypeLookup.canRenderInLayer(state, layer)) - continue; - - IBakedModel originalModel = dispatcher.getModelForState(state); - ms.push(); - ms.translate(info.pos.getX(), info.pos.getY(), info.pos.getZ()); - blockRenderer.renderModel(renderWorld, originalModel, state, info.pos, ms, builder, true, random, 42, - OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); - ms.pop(); - } - - builder.finishDrawing(); - renderWorld.clear(); - renderWorld = null; - return builder; - } - - protected static void renderActors(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; - for (Pair actor : c.getActors()) { - MovementContext context = actor.getRight(); - if (context == null) - continue; - if (context.world == null) - context.world = world; - BlockInfo blockInfo = actor.getLeft(); - for (MatrixStack m : matrixStacks) { - m.push(); - MatrixStacker.of(m) - .translate(blockInfo.pos); - } - - MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); - if (movementBehaviour != null) - movementBehaviour.renderInContraption(context, ms, msLocal, buffer); - - for (MatrixStack m : matrixStacks) - m.pop(); - } - } - - public static int getLight(World world, float lx, float ly, float lz) { - BlockPos.Mutable pos = new BlockPos.Mutable(); - float sky = 0, block = 0; - float offset = 1 / 8f; - - for (float zOffset = offset; zOffset >= -offset; zOffset -= 2 * offset) - for (float yOffset = offset; yOffset >= -offset; yOffset -= 2 * offset) - for (float xOffset = offset; xOffset >= -offset; xOffset -= 2 * offset) { - pos.setPos(lx + xOffset, ly + yOffset, lz + zOffset); - sky += world.getLightLevel(LightType.SKY, pos) / 8f; - block += world.getLightLevel(LightType.BLOCK, pos) / 8f; - } - - return ((int) sky) << 20 | ((int) block) << 4; - } - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index dc9a28356..78fa432cb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.*; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -57,7 +58,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { // render superBuffer.light(msLocal.peek() - .getModel()); + .getModel(), ContraptionRenderDispatcher.getLightOnContraption(context)); superBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index ff7b72608..80310c7aa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -1,45 +1,51 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; -import com.simibubi.create.foundation.render.AllProgramSpecs; -import com.simibubi.create.foundation.render.TileEntityRenderHelper; +import com.simibubi.create.AllMovementBehaviours; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.components.structureMovement.*; +import com.simibubi.create.foundation.render.*; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; import net.minecraft.world.World; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.event.TickEvent; +import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL40; import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ForkJoinPool; public class ContraptionRenderDispatcher { public static final Int2ObjectMap renderers = new Int2ObjectOpenHashMap<>(); + public static final Compartment> CONTRAPTION = new Compartment<>(); + protected static PlacementSimulationWorld renderWorld; public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) { for (RenderedContraption renderer : renderers.values()) { @@ -48,6 +54,8 @@ public class ContraptionRenderDispatcher { } public static void renderTick(TickEvent.RenderTickEvent event) { + if (!Backend.canUseVBOs()) return; + ClientWorld world = Minecraft.getInstance().world; if (event.phase == TickEvent.Phase.START && world != null) { Map> map = ContraptionHandler.loadedContraptions.get(world); @@ -69,10 +77,14 @@ public class ContraptionRenderDispatcher { } public static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - RenderedContraption renderer = getRenderer(world, c); + IRenderTypeBuffer buffer) { + if (Backend.canUseInstancing()) { + RenderedContraption renderer = getRenderer(world, c); - TileEntityRenderHelper.renderTileEntities(world, renderer.renderWorld, c.specialRenderedTileEntities, ms, msLocal, buffer); + TileEntityRenderHelper.renderTileEntities(world, renderer.renderWorld, c.specialRenderedTileEntities, ms, msLocal, buffer); + } else { + TileEntityRenderHelper.renderTileEntities(world, c.specialRenderedTileEntities, ms, msLocal, buffer); + } } private static void updateTransform(C c, AbstractContraptionEntityRenderer entityRenderer) { @@ -152,4 +164,158 @@ public class ContraptionRenderDispatcher { renderers.clear(); } + + public static void render(AbstractContraptionEntity entity, MatrixStack ms, IRenderTypeBuffer buffers, + MatrixStack msLocal, Contraption contraption) { + if (Backend.canUseVBOs()) { + ContraptionRenderDispatcher.renderDynamic(entity.world, contraption, ms, msLocal, buffers); + } else { + ContraptionRenderDispatcher.renderDynamic(entity.world, contraption, ms, msLocal, buffers); + ContraptionRenderDispatcher.renderStructure(entity.world, contraption, ms, msLocal, buffers); + } + } + + public static void renderDynamic(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + renderTileEntities(world, c, ms, msLocal, buffer); + if (buffer instanceof IRenderTypeBuffer.Impl) + ((IRenderTypeBuffer.Impl) buffer).draw(); + renderActors(world, c, ms, msLocal, buffer); + } + + public static void renderStructure(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + SuperByteBufferCache bufferCache = CreateClient.bufferCache; + List blockLayers = RenderType.getBlockLayers(); + + buffer.getBuffer(RenderType.getSolid()); + for (int i = 0; i < blockLayers.size(); i++) { + RenderType layer = blockLayers.get(i); + Pair key = Pair.of(c, i); + SuperByteBuffer contraptionBuffer = bufferCache.get(CONTRAPTION, key, () -> buildStructureBuffer(c, layer)); + if (contraptionBuffer.isEmpty()) + continue; + Matrix4f model = msLocal.peek() + .getModel(); + contraptionBuffer.light(model) + .renderInto(ms, buffer.getBuffer(layer)); + } + } + + private static SuperByteBuffer buildStructureBuffer(Contraption c, RenderType layer) { + BufferBuilder builder = buildStructure(c, layer); + return new SuperByteBuffer(builder); + } + + public static BufferBuilder buildStructure(Contraption c, RenderType layer) { + if (renderWorld == null || renderWorld.getWorld() != Minecraft.getInstance().world) + renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world); + + ForgeHooksClient.setRenderLayer(layer); + MatrixStack ms = new MatrixStack(); + BlockRendererDispatcher dispatcher = Minecraft.getInstance() + .getBlockRendererDispatcher(); + BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); + Random random = new Random(); + BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); + builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); + renderWorld.setTileEntities(c.presentTileEntities.values()); + + for (Template.BlockInfo info : c.getBlocks() + .values()) + renderWorld.setBlockState(info.pos, info.state); + + for (Template.BlockInfo info : c.getBlocks() + .values()) { + BlockState state = info.state; + + if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) + continue; + if (!RenderTypeLookup.canRenderInLayer(state, layer)) + continue; + + IBakedModel originalModel = dispatcher.getModelForState(state); + ms.push(); + ms.translate(info.pos.getX(), info.pos.getY(), info.pos.getZ()); + blockRenderer.renderModel(renderWorld, originalModel, state, info.pos, ms, builder, true, random, 42, + OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + ms.pop(); + } + + builder.finishDrawing(); + renderWorld.clear(); + renderWorld = null; + return builder; + } + + protected static void renderActors(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; + for (Pair actor : c.getActors()) { + MovementContext context = actor.getRight(); + if (context == null) + continue; + if (context.world == null) + context.world = world; + Template.BlockInfo blockInfo = actor.getLeft(); + for (MatrixStack m : matrixStacks) { + m.push(); + MatrixStacker.of(m) + .translate(blockInfo.pos); + } + + MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); + if (movementBehaviour != null) + movementBehaviour.renderInContraption(context, ms, msLocal, buffer); + + for (MatrixStack m : matrixStacks) + m.pop(); + } + } + + public static int getLight(World world, float lx, float ly, float lz) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + float sky = 0, block = 0; + float offset = 1 / 8f; + + for (float zOffset = offset; zOffset >= -offset; zOffset -= 2 * offset) + for (float yOffset = offset; yOffset >= -offset; yOffset -= 2 * offset) + for (float xOffset = offset; xOffset >= -offset; xOffset -= 2 * offset) { + pos.setPos(lx + xOffset, ly + yOffset, lz + zOffset); + sky += world.getLightLevel(LightType.SKY, pos) / 8f; + block += world.getLightLevel(LightType.BLOCK, pos) / 8f; + } + + return ((int) sky) << 20 | ((int) block) << 4; + } + + public static int getLightOnContraption(World world, PlacementSimulationWorld renderWorld, BlockPos pos, BlockPos lightPos) { + int worldLight = WorldRenderer.getLightmapCoordinates(world, lightPos); + + if (renderWorld != null) + return getMaxBlockLight(worldLight, renderWorld.getLightLevel(LightType.BLOCK, pos)); + + return worldLight; + } + + public static int getMaxBlockLight(int packedLight, int blockLightValue) { + int unpackedBlockLight = LightTexture.getBlockLightCoordinates(packedLight); + + if (blockLightValue > unpackedBlockLight) { + packedLight = (packedLight & 0xFFFF0000) | (blockLightValue << 4); + } + + return packedLight; + } + + public static int getLightOnContraption(MovementContext context) { + int entityId = context.contraption.entity.getEntityId(); + + RenderedContraption renderedContraption = renderers.get(entityId); + if (renderedContraption != null) { + return renderedContraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos); + } else { + return -1; + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java new file mode 100644 index 000000000..70b823e70 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.render; + +import java.util.List; +import java.util.Random; + +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.*; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import org.apache.commons.lang3.tuple.Pair; +import org.lwjgl.opengl.GL11; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllMovementBehaviours; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; + +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockModelRenderer; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.template.Template.BlockInfo; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.model.data.EmptyModelData; + +public class ContraptionRenderer { + + + +} diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index 40fcee652..94d03f781 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import it.unimi.dsi.fastutil.longs.Long2DoubleMap; import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; @@ -32,6 +33,7 @@ public class SuperByteBuffer extends TemplateBuffer { // Vertex Lighting private boolean shouldLight; private int packedLightCoords; + private int otherBlockLight; private Matrix4f lightTransform; // Vertex Coloring @@ -136,7 +138,11 @@ public class SuperByteBuffer extends TemplateBuffer { lightPos.set(((x - f) * 15 / 16f) + f, (y - f) * 15 / 16f + f, (z - f) * 15 / 16f + f, 1F); lightPos.transform(localTransforms); lightPos.transform(lightTransform); + light = getLight(Minecraft.getInstance().world, lightPos); + if (otherBlockLight >= 0) { + light = ContraptionRenderDispatcher.getMaxBlockLight(light, otherBlockLight); + } } builder.light(light); } else @@ -150,6 +156,7 @@ public class SuperByteBuffer extends TemplateBuffer { spriteShiftFunc = null; shouldColor = false; shouldLight = false; + otherBlockLight = -1; } public SuperByteBuffer translate(double x, double y, double z) { @@ -214,6 +221,13 @@ public class SuperByteBuffer extends TemplateBuffer { return this; } + public SuperByteBuffer light(Matrix4f lightTransform, int otherBlockLight) { + shouldLight = true; + this.lightTransform = lightTransform; + this.otherBlockLight = otherBlockLight; + return this; + } + public SuperByteBuffer color(int color) { shouldColor = true; r = ((color >> 16) & 0xFF); diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index 7cb280de4..45f4667d6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -12,9 +13,7 @@ import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; import net.minecraft.world.World; -import net.minecraftforge.client.model.pipeline.LightUtil; import java.util.Iterator; @@ -51,17 +50,7 @@ public class TileEntityRenderHelper { Vector4f vec = new Vector4f(pos.getX() + .5f, pos.getY() + .5f, pos.getZ() + .5f, 1); vec.transform(matrix); BlockPos lightPos = new BlockPos(vec.getX(), vec.getY(), vec.getZ()); - int worldLight = WorldRenderer.getLightmapCoordinates(world, lightPos); - - if (renderWorld != null) { - int contraptionBlockLight = renderWorld.getLightLevel(LightType.BLOCK, pos); - - int worldBlockLight = LightTexture.getBlockLightCoordinates(worldLight); - - if (contraptionBlockLight > worldBlockLight) { - worldLight = (worldLight & 0xFFFF0000) | (contraptionBlockLight << 4); - } - } + int worldLight = ContraptionRenderDispatcher.getLightOnContraption(world, renderWorld, pos, lightPos); renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.DEFAULT_UV); From 11616a0b1619a358729f9630f7dd55fe00466748 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 13 Feb 2021 16:26:34 -0800 Subject: [PATCH 105/147] avoid 'glGet's at all costs --- .../mixin/FogColorTrackerMixin.java | 20 +++++++++++++++++++ .../render/backend/gl/BasicProgram.java | 3 +-- .../foundation/render/backend/gl/GlFog.java | 20 +++++++++++++++++-- .../resources/META-INF/accesstransformer.cfg | 8 +++++++- src/main/resources/create.mixins.json | 9 ++++++++- 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/FogColorTrackerMixin.java diff --git a/src/main/java/com/simibubi/create/foundation/mixin/FogColorTrackerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/FogColorTrackerMixin.java new file mode 100644 index 000000000..599cd50c7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/FogColorTrackerMixin.java @@ -0,0 +1,20 @@ +package com.simibubi.create.foundation.mixin; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.render.backend.gl.GlFog; +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(GlStateManager.class) +public class FogColorTrackerMixin { + + @Inject(at = @At("TAIL"), method = "fog") + private static void copyFogColor(int pname, float[] params, CallbackInfo ci) { + if (pname == GL11.GL_FOG_COLOR) { + GlFog.FOG_COLOR = params; + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java index c471945c2..c75fa89eb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java @@ -47,8 +47,7 @@ public class BasicProgram extends GlProgram { GL20.glUniform3f(uCameraPos, camX, camY, camZ); GL20.glUniform2f(uFogRange, GlFog.getFogStart(), GlFog.getFogEnd()); - GL20.glGetFloatv(GL20.GL_FOG_COLOR, Backend.VEC4_BUFFER); - GL20.glUniform4fv(uFogColor, Backend.VEC4_BUFFER); + GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); } protected static void uploadMatrixUniform(int uniform, Matrix4f mat) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java index 29ed4432f..220abfd1b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java @@ -1,13 +1,29 @@ package com.simibubi.create.foundation.render.backend.gl; +import com.mojang.blaze3d.platform.GlStateManager; +import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; public class GlFog { + public static float[] FOG_COLOR = new float[] {0, 0, 0, 0}; + + public static boolean fogEnabled() { + return GlStateManager.FOG.field_179049_a.field_179201_b; + } + + public static int getFogMode() { + return GlStateManager.FOG.field_179047_b; + } + + public static float getFogDensity() { + return GlStateManager.FOG.field_179048_c; + } + public static float getFogEnd() { - return GL20.glGetFloat(GL20.GL_FOG_END); + return GlStateManager.FOG.field_179046_e; } public static float getFogStart() { - return GL20.glGetFloat(GL20.GL_FOG_START); + return GlStateManager.FOG.field_179045_d; } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 440395e69..c03cd0bd8 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -32,4 +32,10 @@ public net.minecraft.client.Minecraft field_193996_ah #renderPartialTicksPaused # Functions needed to setup a projection matrix public net.minecraft.client.renderer.GameRenderer field_78529_t #rendererUpdateCount public net.minecraft.client.renderer.GameRenderer func_228380_a_(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V #bobViewWhenHurt -public net.minecraft.client.renderer.GameRenderer func_228383_b_(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V #bobView \ No newline at end of file +public net.minecraft.client.renderer.GameRenderer func_228383_b_(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V #bobView + +# Expose fog state to the public +public com.mojang.blaze3d.platform.GlStateManager$FogState +public com.mojang.blaze3d.platform.GlStateManager field_225663_h_ #FOG +public com.mojang.blaze3d.platform.GlStateManager$BooleanState +public com.mojang.blaze3d.platform.GlStateManager$BooleanState field_179201_b #field_179201_b \ No newline at end of file diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index ad05fd38b..e9d682678 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -3,7 +3,14 @@ "package": "com.simibubi.create.foundation.mixin", "compatibilityLevel": "JAVA_8", "refmap": "create.refmap.json", - "client": ["OnRemoveTileMixin", "ShaderCloseMixin", "CancelTileEntityRenderMixin", "LightUpdateMixin", "RenderHooksMixin"], + "client": [ + "OnRemoveTileMixin", + "ShaderCloseMixin", + "CancelTileEntityRenderMixin", + "LightUpdateMixin", + "RenderHooksMixin", + "FogColorTrackerMixin" + ], "injectors": { "defaultRequire": 1 }, From 676a05ad07c7179b15a1b991ccde23275bcc46b5 Mon Sep 17 00:00:00 2001 From: Snownee Date: Sun, 14 Feb 2021 11:18:38 +0800 Subject: [PATCH 106/147] Fix rose quartz duplication glitch (#1104) --- .../create/content/curiosities/tools/SandPaperItem.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItem.java index 1915a3e3b..2411eb091 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItem.java @@ -77,6 +77,8 @@ public class SandPaperItem extends Item { AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).grow(1f); ItemEntity pickUp = null; for (ItemEntity itemEntity : worldIn.getEntitiesWithinAABB(ItemEntity.class, bb)) { + if (!itemEntity.isAlive()) + continue; if (itemEntity.getPositionVec() .distanceTo(playerIn.getPositionVec()) > 3) continue; From 5e14ca71d997786c1ab7edbe85971b17e6028c63 Mon Sep 17 00:00:00 2001 From: Snownee Date: Sun, 14 Feb 2021 11:51:31 +0800 Subject: [PATCH 107/147] Add max stack size check to ItemHelper.extract --- .../java/com/simibubi/create/foundation/item/ItemHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index 22a225e60..0263c476f 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -174,7 +174,7 @@ public class ItemHelper { if (!simulate && hasEnoughItems) inv.extractItem(slot, stack.getCount(), false); - if (extracting.getCount() >= maxExtractionCount) { + if (extracting.getCount() >= maxExtractionCount || extracting.getCount() >= extracting.getMaxStackSize()) { if (checkHasEnoughItems) { hasEnoughItems = true; checkHasEnoughItems = false; @@ -234,7 +234,7 @@ public class ItemHelper { if (!simulate) inv.extractItem(slot, stack.getCount(), false); - if (extracting.getCount() == maxExtractionCount) + if (extracting.getCount() >= maxExtractionCount || extracting.getCount() >= extracting.getMaxStackSize()) break; } From 1e95fe4c7b5f5fec1da7b38cf78b0fc3a7a920ac Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sun, 14 Feb 2021 23:09:17 -0800 Subject: [PATCH 108/147] avoid floating point accuracy errors at high coordinate values. refactor contraption model translation to be a method in AbstractContraptionEntity. - this simplifies the setup required for the fast rendering. --- .../com/simibubi/create/AllEntityTypes.java | 8 +- .../contraptions/base/KineticData.java | 13 +++ .../contraptions/base/RotatingData.java | 5 + .../base/RotatingInstancedModel.java | 7 +- .../actors/ContraptionActorData.java | 6 + .../components/actors/RotatingActorModel.java | 7 +- .../AbstractContraptionEntity.java | 4 + ...er.java => ContraptionEntityRenderer.java} | 31 ++---- .../ControlledContraptionEntity.java | 16 +++ .../ControlledContraptionEntityRenderer.java | 30 ----- .../OrientedContraptionEntity.java | 93 +++++++++++++++- .../OrientedContraptionEntityRenderer.java | 103 +----------------- .../render/ContraptionKineticRenderer.java | 13 ++- .../render/ContraptionProgram.java | 10 +- .../render/ContraptionRenderDispatcher.java | 67 ++++-------- .../render/RenderedContraption.java | 88 +++++++++------ .../contraptions/relays/belt/BeltData.java | 6 +- .../relays/belt/BeltInstancedModel.java | 7 +- .../SchematicRendererWithInstancing.java | 30 ----- .../simibubi/create/events/ClientEvents.java | 2 +- .../foundation/mixin/RenderHooksMixin.java | 14 +-- .../foundation/render/KineticRenderer.java | 65 ++++++++++- .../foundation/render/backend/Backend.java | 2 - .../render/backend/FastRenderDispatcher.java | 24 +--- .../render/backend/gl/BasicProgram.java | 4 +- .../backend/instancing/InstanceData.java | 6 + .../backend/instancing/InstancedModel.java | 5 +- .../instancing/InstancedTileRenderer.java | 49 ++++++++- .../backend/instancing/ModelFactory.java | 2 +- .../backend/instancing/RenderMaterial.java | 14 ++- .../instancing/TileEntityInstance.java | 19 +++- .../render/backend/light/LightVolume.java | 4 +- .../resources/assets/create/shader/belt.vert | 9 +- .../create/shader/contraption_actor.vert | 2 +- .../create/shader/contraption_structure.vert | 8 +- .../assets/create/shader/rotating.vert | 9 +- 36 files changed, 431 insertions(+), 351 deletions(-) rename src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/{AbstractContraptionEntityRenderer.java => ContraptionEntityRenderer.java} (61%) delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntityRenderer.java delete mode 100644 src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 08a1a8d1a..1543d8eb7 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -1,11 +1,7 @@ package com.simibubi.create; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntityRenderer; -import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntityRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.*; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueRenderer; import com.simibubi.create.foundation.utility.Lang; @@ -51,7 +47,7 @@ public class AllEntityTypes { @OnlyIn(value = Dist.CLIENT) public static void registerRenderers() { RenderingRegistry.registerEntityRenderingHandler(CONTROLLED_CONTRAPTION.get(), - ControlledContraptionEntityRenderer::new); + ContraptionEntityRenderer::new); RenderingRegistry.registerEntityRenderingHandler(ORIENTED_CONTRAPTION.get(), OrientedContraptionEntityRenderer::new); RenderingRegistry.registerEntityRenderingHandler(SUPER_GLUE.get(), SuperGlueRenderer::new); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java index bf543f563..a5f2889ba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.render.backend.instancing.InstanceData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.utility.ColorHelper; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; @@ -19,6 +20,10 @@ public class KineticData> extends InstanceData { private float rotationalSpeed; private float rotationOffset; + protected KineticData(InstancedModel owner) { + super(owner); + } + public D setTileEntity(KineticTileEntity te) { setPosition(te.getPos()); if (te.hasSource()) { @@ -37,6 +42,14 @@ public class KineticData> extends InstanceData { return setPosition(pos.getX(), pos.getY(), pos.getZ()); } + public D setPosition(int x, int y, int z) { + BlockPos origin = owner.renderer.getOriginCoordinate(); + + return setPosition((float) (x - origin.getX()), + (float) (y - origin.getY()), + (float) (z - origin.getZ())); + } + public D setPosition(float x, float y, float z) { this.x = x; this.y = y; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java index c8afa2c35..75fca6a53 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.Direction; @@ -16,6 +17,10 @@ public class RotatingData extends KineticData { private byte rotationAxisY; private byte rotationAxisZ; + protected RotatingData(InstancedModel owner) { + super(owner); + } + public RotatingData setRotationAxis(Direction.Axis axis) { Direction orientation = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis); setRotationAxis(orientation.getUnitVector()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java index 420121124..0b9a2e998 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java @@ -2,16 +2,17 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import net.minecraft.client.renderer.BufferBuilder; public class RotatingInstancedModel extends InstancedModel { - public RotatingInstancedModel(BufferBuilder buf) { - super(buf); + public RotatingInstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { + super(renderer, buf); } @Override protected RotatingData newInstance() { - return new RotatingData(); + return new RotatingData(this); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java index 5f6494a62..d7eb78b24 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstanceData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; @@ -28,6 +29,11 @@ public class ContraptionActorData extends InstanceData { private byte rotationCenterY = 64; private byte rotationCenterZ = 64; + protected ContraptionActorData(InstancedModel owner) { + super(owner); + } + + public ContraptionActorData setPosition(BlockPos pos) { this.x = pos.getX(); this.y = pos.getY(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java index 481df3061..0efe011b0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java @@ -2,11 +2,12 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import net.minecraft.client.renderer.BufferBuilder; public class RotatingActorModel extends InstancedModel { - public RotatingActorModel(BufferBuilder buf) { - super(buf); + public RotatingActorModel(InstancedTileRenderer renderer, BufferBuilder buf) { + super(renderer, buf); } @Override @@ -16,6 +17,6 @@ public class RotatingActorModel extends InstancedModel { @Override protected ContraptionActorData newInstance() { - return new ContraptionActorData(); + return new ContraptionActorData(this); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index 84b7f8b64..76e764d89 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.UUID; +import com.mojang.blaze3d.matrix.MatrixStack; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.tuple.MutablePair; @@ -593,6 +594,9 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return false; } + @OnlyIn(Dist.CLIENT) + public abstract void doLocalTransforms(float partialTicks, MatrixStack[] matrixStacks); + public static class ContraptionRotationState { static final ContraptionRotationState NONE = new ContraptionRotationState(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java similarity index 61% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java index 92b0baf9a..850d92446 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java @@ -10,37 +10,26 @@ import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; -public abstract class AbstractContraptionEntityRenderer extends EntityRenderer { +public class ContraptionEntityRenderer extends EntityRenderer { - protected AbstractContraptionEntityRenderer(EntityRendererManager p_i46179_1_) { + public ContraptionEntityRenderer(EntityRendererManager p_i46179_1_) { super(p_i46179_1_); } @Override - public ResourceLocation getEntityTexture(C p_110775_1_) { + public ResourceLocation getEntityTexture(C entity) { return null; } - protected abstract void transform(C contraptionEntity, float partialTicks, MatrixStack[] matrixStacks); - - public MatrixStack makeTransformMatrix(C contraptionEntity, float partialTicks) { - MatrixStack stack = getLocalTransform(contraptionEntity, partialTicks); - - transform(contraptionEntity, partialTicks, new MatrixStack[]{ stack }); - - return stack; - } - @Override - public boolean shouldRender(C entity, ClippingHelperImpl p_225626_2_, double p_225626_3_, double p_225626_5_, + public boolean shouldRender(C entity, ClippingHelperImpl clippingHelper, double p_225626_3_, double p_225626_5_, double p_225626_7_) { - if (!super.shouldRender(entity, p_225626_2_, p_225626_3_, p_225626_5_, p_225626_7_)) + if (entity.getContraption() == null) return false; if (!entity.isAlive()) return false; - if (entity.getContraption() == null) - return false; - return true; + + return super.shouldRender(entity, clippingHelper, p_225626_3_, p_225626_5_, p_225626_7_); } @Override @@ -49,11 +38,11 @@ public abstract class AbstractContraptionEntityRenderer { - - public ControlledContraptionEntityRenderer(EntityRendererManager p_i46179_1_) { - super(p_i46179_1_); - } - - @Override - protected void transform(ControlledContraptionEntity entity, float partialTicks, - MatrixStack[] matrixStacks) { - float angle = entity.getAngle(partialTicks); - Axis axis = entity.getRotationAxis(); - - for (MatrixStack stack : matrixStacks) - MatrixStacker.of(stack) - .nudge(entity.getEntityId()) - .centre() - .rotate(angle, axis) - .unCentre(); - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java index cf77d0a14..8b6df8b9b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java @@ -7,6 +7,7 @@ import java.util.UUID; import javax.annotation.Nullable; +import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; @@ -14,10 +15,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.mou import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.*; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -40,6 +38,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.LazyOptional; /** @@ -494,4 +494,89 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { yaw = angle; } + @Override + @OnlyIn(Dist.CLIENT) + public void doLocalTransforms(float partialTicks, MatrixStack[] matrixStacks) { + float angleInitialYaw = getInitialYaw(); + float angleYaw = getYaw(partialTicks); + float anglePitch = getPitch(partialTicks); + + for (MatrixStack stack : matrixStacks) + stack.translate(-.5f, 0, -.5f); + + Entity ridingEntity = getRidingEntity(); + if (ridingEntity instanceof AbstractMinecartEntity) + repositionOnCart(partialTicks, matrixStacks, ridingEntity); + else if (ridingEntity instanceof AbstractContraptionEntity) { + if (ridingEntity.getRidingEntity() instanceof AbstractMinecartEntity) + repositionOnCart(partialTicks, matrixStacks, ridingEntity.getRidingEntity()); + else + repositionOnContraption(partialTicks, matrixStacks, ridingEntity); + } + + for (MatrixStack stack : matrixStacks) + MatrixStacker.of(stack) + .nudge(getEntityId()) + .centre() + .rotateY(angleYaw) + .rotateZ(anglePitch) + .rotateY(angleInitialYaw) + .unCentre(); + } + + @OnlyIn(Dist.CLIENT) + private void repositionOnContraption(float partialTicks, MatrixStack[] matrixStacks, Entity ridingEntity) { + Vec3d pos = getContraptionOffset(partialTicks, ridingEntity); + for (MatrixStack stack : matrixStacks) + stack.translate(pos.x, pos.y, pos.z); + } + + // Minecarts do not always render at their exact location, so the contraption + // has to adjust aswell + @OnlyIn(Dist.CLIENT) + private void repositionOnCart(float partialTicks, MatrixStack[] matrixStacks, Entity ridingEntity) { + Vec3d cartPos = getCartOffset(partialTicks, ridingEntity); + + if (cartPos == Vec3d.ZERO) return; + + for (MatrixStack stack : matrixStacks) + stack.translate(cartPos.x, cartPos.y, cartPos.z); + } + + @OnlyIn(Dist.CLIENT) + private Vec3d getContraptionOffset(float partialTicks, Entity ridingEntity) { + AbstractContraptionEntity parent = (AbstractContraptionEntity) ridingEntity; + Vec3d passengerPosition = parent.getPassengerPosition(this, partialTicks); + double x = passengerPosition.x - MathHelper.lerp(partialTicks, this.lastTickPosX, this.getX()); + double y = passengerPosition.y - MathHelper.lerp(partialTicks, this.lastTickPosY, this.getY()); + double z = passengerPosition.z - MathHelper.lerp(partialTicks, this.lastTickPosZ, this.getZ()); + + return new Vec3d(x, y, z); + } + + @OnlyIn(Dist.CLIENT) + private Vec3d getCartOffset(float partialTicks, Entity ridingEntity) { + AbstractMinecartEntity cart = (AbstractMinecartEntity) ridingEntity; + double cartX = MathHelper.lerp(partialTicks, cart.lastTickPosX, cart.getX()); + double cartY = MathHelper.lerp(partialTicks, cart.lastTickPosY, cart.getY()); + double cartZ = MathHelper.lerp(partialTicks, cart.lastTickPosZ, cart.getZ()); + Vec3d cartPos = cart.getPos(cartX, cartY, cartZ); + + if (cartPos != null) { + Vec3d cartPosFront = cart.getPosOffset(cartX, cartY, cartZ, (double) 0.3F); + Vec3d cartPosBack = cart.getPosOffset(cartX, cartY, cartZ, (double) -0.3F); + if (cartPosFront == null) + cartPosFront = cartPos; + if (cartPosBack == null) + cartPosBack = cartPos; + + cartX = cartPos.x - cartX; + cartY = (cartPosFront.y + cartPosBack.y) / 2.0D - cartY; + cartZ = cartPos.z - cartZ; + + return new Vec3d(cartX, cartY, cartZ); + } + + return Vec3d.ZERO; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java index 8f563a92b..f1b42cda4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntityRenderer.java @@ -1,113 +1,20 @@ package com.simibubi.create.content.contraptions.components.structureMovement; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.utility.MatrixStacker; - import net.minecraft.client.renderer.culling.ClippingHelperImpl; import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.minecart.AbstractMinecartEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -public class OrientedContraptionEntityRenderer extends AbstractContraptionEntityRenderer { +public class OrientedContraptionEntityRenderer extends ContraptionEntityRenderer { public OrientedContraptionEntityRenderer(EntityRendererManager p_i46179_1_) { super(p_i46179_1_); } @Override - public boolean shouldRender(OrientedContraptionEntity entity, ClippingHelperImpl p_225626_2_, double p_225626_3_, + public boolean shouldRender(OrientedContraptionEntity entity, ClippingHelperImpl clippingHelper, double p_225626_3_, double p_225626_5_, double p_225626_7_) { - if (!super.shouldRender(entity, p_225626_2_, p_225626_3_, p_225626_5_, p_225626_7_)) + if (!super.shouldRender(entity, clippingHelper, p_225626_3_, p_225626_5_, p_225626_7_)) return false; - if (entity.getContraption() - .getType() == AllContraptionTypes.MOUNTED && entity.getRidingEntity() == null) - return false; - return true; + + return entity.getContraption().getType() != AllContraptionTypes.MOUNTED || entity.getRidingEntity() != null; } - - @Override - protected void transform(OrientedContraptionEntity entity, float partialTicks, MatrixStack[] matrixStacks) { - float angleInitialYaw = entity.getInitialYaw(); - float angleYaw = entity.getYaw(partialTicks); - float anglePitch = entity.getPitch(partialTicks); - - for (MatrixStack stack : matrixStacks) - stack.translate(-.5f, 0, -.5f); - - Entity ridingEntity = entity.getRidingEntity(); - if (ridingEntity instanceof AbstractMinecartEntity) - repositionOnCart(partialTicks, matrixStacks, ridingEntity); - else if (ridingEntity instanceof AbstractContraptionEntity) { - if (ridingEntity.getRidingEntity() instanceof AbstractMinecartEntity) - repositionOnCart(partialTicks, matrixStacks, ridingEntity.getRidingEntity()); - else - repositionOnContraption(entity, partialTicks, matrixStacks, ridingEntity); - } - - for (MatrixStack stack : matrixStacks) - MatrixStacker.of(stack) - .nudge(entity.getEntityId()) - .centre() - .rotateY(angleYaw) - .rotateZ(anglePitch) - .rotateY(angleInitialYaw) - .unCentre(); - } - - private void repositionOnContraption(OrientedContraptionEntity entity, float partialTicks, - MatrixStack[] matrixStacks, Entity ridingEntity) { - Vec3d pos = getContraptionOffset(entity, partialTicks, ridingEntity); - for (MatrixStack stack : matrixStacks) - stack.translate(pos.x, pos.y, pos.z); - } - - // Minecarts do not always render at their exact location, so the contraption - // has to adjust aswell - private void repositionOnCart(float partialTicks, MatrixStack[] matrixStacks, Entity ridingEntity) { - Vec3d cartPos = getCartOffset(partialTicks, ridingEntity); - - if (cartPos == Vec3d.ZERO) return; - - for (MatrixStack stack : matrixStacks) - stack.translate(cartPos.x, cartPos.y, cartPos.z); - } - - private Vec3d getContraptionOffset(OrientedContraptionEntity entity, float partialTicks, Entity ridingEntity) { - AbstractContraptionEntity parent = (AbstractContraptionEntity) ridingEntity; - Vec3d passengerPosition = parent.getPassengerPosition(entity, partialTicks); - double x = passengerPosition.x - MathHelper.lerp(partialTicks, entity.lastTickPosX, entity.getX()); - double y = passengerPosition.y - MathHelper.lerp(partialTicks, entity.lastTickPosY, entity.getY()); - double z = passengerPosition.z - MathHelper.lerp(partialTicks, entity.lastTickPosZ, entity.getZ()); - - return new Vec3d(x, y, z); - } - - private Vec3d getCartOffset(float partialTicks, Entity ridingEntity) { - AbstractMinecartEntity cart = (AbstractMinecartEntity) ridingEntity; - double cartX = MathHelper.lerp(partialTicks, cart.lastTickPosX, cart.getX()); - double cartY = MathHelper.lerp(partialTicks, cart.lastTickPosY, cart.getY()); - double cartZ = MathHelper.lerp(partialTicks, cart.lastTickPosZ, cart.getZ()); - Vec3d cartPos = cart.getPos(cartX, cartY, cartZ); - - if (cartPos != null) { - Vec3d cartPosFront = cart.getPosOffset(cartX, cartY, cartZ, (double) 0.3F); - Vec3d cartPosBack = cart.getPosOffset(cartX, cartY, cartZ, (double) -0.3F); - if (cartPosFront == null) - cartPosFront = cartPos; - if (cartPosBack == null) - cartPosBack = cartPos; - - cartX = cartPos.x - cartX; - cartY = (cartPosFront.y + cartPosBack.y) / 2.0D - cartY; - cartZ = cartPos.z - cartZ; - - return new Vec3d(cartX, cartY, cartZ); - } - - return Vec3d.ZERO; - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java index c35a87c18..d670c354f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -7,13 +7,20 @@ import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel; +import net.minecraft.util.math.BlockPos; public class ContraptionKineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_BELT, BeltInstancedModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_ROTATING, RotatingInstancedModel::new)); - materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(AllProgramSpecs.CONTRAPTION_ACTOR, RotatingActorModel::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_BELT, BeltInstancedModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_ROTATING, RotatingInstancedModel::new)); + materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_ACTOR, RotatingActorModel::new)); + } + + @Override + public BlockPos getOriginCoordinate() { + return BlockPos.ZERO; } } + diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java index 6a2ee017e..ce2aede88 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java @@ -4,6 +4,7 @@ import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; import org.lwjgl.opengl.GL20; public class ContraptionProgram extends BasicProgram { @@ -26,9 +27,12 @@ public class ContraptionProgram extends BasicProgram { uLightVolume = setSamplerBinding("uLightVolume", 4); } - public void bind(Matrix4f model, GridAlignedBB lightVolume) { - GL20.glUniform3f(uLightBoxSize, lightVolume.sizeX(), lightVolume.sizeY(), lightVolume.sizeZ()); - GL20.glUniform3f(uLightBoxMin, lightVolume.minX, lightVolume.minY, lightVolume.minZ); + public void bind(Matrix4f model, AxisAlignedBB lightVolume) { + double sizeX = lightVolume.maxX - lightVolume.minX; + double sizeY = lightVolume.maxY - lightVolume.minY; + double sizeZ = lightVolume.maxZ - lightVolume.minZ; + GL20.glUniform3f(uLightBoxSize, (float) sizeX, (float) sizeY, (float) sizeZ); + GL20.glUniform3f(uLightBoxMin, (float) lightVolume.minX, (float) lightVolume.minY, (float) lightVolume.minZ); uploadMatrixUniform(uModel, model); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index 80310c7aa..5c3d4f8af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -38,60 +38,34 @@ import org.lwjgl.opengl.GL40; import java.lang.ref.WeakReference; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ForkJoinPool; public class ContraptionRenderDispatcher { public static final Int2ObjectMap renderers = new Int2ObjectOpenHashMap<>(); public static final Compartment> CONTRAPTION = new Compartment<>(); protected static PlacementSimulationWorld renderWorld; + private static boolean firstLayer = true; + public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) { for (RenderedContraption renderer : renderers.values()) { renderer.getLighter().lightVolume.notifyLightUpdate(world, type, pos); } } - public static void renderTick(TickEvent.RenderTickEvent event) { - if (!Backend.canUseVBOs()) return; - - ClientWorld world = Minecraft.getInstance().world; - if (event.phase == TickEvent.Phase.START && world != null) { - Map> map = ContraptionHandler.loadedContraptions.get(world); - - for (WeakReference weakReference : map.values()) { - AbstractContraptionEntity entity = weakReference.get(); - - if (entity == null) continue; - - EntityRendererManager renderManager = Minecraft.getInstance().getRenderManager(); - - EntityRenderer renderer = renderManager.getRenderer(entity); - - if (renderer instanceof AbstractContraptionEntityRenderer) { - updateTransform(entity, (AbstractContraptionEntityRenderer) renderer); - } - } - } + public static void renderTick() { + firstLayer = true; } public static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { - if (Backend.canUseInstancing()) { + PlacementSimulationWorld renderWorld = null; + if (Backend.canUseVBOs()) { RenderedContraption renderer = getRenderer(world, c); - TileEntityRenderHelper.renderTileEntities(world, renderer.renderWorld, c.specialRenderedTileEntities, ms, msLocal, buffer); - } else { - TileEntityRenderHelper.renderTileEntities(world, c.specialRenderedTileEntities, ms, msLocal, buffer); + renderWorld = renderer.renderWorld; } - } + TileEntityRenderHelper.renderTileEntities(world, renderWorld, c.specialRenderedTileEntities, ms, msLocal, buffer); - private static void updateTransform(C c, AbstractContraptionEntityRenderer entityRenderer) { - MatrixStack stack = entityRenderer.makeTransformMatrix(c, AnimationTickHolder.getPartialTicks()); - - Contraption c1 = c.getContraption(); - getRenderer(c1.entity.world, c1).setRenderSettings(stack.peek().getModel()); } public static void tick() { @@ -112,11 +86,20 @@ public class ContraptionRenderDispatcher { return contraption; } - public static void renderLayer(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ) { + public static void renderLayer(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { removeDeadContraptions(); if (renderers.isEmpty()) return; + if (firstLayer) { + + for (RenderedContraption renderer : renderers.values()) { + renderer.beginFrame(camX, camY, camZ); + } + + firstLayer = false; + } + layer.startDrawing(); GL11.glEnable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 @@ -142,19 +125,13 @@ public class ContraptionRenderDispatcher { } public static void removeDeadContraptions() { - ArrayList toRemove = new ArrayList<>(); - - for (RenderedContraption renderer : renderers.values()) { + renderers.values().removeIf(renderer -> { if (renderer.isDead()) { - toRemove.add(renderer.getEntityId()); renderer.invalidate(); + return true; } - } - - - for (Integer id : toRemove) { - renderers.remove(id); - } + return false; + }); } public static void invalidateAll() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index ddcf78be9..32fed725d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -3,23 +3,26 @@ package com.simibubi.create.content.contraptions.components.structureMovement.re import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.*; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template; import net.minecraft.world.lighting.WorldLightManager; @@ -45,6 +48,7 @@ public class RenderedContraption { public Contraption contraption; private Matrix4f model; + private AxisAlignedBB lightBox; public RenderedContraption(World world, Contraption contraption) { this.contraption = contraption; @@ -76,14 +80,55 @@ public class RenderedContraption { } public void doRenderLayer(RenderType layer, ContraptionProgram shader) { - ContraptionModel buffer = renderLayers.get(layer); - if (buffer != null) { + ContraptionModel structure = renderLayers.get(layer); + if (structure != null) { setup(shader); - buffer.render(); + structure.render(); teardown(); } } + public void beginFrame(double camX, double camY, double camZ) { + AbstractContraptionEntity entity = contraption.entity; + float pt = AnimationTickHolder.getPartialTicks(); + + MatrixStack stack = new MatrixStack(); + + double x = MathHelper.lerp(pt, entity.lastTickPosX, entity.getX()) - camX; + double y = MathHelper.lerp(pt, entity.lastTickPosY, entity.getY()) - camY; + double z = MathHelper.lerp(pt, entity.lastTickPosZ, entity.getZ()) - camZ; + stack.translate(x, y, z); + + entity.doLocalTransforms(pt, new MatrixStack[]{ stack }); + + model = stack.peek().getModel(); + + AxisAlignedBB lightBox = GridAlignedBB.toAABB(lighter.lightVolume.getTextureVolume()); + + this.lightBox = lightBox.offset(-camX, -camY, -camZ); + } + + void setup(ContraptionProgram shader) { + if (model == null || lightBox == null) return; + shader.bind(model, lightBox); + lighter.lightVolume.bind(); + } + + void teardown() { + lighter.lightVolume.unbind(); + } + + void invalidate() { + for (ContraptionModel buffer : renderLayers.values()) { + buffer.delete(); + } + renderLayers.clear(); + + lighter.lightVolume.delete(); + + kinetics.invalidate(); + } + private void buildLayers() { for (ContraptionModel buffer : renderLayers.values()) { buffer.delete(); @@ -128,37 +173,12 @@ public class RenderedContraption { } } - void setRenderSettings(Matrix4f model) { - this.model = model; - } - - void setup(ContraptionProgram shader) { - if (model == null) return; - shader.bind(model, lighter.lightVolume.getTextureVolume()); - lighter.lightVolume.use(); - } - - void teardown() { - lighter.lightVolume.release(); - } - - void invalidate() { - for (ContraptionModel buffer : renderLayers.values()) { - buffer.delete(); - } - renderLayers.clear(); - - lighter.lightVolume.delete(); - - kinetics.invalidate(); - } - private static ContraptionModel buildStructureModel(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) { BufferBuilder builder = buildStructure(renderWorld, c, layer); return new ContraptionModel(builder); } - public static PlacementSimulationWorld setupRenderWorld(World world, Contraption c) { + private static PlacementSimulationWorld setupRenderWorld(World world, Contraption c) { PlacementSimulationWorld renderWorld = new PlacementSimulationWorld(world); renderWorld.setTileEntities(c.presentTileEntities.values()); @@ -176,7 +196,7 @@ public class RenderedContraption { return renderWorld; } - public static BufferBuilder buildStructure(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) { + private static BufferBuilder buildStructure(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) { ForgeHooksClient.setRenderLayer(layer); MatrixStack ms = new MatrixStack(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java index 02fa03770..cbd2ee461 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java @@ -4,6 +4,7 @@ import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.content.contraptions.base.KineticVertexAttributes; import com.simibubi.create.content.contraptions.base.KineticData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import java.nio.ByteBuffer; @@ -25,6 +26,10 @@ public class BeltData extends KineticData { private float maxV; private byte scrollMult; + protected BeltData(InstancedModel owner) { + super(owner); + } + public BeltData setRotation(float rotX, float rotY, float rotZ) { this.rotX = rotX; this.rotY = rotY; @@ -32,7 +37,6 @@ public class BeltData extends KineticData { return this; } - public BeltData setScrollTexture(SpriteShiftEntry spriteShift) { TextureAtlasSprite source = spriteShift.getOriginal(); TextureAtlasSprite target = spriteShift.getTarget(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java index b2e805d25..cb8c64082 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java @@ -2,16 +2,17 @@ package com.simibubi.create.content.contraptions.relays.belt; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import net.minecraft.client.renderer.BufferBuilder; public class BeltInstancedModel extends InstancedModel { - public BeltInstancedModel(BufferBuilder buf) { - super(buf); + public BeltInstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { + super(renderer, buf); } @Override protected BeltData newInstance() { - return new BeltData(); + return new BeltData(this); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java deleted file mode 100644 index afbefca53..000000000 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRendererWithInstancing.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.simibubi.create.content.schematics.client; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; -import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import net.minecraft.client.Minecraft; - -public class SchematicRendererWithInstancing extends SchematicRenderer { - public final ContraptionKineticRenderer tiles; - - public SchematicRendererWithInstancing() { - this.tiles = new ContraptionKineticRenderer(); - } - - @Override - protected void redraw(Minecraft minecraft) { - super.redraw(minecraft); - - tiles.invalidate(); - - schematic.getRenderedTileEntities().forEach(tiles::add); - } - - @Override - public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { - super.render(ms, buffer); - - //tiles.render(RenderType.getCutoutMipped(), FastRenderDispatcher.getProjectionMatrix(), ); - } -} diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index f4c4d6a01..b5c83a913 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -195,7 +195,7 @@ public class ClientEvents { if (!isGameActive()) return; TurntableHandler.gameRenderTick(); - ContraptionRenderDispatcher.renderTick(event); + ContraptionRenderDispatcher.renderTick(); } protected static boolean isGameActive() { diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java index 0014fea7c..c3fecc726 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.mixin; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.backend.Backend; @@ -38,17 +39,12 @@ public class RenderHooksMixin { private void renderLayer(RenderType type, MatrixStack stack, double camX, double camY, double camZ, CallbackInfo ci) { if (!Backend.available()) return; - float cameraX = (float) camX; - float cameraY = (float) camY; - float cameraZ = (float) camZ; - - Matrix4f viewProjection = Matrix4f.translate(-cameraX, -cameraY, -cameraZ); - viewProjection.multiplyBackward(stack.peek().getModel()); + Matrix4f viewProjection = stack.peek().getModel().copy(); viewProjection.multiplyBackward(FastRenderDispatcher.getProjectionMatrix()); - FastRenderDispatcher.renderLayer(type, viewProjection, cameraX, cameraY, cameraZ); + FastRenderDispatcher.renderLayer(type, viewProjection, camX, camY, camZ); - ContraptionRenderDispatcher.renderLayer(type, viewProjection, cameraX, cameraY, cameraZ); + ContraptionRenderDispatcher.renderLayer(type, viewProjection, camX, camY, camZ); GL20.glUseProgram(0); } @@ -60,6 +56,6 @@ public class RenderHooksMixin { OptifineHandler.refresh(); Backend.refresh(); - if (world != null) world.loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); + if (Backend.canUseInstancing() && world != null) world.loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java index 2e75eeeca..40e9de47a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java @@ -4,12 +4,73 @@ import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.backend.instancing.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; + +import java.util.ArrayList; public class KineticRenderer extends InstancedTileRenderer { + public static int MAX_ORIGIN_DISTANCE = 1000; + + public BlockPos originCoordinate = BlockPos.ZERO; + @Override public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(AllProgramSpecs.BELT, BeltInstancedModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(AllProgramSpecs.ROTATING, RotatingInstancedModel::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.BELT, BeltInstancedModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.ROTATING, RotatingInstancedModel::new)); + } + + @Override + public BlockPos getOriginCoordinate() { + return originCoordinate; + } + + @Override + public void tick() { + super.tick(); + + Minecraft mc = Minecraft.getInstance(); + Entity renderViewEntity = mc.renderViewEntity; + + if (renderViewEntity == null) return; + + BlockPos renderViewPosition = renderViewEntity.getPosition(); + + int dX = Math.abs(renderViewPosition.getX() - originCoordinate.getX()); + int dY = Math.abs(renderViewPosition.getY() - originCoordinate.getY()); + int dZ = Math.abs(renderViewPosition.getZ() - originCoordinate.getZ()); + + if (dX > MAX_ORIGIN_DISTANCE || + dY > MAX_ORIGIN_DISTANCE || + dZ > MAX_ORIGIN_DISTANCE) { + + originCoordinate = renderViewPosition; + + ArrayList instancedTiles = new ArrayList<>(instances.keySet()); + invalidate(); + instancedTiles.forEach(this::add); + } + } + + @Override + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback callback) { + BlockPos originCoordinate = getOriginCoordinate(); + + camX -= originCoordinate.getX(); + camY -= originCoordinate.getY(); + camZ -= originCoordinate.getZ(); + + Matrix4f translate = Matrix4f.translate((float) -camX, (float) -camY, (float) -camZ); + + translate.multiplyBackward(viewProjection); + + super.render(layer, translate, camX, camY, camZ, callback); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index 597b22279..5218b3a98 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -34,8 +34,6 @@ import java.util.function.Predicate; public class Backend { public static final Logger log = LogManager.getLogger(Backend.class); - public static final FloatBuffer FLOAT_BUFFER = MemoryUtil.memAllocFloat(1); // TODO: these leak 80 bytes of memory per program launch - public static final FloatBuffer VEC4_BUFFER = MemoryUtil.memAllocFloat(4); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); private static final Map> registry = new HashMap<>(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index e5f40c872..07e7e91bf 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -29,7 +29,6 @@ import java.util.function.Consumer; public class FastRenderDispatcher { public static WorldAttached> queuedUpdates = new WorldAttached<>(ConcurrentHashMap::newKeySet); - public static WorldAttached> addedLastTick = new WorldAttached<>(ConcurrentHashMap::new); private static Matrix4f projectionMatrixThisFrame = null; @@ -44,26 +43,7 @@ public class FastRenderDispatcher { public static void tick() { ClientWorld world = Minecraft.getInstance().world; - // Clean up twice a second. This doesn't have to happen every tick, - // but this does need to be run to ensure we don't miss anything. - int ticks = AnimationTickHolder.getTicks(); - - ConcurrentHashMap map = addedLastTick.get(world); - map - .entrySet() - .stream() - .filter(it -> ticks - it.getValue() > 10) - .map(Map.Entry::getKey) - .forEach(te -> { - map.remove(te); - - CreateClient.kineticRenderer.onLightUpdate(te); - }); - - - if (ticks % 10 == 0) { - CreateClient.kineticRenderer.clean(); - } + CreateClient.kineticRenderer.tick(); runQueue(queuedUpdates.get(world), CreateClient.kineticRenderer::update); } @@ -98,7 +78,7 @@ public class FastRenderDispatcher { } } - public static void renderLayer(RenderType layer, Matrix4f viewProjection, float cameraX, float cameraY, float cameraZ) { + public static void renderLayer(RenderType layer, Matrix4f viewProjection, double cameraX, double cameraY, double cameraZ) { if (!Backend.canUseInstancing()) return; layer.startDrawing(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java index c75fa89eb..260921c56 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java @@ -37,14 +37,14 @@ public class BasicProgram extends GlProgram { uLightMap = setSamplerBinding("uLightMap", 2); } - public void bind(Matrix4f viewProjection, float camX, float camY, float camZ, int debugMode) { + public void bind(Matrix4f viewProjection, double camX, double camY, double camZ, int debugMode) { super.bind(); GL20.glUniform1i(uDebug, debugMode); GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTick()); uploadMatrixUniform(uViewProjection, viewProjection); - GL20.glUniform3f(uCameraPos, camX, camY, camZ); + GL20.glUniform3f(uCameraPos, (float) camX, (float) camY, (float) camZ); GL20.glUniform2f(uFogRange, GlFog.getFogStart(), GlFog.getFogEnd()); GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java index f713b04c1..2facfb415 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java @@ -4,6 +4,12 @@ import java.nio.ByteBuffer; public abstract class InstanceData { + protected final InstancedModel owner; + + protected InstanceData(InstancedModel owner) { + this.owner = owner; + } + public abstract void write(ByteBuffer buf); public void putVec4(ByteBuffer buf, float x, float y, float z, float w) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index 42c7e2acf..c82c6bd38 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -17,6 +17,8 @@ import java.util.function.Consumer; public abstract class InstancedModel extends BufferedModel { public static final VertexFormat FORMAT = VertexFormat.builder().addAttributes(ModelVertexAttributes.class).build(); + public final InstancedTileRenderer renderer; + protected GlVertexArray vao; protected GlBuffer instanceVBO; protected int glBufferSize = -1; @@ -27,8 +29,9 @@ public abstract class InstancedModel extends BufferedMod protected int minIndexChanged = -1; protected int maxIndexChanged = -1; - public InstancedModel(BufferBuilder buf) { + public InstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { super(buf); + this.renderer = renderer; } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 35507966f..ab30eaa36 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -1,19 +1,27 @@ package com.simibubi.create.foundation.render.backend.instancing; +import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.WorldAttached; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.world.ClientWorld; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public abstract class InstancedTileRenderer

{ + public static WorldAttached> addedLastTick = new WorldAttached<>(ConcurrentHashMap::new); + protected Map> instances = new HashMap<>(); protected Map, RenderMaterial> materials = new HashMap<>(); @@ -22,8 +30,35 @@ public abstract class InstancedTileRenderer

{ registerMaterials(); } + public abstract BlockPos getOriginCoordinate(); + public abstract void registerMaterials(); + public void tick() { + ClientWorld world = Minecraft.getInstance().world; + + int ticks = AnimationTickHolder.getTicks(); + + ConcurrentHashMap map = addedLastTick.get(world); + map + .entrySet() + .stream() + .filter(it -> ticks - it.getValue() > 10) + .map(Map.Entry::getKey) + .forEach(te -> { + map.remove(te); + + onLightUpdate(te); + }); + + + // Clean up twice a second. This doesn't have to happen every tick, + // but this does need to be run to ensure we don't miss anything. + if (ticks % 10 == 0) { + clean(); + } + } + @SuppressWarnings("unchecked") public > RenderMaterial getMaterial(MaterialType materialType) { return (RenderMaterial) materials.get(materialType); @@ -47,7 +82,7 @@ public abstract class InstancedTileRenderer

{ TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); if (renderer != null) { - FastRenderDispatcher.addedLastTick.get(tile.getWorld()).put(tile, AnimationTickHolder.getTicks()); + addedLastTick.get(tile.getWorld()).put(tile, AnimationTickHolder.getTicks()); instances.put(tile, renderer); } @@ -58,6 +93,8 @@ public abstract class InstancedTileRenderer

{ } public void onLightUpdate(T tile) { + if (!Backend.canUseInstancing()) return; + if (tile instanceof IInstanceRendered) { TileEntityInstance instance = getInstance(tile, false); @@ -67,12 +104,16 @@ public abstract class InstancedTileRenderer

{ } public void add(T tile) { + if (!Backend.canUseInstancing()) return; + if (tile instanceof IInstanceRendered) { getInstance(tile); } } public void update(T tile) { + if (!Backend.canUseInstancing()) return; + if (tile instanceof IInstanceRendered) { TileEntityInstance instance = getInstance(tile, false); @@ -82,6 +123,8 @@ public abstract class InstancedTileRenderer

{ } public void remove(T tile) { + if (!Backend.canUseInstancing()) return; + if (tile instanceof IInstanceRendered) { TileEntityInstance instance = getInstance(tile, false); @@ -103,11 +146,11 @@ public abstract class InstancedTileRenderer

{ instances.clear(); } - public void render(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ) { + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { render(layer, viewProjection, camX, camY, camZ, null); } - public void render(RenderType layer, Matrix4f viewProjection, float camX, float camY, float camZ, ShaderCallback

callback) { + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback

callback) { for (RenderMaterial material : materials.values()) { if (material.canRenderInLayer(layer)) material.render(layer, viewProjection, camX, camY, camZ, callback); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java index bc358f799..61d7e36ff 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java @@ -4,5 +4,5 @@ import net.minecraft.client.renderer.BufferBuilder; @FunctionalInterface public interface ModelFactory> { - B convert(BufferBuilder buf); + B makeModel(InstancedTileRenderer renderer, BufferBuilder buf); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java index 64e5eac46..1234f3900 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java @@ -33,6 +33,7 @@ import static com.simibubi.create.foundation.render.Compartment.PARTIAL; public class RenderMaterial

> { + protected final InstancedTileRenderer renderer; protected final Map, Cache> models; protected final ModelFactory factory; protected final ProgramSpec

programSpec; @@ -41,11 +42,12 @@ public class RenderMaterial

programSpec, ModelFactory factory) { - this(programSpec, factory, type -> type == RenderType.getCutoutMipped()); + public RenderMaterial(InstancedTileRenderer renderer, ProgramSpec

programSpec, ModelFactory factory) { + this(renderer, programSpec, factory, type -> type == RenderType.getCutoutMipped()); } - public RenderMaterial(ProgramSpec

programSpec, ModelFactory factory, Predicate layerPredicate) { + public RenderMaterial(InstancedTileRenderer renderer, ProgramSpec

programSpec, ModelFactory factory, Predicate layerPredicate) { + this.renderer = renderer; this.models = new HashMap<>(); this.factory = factory; this.programSpec = programSpec; @@ -59,11 +61,11 @@ public class RenderMaterial

setup) { + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback

setup) { P program = Backend.getProgram(programSpec); program.bind(viewProjection, camX, camY, camZ, FastRenderDispatcher.getDebugMode()); @@ -142,7 +144,7 @@ public class RenderMaterial

{ init(); } - protected abstract void init(); - public final void update() { BlockState currentState = tile.getBlockState(); if (lastState == currentState) { @@ -35,9 +33,24 @@ public abstract class TileEntityInstance { } } + /** + * Acquire all {@link InstanceKey}s and initialize any data you may need to calculate the instance properties. + */ + protected abstract void init(); + + /** + * Update changed instance data using the {@link InstanceKey}s you got in {@link #init()}. + * You don't have to update light data. That should be done in {@link #updateLight()} + */ protected abstract void onUpdate(); - public abstract void updateLight(); + /** + * Called when a light update occurs in the world. If your model needs it, update light here. + */ + public void updateLight() { } + /** + * Call {@link InstanceKey#delete()} on all acquired keys. + */ public abstract void remove(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java index 94c2e5ac5..97f12c48f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java @@ -212,7 +212,7 @@ public class LightVolume { bufferDirty = true; } - public void use() { + public void bind() { // just in case something goes wrong or we accidentally call this before this volume is properly disposed of. if (lightData == null || removed) return; @@ -246,7 +246,7 @@ public class LightVolume { } } - public void release() { + public void unbind() { glTexture.unbind(); } diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index a8bfe94f5..c150f012b 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -67,13 +67,15 @@ void main() { vec4 worldPos = localRotation * vec4(aPos - .5, 1.) + vec4(aInstancePos + .5, 0.); #ifdef CONTRAPTION - worldPos = uModel * worldPos; - BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; - mat4 normalMat = uModel * localRotation; + + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + FragDistance = length(worldPos.xyz); #else mat4 normalMat = localRotation; + + FragDistance = length(worldPos.xyz - uCameraPos); #endif vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; @@ -84,7 +86,6 @@ void main() { Diffuse = diffuse(norm); TexCoords = aTexCoords - aSourceTexture + aScrollTexture.xy + vec2(0, scroll); Light = aLight; - FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; #ifdef CONTRAPTION diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index 5623e01ca..7dbae771c 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -77,7 +77,7 @@ void main() { Diffuse = diffuse(norm); TexCoords = aTexCoords; Light = aModelLight; - FragDistance = length(worldPos.xyz - uCameraPos); + FragDistance = length(worldPos.xyz); gl_Position = uViewProjection * worldPos; if (uDebug == 2) { diff --git a/src/main/resources/assets/create/shader/contraption_structure.vert b/src/main/resources/assets/create/shader/contraption_structure.vert index da8ef4cc8..a665ea8ff 100644 --- a/src/main/resources/assets/create/shader/contraption_structure.vert +++ b/src/main/resources/assets/create/shader/contraption_structure.vert @@ -43,17 +43,17 @@ float diffuse(vec3 normal) { } void main() { - vec4 worldPos = uModel * vec4(aPos, 1.); + vec4 viewPos = uModel * vec4(aPos, 1.); vec3 norm = (uModel * vec4(aNormal, 0.)).xyz; - BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + BoxCoord = (viewPos.xyz - uLightBoxMin) / uLightBoxSize; Diffuse = diffuse(norm); Color = aColor / diffuse(aNormal); TexCoords = aTexCoords; Light = aModelLight; - FragDistance = length(worldPos.xyz - uCameraPos); - gl_Position = uViewProjection * worldPos; + FragDistance = length(viewPos.xyz); + gl_Position = uViewProjection * viewPos; if (uDebug == 2) { Color = vec4(norm, 1.); diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index 3871b6d4f..a1f803139 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -65,13 +65,15 @@ void main() { vec4 worldPos = kineticRotation * vec4(aPos - .5, 1.) + vec4(aInstancePos + .5, 0.); #ifdef CONTRAPTION - worldPos = uModel * worldPos; - BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; - mat4 normalMat = uModel * kineticRotation; + + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + FragDistance = length(worldPos.xyz); #else mat4 normalMat = kineticRotation; + + FragDistance = length(worldPos.xyz - uCameraPos); #endif vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; @@ -79,7 +81,6 @@ void main() { Diffuse = diffuse(norm); TexCoords = aTexCoords; Light = aLight; - FragDistance = length(worldPos.xyz - uCameraPos); gl_Position = uViewProjection * worldPos; #ifdef CONTRAPTION From b9d1a586c191618faf634a034501647ab2ace0d3 Mon Sep 17 00:00:00 2001 From: Zelophed Date: Tue, 16 Feb 2021 00:48:13 +0100 Subject: [PATCH 109/147] Assisted Placement, Part IV MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - added 👻-blocks as a placement preview --- .../com/simibubi/create/CreateClient.java | 15 +- .../structureMovement/bearing/SailBlock.java | 4 +- .../relays/advanced/GantryShaftBlock.java | 1 - .../relays/advanced/SpeedControllerBlock.java | 10 +- .../relays/elementary/CogwheelBlockItem.java | 25 ++- .../simibubi/create/events/ClientEvents.java | 3 + .../foundation/command/HighlightCommand.java | 24 +-- .../command/ToggleDebugCommand.java | 7 +- .../create/foundation/config/CClient.java | 1 + .../create/foundation/utility/VecHelper.java | 61 +++++- .../utility/ghost/GhostBlockParams.java | 50 +++++ .../utility/ghost/GhostBlockRenderer.java | 172 ++++++++++++++++ .../foundation/utility/ghost/GhostBlocks.java | 82 ++++++++ .../utility/placement/IPlacementHelper.java | 24 ++- .../utility/placement/PlacementHelpers.java | 193 ++++++++++++++++-- .../utility/placement/PlacementOffset.java | 59 ++++-- .../utility/placement/util/PoleHelper.java | 8 +- .../resources/META-INF/accesstransformer.cfg | 5 +- 18 files changed, 668 insertions(+), 76 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 51f5007e5..77351c2a0 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -1,10 +1,5 @@ package com.simibubi.create; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; @@ -17,8 +12,8 @@ import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; import com.simibubi.create.foundation.utility.SuperByteBufferCache; +import com.simibubi.create.foundation.utility.ghost.GhostBlocks; import com.simibubi.create.foundation.utility.outliner.Outliner; - import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelShapes; @@ -36,6 +31,11 @@ import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + public class CreateClient { public static ClientSchematicLoader schematicSender; @@ -43,6 +43,7 @@ public class CreateClient { public static SchematicAndQuillHandler schematicAndQuillHandler; public static SuperByteBufferCache bufferCache; public static final Outliner outliner = new Outliner(); + public static GhostBlocks ghostBlocks; private static CustomBlockModels customBlockModels; private static CustomItemModels customItemModels; @@ -67,6 +68,8 @@ public class CreateClient { bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); + ghostBlocks = new GhostBlocks(); + AllKeys.register(); AllContainerTypes.registerScreenFactories(); //AllTileEntities.registerRenderers(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index 9c2255629..2111ebeff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.ProperDirectionalBlock; import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; @@ -216,7 +215,8 @@ public class SailBlock extends ProperDirectionalBlock { @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), state.get(FACING)); + //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), state.get(FACING)); + displayGhost(offset); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java index 05078e359..dab2b86b6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java @@ -279,7 +279,6 @@ public class GantryShaftBlock extends DirectionalKineticBlock { return PlacementOffset.success(offset.getPos(), offset.getTransform() .andThen(s -> s.with(POWERED, state.get(POWERED)))); } - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java index 8d15808c4..caac99749 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java @@ -7,7 +7,6 @@ import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; @@ -20,7 +19,6 @@ import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; @@ -111,9 +109,11 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), - Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, - state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X)); + //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), + // Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, + // state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X)); + + displayGhost(offset); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java index 31a886453..968f729ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java @@ -7,7 +7,6 @@ import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; @@ -150,9 +149,11 @@ public class CogwheelBlockItem extends BlockItem { @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), - Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), - ((CogWheelBlock) state.getBlock()).isLarge ? 1.5D : 0.75D); + //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), + // Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), + // ((CogWheelBlock) state.getBlock()).isLarge ? 1.5D : 0.75D); + + displayGhost(offset); } } @@ -227,8 +228,10 @@ public class CogwheelBlockItem extends BlockItem { @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), - Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), 1D); + //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), + // Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), 1D); + + displayGhost(offset); } protected boolean hitOnShaft(BlockState state, BlockRayTraceResult ray) { @@ -320,10 +323,12 @@ public class CogwheelBlockItem extends BlockItem { @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), - Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, offset.getTransform() - .apply(AllBlocks.LARGE_COGWHEEL.getDefaultState()) - .get(AXIS))); + //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), + // Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, offset.getTransform() + // .apply(AllBlocks.LARGE_COGWHEEL.getDefaultState()) + // .get(AXIS))); + + displayGhost(offset); } } } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 6ff99a9dc..333166ffd 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -104,6 +104,7 @@ public class ClientEvents { ArmInteractionPointHandler.tick(); PlacementHelpers.tick(); CreateClient.outliner.tickOutlines(); + CreateClient.ghostBlocks.tickGhosts(); } @SubscribeEvent @@ -122,6 +123,8 @@ public class ClientEvents { CouplingRenderer.renderAll(ms, buffer); CreateClient.schematicHandler.render(ms, buffer); + CreateClient.ghostBlocks.renderAll(ms, buffer); + CreateClient.outliner.renderOutlines(ms, buffer); // CollisionDebugger.render(ms, buffer); buffer.draw(); diff --git a/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java b/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java index 6071c14f9..16a0e1528 100644 --- a/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java @@ -24,19 +24,7 @@ public class HighlightCommand { public static ArgumentBuilder register() { return Commands.literal("highlight") .requires(cs -> cs.hasPermissionLevel(0)) - .requires(AllCommands.sourceIsPlayer) .then(Commands.argument("pos", BlockPosArgument.blockPos()) - .requires(AllCommands.sourceIsPlayer) - .executes(ctx -> { - BlockPos pos = BlockPosArgument.getLoadedBlockPos(ctx, "pos"); - - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), - new HighlightPacket(pos) - ); - - return Command.SINGLE_SUCCESS; - }) .then(Commands.argument("players", EntityArgument.players()) .executes(ctx -> { Collection players = EntityArgument.getPlayers(ctx, "players"); @@ -52,7 +40,19 @@ public class HighlightCommand { return players.size(); }) ) + //.requires(AllCommands.sourceIsPlayer) + .executes(ctx -> { + BlockPos pos = BlockPosArgument.getLoadedBlockPos(ctx, "pos"); + + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), + new HighlightPacket(pos) + ); + + return Command.SINGLE_SUCCESS; + }) ) + //.requires(AllCommands.sourceIsPlayer) .executes(ctx -> { ServerPlayerEntity player = ctx.getSource().asPlayer(); return highlightAssemblyExceptionFor(player, ctx.getSource()); diff --git a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java index a12ec72d2..a6adfb9f7 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java @@ -1,9 +1,9 @@ package com.simibubi.create.foundation.command; +import com.mojang.brigadier.Command; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.foundation.networking.AllPackets; - import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.entity.player.ServerPlayerEntity; @@ -30,7 +30,8 @@ public class ToggleDebugCommand { ctx.getSource().sendFeedback(new StringTextComponent((value ? "enabled" : "disabled") + " rainbow debug"), true); - return 1; - })); + return Command.SINGLE_SUCCESS; + }) + ); } } diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index b4aabef30..7954b2545 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -15,6 +15,7 @@ public class CClient extends ConfigBase { public ConfigInt overlayOffsetX = i(20, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX", "Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay"); public ConfigInt overlayOffsetY = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetY", "Offset the overlay from goggle- and hover- information by this many pixels on the Y axis; Use /create overlay"); + public ConfigBool smoothPlacementIndicator = b(false, "smoothPlacementIndicator", "Use an alternative indicator when showing where the assisted placement ends up relative to your crosshair"); @Override public String getName() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index d5cac157a..502e176a7 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -1,9 +1,11 @@ package com.simibubi.create.foundation.utility; -import java.util.Random; - -import javax.annotation.Nullable; - +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.Quaternion; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.DoubleNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.util.Direction; @@ -13,6 +15,9 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; +import javax.annotation.Nullable; +import java.util.Random; + public class VecHelper { public static final Vec3d CENTER_OF_ORIGIN = new Vec3d(.5, .5, .5); @@ -145,4 +150,52 @@ public class VecHelper { return origin.add(lineDirection.scale(t)); } + //https://forums.minecraftforge.net/topic/88562-116solved-3d-to-2d-conversion/?do=findComment&comment=413573 slightly modified + public static Vec3d projectToPlayerView(Vec3d target, float partialTicks) { + /* The (centered) location on the screen of the given 3d point in the world. + * Result is (dist right of center screen, dist up from center screen, if < 0, then in front of view plane) */ + ActiveRenderInfo ari = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); + Vec3d camera_pos = ari.getProjectedView(); + Quaternion camera_rotation_conj = ari.getRotation().copy(); + camera_rotation_conj.conjugate(); + + Vector3f result3f = new Vector3f((float) (camera_pos.x - target.x), + (float) (camera_pos.y - target.y), + (float) (camera_pos.z - target.z)); + result3f.func_214905_a(camera_rotation_conj); + + // ----- compensate for view bobbing (if active) ----- + // the following code adapted from GameRenderer::applyBobbing (to invert it) + Minecraft mc = Minecraft.getInstance(); + if (mc.gameSettings.viewBobbing) { + Entity renderViewEntity = mc.getRenderViewEntity(); + if (renderViewEntity instanceof PlayerEntity) { + PlayerEntity playerentity = (PlayerEntity) renderViewEntity; + float distwalked_modified = playerentity.distanceWalkedModified; + + float f = distwalked_modified - playerentity.prevDistanceWalkedModified; + float f1 = -(distwalked_modified + f * partialTicks); + float f2 = MathHelper.lerp(partialTicks, playerentity.prevCameraYaw, playerentity.cameraYaw); + Quaternion q2 = new Quaternion(Vector3f.POSITIVE_X, Math.abs(MathHelper.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F, true); + q2.conjugate(); + result3f.func_214905_a(q2); + + Quaternion q1 = new Quaternion(Vector3f.POSITIVE_Z, MathHelper.sin(f1 * (float) Math.PI) * f2 * 3.0F, true); + q1.conjugate(); + result3f.func_214905_a(q1); + + Vector3f bob_translation = new Vector3f((MathHelper.sin(f1 * (float) Math.PI) * f2 * 0.5F), (-Math.abs(MathHelper.cos(f1 * (float) Math.PI) * f2)), 0.0f); + bob_translation.setY(-bob_translation.getY()); // this is weird but hey, if it works + result3f.add(bob_translation); + } + } + + // ----- adjust for fov ----- + float fov = (float) mc.gameRenderer.getFOVModifier(ari, partialTicks, true); + + float half_height = (float) mc.getWindow().getScaledHeight() / 2; + float scale_factor = half_height / (result3f.getZ() * (float) Math.tan(Math.toRadians(fov / 2))); + return new Vec3d(-result3f.getX() * scale_factor, result3f.getY() * scale_factor, result3f.getZ()); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java new file mode 100644 index 000000000..5723d19b1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java @@ -0,0 +1,50 @@ +package com.simibubi.create.foundation.utility.ghost; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; + +import java.util.function.Supplier; + +public class GhostBlockParams { + + protected final BlockState state; + protected BlockPos pos; + protected Supplier alphaSupplier; + + private GhostBlockParams(BlockState state) { + this.state = state; + this.pos = BlockPos.ZERO; + this.alphaSupplier = () -> 1f; + } + + public static GhostBlockParams of(BlockState state) { + return new GhostBlockParams(state); + } + + public static GhostBlockParams of(Block block) { + return of(block.getDefaultState()); + } + + public GhostBlockParams at(BlockPos pos) { + this.pos = pos; + return this; + } + + public GhostBlockParams at(int x, int y, int z) { + return this.at(new BlockPos(x, y, z)); + } + + public GhostBlockParams alpha(Supplier alphaSupplier) { + this.alphaSupplier = alphaSupplier; + return this; + } + + public GhostBlockParams alpha(float alpha) { + return this.alpha(() -> alpha); + } + + public GhostBlockParams breathingAlpha() { + return this.alpha(() -> (float) GhostBlocks.getBreathingAlpha()); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java new file mode 100644 index 000000000..5f18c34d7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java @@ -0,0 +1,172 @@ +package com.simibubi.create.foundation.utility.ghost; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.VirtualEmptyModelData; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3i; +import org.lwjgl.system.MemoryStack; + +import javax.annotation.Nullable; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.List; +import java.util.Random; + +public abstract class GhostBlockRenderer { + + private static final GhostBlockRenderer transparent = new TransparentGhostBlockRenderer(); + public static GhostBlockRenderer transparent() { + return transparent; + } + + private static final GhostBlockRenderer standard = new DefaultGhostBlockRenderer(); + public static GhostBlockRenderer standard() { + return standard; + } + + + public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params); + + private static class DefaultGhostBlockRenderer extends GhostBlockRenderer { + + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { + ms.push(); + + BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + + IBakedModel model = dispatcher.getModelForState(params.state); + + RenderType layer = RenderTypeLookup.getEntityBlockLayer(params.state); + IVertexBuilder vb = buffer.getEarlyBuffer(layer); + + BlockPos pos = params.pos; + ms.translate(pos.getX(), pos.getY(), pos.getZ()); + + dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); + + ms.pop(); + } + + } + + private static class TransparentGhostBlockRenderer extends GhostBlockRenderer { + + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { + + //prepare + ms.push(); + + //RenderSystem.pushMatrix(); + + BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + + IBakedModel model = dispatcher.getModelForState(params.state); + + //RenderType layer = RenderTypeLookup.getEntityBlockLayer(params.state); + RenderType layer = RenderType.getTranslucent(); + IVertexBuilder vb = buffer.getEarlyBuffer(layer); + + BlockPos pos = params.pos; + ms.translate(pos.getX(), pos.getY(), pos.getZ()); + + //dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); + renderModel(params, ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); + + //buffer.draw(); + //clean + //RenderSystem.popMatrix(); + ms.pop(); + + } + + //BlockModelRenderer + public void renderModel(GhostBlockParams params, MatrixStack.Entry entry, IVertexBuilder vb, @Nullable BlockState state, IBakedModel model, float p_228804_5_, float p_228804_6_, float p_228804_7_, int p_228804_8_, int p_228804_9_, net.minecraftforge.client.model.data.IModelData modelData) { + Random random = new Random(); + + for (Direction direction : Direction.values()) { + random.setSeed(42L); + renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_, model.getQuads(state, direction, random, modelData), p_228804_8_, p_228804_9_); + } + + random.setSeed(42L); + renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_, model.getQuads(state, (Direction) null, random, modelData), p_228804_8_, p_228804_9_); + } + + //BlockModelRenderer + private static void renderQuad(GhostBlockParams params, MatrixStack.Entry p_228803_0_, IVertexBuilder p_228803_1_, float p_228803_2_, float p_228803_3_, float p_228803_4_, List p_228803_5_, int p_228803_6_, int p_228803_7_) { + Float alpha = params.alphaSupplier.get(); + + for (BakedQuad bakedquad : p_228803_5_) { + float f; + float f1; + float f2; + if (bakedquad.hasTintIndex()) { + f = MathHelper.clamp(p_228803_2_, 0.0F, 1.0F); + f1 = MathHelper.clamp(p_228803_3_, 0.0F, 1.0F); + f2 = MathHelper.clamp(p_228803_4_, 0.0F, 1.0F); + } else { + f = 1.0F; + f1 = 1.0F; + f2 = 1.0F; + } + + quad(alpha, p_228803_1_, p_228803_0_, bakedquad, new float[]{1f, 1f, 1f, 1f}, f, f1, f2, new int[]{p_228803_6_, p_228803_6_, p_228803_6_, p_228803_6_}, p_228803_7_); + } + + } + + //IVertexBuilder + static void quad(float alpha, IVertexBuilder vb, MatrixStack.Entry p_227890_1_, BakedQuad p_227890_2_, float[] p_227890_3_, float p_227890_4_, float p_227890_5_, float p_227890_6_, int[] p_227890_7_, int p_227890_8_) { + int[] aint = p_227890_2_.getVertexData(); + Vec3i vec3i = p_227890_2_.getFace().getDirectionVec(); + Vector3f vector3f = new Vector3f((float) vec3i.getX(), (float) vec3i.getY(), (float) vec3i.getZ()); + Matrix4f matrix4f = p_227890_1_.getModel(); + vector3f.transform(p_227890_1_.getNormal()); + int i = 8; + int j = aint.length / 8; + + try (MemoryStack memorystack = MemoryStack.stackPush()) { + ByteBuffer bytebuffer = memorystack.malloc(DefaultVertexFormats.BLOCK.getSize()); + IntBuffer intbuffer = bytebuffer.asIntBuffer(); + + for (int k = 0; k < j; ++k) { + ((Buffer) intbuffer).clear(); + intbuffer.put(aint, k * 8, 8); + float f = bytebuffer.getFloat(0); + float f1 = bytebuffer.getFloat(4); + float f2 = bytebuffer.getFloat(8); + float r; + float g; + float b; + + r = p_227890_3_[k] * p_227890_4_; + g = p_227890_3_[k] * p_227890_5_; + b = p_227890_3_[k] * p_227890_6_; + + + int l = vb.applyBakedLighting(p_227890_7_[k], bytebuffer); + float f9 = bytebuffer.getFloat(16); + float f10 = bytebuffer.getFloat(20); + Vector4f vector4f = new Vector4f(f, f1, f2, 1.0F); + vector4f.transform(matrix4f); + vb.applyBakedNormals(vector3f, bytebuffer, p_227890_1_.getNormal()); + vb.vertex(vector4f.getX(), vector4f.getY(), vector4f.getZ(), r, g, b, alpha, f9, f10, p_227890_8_, l, vector3f.getX(), vector3f.getY(), vector3f.getZ()); + } + } + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java new file mode 100644 index 000000000..01d31b076 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java @@ -0,0 +1,82 @@ +package com.simibubi.create.foundation.utility.ghost; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import net.minecraft.block.BlockState; + +import java.util.HashMap; +import java.util.Map; + +public class GhostBlocks { + + public static double getBreathingAlpha() { + double period = 2500; + double timer = System.currentTimeMillis() % period; + double offset = Math.cos((2d/period) * Math.PI * timer); + return 0.75d - 0.2d * offset; + } + + final Map ghosts; + + public GhostBlockParams showGhostState(Object slot, BlockState state) { + return showGhostState(slot, state, 1); + } + + public GhostBlockParams showGhostState(Object slot, BlockState state, int ttl) { + Entry e = refresh(slot, GhostBlockRenderer.transparent(), GhostBlockParams.of(state), ttl); + return e.params; + } + + public GhostBlockParams showGhost(Object slot, GhostBlockRenderer ghost, GhostBlockParams params, int ttl) { + Entry e = refresh(slot, ghost, params, ttl); + return e.params; + } + + private Entry refresh(Object slot, GhostBlockRenderer ghost, GhostBlockParams params, int ttl) { + if (!ghosts.containsKey(slot)) + ghosts.put(slot, new Entry(ghost, params, ttl)); + + Entry e = ghosts.get(slot); + e.ticksToLive = ttl; + e.params = params; + e.ghost = ghost; + return e; + } + + public GhostBlocks() { + ghosts = new HashMap<>(); + } + + public void tickGhosts() { + ghosts.forEach((slot, entry) -> entry.ticksToLive--); + ghosts.entrySet().removeIf(e -> !e.getValue().isAlive()); + } + + public void renderAll(MatrixStack ms, SuperRenderTypeBuffer buffer) { + ghosts.forEach((slot, entry) -> { + GhostBlockRenderer ghost = entry.ghost; + ghost.render(ms, buffer, entry.params); + }); + } + + static class Entry { + + private GhostBlockRenderer ghost; + private GhostBlockParams params; + private int ticksToLive; + + public Entry(GhostBlockRenderer ghost, GhostBlockParams params) { + this(ghost, params, 1); + } + + public Entry(GhostBlockRenderer ghost, GhostBlockParams params, int ttl) { + this.ghost = ghost; + this.params = params; + this.ticksToLive = ttl; + } + + public boolean isAlive() { + return ticksToLive >= 0; + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java index 082776a7c..c74301353 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java @@ -7,6 +7,7 @@ import com.simibubi.create.foundation.utility.VecHelper; import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -46,9 +47,21 @@ public interface IPlacementHelper { */ PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray); + //overrides the default ghost state of the helper with the actual state of the held block item, this is used in PlacementHelpers and can be ignored in most cases + default PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray, ItemStack heldItem) { + PlacementOffset offset = getOffset(world, state, pos, ray); + if (heldItem.getItem() instanceof BlockItem) { + BlockItem blockItem = (BlockItem) heldItem.getItem(); + offset = offset.withGhostState(blockItem.getBlock().getDefaultState()); + } + return offset; + } + //only gets called when placementOffset is successful default void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), ray.getFace()); + //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), ray.getFace()); + + displayGhost(offset); } static void renderArrow(Vec3d center, Vec3d target, Direction arrowPlane) { @@ -67,6 +80,15 @@ public interface IPlacementHelper { CreateClient.outliner.showLine("placementArrowB" + center + target, start.add(offset), endB.add(offset)).lineWidth(1/16f); } + default void displayGhost(PlacementOffset offset) { + if (!offset.hasGhostState()) + return; + + CreateClient.ghostBlocks.showGhostState(this, offset.getTransform().apply(offset.getGhostState())) + .at(offset.getBlockPos()) + .breathingAlpha(); + } + static List orderedByDistanceOnlyAxis(BlockPos pos, Vec3d hit, Direction.Axis axis) { return orderedByDistance(pos, hit, dir -> dir.getAxis() == axis); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java index 7645ef75f..0026d5fe6 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java @@ -1,22 +1,43 @@ package com.simibubi.create.foundation.utility.placement; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingAngle; +import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import org.lwjgl.opengl.GL11; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +@Mod.EventBusSubscriber public class PlacementHelpers { private static final List helpers = new ArrayList<>(); + private static int animationTick = 0; + private static final InterpolatedChasingValue angle = new InterpolatedChasingAngle().withSpeed(0.15f); + private static BlockPos target = null; + private static BlockPos lastTarget = null; public static int register(IPlacementHelper helper) { helpers.add(helper); @@ -32,6 +53,23 @@ public class PlacementHelpers { @OnlyIn(Dist.CLIENT) public static void tick() { + setTarget(null); + checkHelpers(); + + if (target == null) { + if (animationTick > 0) + animationTick = Math.max(animationTick - 2, 0); + + return; + } + + if (animationTick < 10) + animationTick++; + + } + + @OnlyIn(Dist.CLIENT) + private static void checkHelpers() { Minecraft mc = Minecraft.getInstance(); ClientWorld world = mc.world; @@ -46,29 +84,154 @@ public class PlacementHelpers { if (mc.player == null) return; - List filteredForHeldItem = helpers.stream().filter(helper -> Arrays.stream(Hand.values()).anyMatch(hand -> helper.getItemPredicate().test(mc.player.getHeldItem(hand)))).collect(Collectors.toList()); - if (filteredForHeldItem.isEmpty()) - return; - if (mc.player.isSneaking())//for now, disable all helpers when sneaking TODO add helpers that respect sneaking but still show position return; - BlockPos pos = ray.getPos(); - BlockState state = world.getBlockState(pos); + for (Hand hand : Hand.values()) { - List filteredForState = filteredForHeldItem.stream().filter(helper -> helper.getStatePredicate().test(state)).collect(Collectors.toList()); + ItemStack heldItem = mc.player.getHeldItem(hand); + List filteredForHeldItem = helpers.stream().filter(helper -> helper.matchesItem(heldItem)).collect(Collectors.toList()); + if (filteredForHeldItem.isEmpty()) + continue; - if (filteredForState.isEmpty()) - return; + BlockPos pos = ray.getPos(); + BlockState state = world.getBlockState(pos); - for (IPlacementHelper h : filteredForState) { - PlacementOffset offset = h.getOffset(world, state, pos, ray); + List filteredForState = filteredForHeldItem.stream().filter(helper -> helper.matchesState(state)).collect(Collectors.toList()); + if (filteredForState.isEmpty()) + continue; + + boolean atLeastOneMatch = false; + for (IPlacementHelper h : filteredForState) { + PlacementOffset offset = h.getOffset(world, state, pos, ray, heldItem); + + if (offset.isSuccessful()) { + h.renderAt(pos, state, ray, offset); + setTarget(offset.getBlockPos()); + atLeastOneMatch = true; + break; + } - if (offset.isSuccessful()) { - h.renderAt(pos, state, ray, offset); - break; } + //at least one helper activated, no need to check the offhand if we are still in the mainhand + if (atLeastOneMatch) + return; + } } + + static void setTarget(BlockPos target) { + PlacementHelpers.target = target; + + if (target == null) + return; + + if (lastTarget == null) { + lastTarget = target; + return; + } + + if (!lastTarget.equals(target)) + lastTarget = target; + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public static void onRender(RenderGameOverlayEvent.Pre event) { + if (event.getType() != RenderGameOverlayEvent.ElementType.CROSSHAIRS) + return; + + Minecraft mc = Minecraft.getInstance(); + PlayerEntity player = mc.player; + + if (player != null && animationTick > 0) { + MainWindow res = event.getWindow(); + //MatrixStack matrix = event.getMatrix(); + //String text = "( )"; + + //matrix.push(); + //matrix.translate(res.getScaledWidth() / 2F, res.getScaledHeight() / 2f - 4, 0); + float screenY = res.getScaledHeight() / 2f; + float screenX = res.getScaledWidth() / 2f; + //float y = screenY - 3.5f; + //float x = screenX; + //x -= mc.fontRenderer.getStringWidth(text)/2f - 0.25f; + + float progress = Math.min(animationTick / 10f/* + event.getPartialTicks()*/, 1f); + //int opacity = ((int) (255 * (progress * progress))) << 24; + + //mc.fontRenderer.drawString(text, x, y, 0xFFFFFF | opacity); + + boolean flag = AllConfigs.CLIENT.smoothPlacementIndicator.get(); + if (flag) + drawDirectionIndicator(event.getPartialTicks(), screenX, screenY, progress); + + else { + //TODO find something more in style + } + //matrix.pop(); + } + } + + @OnlyIn(Dist.CLIENT) + private static void drawDirectionIndicator(float partialTicks, float centerX, float centerY, float progress) { + float r = .8f; + float g = .8f; + float b = .8f; + float a = progress * progress; + + Vec3d projTarget = VecHelper.projectToPlayerView(VecHelper.getCenterOf(lastTarget), partialTicks); + + Vec3d target = new Vec3d(projTarget.x, projTarget.y, 0); + Vec3d norm = target.normalize(); + Vec3d ref = new Vec3d(0, 1, 0); + float targetAngle = AngleHelper.deg(Math.acos(norm.dotProduct(ref))); + + if (norm.x > 0) { + targetAngle = 360 - targetAngle; + } + + if (animationTick < 10) + angle.set(targetAngle); + + angle.target(targetAngle); + angle.tick(); + + + float length = 10; + //TOD O if the target is off screen, use length to show a meaningful distance + + RenderSystem.pushMatrix(); + RenderSystem.disableTexture(); + RenderSystem.enableBlend(); + RenderSystem.disableAlphaTest(); + RenderSystem.defaultBlendFunc(); + RenderSystem.shadeModel(GL11.GL_SMOOTH); + + RenderSystem.translated(centerX, centerY, 0); + RenderSystem.rotatef(angle.get(0.1f), 0, 0, -1); + //RenderSystem.scaled(3, 3, 3); + + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferbuilder = tessellator.getBuffer(); + bufferbuilder.begin(GL11.GL_POLYGON, DefaultVertexFormats.POSITION_COLOR); + + bufferbuilder.vertex(0, - (10 + length), 0).color(r, g, b, a).endVertex(); + + bufferbuilder.vertex(-9, -3, 0).color(r, g, b, 0f).endVertex(); + bufferbuilder.vertex(-6, -6, 0).color(r, g, b, 0f).endVertex(); + bufferbuilder.vertex(-3, -8, 0).color(r, g, b, 0f).endVertex(); + bufferbuilder.vertex(0, -8.5, 0).color(r, g, b, 0f).endVertex(); + bufferbuilder.vertex(3, -8, 0).color(r, g, b, 0f).endVertex(); + bufferbuilder.vertex(6, -6, 0).color(r, g, b, 0f).endVertex(); + bufferbuilder.vertex(9, -3, 0).color(r, g, b, 0f).endVertex(); + + tessellator.draw(); + RenderSystem.shadeModel(GL11.GL_FLAT); + RenderSystem.disableBlend(); + RenderSystem.enableAlphaTest(); + RenderSystem.enableTexture(); + RenderSystem.popMatrix(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java index e9d50d6d5..d6251384e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java @@ -27,25 +27,46 @@ import java.util.function.Function; public class PlacementOffset { private final boolean success; - private final Vec3i pos; - private final Function stateTransform; + private Vec3i pos; + private Function stateTransform; + private BlockState ghostState; - private PlacementOffset(boolean success, Vec3i pos, Function transform) { + private PlacementOffset(boolean success) { this.success = success; - this.pos = pos; - this.stateTransform = transform == null ? Function.identity() : transform; + this.pos = BlockPos.ZERO; + this.stateTransform = Function.identity(); + this.ghostState = null; } public static PlacementOffset fail() { - return new PlacementOffset(false, Vec3i.NULL_VECTOR, null); + return new PlacementOffset(false); + } + + public static PlacementOffset success() { + return new PlacementOffset(true); } public static PlacementOffset success(Vec3i pos) { - return new PlacementOffset(true, pos, null); + return success().at(pos); } public static PlacementOffset success(Vec3i pos, Function transform) { - return new PlacementOffset(true, pos, transform); + return success().at(pos).withTransform(transform); + } + + public PlacementOffset at(Vec3i pos) { + this.pos = pos; + return this; + } + + public PlacementOffset withTransform(Function stateTransform) { + this.stateTransform = stateTransform; + return this; + } + + public PlacementOffset withGhostState(BlockState ghostState) { + this.ghostState = ghostState; + return this; } public boolean isSuccessful() { @@ -56,10 +77,25 @@ public class PlacementOffset { return pos; } + public BlockPos getBlockPos() { + if (pos instanceof BlockPos) + return (BlockPos) pos; + + return new BlockPos(pos); + } + public Function getTransform() { return stateTransform; } + public boolean hasGhostState() { + return ghostState != null; + } + + public BlockState getGhostState() { + return ghostState; + } + public boolean isReplaceable(World world) { if (!success) return false; @@ -69,16 +105,15 @@ public class PlacementOffset { public ActionResultType placeInWorld(World world, BlockItem blockItem, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { - ItemUseContext context = new ItemUseContext(player, hand, ray); + if (!isReplaceable(world)) + return ActionResultType.PASS; + ItemUseContext context = new ItemUseContext(player, hand, ray); BlockPos newPos = new BlockPos(pos); if (!world.isBlockModifiable(player, newPos)) return ActionResultType.PASS; - if (!isReplaceable(world)) - return ActionResultType.PASS; - BlockState state = stateTransform.apply(blockItem.getBlock().getDefaultState()); if (state.has(BlockStateProperties.WATERLOGGED)) { IFluidState fluidState = world.getFluidState(newPos); diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java index f074a8d5c..fef9b0783 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.utility.placement.util; -import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementOffset; import mcp.MethodsReturnNonnullByDefault; @@ -9,7 +8,6 @@ import net.minecraft.state.IProperty; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import java.util.List; @@ -71,7 +69,9 @@ public abstract class PoleHelper> implements IPlacementH @Override public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - Vec3d centerOffset = new Vec3d(ray.getFace().getDirectionVec()).scale(.3); - IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos).add(centerOffset), VecHelper.getCenterOf(offset.getPos()).add(centerOffset), ray.getFace(), 0.75D); + //Vec3d centerOffset = new Vec3d(ray.getFace().getDirectionVec()).scale(.3); + //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos).add(centerOffset), VecHelper.getCenterOf(offset.getPos()).add(centerOffset), ray.getFace(), 0.75D); + + displayGhost(offset); } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 98de531a9..22c960e77 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -23,4 +23,7 @@ public net.minecraft.tileentity.BeaconTileEntity field_174909_f # beamSegments # Server Tick List (For stopping placed fluids from spilling) public net.minecraft.world.server.ServerTickList field_205374_d # pendingTickListEntriesHashSet -public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet \ No newline at end of file +public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet + +# GameRenderer +public net.minecraft.client.renderer.GameRenderer func_215311_a(Lnet/minecraft/client/renderer/ActiveRenderInfo;FZ)D #getFOVModifier \ No newline at end of file From e4fe371d4c999b08ec94532af0d01c55da416969 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Tue, 16 Feb 2021 13:59:05 -0300 Subject: [PATCH 110/147] Add Spanish language (es_es) (unfinished) --- .../resources/assets/create/lang/es_es.json | 1797 +++++++++++++++++ 1 file changed, 1797 insertions(+) create mode 100644 src/main/resources/assets/create/lang/es_es.json diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json new file mode 100644 index 000000000..9a01ded06 --- /dev/null +++ b/src/main/resources/assets/create/lang/es_es.json @@ -0,0 +1,1797 @@ +{ + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "Ventana de Acacia", + "block.create.acacia_window_pane": "Panel de ventana de acacia", + "block.create.adjustable_chain_gearshift": "Cadena de transmisión ajustable", + "block.create.adjustable_crate": "Caja ajustable", + "block.create.adjustable_pulse_repeater": "Repetidor de pulso ajustable", + "block.create.adjustable_repeater": "Repetidor ajustable", + "block.create.analog_lever": "Palanca analógica", + "block.create.andesite_belt_funnel": "Cinturón de embudo de andesita", + "block.create.andesite_bricks": "Ladrillos de andesita", + "block.create.andesite_bricks_slab": "Losa de ladrillos de andesita", + "block.create.andesite_bricks_stairs": "Escaleras de ladrillos de andesita", + "block.create.andesite_bricks_wall": "Pared de ladrillos de andesita", + "block.create.andesite_casing": "Andesita revestida", + "block.create.andesite_cobblestone": "Adoquín de andesita", + "block.create.andesite_cobblestone_slab": "Losa de adoquín de andesita", + "block.create.andesite_cobblestone_stairs": "Escaleras de adoquines de andesita", + "block.create.andesite_cobblestone_wall": "Muro de adoquines de andesita", + "block.create.andesite_encased_shaft": "Eje revestido de andesita", + "block.create.andesite_funnel": "Embudo de andesita", + "block.create.andesite_pillar": "Poste de andesita", + "block.create.andesite_tunnel": "Túnel de Andesita", + "block.create.basin": "Cuenca", + "block.create.belt": "Cinturón mecánico", + "block.create.birch_window": "Ventana de abedul", + "block.create.birch_window_pane": "Panel de ventana de abedul", + "block.create.black_sail": "Vela negra", + "block.create.black_seat": "Asiento negro", + "block.create.black_valve_handle": "Asa de válvula negra", + "block.create.blaze_burner": "Blaze Burner", + "block.create.blue_sail": "Vela azul", + "block.create.blue_seat": "Asiento azul", + "block.create.blue_valve_handle": "Asa de válvula azul", + "block.create.brass_belt_funnel": "Cinturón de embudo de bronce", + "block.create.brass_block": "Bloque de bronce", + "block.create.brass_casing": "Recubridor de bronce", + "block.create.brass_encased_shaft": "Eje revestido de bronce", + "block.create.brass_funnel": "Embudo de bronce", + "block.create.brass_tunnel": "Túnel de bronce", + "block.create.brown_sail": "Vela marrón", + "block.create.brown_seat": "Asiento marrón", + "block.create.brown_valve_handle": "Asa de válvula marrón", + "block.create.cart_assembler": "Ensamblador de vagonetas", + "block.create.chiseled_dark_scoria": "Escoria oscura cincelada", + "block.create.chiseled_dolomite": "Dolomita cincelada", + "block.create.chiseled_gabbro": "Gabro cincelado", + "block.create.chiseled_limestone": "Caliza cincelada", + "block.create.chiseled_scoria": "Escoria cincelada", + "block.create.chiseled_weathered_limestone": "Piedra caliza erosionada cincelada", + "block.create.chocolate": "Chocolate", + "block.create.chute": "Ducto", + "block.create.clockwork_bearing": "Cojinete de reloj", + "block.create.clutch": "Embrague", + "block.create.cogwheel": "Rueda dentada", + "block.create.content_observer": "Observador de contenidos", + "block.create.controller_rail": "Raíl de control", + "block.create.copper_block": "Bloque de cobre", + "block.create.copper_casing": "Bloque de caliza", + "block.create.copper_ore": "Mineral de cobre", + "block.create.copper_shingles": "Teja de cobre", + "block.create.copper_tiles": "Baldosa de cobre", + "block.create.copper_valve_handle": "Asa de válvula de cobre", + "block.create.creative_crate": "Caja creativa", + "block.create.creative_fluid_tank": "Tanque de fluídos creativo", + "block.create.creative_motor": "Motor creativo", + "block.create.crushing_wheel": "Rueda trituradora", + "block.create.crushing_wheel_controller": "Controlador de Rueda trituradora", + "block.create.cuckoo_clock": "Reloj Cucú", + "block.create.cyan_sail": "Vela cian", + "block.create.cyan_seat": "Asiento cian", + "block.create.cyan_valve_handle": "Asa de válvula cian", + "block.create.dark_oak_window": "Ventana de roble oscuro", + "block.create.dark_oak_window_pane": "Panel de ventana de roble oscuro", + "block.create.dark_scoria": "Escoria oscura", + "block.create.dark_scoria_bricks": "Ladrillos de escoria oscura", + "block.create.dark_scoria_bricks_slab": "Losa de ladrillos de escoria oscura", + "block.create.dark_scoria_bricks_stairs": "Escaleras de ladrillos de escoria oscura", + "block.create.dark_scoria_bricks_wall": "Pared de ladrillos de escoria oscura", + "block.create.dark_scoria_cobblestone": "Adoquines de escoria oscura", + "block.create.dark_scoria_cobblestone_slab": "Losa de adoquines de escoria oscura", + "block.create.dark_scoria_cobblestone_stairs": "Escaleras de adoquines de escoria oscura", + "block.create.dark_scoria_cobblestone_wall": "Pared de adoquines de escoria oscura", + "block.create.dark_scoria_pillar": "Pilar de escoria oscura", + "block.create.deployer": "Desplegador", + "block.create.depot": "Depósito", + "block.create.diorite_bricks": "Ladrillos de diorita", + "block.create.diorite_bricks_slab": "Losa de ladrillos de diorita", + "block.create.diorite_bricks_stairs": "Escaleras de ladrillos de diorita", + "block.create.diorite_bricks_wall": "Pared de ladrillos de diorita", + "block.create.diorite_cobblestone": "Adoquín de diorita", + "block.create.diorite_cobblestone_slab": "Losa de adoquínes de diorita", + "block.create.diorite_cobblestone_stairs": "Escaleras de adoquines de diorita", + "block.create.diorite_cobblestone_wall": "Pared de adoquines de diorita", + "block.create.diorite_pillar": "Pilar de diorita", + "block.create.dolomite": "Dolomita", + "block.create.dolomite_bricks": "Ladrillos de dolomita", + "block.create.dolomite_bricks_slab": "Losa de ladrillos de dolomita", + "block.create.dolomite_bricks_stairs": "Escaleras de ladrillos de dolomita", + "block.create.dolomite_bricks_wall": "Pared de ladrillos de dolomita", + "block.create.dolomite_cobblestone": "Adoquín de dolomita", + "block.create.dolomite_cobblestone_slab": "Losa de adoquín de dolomita", + "block.create.dolomite_cobblestone_stairs": "Escaleras de adoquines de dolomita", + "block.create.dolomite_cobblestone_wall": "Pared de adoquines de dolomita", + "block.create.dolomite_pillar": "Pilar de dolomita", + "block.create.encased_chain_drive": "Cadena de transmisión revestida", + "block.create.encased_fan": "Ventilador revestido", + "block.create.encased_fluid_pipe": "Tubería de fluídos de cobre revestida", + "block.create.fancy_andesite_bricks": "Ladrillos de andesita elegantes", + "block.create.fancy_andesite_bricks_slab": "Ladrillos de andesita elegantes", + "block.create.fancy_andesite_bricks_stairs": "Escaleras de ladrillos de andesita elegantes", + "block.create.fancy_andesite_bricks_wall": "Pared de ladrillos de andesita elegantes", + "block.create.fancy_dark_scoria_bricks": "Ladrillos de escoria oscura elegantes", + "block.create.fancy_dark_scoria_bricks_slab": "Losa de ladrillos de escoria oscura elegantes", + "block.create.fancy_dark_scoria_bricks_stairs": "Escalera de ladrillos de escoria oscura elegantes", + "block.create.fancy_dark_scoria_bricks_wall": "Pared de ladrillos de escoria oscura elegantes", + "block.create.fancy_diorite_bricks": "Ladrillos de diorita elegantes", + "block.create.fancy_diorite_bricks_slab": "Losa de ladrillos de diorita elegantes", + "block.create.fancy_diorite_bricks_stairs": "Escaleras de ladrillos de diorita elegantes", + "block.create.fancy_diorite_bricks_wall": "Pared de ladrillos de diorita elegantes", + "block.create.fancy_dolomite_bricks": "Ladrillos de dolomita elegantes", + "block.create.fancy_dolomite_bricks_slab": "Losa de ladrillos de dolomita elegantes", + "block.create.fancy_dolomite_bricks_stairs": "Escaleras de ladrillos de dolomita elegantes", + "block.create.fancy_dolomite_bricks_wall": "Pared de ladrillos de dolomita elegantes", + "block.create.fancy_gabbro_bricks": "Ladrillos de gabro elegantes", + "block.create.fancy_gabbro_bricks_slab": "Losa de ladrillos de gabro elegantes", + "block.create.fancy_gabbro_bricks_stairs": "Escaleras de ladrillos de gabro elegantes", + "block.create.fancy_gabbro_bricks_wall": "Pared de ladrillos de gabro elegantes", + "block.create.fancy_granite_bricks": "Ladrillos de granito elegantes", + "block.create.fancy_granite_bricks_slab": "Losa de ladrillos de granito elegantes", + "block.create.fancy_granite_bricks_stairs": "Escaleras de ladrillos de granito elegantes", + "block.create.fancy_granite_bricks_wall": "Pared de ladrillos de granito elegantes", + "block.create.fancy_limestone_bricks": "Ladrillos de piedra caliza elegantes", + "block.create.fancy_limestone_bricks_slab": "Losa de ladrillos de piedra caliza elegantes", + "block.create.fancy_limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza elegantes", + "block.create.fancy_limestone_bricks_wall": "Pared de ladrillos de piedra caliza elegantes", + "block.create.fancy_scoria_bricks": "Ladrillos de escoria elegantes", + "block.create.fancy_scoria_bricks_slab": "Losa de ladrillos de escoria elegantes", + "block.create.fancy_scoria_bricks_stairs": "Escaleras de ladrills de escoria elegantes", + "block.create.fancy_scoria_bricks_wall": "Pared de ladrillos de escoria elegantes", + "block.create.fancy_weathered_limestone_bricks": "Ladrillos de piedra de caliza erosionada elegantes", + "block.create.fancy_weathered_limestone_bricks_slab": "Losa de ladrillos de caliza erosionada elegantes", + "block.create.fancy_weathered_limestone_bricks_stairs": "Escaleras de ladrillos de caliza erosionada elegantes", + "block.create.fancy_weathered_limestone_bricks_wall": "Pared de ladrillos de caliza erosionada elegantes", + "block.create.fluid_pipe": "Tubería de fluídos de cobre", + "block.create.fluid_tank": "Depósito de fluidos", + "block.create.fluid_valve": "Válvula de fluidos", + "block.create.flywheel": "Rueda de inercia", + "block.create.framed_glass": "Cristal enmarcado", + "block.create.framed_glass_pane": "Panel de cristal enmarcado", + "block.create.furnace_engine": "Motor de horno", + "block.create.gabbro": "Gabro", + "block.create.gabbro_bricks": "Ladrillos de gabro", + "block.create.gabbro_bricks_slab": "Losa de ladrillos de gabro", + "block.create.gabbro_bricks_stairs": "Escaleras de ladrillos de gabro", + "block.create.gabbro_bricks_wall": "Pared de ladrillos de gabro", + "block.create.gabbro_cobblestone": "Adoquín de gabro", + "block.create.gabbro_cobblestone_slab": "Losa de adoquínes de gabro", + "block.create.gabbro_cobblestone_stairs": "Escaleras de adoquínes de gabro", + "block.create.gabbro_cobblestone_wall": "Pared de adoquínes de gabro", + "block.create.gabbro_pillar": "Pilar de gabro", + "block.create.gantry_pinion": "Piñón de grúa", + "block.create.gantry_shaft": "Eje de grúa", + "block.create.gearbox": "Caja de transmisión", + "block.create.gearshift": "Palanca de cambios", + "block.create.glass_fluid_pipe": "Tubo de cristal para fluidos", + "block.create.granite_bricks": "Ladrillos de granito", + "block.create.granite_bricks_slab": "Losa de ladrillos de granito", + "block.create.granite_bricks_stairs": "Escaleras de ladrillos de granito", + "block.create.granite_bricks_wall": "Pared de ladrillos de granito", + "block.create.granite_cobblestone": "Adoquín de granito", + "block.create.granite_cobblestone_slab": "Losa de adoquínes de granito", + "block.create.granite_cobblestone_stairs": "Escaleras de adoquínes de granito", + "block.create.granite_cobblestone_wall": "Pared de adoquínes de granito", + "block.create.granite_pillar": "Pilar de granito", + "block.create.gray_sail": "Vela gris", + "block.create.gray_seat": "Asiento gris", + "block.create.gray_valve_handle": "Asa de válvula gris", + "block.create.green_sail": "Vela verde", + "block.create.green_seat": "Asiento verde", + "block.create.green_valve_handle": "Asa de válvula verde", + "block.create.hand_crank": "Manivela", + "block.create.honey": "Miel", + "block.create.horizontal_framed_glass": "Cristal con marco horizontal", + "block.create.horizontal_framed_glass_pane": "Panel de cristal con marco horizontal", + "block.create.hose_pulley": "Polea de manguera", + "block.create.item_drain": "Drenaje de elementos", + "block.create.jungle_window": "Ventana de jungla", + "block.create.jungle_window_pane": "Panel de ventana de jungla", + "block.create.large_cogwheel": "Rueda dentada grande", + "block.create.layered_andesite": "Andesita estratificada", + "block.create.layered_dark_scoria": "Escoria oscura estratificada", + "block.create.layered_diorite": "Diorita estratificada", + "block.create.layered_dolomite": "Dolomita estratificada", + "block.create.layered_gabbro": "Gabro estratificado", + "block.create.layered_granite": "Granito estratificado", + "block.create.layered_limestone": "Piedra caliza estratificada", + "block.create.layered_scoria": "Escoria estratificada", + "block.create.layered_weathered_limestone": "Caliza erosionada estratificada", + "block.create.light_blue_sail": "Vela azul claro", + "block.create.light_blue_seat": "Asiento azul claro", + "block.create.light_blue_valve_handle": "Asa de válvula azul claro", + "block.create.light_gray_sail": "Vela gris claro", + "block.create.light_gray_seat": "Asiento gris claro", + "block.create.light_gray_valve_handle": "Asa de válvula gris claro", + "block.create.lime_sail": "Vela lima", + "block.create.lime_seat": "Asiento lima", + "block.create.lime_valve_handle": "Asa de válvula lima", + "block.create.limesand": "Arena caliza", + "block.create.limestone": "Piedra caliza", + "block.create.limestone_bricks": "Ladrillos de piedra caliza", + "block.create.limestone_bricks_slab": "Losa de ladrillos de piedra caliza", + "block.create.limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza", + "block.create.limestone_bricks_wall": "Pared de ladrillos de piedra caliza", + "block.create.limestone_cobblestone": "Adoquínes de piedra caliza", + "block.create.limestone_cobblestone_slab": "Losa de adoquines de piedra caliza", + "block.create.limestone_cobblestone_stairs": "Escaleras de adoquines de piedra caliza", + "block.create.limestone_cobblestone_wall": "Pared de adoquines de piedra caliza", + "block.create.limestone_pillar": "Pilar de piedra caliza", + "block.create.linear_chassis": "Chasis lineal", + "block.create.lit_blaze_burner": "Lit Blaze Burner", + "block.create.magenta_sail": "Vela magenta", + "block.create.magenta_seat": "Asiento magenta", + "block.create.magenta_valve_handle": "Asa de válvula magenta", + "block.create.mechanical_arm": "Brazo mecánico", + "block.create.mechanical_bearing": "Rodamiento mecánico", + "block.create.mechanical_crafter": "Mecanizador", + "block.create.mechanical_drill": "Taladro mecánico", + "block.create.mechanical_harvester": "Cosechadora mecánica", + "block.create.mechanical_mixer": "Mezcladora mecánica", + "block.create.mechanical_piston": "Pistón mecánico", + "block.create.mechanical_piston_head": "Cabezal de pistón mecánico", + "block.create.mechanical_plough": "Arado mecánico", + "block.create.mechanical_press": "Prensa mecánica", + "block.create.mechanical_pump": "Bomba mecánica", + "block.create.mechanical_saw": "Sierra mecánica", + "block.create.metal_bracket": "Soporte de metal", + "block.create.millstone": "Piedra de molino", + "block.create.minecart_anchor": "Ancla de vagonetas", + "block.create.mossy_andesite": "Andesita musgosa", + "block.create.mossy_dark_scoria": "Escoria oscura musgosa", + "block.create.mossy_diorite": "Diorita musgosa", + "block.create.mossy_dolomite": "Dolomita musgosa", + "block.create.mossy_gabbro": "Gabro musgoso", + "block.create.mossy_granite": "Granito musgoso", + "block.create.mossy_limestone": "Caliza musgosa", + "block.create.mossy_scoria": "Escoria musgosa", + "block.create.mossy_weathered_limestone": "Caliza erosionada musgosa", + "block.create.mysterious_cuckoo_clock": "Reloj cucú", + "block.create.natural_scoria": "Escoria natural", + "block.create.nixie_tube": "Tubo Nixie", + "block.create.nozzle": "Boquilla", + "block.create.oak_window": "Ventana de roble", + "block.create.oak_window_pane": "Panel de ventana de roble", + "block.create.orange_sail": "Vela naranja", + "block.create.orange_seat": "Asiento naranja", + "block.create.orange_valve_handle": "Asa de válvula naranja", + "block.create.ornate_iron_window": "Ventana de hierro ornamentada", + "block.create.ornate_iron_window_pane": "Panel de ventana de hierro ornamentada", + "block.create.overgrown_andesite": "Andesita sobredimensionada", + "block.create.overgrown_dark_scoria": "Escoria oscura sobredimensionada", + "block.create.overgrown_diorite": "Diorita sobredimensionada", + "block.create.overgrown_dolomite": "Dolomita sobredimensionada", + "block.create.overgrown_gabbro": "Gabro sobredimensionado", + "block.create.overgrown_granite": "Granito sobredimensionado", + "block.create.overgrown_limestone": "Caliza sobredimensionada", + "block.create.overgrown_scoria": "Escoria sobredimensionada", + "block.create.overgrown_weathered_limestone": "Caliza erosionada sobredimensionada", + "block.create.paved_andesite": "Andesita pavimentada", + "block.create.paved_andesite_slab": "Losa de andesita pavimentada", + "block.create.paved_andesite_stairs": "Escaleras de andesita pavimentada", + "block.create.paved_andesite_wall": "Pared de andesita pavimentada", + "block.create.paved_dark_scoria": "Escoria oscura pavimentada", + "block.create.paved_dark_scoria_slab": "Losa de escoria oscura pavimentada", + "block.create.paved_dark_scoria_stairs": "Escaleras de escoria oscura pavimentada", + "block.create.paved_dark_scoria_wall": "Pared de escoria oscura pavimentad", + "block.create.paved_diorite": "Diorita pavimentada", + "block.create.paved_diorite_slab": "Losa de diorita pavimentada", + "block.create.paved_diorite_stairs": "Escaleras de diorita pavimentada", + "block.create.paved_diorite_wall": "Pared de diorita pavimentad", + "block.create.paved_dolomite": "Dolomita pavimentada", + "block.create.paved_dolomite_slab": "Losa de dolomita pavimentada", + "block.create.paved_dolomite_stairs": "Escaleras de dolomita pavimentada", + "block.create.paved_dolomite_wall": "Pared de dolomita pavimentada", + "block.create.paved_gabbro": "Gabro pavimentado", + "block.create.paved_gabbro_slab": "Losa de gabro pavimentado", + "block.create.paved_gabbro_stairs": "Escaleras de gabro pavimentado", + "block.create.paved_gabbro_wall": "Pared de gabro pavimentado", + "block.create.paved_granite": "Granito pavimentado", + "block.create.paved_granite_slab": "Losa de granito pavimentado", + "block.create.paved_granite_stairs": "Escaleras de granito pavimentado", + "block.create.paved_granite_wall": "Pared de granito pavimentado", + "block.create.paved_limestone": "Piedra caliza pavimentada", + "block.create.paved_limestone_slab": "Losa de piedra caliza pavimentada", + "block.create.paved_limestone_stairs": "Escaleras de piedra caliza pavimentada", + "block.create.paved_limestone_wall": "Pared de piedra caliza pavimentada", + "block.create.paved_scoria": "Escoria pavimentada", + "block.create.paved_scoria_slab": "Losa de escoria pavimentada", + "block.create.paved_scoria_stairs": "Escaleras de escoria pavimentada", + "block.create.paved_scoria_wall": "Pared de escoria pavimentada", + "block.create.paved_weathered_limestone": "Piedra caliza erosionada pavimentada", + "block.create.paved_weathered_limestone_slab": "Losa de piedra caliza erosionada pavimentada", + "block.create.paved_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pavimentada", + "block.create.paved_weathered_limestone_wall": "Pared de piedra caliza erosionada pavimentada", + "block.create.pink_sail": "Vela rosa", + "block.create.pink_seat": "Asiento rosa", + "block.create.pink_valve_handle": "Asa de válvula rosa", + "block.create.piston_extension_pole": "Pértiga de extensión de pistón", + "block.create.polished_dark_scoria": "Escoria oscura pulida", + "block.create.polished_dark_scoria_slab": "Losa de escoria oscura pulida", + "block.create.polished_dark_scoria_stairs": "Escaleras de escoria oscura pulida", + "block.create.polished_dark_scoria_wall": "Pared de escoria oscura pulida", + "block.create.polished_dolomite": "Dolomita pulida", + "block.create.polished_dolomite_slab": "Losa de dolomita pulida", + "block.create.polished_dolomite_stairs": "Escaleras de dolomita pulidas", + "block.create.polished_dolomite_wall": "Pared de dolomita pulida", + "block.create.polished_gabbro": "Gabro pulido", + "block.create.polished_gabbro_slab": "Losa de gabro pulido", + "block.create.polished_gabbro_stairs": "Escaleras de gabro pulido", + "block.create.polished_gabbro_wall": "Pared de gabro pulido", + "block.create.polished_limestone": "Piedra caliza pulida", + "block.create.polished_limestone_slab": "Losa de piedra caliza pulida", + "block.create.polished_limestone_stairs": "Escaleras de piedra caliza pulidas", + "block.create.polished_limestone_wall": "Pared de piedra caliza pulida", + "block.create.polished_scoria": "Escoria pulida", + "block.create.polished_scoria_slab": "Losa de escoria pulida", + "block.create.polished_scoria_stairs": "Escaleras de losa pulida", + "block.create.polished_scoria_wall": "Pared de escoria pulida", + "block.create.polished_weathered_limestone": "Piedra caliza erosionada pulida", + "block.create.polished_weathered_limestone_slab": "Losa de piedra caliza erosionada pulida", + "block.create.polished_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pulida", + "block.create.polished_weathered_limestone_wall": "Pared de piedra caliza erosionada pulida", + "block.create.portable_fluid_interface": "Interfaz de fluídos portátil", + "block.create.portable_storage_interface": "Interfaz de almacenamiento portátil", + "block.create.powered_latch": "Palanca motorizada", + "block.create.powered_toggle_latch": "Palanca de cierre motorizada", + "block.create.pulley_magnet": "Imán de la polea", + "block.create.pulse_repeater": "Repetidor de pulsos", + "block.create.purple_sail": "Vela morada", + "block.create.purple_seat": "Asiento morado", + "block.create.purple_valve_handle": "Asa de válvula morada", + "block.create.radial_chassis": "Chasis radial", + "block.create.red_sail": "Vela roja", + "block.create.red_seat": "Asiento rojo", + "block.create.red_valve_handle": "Asa de válvula roja", + "block.create.redstone_contact": "Contacto de Redstone", + "block.create.redstone_link": "Enlace de Redstone", + "block.create.refined_radiance_casing": "Revestimiento radiante", + "block.create.reinforced_rail": "Raíl reforzado", + "block.create.rope": "Soga", + "block.create.rope_pulley": "Polea de cuerda", + "block.create.rotation_speed_controller": "Controlador de velocidad de rotación", + "block.create.sail_frame": "Marco de vela", + "block.create.schematic_table": "Tabla de esquemas", + "block.create.schematicannon": "Schematicannon", + "block.create.scoria": "Escoria", + "block.create.scoria_bricks": "Ladrillos de escoria", + "block.create.scoria_bricks_slab": "Losa de ladrillos de escoria", + "block.create.scoria_bricks_stairs": "Escaleras de ladrillos de escoria", + "block.create.scoria_bricks_wall": "Pared de ladrillos de escoria", + "block.create.scoria_cobblestone": "Adoquín de escoria", + "block.create.scoria_cobblestone_slab": "Losa de adoquínes de escoria", + "block.create.scoria_cobblestone_stairs": "Escaleras de adoquines de escoria", + "block.create.scoria_cobblestone_wall": "Pared de adoquines de escoria", + "block.create.scoria_pillar": "Pilar de escoria", + "block.create.secondary_linear_chassis": "Chasis lineal secundario", + "block.create.sequenced_gearshift": "Palanca de cambios secuencial", + "block.create.shadow_steel_casing": "Revestimiento sombrío", + "block.create.shaft": "Eje", + "block.create.smart_chute": "Ducto inteligente", + "block.create.smart_fluid_pipe": "Tubería de fluídos inteligente", + "block.create.speedometer": "Velocímetro", + "block.create.spout": "Surtidor", + "block.create.spruce_window": "Ventana de abeto", + "block.create.spruce_window_pane": "Panel de ventana de abeto", + "block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso", + "block.create.stockpile_switch": "Interruptor de la reserva", + "block.create.stressometer": "Estresómetro", + "block.create.tiled_glass": "Vidrio esmaltado", + "block.create.tiled_glass_pane": "Panel de vidrio esmaltado", + "block.create.turntable": "Plataforma giratoria mecánica", + "block.create.vertical_framed_glass": "Vidrio esmaltado vertical", + "block.create.vertical_framed_glass_pane": "Panel de vidrio esmaltado vertical", + "block.create.water_wheel": "Rueda hidráulica mecánica", + "block.create.weathered_limestone": "Piedra caliza erosionada", + "block.create.weathered_limestone_bricks": "Ladrillos de piedra caliza erosionada", + "block.create.weathered_limestone_bricks_slab": "Losa de piedra caliza erosionada", + "block.create.weathered_limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza erosionada", + "block.create.weathered_limestone_bricks_wall": "Pared de ladrillos de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone": "Adoquín de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone_slab": "Losa de adoquín de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone_stairs": "Escaleras de adoquín de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone_wall": "Pared de adoquínes de piedra caliza erosionada", + "block.create.weathered_limestone_pillar": "Pilar de piedra caliza erosionada", + "block.create.white_sail": "Vela blanca", + "block.create.white_seat": "Asiento blanco", + "block.create.white_valve_handle": "Asa de válvula blanco", + "block.create.windmill_bearing": "Rodamiento del molino de viento", + "block.create.wooden_bracket": "Soporte de madera", + "block.create.yellow_sail": "Vela amarilla", + "block.create.yellow_seat": "Asiento amarillo", + "block.create.yellow_valve_handle": "Asa de válvula amarillo", + "block.create.zinc_block": "Bloque de zinc", + "block.create.zinc_ore": "Mineral de zinc", + + "entity.create.contraption": "Artilugio", + "entity.create.gantry_contraption": "Artilugio de grúa", + "entity.create.seat": "Asiento", + "entity.create.stationary_contraption": "Artilugio estacionario", + "entity.create.super_glue": "Super Pegamento", + + "fluid.create.milk": "Leche", + "fluid.create.potion": "Poción", + "fluid.create.tea": "Té del Constructor", + + "item.create.andesite_alloy": "Aleación de andesita", + "item.create.attribute_filter": "Filtro de atributos", + "item.create.bar_of_chocolate": "Barra de chocolate", + "item.create.belt_connector": "Cinturón mecánico", + "item.create.blaze_cake": "Pastel Blaze", + "item.create.blaze_cake_base": "Base de pastel Blaze", + "item.create.brass_hand": "Mano de bronce", + "item.create.brass_ingot": "Lingote de bronce", + "item.create.brass_nugget": "Pepita de bronce", + "item.create.brass_sheet": "Lámina de bronce", + "item.create.builders_tea": "Té del Constructor", + "item.create.chest_minecart_contraption": "Artilugio de vagoneta con cofre", + "item.create.chocolate_bucket": "Cubo de chocolate", + "item.create.chromatic_compound": "Compuesto cromático", + "item.create.cinder_flour": "Harina de ceniza", + "item.create.copper_ingot": "Lingote de cobre", + "item.create.copper_nugget": "Pepita de cobre", + "item.create.copper_sheet": "Lámina de cobre", + "item.create.crafter_slot_cover": "Tapa de la ranura del Mecanizador", + "item.create.crushed_aluminum_ore": "Mineral de aluminio triturado", + "item.create.crushed_brass": "Bronce triturado", + "item.create.crushed_copper_ore": "Mineral de cobre triturado", + "item.create.crushed_gold_ore": "Mineral de oro triturado", + "item.create.crushed_iron_ore": "Mineral de hierro triturado", + "item.create.crushed_lead_ore": "Mineral de plomo triturado", + "item.create.crushed_nickel_ore": "Mineral de níquel triturado", + "item.create.crushed_osmium_ore": "Mineral de osmio triturado", + "item.create.crushed_platinum_ore": "Mineral de platino triturado", + "item.create.crushed_quicksilver_ore": "Mineral de mercurio triturado", + "item.create.crushed_silver_ore": "Mineral de plata triturado", + "item.create.crushed_tin_ore": "Mineral de estaño triturado", + "item.create.crushed_uranium_ore": "Mineral de uranio triturado", + "item.create.crushed_zinc_ore": "Mineral de zinc triturado", + "item.create.deforester": "Deforestador", + "item.create.dough": "Masilla", + "item.create.electron_tube": "Tubo de electrones", + "item.create.empty_blaze_burner": "Quemador Blaze vacío", + "item.create.empty_schematic": "Esquema vacío", + "item.create.extendo_grip": "Agarre extendido", + "item.create.filter": "Filtro", + "item.create.furnace_minecart_contraption": "Artilugio de vagoneta de horno", + "item.create.goggles": "Gafas del Ingeniero", + "item.create.golden_sheet": "Lámina de oro", + "item.create.handheld_blockzapper": "Blockzapper", + "item.create.handheld_worldshaper": "Worldshaper", + "item.create.honey_bucket": "Cubo de miel", + "item.create.integrated_circuit": "Chip de circuito integrado", + "item.create.iron_sheet": "Lámina de hierro", + "item.create.lapis_sheet": "Lámina de lapislázuli", + "item.create.minecart_contraption": "Artilugio de vagoneta", + "item.create.minecart_coupling": "Acoplamiento de vagoneta", + "item.create.polished_rose_quartz": "Cuarzo rosado pulido", + "item.create.powdered_obsidian": "Obsidiana en polvo", + "item.create.propeller": "Hélice", + "item.create.red_sand_paper": "Papel de lija rojo", + "item.create.refined_radiance": "Resplandor refinado", + "item.create.rose_quartz": "Cuarzo rosado", + "item.create.sand_paper": "Papel de lija", + "item.create.schematic": "Esquema", + "item.create.schematic_and_quill": "Esquema y Pluma", + "item.create.shadow_steel": "Acero sombrío", + "item.create.super_glue": "Super Pegamento", + "item.create.tree_fertilizer": "Fertilizador de árboles", + "item.create.vertical_gearbox": "Caja de transmisión vertical", + "item.create.wand_of_symmetry": "Varita de simetría", + "item.create.wheat_flour": "Harina de trigo", + "item.create.whisk": "Batidora", + "item.create.wrench": "Llave inglesa", + "item.create.zinc_ingot": "Lingote de zinc", + "item.create.zinc_nugget": "Pepita de zinc", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "Bienvenido a Create", + "advancement.create.root.desc": "¡Es hora de empezar a construir increíbles Artilugios!", + "advancement.create.andesite_alloy": "Aliteraciones en abundancia", + "advancement.create.andesite_alloy.desc": "Los materiales de Create tienen nombres extraños, la aleación de andesita es uno de ellos.", + "advancement.create.its_alive": "Está Vivo!", + "advancement.create.its_alive.desc": "Vea cómo gira su primer componente cinético.", + "advancement.create.shifting_gears": "Cambiando de marcha", + "advancement.create.shifting_gears.desc": "Conecta una rueda dentada grande a una pequeña, lo que te permitirá cambiar la velocidad de tu artilugio.", + "advancement.create.overstressed": "Sobrecargado", + "advancement.create.overstressed.desc": "Experimenta los límites del estrés.", + "advancement.create.belt": "Paseo de algas", + "advancement.create.belt.desc": "Conectar dos ejes con un cinturón mecánico.", + "advancement.create.tunnel": "Cúbrete!", + "advancement.create.tunnel.desc": "Embellece tu cinturón mecánico con un Túnel.", + "advancement.create.splitter_tunnel": "Divide y vencerás", + "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de bronce.", + "advancement.create.chute": "Caída en picado", + "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical del cinturón.", + "advancement.create.upward_chute": "Abducción aérea", + "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela hacia un paracaídas impulsado por un ventilador.", + "advancement.create.belt_funnel": "Colgantes con forma de embudo", + "advancement.create.belt_funnel.desc": "Coloca un embudo lateral encima de una cinta o depósito para crear un tipo especial.", + "advancement.create.belt_funnel_kiss": "Los loros y las aletas", + "advancement.create.belt_funnel_kiss.desc": "Haz besar dos embudos montados con un cinturón.", + "advancement.create.fan": "Maestro mecánico del aire", + "advancement.create.fan.desc": "Monta la corriente de aire proporcionada por un ventilador revestido.", + "advancement.create.fan_lava": "Calentador geotérmico", + "advancement.create.fan_lava.desc": "Quedar atrapado en una corriente de aire que funde las cosas.", + "advancement.create.fan_water": "Lavado de la ropa", + "advancement.create.fan_water.desc": "Quedar atrapado en una corriente de aire que lava las cosas.", + "advancement.create.fan_smoke": "Fuelle mecánico", + "advancement.create.fan_smoke.desc": "Quedar atrapado en una corriente de aire que humea los artículos.", + "advancement.create.wrench": "Configurar convenientemente", + "advancement.create.wrench.desc": "Crea una llave inglesa para ayudarte a construir tus artilugios.", + "advancement.create.goggles": "Stress-O-Vision", + "advancement.create.goggles.desc": "Crea unas Gafas del Ingeniero para ayudarte a obtener más información cinética de los componentes.", + "advancement.create.speedometer": "Pero, ¿con qué rapidez exactamente??", + "advancement.create.speedometer.desc": "Coloca y alimenta un Velocímetro. Míralo a través de las gafas para leer su valor exacto.", + "advancement.create.stressometer": "Pero, ¿cuán estresado exactamente??", + "advancement.create.stressometer.desc": "Coloca y alimenta un Estresómetro. Míralo a través de las gafas para leer su valor exacto.", + "advancement.create.aesthetics": "Boom, Estética!", + "advancement.create.aesthetics.desc": "Colocar los soportes en un eje, tubo y rueda dentada.", + "advancement.create.reinforced": "Boom, Reforzado!", + "advancement.create.reinforced.desc": "Utilización de bloques de encaje en un eje, un tubo y un cinturón mecánico.", + "advancement.create.water_wheel": "Aprovechar la hidráulica", + "advancement.create.water_wheel.desc": "Coloca una Rueda hidráulica e intenta hacerla girar.", + "advancement.create.chocolate_wheel": "Potencia de buen gusto", + "advancement.create.chocolate_wheel.desc": "Hacer funcionar una rueda de agua con chocolate fundido.", + "advancement.create.lava_wheel": "Rueda de Magma", + "advancement.create.lava_wheel.desc": "Esto no debió haber funcionado.", + "advancement.create.cuckoo": "¿Es el momento?", + "advancement.create.cuckoo.desc": "Presenciar cómo un Reloj de cucú anuncia la hora de acostarse.", + "advancement.create.millstone": "Triturador de bolsillo", + "advancement.create.millstone.desc": "Colocar y alimentar una Piedra de molino.", + "advancement.create.windmill": "Una suave brisa", + "advancement.create.windmill.desc": "Montar un molino de viento.", + "advancement.create.maxed_windmill": "Una fuerte brisa", + "advancement.create.maxed_windmill.desc": "Montar un molino de viento de máxima intensidad.", + "advancement.create.andesite_casing": "La edad de la andesita", + "advancement.create.andesite_casing.desc": "Utiliza un poco de aleación de andesita y madera para crear un revestimiento básico.", + "advancement.create.mechanical_drill": "Interruptores fijos", + "advancement.create.mechanical_drill.desc": "Colocar y alimentar un taladro mecánico.", + "advancement.create.press": "¡La prensa se pone en marcha!", + "advancement.create.press.desc": "Activa una prensa mecánica y utilízala para crear algunas láminas.", + "advancement.create.polished_rose_quartz": "Diamantes rosas", + "advancement.create.polished_rose_quartz.desc": "Utiliza un trozo de papel de lija para pulir el cuarzo rosa hasta que se vuelva transparente.", + "advancement.create.electron_tube": "Beep Boop", + "advancement.create.electron_tube.desc": "Haz algunos Tubos de Electrones, útiles en la fabricación de maquinaria menos primitiva.", + "advancement.create.mechanical_saw": "Picado estacionario", + "advancement.create.mechanical_saw.desc": "Colocar y alimentar una sierra mecánica.", + "advancement.create.basin": "Funcionamiento de la cuenca", + "advancement.create.basin.desc": "Coloca una Cuenca e intenta arrojar objetos en ella.", + "advancement.create.mixer": "Mezcla de colores", + "advancement.create.mixer.desc": "Coloque una batidora mecánica sobre el lavabo, enciéndala y empiece a mezclar algunos ingredientes.", + "advancement.create.blaze_burner": "Una chimenea viva", + "advancement.create.blaze_burner.desc": "Obtener un Quemador de Blaze.", + "advancement.create.compact": "Compactación automática", + "advancement.create.compact.desc": "Utiliza una prensa y una palangana para compactar algunos elementos.", + "advancement.create.brass": "Aleaciones reales", + "advancement.create.brass.desc": "Utiliza Cobre Triturado y Zinc Triturado para crear algo de bronce.", + "advancement.create.brass_casing": "La Edad de Bronce", + "advancement.create.brass_casing.desc": "Utiliza el bronce recién obtenido y algo de madera para crear un revestimiento más avanzado.", + "advancement.create.copper_casing": "La Edad de Cobre", + "advancement.create.copper_casing.desc": "Utiliza algunas láminas de cobre y madera para crear algunos revestimientos de cobre.", + "advancement.create.spout": "Sploosh", + "advancement.create.spout.desc": "Observar el llenado de un elemento fluido usando una boquilla.", + "advancement.create.spout_potion": "Cervecera global", + "advancement.create.spout_potion.desc": "Mira cómo un pico llena una botella con líquido de poción.", + "advancement.create.chocolate": "Un mundo de imaginación", + "advancement.create.chocolate.desc": "Obtener un cubo de chocolate fundido.", + "advancement.create.item_drain": "Drenaje de la ropa", + "advancement.create.item_drain.desc": "Ver cómo se vacía un elemento fluido mediante un drenaje de elementos.", + "advancement.create.chained_item_drain": "Déjalo rodar!", + "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenajes de objetos encadenados.", + "advancement.create.glass_pipe": "Espía del flujo", + "advancement.create.glass_pipe.desc": "Observe cómo se propaga el fluido a través de un tubo de fluido con ventanas. Las tuberías de fluido rectas se convierten en ventanas cuando se utiliza una llave en ellas.", + "advancement.create.pipe_collision": "No cruzar nunca los arroyos", + "advancement.create.pipe_collision.desc": "Vea cómo se unen dos fluidos en su red de tuberías.", + "advancement.create.pipe_spill": "¡Hay una fuga!", + "advancement.create.pipe_spill.desc": "Observe cómo un extremo abierto de una tubería toma o deposita fluidos en el mundo.", + "advancement.create.hose_pulley": "Vertidos industriales", + "advancement.create.hose_pulley.desc": "Bajar una polea de manguera y ver cómo se vacía o se llena un cuerpo de líquido.", + "advancement.create.infinite_water": "Drenando el océano", + "advancement.create.infinite_water.desc": "Bombea de una masa de agua lo suficientemente grande como para ser considerada infinita.", + "advancement.create.infinite_lava": "Drenaje del núcleo de los planetas", + "advancement.create.infinite_lava.desc": "Bombea de una masa de lava lo suficientemente grande como para ser considerada infinita.", + "advancement.create.infinite_chocolate": "Ahogándose en la imaginación", + "advancement.create.infinite_chocolate.desc": "Bombea desde una masa de chocolate fundido lo suficientemente grande como para ser considerado infinito.", + "advancement.create.crafter": "Montaje automatizado", + "advancement.create.crafter.desc": "Coloca y alimenta algunos mecanizadores.", + "advancement.create.clockwork_bearing": "Artilugio a la hora", + "advancement.create.clockwork_bearing.desc": "Ensamblar una estructura montada sobre un rodamiento de relojería.", + "advancement.create.nixie_tube": "Signos de estilo", + "advancement.create.nixie_tube.desc": "Obtener y colocar un par de tubos Nixie.", + "advancement.create.deployer": "Picar, colocar y atacar", + "advancement.create.deployer.desc": "Coloca y potencia un Desplegador, el reflejo perfecto de ti mismo.", + "advancement.create.speed_controller": "Los ingenieros lo odian!", + "advancement.create.speed_controller.desc": "Coloque un regulador de velocidad de rotación, el dispositivo definitivo para cambiar de marcha.", + "advancement.create.flywheel": "El corazón de la fábrica", + "advancement.create.flywheel.desc": "Conectar con éxito un motor a la rueda de inercia.", + "advancement.create.overstress_flywheel": "Altos niveles de estrés", + "advancement.create.overstress_flywheel.desc": "Sobrecargar un Motor de Horno.", + "advancement.create.integrated_circuit": "Cálculos complejos", + "advancement.create.integrated_circuit.desc": "Ensamblar un chip de circuito integrado.", + "advancement.create.mechanical_arm": "Manos ocupadas!", + "advancement.create.mechanical_arm.desc": "Crea un brazo mecánico, selecciona las entradas y salidas, colócalo en el suelo y dale energía; luego observa cómo hace todo el trabajo por ti.", + "advancement.create.musical_arm": "Tócame la melodía!", + "advancement.create.musical_arm.desc": "Vea cómo un brazo mecánico maneja su Jukebox.", + "advancement.create.arm_many_targets": "Organize-o-Tron", + "advancement.create.arm_many_targets.desc": "Programar un brazo mecánico con diez o más posiciones de salida.", + "advancement.create.arm_blaze_burner": "Combust-o-Tron", + "advancement.create.arm_blaze_burner.desc": "Instruya un brazo mecánico para alimentar su Quemador Blaze.", + "advancement.create.fist_bump": "¡Pégale, hermano!", + "advancement.create.fist_bump.desc": "Hacer que dos Desplegadores se den un puñetazo.", + "advancement.create.crushing_wheel": "Un par de gigantes", + "advancement.create.crushing_wheel.desc": "Crea algunas ruedas de trituración para descomponer más materiales de forma más eficaz.", + "advancement.create.blaze_cake": "Fiebre del azúcar", + "advancement.create.blaze_cake.desc": "Hornea en tu Quemador de Blaze una Tarta especial.", + "advancement.create.chromatic_compound": "Minerales bipolares", + "advancement.create.chromatic_compound.desc": "Crea una Barra de Compuesto Cromático.", + "advancement.create.shadow_steel": "Retorno del vacío", + "advancement.create.shadow_steel.desc": "Crea Acero Sombrío, una barra de metal de la nada.", + "advancement.create.refined_radiance": "Brillante e inspirador", + "advancement.create.refined_radiance.desc": "Crea un Resplandor refinado, una poderosa sustancia cromática.", + "advancement.create.chromatic_age": "La edad cromática", + "advancement.create.chromatic_age.desc": "Crear bloques de revestimiento de la luz y la oscuridad.", + "advancement.create.zapper": "Construir con estilo", + "advancement.create.zapper.desc": "Construye un Blockzapper. Una pistola láser radiante que te ayuda a construir.", + "advancement.create.upgraded_zapper": "Radiante sobrecarga", + "advancement.create.upgraded_zapper.desc": "Crear y activar un Blockzapper totalmente mejorado.", + "advancement.create.wand_of_symmetry": "Espejos radiantes", + "advancement.create.wand_of_symmetry.desc": "Crear un bastón de simetría.", + "advancement.create.deforester": "Picado radiante", + "advancement.create.deforester.desc": "Crea un Deforestador y despídete del bosque local.", + "advancement.create.extendo_grip": "Boioioing!", + "advancement.create.extendo_grip.desc": "Hazte con un Agarre extentido.", + "advancement.create.dual_extendo_grip": "La última edad del boing", + "advancement.create.dual_extendo_grip.desc": "Doble Empuñadura extendida para un alcance sobrehumano.", + "advancement.create.eob": "Fin de la beta", + "advancement.create.eob.desc": "Espere más contenido aquí en el futuro. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "Create", + "itemGroup.create.palettes": "Paletas", + + "death.attack.create.crush": "%1$s se procesó por las Ruedas de trituración", + "death.attack.create.fan_fire": "%1$s murió quemado por el aire caliente", + "death.attack.create.fan_lava": "%1$s murió quemado por un abanico de lava", + "death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico", + "death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica", + "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj cucú manipulado", + + "create.block.deployer.damage_source_name": "un Desplegador rebelde", + "create.block.cart_assembler.invalid": "Coloque su Ensamblador de vagonetas en un bloque de Raíles", + + "create.recipe.crushing": "Trituración", + "create.recipe.milling": "Fresado", + "create.recipe.fan_washing": "Lavado a granel", + "create.recipe.fan_washing.fan": "Ventilador detrás del agua fluyente", + "create.recipe.fan_smoking": "Ahumador a granel", + "create.recipe.fan_smoking.fan": "Ventilador detrás del fuego", + "create.recipe.fan_blasting": "Voladuras a granel", + "create.recipe.fan_blasting.fan": "Ventilador detrás de la lava", + "create.recipe.pressing": "Prensando", + "create.recipe.mixing": "Mezclando", + "create.recipe.automatic_shapeless": "Elaboración automatizada de productos sin forma", + "create.recipe.automatic_brewing": "Elaboración de cerveza automatizada", + "create.recipe.packing": "Compactando", + "create.recipe.automatic_packing": "Embalaje automatizado", + "create.recipe.sawing": "Aserrando", + "create.recipe.mechanical_crafting": "Elaboración mecánica", + "create.recipe.automatic_shaped": "Elaboración automatizada de productos con forma", + "create.recipe.block_cutting": "Corte de bloques", + "create.recipe.blockzapper_upgrade": "Blockzapper", + "create.recipe.sandpaper_polishing": "Pulido con papel de lija", + "create.recipe.mystery_conversion": "Conversión misteriosa", + "create.recipe.spout_filling": "Llenar por el pico", + "create.recipe.draining": "Drenaje de elementos", + "create.recipe.processing.chance": "%1$s%% Chance", + "create.recipe.heat_requirement.none": "No es necesario calentar", + "create.recipe.heat_requirement.heated": "Calentado", + "create.recipe.heat_requirement.superheated": "Súper-Calentado", + + "create.generic.range": "Rango", + "create.generic.radius": "Radio", + "create.generic.width": "Ancho", + "create.generic.height": "Alto", + "create.generic.length": "Largo", + "create.generic.speed": "Velocidad", + "create.generic.delay": "Retraso", + "create.generic.unit.ticks": "Ticks", + "create.generic.unit.seconds": "Segundos", + "create.generic.unit.minutes": "Minutos", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "En el sentido de las agujas del reloj", + "create.generic.counter_clockwise": "En sentido contrario a las agujas del reloj", + + "create.action.scroll": "Desplazar", + "create.action.confirm": "Confirmar", + "create.action.abort": "Abortar", + "create.action.saveToFile": "Guardar", + "create.action.discard": "Descartar", + + "create.keyinfo.toolmenu": "Menú de la Herramienta de Enfoque", + "create.keyinfo.scrollup": "Simular la rueda del ratón hacia arriba (en el mundo)", + "create.keyinfo.scrolldown": "Simular la rueda del ratón hacia abajo (en el mundo)", + + "create.gui.scrollInput.defaultTitle": "Seleccione una opción:", + "create.gui.scrollInput.scrollToModify": "Scroll para Modificar", + "create.gui.scrollInput.scrollToAdjustAmount": "Scroll para ajustar la cantidad", + "create.gui.scrollInput.scrollToSelect": "Scroll para Seleccionar", + "create.gui.scrollInput.shiftScrollsFaster": "Shift para Scroll Rápido", + "create.gui.toolmenu.focusKey": "Mantenga [%1$s] para enfocar", + "create.gui.toolmenu.cycle": "[SCROLL] para el ciclo", + "create.gui.symmetryWand.mirrorType": "Espejado", + "create.gui.symmetryWand.orientation": "Orientación", + + "create.symmetry.mirror.plane": "Plano de espejo", + "create.symmetry.mirror.doublePlane": "Rectangular", + "create.symmetry.mirror.triplePlane": "Octogonal", + + "create.orientation.orthogonal": "Ortogonal", + "create.orientation.diagonal": "Diagonal", + "create.orientation.horizontal": "Horizontal", + "create.orientation.alongZ": "A lo largo de Z", + "create.orientation.alongX": "A lo largo de X", + + "create.gui.blockzapper.title": "Blockzapper", + "create.gui.blockzapper.replaceMode": "Modo de sustitución", + "create.gui.blockzapper.searchDiagonal": "Seguir las diagonales", + "create.gui.blockzapper.searchFuzzy": "Ignorar los bordes del material", + "create.gui.blockzapper.range": "Alcance del margen de maniobra", + "create.gui.blockzapper.needsUpgradedAmplifier": "Requiere un amplificador mejorado", + "create.gui.blockzapper.patternSection": "Patrón", + "create.gui.blockzapper.pattern.solid": "Sólido", + "create.gui.blockzapper.pattern.checkered": "Tablero de ajedrez", + "create.gui.blockzapper.pattern.inversecheckered": "Tablero de ajedrez invertido", + "create.gui.blockzapper.pattern.chance25": "25% Roll", + "create.gui.blockzapper.pattern.chance50": "50% Roll", + "create.gui.blockzapper.pattern.chance75": "75% Roll", + "create.gui.terrainzapper.title": "Worldshaper", + "create.gui.terrainzapper.placement": "Colocación", + "create.gui.terrainzapper.placement.merged": "Fusionado", + "create.gui.terrainzapper.placement.attached": "Adjuntado", + "create.gui.terrainzapper.placement.inserted": "Insertado", + "create.gui.terrainzapper.brush": "Pincel", + "create.gui.terrainzapper.brush.cuboid": "Cuboide", + "create.gui.terrainzapper.brush.sphere": "Esfera", + "create.gui.terrainzapper.brush.cylinder": "Cilindro", + "create.gui.terrainzapper.tool": "Herramienta", + "create.gui.terrainzapper.tool.fill": "Llenar", + "create.gui.terrainzapper.tool.place": "Sitio", + "create.gui.terrainzapper.tool.replace": "Sustituir", + "create.gui.terrainzapper.tool.clear": "Borrar", + "create.gui.terrainzapper.tool.overlay": "Superposición", + "create.gui.terrainzapper.tool.flatten": "Aplanar", + + "create.terrainzapper.shiftRightClickToSet": "Shift+Clic con el botón derecho para seleccionar una forma", + + "create.blockzapper.usingBlock": "Utilizando: %1$s", + "create.blockzapper.componentUpgrades": "Mejoras de componentes:", + "create.blockzapper.component.body": "Cuerpo", + "create.blockzapper.component.amplifier": "Amplificador", + "create.blockzapper.component.accelerator": "Acelerador", + "create.blockzapper.component.retriever": "Recuperador", + "create.blockzapper.component.scope": "Mira telescópica", + "create.blockzapper.componentTier.none": "Ninguno", + "create.blockzapper.componentTier.brass": "Bronce", + "create.blockzapper.componentTier.chromatic": "Cromático", + "create.blockzapper.leftClickToSet": "Clic izquierdo en un bloque para establecer el material", + "create.blockzapper.empty": "Sin bloques!", + + "create.minecart_coupling.two_couplings_max": "Las vagonetas no pueden tener más de dos enganches cada una", + "create.minecart_coupling.unloaded": "Algunas partes de su tren parecen estar en chunks no cargados", + "create.minecart_coupling.no_loops": "Los acoplamientos no pueden formar un bucle", + "create.minecart_coupling.removed": "Se han retirado todos los acoplamientos de la vagoneta", + "create.minecart_coupling.too_far": "Las vagonetas están demasiado separadas", + + "create.contraptions.movement_mode": "Modo de movimiento", + "create.contraptions.movement_mode.move_place": "Colocar siempre al detenerse", + "create.contraptions.movement_mode.move_place_returned": "Colocar sólo en la posición inicial", + "create.contraptions.movement_mode.move_never_place": "Colocar sólo cuando se destruye el ancla", + "create.contraptions.movement_mode.rotate_place": "Colocar siempre al detenerse", + "create.contraptions.movement_mode.rotate_place_returned": "Colocar sólo cerca del ángulo inicial", + "create.contraptions.movement_mode.rotate_never_place": "Colocar sólo cuando se destruye el ancla", + "create.contraptions.cart_movement_mode": "Modo de movimiento de la vagoneta", + "create.contraptions.cart_movement_mode.rotate": "Siempre de cara al movimiento", + "create.contraptions.cart_movement_mode.rotate_paused": "Pausar a los actores mientras giran", + "create.contraptions.cart_movement_mode.rotation_locked": "Bloquear rotación", + "create.contraptions.windmill.rotation_direction": "Dirección de rotación", + "create.contraptions.clockwork.clock_hands": "Manecillas de reloj", + "create.contraptions.clockwork.hour_first": "La manecilla de las horas primero", + "create.contraptions.clockwork.minute_first": "La manecilla de los minutos primero", + "create.contraptions.clockwork.hour_first_24": "La manecilla del día primero", + + "create.logistics.filter": "Filtro", + "create.logistics.recipe_filter": "Filtro de recetas", + "create.logistics.fluid_filter": "Filtro de fluídos", + "create.logistics.firstFrequency": "Freq. #1", + "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "Filtro aplicado a %1$s.", + "create.logistics.filter.apply_click_again": "Filtro aplicado a %1$s, haga clic de nuevo para copiar la cantidad.", + "create.logistics.filter.apply_count": "Aplicado recuento de extracciones al filtro.", + + "create.gui.goggles.generator_stats": "Estadísticas del generador:", + "create.gui.goggles.kinetic_stats": "Estadísticas cinéticas:", + "create.gui.goggles.at_current_speed": "con la velocidad actual", + "create.gui.goggles.pole_length": "Longitud del poste:", + "create.gui.assembly.exception": "Este artilugio no se pudo montar:", + "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s %2$s %3$s] no estaba en un chunk cargado", + "create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s", + "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón", + "create.gui.gauge.info_header": "Información sobre el medidor:", + "create.gui.speedometer.title": "Velocidad de rotación", + "create.gui.stressometer.title": "Estrés de la red", + "create.gui.stressometer.capacity": "Capacidad restante", + "create.gui.stressometer.overstressed": "Sobrecargado", + "create.gui.stressometer.no_rotation": "Sin rotación", + "create.gui.contraptions.not_fast_enough": "Parece que este %1$s no está girando con _suficiente_ velocidad_.", + "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto_ de alto estrés.", + "create.gui.adjustable_crate.title": "Caja ajustable", + "create.gui.adjustable_crate.storageSpace": "Espacio de almacenamiento", + "create.gui.stockpile_switch.title": "Interruptor de la reserva", + "create.gui.stockpile_switch.invert_signal": "Invertir señal", + "create.gui.stockpile_switch.move_to_lower_at": "Pasar al carril inferior en %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "Pasar al carril superior en %1$s%%", + "create.gui.sequenced_gearshift.title": "Cambio de marchas secuenciado", + "create.gui.sequenced_gearshift.instruction": "Instrucción", + "create.gui.sequenced_gearshift.instruction.turn_angle": "Giro", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Ángulo", + "create.gui.sequenced_gearshift.instruction.turn_distance": "Pistón", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distancia", + "create.gui.sequenced_gearshift.instruction.wait": "Espera", + "create.gui.sequenced_gearshift.instruction.wait.duration": "Duración", + "create.gui.sequenced_gearshift.instruction.end": "Fin", + "create.gui.sequenced_gearshift.speed": "Velocidad, Dirección", + "create.gui.sequenced_gearshift.speed.forward": "Velocidad de entrada, hacia adelante", + "create.gui.sequenced_gearshift.speed.forward_fast": "Doble velocidad, hacia adelante", + "create.gui.sequenced_gearshift.speed.back": "Velocidad de entrada, Invertida", + "create.gui.sequenced_gearshift.speed.back_fast": "Doble velocidad, Invertida", + + "create.schematicAndQuill.dimensions": "Tamaño del esquema: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "Primera posición fijada.", + "create.schematicAndQuill.secondPos": "Segunda posición fijada.", + "create.schematicAndQuill.noTarget": "Mantenga [Ctrl] para seleccionar los bloques del aire.", + "create.schematicAndQuill.abort": "Selección eliminada.", + "create.schematicAndQuill.title": "Nombre del esquema:", + "create.schematicAndQuill.convert": "Guardar y desplegar inmediatamente", + "create.schematicAndQuill.fallbackName": "Mi esquema", + "create.schematicAndQuill.saved": "Guardado como %1$s", + + "create.schematic.invalid": "[!] Elemento no válido - Utilice la tabla de esquemas en su lugar", + "create.schematic.position": "Posición", + "create.schematic.rotation": "Rotación", + "create.schematic.rotation.none": "Ninguno", + "create.schematic.rotation.cw90": "En el sentido de las agujas del reloj 90", + "create.schematic.rotation.cw180": "En el sentido de las agujas del reloj 180", + "create.schematic.rotation.cw270": "En el sentido de las agujas del reloj 270", + "create.schematic.mirror": "Espejado", + "create.schematic.mirror.none": "Ninguno", + "create.schematic.mirror.frontBack": "Delante-detrás", + "create.schematic.mirror.leftRight": "Izquierda-Derecha", + "create.schematic.tool.deploy": "Despliegue", + "create.schematic.tool.move": "Mover XZ", + "create.schematic.tool.movey": "Mover Y", + "create.schematic.tool.rotate": "Rotar", + "create.schematic.tool.print": "Imprimir", + "create.schematic.tool.flip": "Voltear", + "create.schematic.tool.deploy.description.0": "Mueve la estructura a un lugar.", + "create.schematic.tool.deploy.description.1": "Haga clic con el botón derecho del ratón en el suelo para colocar.", + "create.schematic.tool.deploy.description.2": "Mantenga [Ctrl] para seleccionar a una distancia fija.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-Scroll para cambiar la distancia.", + "create.schematic.tool.move.description.0": "Desplaza el esquema horizontalmente.", + "create.schematic.tool.move.description.1": "Apunta al Esquema y [CTRL]-Scroll para ponerlo.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "Desplaza el esquema verticalmente..", + "create.schematic.tool.movey.description.1": "[CTRL]-Scroll para moverlo hacia arriba/abajo.", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "Gira el esquema alrededor de su centro.", + "create.schematic.tool.rotate.description.1": "[CTRL]-Scroll para girar 90 grados.", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "Sitúa instantáneamente la estructura en el mundo.", + "create.schematic.tool.print.description.1": "[Clic derecho] para confirmar la colocación en el lugar actual.", + "create.schematic.tool.print.description.2": "Esta herramienta es sólo para el Modo Creativo.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "Voltea el Esquema a lo largo de la cara que seleccione.", + "create.schematic.tool.flip.description.1": "Apunta al esquema y [CTRL]-Scroll para voltearlo.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "Sincronizando...", + "create.schematics.uploadTooLarge": "Tu esquema excede las limitaciones especificadas por el servidor.", + "create.schematics.maxAllowedSize": "El tamaño máximo permitido del archivo del esquema es:", + + "create.gui.schematicTable.refresh": "Refrescar archivos", + "create.gui.schematicTable.open_folder": "Abrir carpeta", + "create.gui.schematicTable.title": "Tabla de esquemas", + "create.gui.schematicTable.availableSchematics": "Esquemas disponibles", + "create.gui.schematicTable.noSchematics": "No hay esquemas guardados", + "create.gui.schematicTable.uploading": "Subiendo...", + "create.gui.schematicTable.finished": "Subida finalizada!", + "create.gui.schematicannon.title": "Schematicannon", + "create.gui.schematicannon.listPrinter": "Lista de control de la impresora", + "create.gui.schematicannon.gunpowderLevel": "Pólvora %1$s%%", + "create.gui.schematicannon.shotsRemaining": "Disparos restantes: %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "Con respaldo: %1$s", + "create.gui.schematicannon.optionEnabled": "Actualmente habilitado", + "create.gui.schematicannon.optionDisabled": "Actualmente deshabilitado", + "create.gui.schematicannon.showOptions": "Mostrar la configuración de la impresora", + "create.gui.schematicannon.option.dontReplaceSolid": "No sustituír los bloques sólidos", + "create.gui.schematicannon.option.replaceWithSolid": "Sustituir sólido por sólido", + "create.gui.schematicannon.option.replaceWithAny": "Sustituir sólido por cualquiera", + "create.gui.schematicannon.option.replaceWithEmpty": "Sustituir sólido por vacío", + "create.gui.schematicannon.option.skipMissing": "Omitir los bloques que faltan", + "create.gui.schematicannon.option.skipTileEntities": "Proteger a las entidades", + "create.gui.schematicannon.slot.gunpowder": "Añade pólvora para alimentar el cañón", + "create.gui.schematicannon.slot.listPrinter": "Coloque los libros aquí para imprimir una lista de comprobación para su esquema", + "create.gui.schematicannon.slot.schematic": "Añada su esquema aquí. Asegúrese de que se despliega en un lugar específico.", + "create.gui.schematicannon.option.skipMissing.description": "Si el cañón no encuentra un bloque necesario para su colocación, continuará en la siguiente ubicación.", + "create.gui.schematicannon.option.skipTileEntities.description": "El cañón evitará reemplazar los bloques que contienen datos, como los Cofres.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "El cañón nunca sustituirá ningún bloque sólido en su zona de trabajo, sólo los no sólidos y el aire.", + "create.gui.schematicannon.option.replaceWithSolid.description": "El cañón sólo reemplazará los bloques sólidos en su área de trabajo si el esquema contiene un bloque sólido en la ubicación.", + "create.gui.schematicannon.option.replaceWithAny.description": "El cañón reemplazará los bloques sólidos en su área de trabajo si el esquema contiene algún bloque en la ubicación.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "El cañón eliminará todos los bloques de su zona de trabajo, incluidos los sustituidos por Aire.", + + "create.schematicannon.status.idle": "Inactivo", + "create.schematicannon.status.ready": "Listo", + "create.schematicannon.status.running": "Funcionando", + "create.schematicannon.status.finished": "Finished", + "create.schematicannon.status.paused": "Pausado", + "create.schematicannon.status.stopped": "Detenido", + "create.schematicannon.status.noGunpowder": "Sin pólvora", + "create.schematicannon.status.targetNotLoaded": "El objetivo no está cargado", + "create.schematicannon.status.targetOutsideRange": "Objetivo demasiado lejano", + "create.schematicannon.status.searching": "Buscando", + "create.schematicannon.status.skipping": "Omitiendo", + "create.schematicannon.status.missingBlock": "Elementos perdidos:", + "create.schematicannon.status.placing": "Colocando", + "create.schematicannon.status.clearing": "Limpiando bloques", + "create.schematicannon.status.schematicInvalid": "Esquema inválido", + "create.schematicannon.status.schematicNotPlaced": "Esquema no desplegado", + "create.schematicannon.status.schematicExpired": "Archivo de esquemas caducado", + + "create.materialChecklist": "Lista de control del material", + "create.materialChecklist.blocksNotLoaded": "* Descargo de Responsabilidad *\n\nLa lista de materiales puede ser inexacta debido a que no se han cargado los chunks pertinentes.", + + "create.gui.filter.deny_list": "Lista de denegación", + "create.gui.filter.deny_list.description": "Los elementos pasan si NO coinciden con ninguno de los anteriores. Una lista de denegación vacía acepta todo.", + "create.gui.filter.allow_list": "Lista de permitidos", + "create.gui.filter.allow_list.description": "Los elementos pasan si coinciden con alguno de los anteriores. Una lista de permitidos vacía rechaza todo.", + "create.gui.filter.respect_data": "Respetar datos", + "create.gui.filter.respect_data.description": "Los objetos sólo coinciden si su durabilidad, encantos y otros atributos también coinciden.", + "create.gui.filter.ignore_data": "Ignorar datos", + "create.gui.filter.ignore_data.description": "Los artículos coinciden independientemente de sus atributos.", + + "create.item_attributes.placeable": "se puede colocar", + "create.item_attributes.placeable.inverted": "no se puede colocar", + "create.item_attributes.consumable": "se puede comer", + "create.item_attributes.consumable.inverted": "no se puede comer", + "create.item_attributes.smeltable": "se puede fundir", + "create.item_attributes.smeltable.inverted": "no se puede fundir", + "create.item_attributes.washable": "se puede lavar", + "create.item_attributes.washable.inverted": "no se puede lavar", + "create.item_attributes.smokable": "puede ser ahumado", + "create.item_attributes.smokable.inverted": "no puede ser ahumado", + "create.item_attributes.crushable": "puede ser aplastado", + "create.item_attributes.crushable.inverted": "no puede ser aplastado", + "create.item_attributes.blastable": "es fundible en el alto horno", + "create.item_attributes.blastable.inverted": "no es fundible en el alto horno", + "create.item_attributes.enchanted": "está encantado", + "create.item_attributes.enchanted.inverted": "no está encantado", + "create.item_attributes.damaged": "está dañado", + "create.item_attributes.damaged.inverted": "no está dañado", + "create.item_attributes.badly_damaged": "está muy dañado", + "create.item_attributes.badly_damaged.inverted": "no está muy dañado", + "create.item_attributes.not_stackable": "no se puede apilar", + "create.item_attributes.not_stackable.inverted": "se puede apilar", + "create.item_attributes.equipable": "se puede equipar", + "create.item_attributes.equipable.inverted": "no se puede equipar", + "create.item_attributes.furnace_fuel": "es combustible para hornos", + "create.item_attributes.furnace_fuel.inverted": "no es combustible para hornos", + "create.item_attributes.in_tag": "está etiquetado %1$s", + "create.item_attributes.in_tag.inverted": "no está etiquetado %1$s", + "create.item_attributes.in_item_group": "está en el grupo '%1$s'", + "create.item_attributes.in_item_group.inverted": "no está en el grupo '%1$s'", + "create.item_attributes.added_by": "fue añadido por %1$s", + "create.item_attributes.added_by.inverted": "no fue añadida por %1$s", + "create.item_attributes.has_enchant": "está encantado con %1$s", + "create.item_attributes.has_enchant.inverted": "no está encantado con %1$s", + "create.item_attributes.has_fluid": "contiene %1$s", + "create.item_attributes.has_fluid.inverted": "no contiene %1$s", + "create.item_attributes.has_name": "tiene el nombre personalizado %1$s", + "create.item_attributes.has_name.inverted": "no tiene el nombre personalizado %1$s", + "create.item_attributes.book_author": "es obra de %1$s", + "create.item_attributes.book_author.inverted": "no es es obra de %1$s", + "create.item_attributes.book_copy_original": "es un original", + "create.item_attributes.book_copy_original.inverted": "no es un original", + "create.item_attributes.book_copy_first": "es una copia de primera generación", + "create.item_attributes.book_copy_first.inverted": "no es una copia de primera generación", + "create.item_attributes.book_copy_second": "es una copia de segunda generación", + "create.item_attributes.book_copy_second.inverted": "no es una copia de segunda generación", + "create.item_attributes.book_copy_tattered": "is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "does not improve %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", + "create.gui.attribute_filter.selected_attributes": "Selected attributes:", + "create.gui.attribute_filter.add_attribute": "Add attribute to List", + "create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List", + "create.gui.attribute_filter.allow_list_disjunctive": "Allow-List (Any)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_conjunctive": "Allow-List (All)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.deny_list": "Deny-List", + "create.gui.attribute_filter.deny_list.description": "Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.add_reference_item": "Add Reference Item", + + "create.tooltip.holdKey": "Hold [%1$s]", + "create.tooltip.holdKeyOrKey": "Hold [%1$s] or [%2$s]", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "Speed Requirement: %1$s", + "create.tooltip.speedRequirement.none": "None", + "create.tooltip.speedRequirement.medium": "Moderate", + "create.tooltip.speedRequirement.high": "Fast", + "create.tooltip.stressImpact": "Stress Impact: %1$s", + "create.tooltip.stressImpact.low": "Low", + "create.tooltip.stressImpact.medium": "Moderate", + "create.tooltip.stressImpact.high": "High", + "create.tooltip.stressImpact.overstressed": "Overstressed", + "create.tooltip.capacityProvided": "Stress Capacity: %1$s", + "create.tooltip.capacityProvided.low": "Small", + "create.tooltip.capacityProvided.medium": "Medium", + "create.tooltip.capacityProvided.high": "Large", + "create.tooltip.capacityProvided.asGenerator": "(As Generator)", + "create.tooltip.generationSpeed": "Generates at %1$s %2$s", + "create.tooltip.analogStrength": "Analog Strength: %1$s/15", + + "create.mechanical_arm.extract_from": "Take items from %1$s", + "create.mechanical_arm.deposit_to": "Deposit items to %1$s", + "create.mechanical_arm.summary": "Mechanical Arm has %1$s input(s) and %2$s output(s).", + "create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.", + + "create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available", + + "create.mechanical_arm.selection_mode.round_robin": "Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "Forced Round Robin", + "create.mechanical_arm.selection_mode.prefer_first": "Prefer First Target", + + "create.tunnel.selection_mode.split": "Split", + "create.tunnel.selection_mode.forced_split": "Forced Split", + "create.tunnel.selection_mode.round_robin": "Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "Forced Round Robin", + "create.tunnel.selection_mode.prefer_nearest": "Prefer Nearest", + "create.tunnel.selection_mode.randomize": "Randomize", + "create.tunnel.selection_mode.synchronize": "Synchronize Inputs", + + "create.tooltip.chute.header": "Chute Information", + "create.tooltip.chute.items_move_down": "Items move Downward", + "create.tooltip.chute.items_move_up": "Items move Upward", + "create.tooltip.chute.no_fans_attached": "No attached fans", + "create.tooltip.chute.fans_push_up": "Fans push from Below", + "create.tooltip.chute.fans_push_down": "Fans push from Above", + "create.tooltip.chute.fans_pull_up": "Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "Fans pull from Below", + "create.tooltip.chute.contains": "Contains: %1$s x%2$s", + + "create.hint.hose_pulley.title": "Bottomless Supply", + "create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", + "create.hint.mechanical_arm_no_targets.title": "No Targets", + "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "Horizontal Funnels", + "create.hint.horizontal_funnel": "cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "Funnels facing upward", + "create.hint.upward_funnel": "can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "Update Bearing", + "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.hint.full_deployer.title": "Deployer Item Overflow", + "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + + "create.gui.config.overlay1": "Hi :)", + "create.gui.config.overlay2": "This is a sample overlay", + "create.gui.config.overlay3": "Click or drag with your mouse", + "create.gui.config.overlay4": "to move this preview", + "create.gui.config.overlay5": "Press ESC to exit this screen", + "create.gui.config.overlay6": "and save the new position", + "create.gui.config.overlay7": "Run /create overlay reset", + "create.gui.config.overlay8": "to reset to the default position", + + "create.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Server tick is currently slowed by %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Server tick is slowed by %s ms now >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Server tick is back to regular speed :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", + "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "create.subtitle.schematicannon_launch_block": "Schematicannon shoots", + "create.subtitle.schematicannon_finish": "Schematicannon finishes", + "create.subtitle.slime_added": "Slime squishes", + "create.subtitle.mechanical_press_activation": "Mechanical Press activates", + "create.subtitle.mechanical_press_item_break": "Metal clanks", + "create.subtitle.blockzapper_place": "Blocks zap into place", + "create.subtitle.blockzapper_confirm": "Affirmative Ding", + "create.subtitle.blockzapper_deny": "Declining Boop", + "create.subtitle.block_funnel_eat": "Funnel CHOMPS", + "create.subtitle.blaze_munch": "Blaze munches happily", + + + "_": "->------------------------] Item Descriptions [------------------------<-", + + "item.create.example_item.tooltip": "EXAMPLE ITEM (just a marker that this tooltip exists)", + "item.create.example_item.tooltip.summary": "A brief description of the item. _Underscores_ highlight a term.", + "item.create.example_item.tooltip.condition1": "When this", + "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", + "item.create.example_item.tooltip.condition2": "And When this", + "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", + "item.create.example_item.tooltip.control1": "When Ctrl pressed", + "item.create.example_item.tooltip.action1": "These controls are displayed.", + + "block.create.andesite_encased_shaft.tooltip": "ANDESITE ENCASED SHAFT", + "block.create.andesite_encased_shaft.tooltip.summary": "_Creative only_ item. Encase shafts _in-world_ using _Andesite Casing_. Casing blocks will not be consumed.", + + "block.create.brass_encased_shaft.tooltip": "BRASS ENCASED SHAFT", + "block.create.brass_encased_shaft.tooltip.summary": "_Creative only_ item. Encase shafts _in-world_ using _Brass Casing_. Casing blocks will not be consumed.", + + "block.create.wooden_bracket.tooltip": "WOODEN BRACKET", + "block.create.wooden_bracket.tooltip.summary": "_Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with a cozy and wooden bit of reinforcement.", + + "block.create.metal_bracket.tooltip": "METAL BRACKET", + "block.create.metal_bracket.tooltip.summary": "_Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with an industrial and sturdy bit of reinforcement.", + + "block.create.andesite_casing.tooltip": "ANDESITE CASING", + "block.create.andesite_casing.tooltip.summary": "Simple machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._", + + "block.create.andesite_funnel.tooltip": "ANDESITE FUNNEL", + "block.create.andesite_funnel.tooltip.summary": "A general item transfer component, transitioning items between means of transportation. Can be controlled with a _redstone signal_.", + "block.create.andesite_funnel.tooltip.condition1": "General Behaviour", + "block.create.andesite_funnel.tooltip.behaviour1": "The _open face_ will _collect ground items_ in the block space in front of it and _insert_ them into any container on the opposite side of the funnel.", + "block.create.andesite_funnel.tooltip.condition2": "When mounted on belts, depots and similar", + "block.create.andesite_funnel.tooltip.behaviour2": "_Collects_ or _Places_ items onto the mounted component, from or to the _inventory behind_ itself. Whenever the funnel has specific directionality, it can be reversed using a Wrench.", + "block.create.andesite_funnel.tooltip.condition3": "When vertically between two inventories", + "block.create.andesite_funnel.tooltip.behaviour3": "Will _transfer_ items _downward_, much like a buffer-less hopper.", + + "block.create.andesite_tunnel.tooltip": "ANDESITE TUNNEL", + "block.create.andesite_tunnel.tooltip.summary": "A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", + "block.create.andesite_tunnel.tooltip.control1": "R-Click with Wrench on Side", + "block.create.andesite_tunnel.tooltip.action1": "_Adjusts window shutters_ if the tunnel has a window on that face.", + + "block.create.brass_funnel.tooltip": "BRASS FUNNEL", + "block.create.brass_funnel.tooltip.summary": "A general item transfer component, transitioning items between means of transportation. Can be controlled with a _redstone signal_. Comes with a handy _filter_.", + "block.create.brass_funnel.tooltip.condition1": "General Behaviour", + "block.create.brass_funnel.tooltip.behaviour1": "The _open face_ will _collect ground items_ in the block space in front of it and _insert_ them into any container on the opposite side of the funnel.", + "block.create.brass_funnel.tooltip.condition2": "When mounted on belts, depots and similar", + "block.create.brass_funnel.tooltip.behaviour2": "_Collects_ or _Places_ items onto the mounted component, from or to the _inventory behind_ itself. Whenever the funnel has specific directionality, it can be reversed using a Wrench.", + "block.create.brass_funnel.tooltip.condition3": "When vertically between two inventories", + "block.create.brass_funnel.tooltip.behaviour3": "Will _transfer_ items _downward_, much like a buffer-less hopper.", + + "block.create.brass_tunnel.tooltip": "BRASS TUNNEL", + "block.create.brass_tunnel.tooltip.summary": "A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", + "block.create.brass_tunnel.tooltip.condition1": "When placed side by side", + "block.create.brass_tunnel.tooltip.behaviour1": "_Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", + "block.create.brass_tunnel.tooltip.condition2": "Filtering", + "block.create.brass_tunnel.tooltip.behaviour2": "_Brass Tunnels_ come with filters for both _Input_ and _Output_. If an _Item_ isn't permitted from the filtered output of a _Tunnel_ it will be transferred to the output of a connected _Tunnel_.", + "block.create.brass_tunnel.tooltip.condition3": "Splitting", + "block.create.brass_tunnel.tooltip.behaviour3": "_Brass Tunnels_ can be configured to change the method in which _Items_ are sorted onto connected _Belts_.", + "block.create.brass_tunnel.tooltip.control1": "R-Click with Wrench on Side", + "block.create.brass_tunnel.tooltip.action1": "_Adjusts window shutters_ if the tunnel has a window on that face.", + "block.create.brass_tunnel.tooltip.control2": "Scroll with Wrench on Top", + "block.create.brass_tunnel.tooltip.action2": "Change the splitting method of connected _Tunnels_.", + + "block.create.copper_casing.tooltip": "COPPER CASING", + "block.create.copper_casing.tooltip.summary": "Robust machine casing with a variety of uses. Safe for decoration.", + "block.create.copper_casing.tooltip.condition1": "When used on Fluid Pipe", + "block.create.copper_casing.tooltip.behaviour1": "_Encases_ the _Fluid Pipe_ with the _Copper Casing_. Encased Fluid pipes will _lock their connections_ in place, no longer reacting to changes to neighbouring pipes.", + + "block.create.encased_fluid_pipe.tooltip": "ENCASED FLUID PIPE", + "block.create.encased_fluid_pipe.tooltip.summary": "A _Fluid Pipe_ encased with the _Copper Casing_.", + + "block.create.copper_valve_handle.tooltip": "COPPER VALVE HANDLE", + "block.create.copper_valve_handle.tooltip.summary": "A precise _source_ of _Rotational Force_ that requires the interaction of players. Be careful not to wear yourself out!", + "block.create.copper_valve_handle.tooltip.condition1": "When Used", + "block.create.copper_valve_handle.tooltip.behaviour1": "Provides _Rotational Force_ to an attached contraption. _Sneak to reverse_ the rotation.", + + "block.create.seat.tooltip": "SEAT", + "block.create.seat.tooltip.summary": "Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.condition1": "Right click on Seat", + "block.create.seat.tooltip.behaviour1": "Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + + "block.create.chute.tooltip": "CHUTE", + "block.create.chute.tooltip.summary": "_Collect_ and transport items vertically or diagonally. Can both take and place items into _item containers_. You can also interact with chutes from the side using _hoppers_ or _mounted funnels_.", + "block.create.chute.tooltip.condition1": "When powered by a fan", + "block.create.chute.tooltip.behaviour1": "_Fan_ powered chutes can convey _Items_ upwards, and suck _items_ off of _Depots_ and _Belts_.", + + "block.create.depot.tooltip": "DEPOT", + "block.create.depot.tooltip.summary": "A handy location to place your _Items_. Provides an interaction point for several machines", + "block.create.depot.tooltip.condition1": "Right Click on Depot", + "block.create.depot.tooltip.behaviour1": "Places or takes an _Item_ from the _Depot_. _Blocks_ and _Contraptions_ that would interact with a _Belt_ also work on a _Depot_.", + + "item.create.blaze_cake.tooltip": "BLAZE CAKE", + "item.create.blaze_cake.tooltip.summary": "A Delicious treat for your hard-working _Blaze Burners_. Gets them all fired up!", + + "item.create.empty_blaze_burner.tooltip": "EMPTY BLAZE BURNER", + "item.create.empty_blaze_burner.tooltip.summary": "A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "When used on a Blaze or Blaze spawner", + "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "Used for moving _fluids_ around. Needs a _Mechanical Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "Can connect to _fluid containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "Places a window on the pipe if available", + + "block.create.hose_pulley.tooltip": "HOSE PULLEY", + "block.create.hose_pulley.tooltip.summary": "Used for _placing_ or _draining_ large _fluid bodies_ in the world.", + "block.create.hose_pulley.tooltip.condition1": "When Powered by Kinetics", + "block.create.hose_pulley.tooltip.behaviour1": "_Raises_ or _Lowers_ the hose, location of the hose determines up to which _height extraction_ or _filling_ will act.", + "block.create.hose_pulley.tooltip.condition2": "When Fluids pulled from Pulley", + "block.create.hose_pulley.tooltip.behaviour2": "Starts _taking fluid_ blocks from the body the hose end was lowered into. Very _large bodies_ of fluids will be _considered infinite_.", + "block.create.hose_pulley.tooltip.condition3": "When Fluids pushed to Pulley", + "block.create.hose_pulley.tooltip.behaviour3": "Starts _filling fluid_ into the world _up to_ the _hose_ ends' _height_.", + + "block.create.fluid_tank.tooltip": "FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "_Stores_ all your favourite _fluids_. Scales in width and height.", + "block.create.fluid_tank.tooltip.condition1": "Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.behaviour1": "Changes the optional window", + + "block.create.creative_fluid_tank.tooltip": "CREATIVE FLUID TANK", + "block.create.creative_fluid_tank.tooltip.summary": "This _Fluid Tank_ allows infinite replication of any Fluid. Scales in width and height.", + "block.create.creative_fluid_tank.tooltip.condition1": "When Fluid in Tank", + "block.create.creative_fluid_tank.tooltip.behaviour1": "Anything _extracting_ from this tank will provide an _endless supply_ of the fluid specified. Fluids _inserted_ into this tank will be _voided._", + "block.create.creative_fluid_tank.tooltip.condition2": "Right-clicked with Wrench", + "block.create.creative_fluid_tank.tooltip.behaviour2": "Changes the optional window", + + "block.create.fluid_valve.tooltip": "FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "Applied _rotational force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational force_ to re-open the valve.", + + "block.create.mechanical_pump.tooltip": "MECHANICAL PUMP", + "block.create.mechanical_pump.tooltip.summary": "Takes _rotational force_ and uses it to move _fluid_ along a _pipe_. Has a maximum range of effect in both directions. (16 blocks by default)", + "block.create.mechanical_pump.tooltip.condition1": "Fluid Flow", + "block.create.mechanical_pump.tooltip.behaviour1": "Applied _rotational force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational force_ to switch the direction that the _fluid_ flows.", + "block.create.mechanical_pump.tooltip.control1": "Right-clicked with Wrench", + "block.create.mechanical_pump.tooltip.action1": "Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "A _fluid pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.condition1": "When Fluids are pushed into it", + "block.create.smart_fluid_pipe.tooltip.behaviour1": "Smart pipes receiving fluid that does not match its filter will block the flow.", + "block.create.smart_fluid_pipe.tooltip.condition2": "When adjacent to fluid container", + "block.create.smart_fluid_pipe.tooltip.behaviour2": "Smart pipes _starting_ a _flow_ from any container will only extract fluids that _match_ its _filter._", + + "block.create.spout.tooltip": "SPOUT", + "block.create.spout.tooltip.summary": "An injector for refilling your _fluid items._", + "block.create.spout.tooltip.condition1": "Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "When a _fluid container item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "Fluid Automation", + "block.create.spout.tooltip.behaviour2": "The spout placed above a _belt_ or _depot_ will react automatically with a _fluid container item_ that passes beneath it.", + + "block.create.item_drain.tooltip": "ITEM DRAIN", + "block.create.item_drain.tooltip.summary": "A grated depot for emptying your _fluid items._", + "block.create.item_drain.tooltip.condition1": "Fluid Transfer", + "block.create.item_drain.tooltip.behaviour1": "When a _fluid container item_ such as a _bucket_ or _bottle_ is inserted from the side, the drain will attempt to empty it into its own _fluid container_. The item will then be ejected on the opposite side.", + + "block.create.mechanical_arm.tooltip": "MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "Can take or place items into any _accessible inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "While in Hand", + "block.create.mechanical_arm.tooltip.action1": "Right-Click an _accessible item inventory_ to set it as a _source_ for the _Mechanical Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "Sets the ordering behaviour for _items_ output by the _mechanical Arm_.", + + "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", + "item.create.wand_of_symmetry.tooltip.summary": "Perfectly mirrors Block placement across configured planes.", + "item.create.wand_of_symmetry.tooltip.condition1": "When in Hotbar", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Stays Active", + "item.create.wand_of_symmetry.tooltip.control1": "R-Click on Ground", + "item.create.wand_of_symmetry.tooltip.action1": "_Creates_ or _Moves_ the Mirror", + "item.create.wand_of_symmetry.tooltip.control2": "R-Click in the Air", + "item.create.wand_of_symmetry.tooltip.action2": "_Removes_ the active Mirror", + "item.create.wand_of_symmetry.tooltip.control3": "R-Click while Sneaking", + "item.create.wand_of_symmetry.tooltip.action3": "Opens the _Configuration Interface_", + + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", + "item.create.handheld_blockzapper.tooltip.summary": "Novel gadget for placing or exchanging blocks at a distance.", + "item.create.handheld_blockzapper.tooltip.control1": "L-Click at Block", + "item.create.handheld_blockzapper.tooltip.action1": "Sets blocks placed by the tool to the targeted block.", + "item.create.handheld_blockzapper.tooltip.control2": "R-Click at Block", + "item.create.handheld_blockzapper.tooltip.action2": "_Places_ or _Replaces_ the targeted block.", + "item.create.handheld_blockzapper.tooltip.control3": "R-Click while Sneaking", + "item.create.handheld_blockzapper.tooltip.action3": "Opens the _Configuration Interface_.", + + "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "Handy tool for creating _landscapes_ and _terrain features_.", + "item.create.handheld_worldshaper.tooltip.control1": "L-Click at Block", + "item.create.handheld_worldshaper.tooltip.action1": "Sets blocks placed by the tool to the targeted block.", + "item.create.handheld_worldshaper.tooltip.control2": "R-Click at Block", + "item.create.handheld_worldshaper.tooltip.action2": "Applies the currently selected _Brush_ and _Tool_ at the targeted location.", + "item.create.handheld_worldshaper.tooltip.control3": "R-Click while Sneaking", + "item.create.handheld_worldshaper.tooltip.action3": "Opens the _Configuration Interface_", + + "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", + "item.create.tree_fertilizer.tooltip.summary": "A powerful combination of minerals suitable for speeding up the growth of common tree types.", + "item.create.tree_fertilizer.tooltip.condition1": "When used on a Sapling", + "item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees _regardless_ of their _spacing conditions_", + + "item.create.deforester.tooltip": "DEFORESTER", + "item.create.deforester.tooltip.summary": "A _radiant axe_ able to chop down trees in a split second.", + + "item.create.extendo_grip.tooltip": "EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder.", + "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", + "item.create.extendo_grip.tooltip.behaviour1": "Increases _reach distance_ of items used in the _Main-Hand_.", + + "item.create.filter.tooltip": "FILTER", + "item.create.filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", + "item.create.filter.tooltip.condition1": "When in filter slot", + "item.create.filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", + "item.create.filter.tooltip.condition2": "When R-Clicked", + "item.create.filter.tooltip.behaviour2": "Opens the _configuration interface_.", + + "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of_ item _attributes_ and _categories_.", + "item.create.attribute_filter.tooltip.condition1": "When in filter slot", + "item.create.attribute_filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", + "item.create.attribute_filter.tooltip.condition2": "When R-Clicked", + "item.create.attribute_filter.tooltip.behaviour2": "Opens the _configuration interface_.", + + "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", + "item.create.empty_schematic.tooltip.summary": "Used as a recipe ingredient and for writing at the _Schematic Table_.", + + "item.create.schematic.tooltip": "SCHEMATIC", + "item.create.schematic.tooltip.summary": "Holds a structure to be positioned and placed into the world. Position the Hologram as desired and use a _Schematicannon_ to build it.", + "item.create.schematic.tooltip.condition1": "When Held", + "item.create.schematic.tooltip.behaviour1": "Can be positioned using the Tools on Screen.", + "item.create.schematic.tooltip.control1": "R-Click while Sneaking", + "item.create.schematic.tooltip.action1": "Opens an _Interface_ for entering exact _Coordinates_.", + + "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", + "item.create.schematic_and_quill.tooltip.summary": "Used for saving a Structure in your world to a .nbt file.", + "item.create.schematic_and_quill.tooltip.condition1": "Step 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Select two corner points using R-Click.", + "item.create.schematic_and_quill.tooltip.condition2": "Step 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ on the faces to adjust the size. R-Click again to Save.", + "item.create.schematic_and_quill.tooltip.control1": "R-Click", + "item.create.schematic_and_quill.tooltip.action1": "Select a corner point / confirm save.", + "item.create.schematic_and_quill.tooltip.control2": "Ctrl Held", + "item.create.schematic_and_quill.tooltip.action2": "Select points in _mid-air_. _Scroll_ to adjust the distance.", + "item.create.schematic_and_quill.tooltip.control3": "R-Click while Sneaking", + "item.create.schematic_and_quill.tooltip.action3": "_Resets_ and removes the selection.", + + "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _Esquema_ desplegado en el Mundo. Utiliza elementos de los inventarios adyacentes y _Pólvora_ como combustible.", + "block.create.schematicannon.tooltip.control1": "Cuando se hace clic derecho", + "block.create.schematicannon.tooltip.action1": "Abre la _Interfaz_", + + "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", + "block.create.schematic_table.tooltip.summary": "Writes saved Schematics onto an _Empty Schematic_.", + "block.create.schematic_table.tooltip.condition1": "When given an Empty Schematic", + "block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder.", + + "block.create.shaft.tooltip": "SHAFT", + "block.create.shaft.tooltip.summary": "_Relays Rotation_ in a straight line.", + + "block.create.cogwheel.tooltip": "COGWHEEL", + "block.create.cogwheel.tooltip.summary": "_Relays Rotation_ in a straight line, and to adjacent _Cogwheels_.", + + "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", + "block.create.large_cogwheel.tooltip.summary": "A larger version of the _Cogwheel_, allowing for _change_ in _Rotation Speed_ when connected to its smaller Counterpart.", + + "block.create.encased_shaft.tooltip": "ENCASED SHAFT", + "block.create.encased_shaft.tooltip.summary": "_Relays Rotation_ in a straight line. Suitable for propagating Rotation through Walls.", + + "block.create.gearbox.tooltip": "GEARBOX", + "block.create.gearbox.tooltip.summary": "_Relays Rotation_ in _four directions_ Reverses straight connections.", + + "block.create.gearshift.tooltip": "GEARSHIFT", + "block.create.gearshift.tooltip.summary": "A control to toggle rotation direction for connected shafts.", + "block.create.gearshift.tooltip.condition1": "When Powered", + "block.create.gearshift.tooltip.behaviour1": "_Reverses_ the outgoing rotation.", + + "block.create.clutch.tooltip": "CLUTCH", + "block.create.clutch.tooltip.summary": "A control to engage/disengage rotation for connected shafts.", + "block.create.clutch.tooltip.condition1": "When Powered", + "block.create.clutch.tooltip.behaviour1": "_Stops_ conveying rotation to the other side.", + + "block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE", + "block.create.encased_chain_drive.tooltip.summary": "_Relays Rotation_ in a straight line and to adjacent _Encased Chain Drives_. Chain drives connect in a group when placed next to another on any face without a shaft. Their orientation does not have to match.", + "block.create.encased_chain_drive.tooltip.condition1": "When Connected", + "block.create.encased_chain_drive.tooltip.behaviour1": "Attached Blocks will relay _rotation speed_ and direction of this component.", + + "block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT", + "block.create.adjustable_chain_gearshift.tooltip.summary": "_Relays Rotation_ in a straight line and to adjacent _Encased Chain Drives_. _Analog redstone_ provided to this block will control which size of drive wheel is engaged with attached chain drives.", + "block.create.adjustable_chain_gearshift.tooltip.condition1": "Redstone Control", + "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Without_ a signal, adjacent chain drives will relay the _same speed._ With a _full strength_ signal, adjacent chain drives will relay exactly _twice its speed._ Anything inbetween will give results between 1-2x its speed.", + + "item.create.belt_connector.tooltip": "BELT CONNECTOR", + "item.create.belt_connector.tooltip.summary": "Connects two or more _Shafts_ with a _Mechanical Belt_. Connected shafts will have the exact same rotation speed and direction. The Belt can act as a _Conveyor_ for _Items_ and _Entities_.", + "item.create.belt_connector.tooltip.control1": "R-Clicked on Shaft", + "item.create.belt_connector.tooltip.action1": "Selects the shaft as one pulley of the Belt. Both selected Shafts have to _line up_ either _Vertically_, _Horizontally_, or _Diagonally_ toward the Belt's Direction.", + "item.create.belt_connector.tooltip.control2": "R-Click while Sneaking", + "item.create.belt_connector.tooltip.action2": "_Resets_ the first selected position for the Belt.", + + "item.create.goggles.tooltip": "GOGGLES", + "item.create.goggles.tooltip.summary": "A pair of glasses to augment your vision with useful _kinetic information_.", + "item.create.goggles.tooltip.condition1": "When worn", + "item.create.goggles.tooltip.behaviour1": "Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", + "item.create.goggles.tooltip.condition2": "When looking at gauge", + "item.create.goggles.tooltip.behaviour2": "Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + + "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip.summary": "A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", + "item.create.wrench.tooltip.control1": "Right-Click a kinetic block", + "item.create.wrench.tooltip.action1": "_Rotates components_ toward or away from the face with which you interacted.", + "item.create.wrench.tooltip.control2": "R-Click while Sneaking", + "item.create.wrench.tooltip.action2": "_Disassembles Kinetic components_ and places them back in _your inventory_.", + + "block.create.creative_motor.tooltip": "CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "A configurable source of _Rotational Force_.", + + "block.create.water_wheel.tooltip": "WATER WHEEL", + "block.create.water_wheel.tooltip.summary": "Provides _Rotational Force_ taken from adjacent _Water Currents_.", + + "block.create.encased_fan.tooltip": "ENCASED FAN", + "block.create.encased_fan.tooltip.summary": "Converts _Rotational Force_ to _Air Currents_ and back. Has a variety of uses.", + "block.create.encased_fan.tooltip.condition1": "When Powered by Redstone", + "block.create.encased_fan.tooltip.behaviour1": "Provides _rotational force_ from any _heat sources_ immediately below itself. The fan has to be facing down.", + "block.create.encased_fan.tooltip.condition2": "When Powered by Kinetics", + "block.create.encased_fan.tooltip.behaviour2": "_Pushes_ or _Pulls_ Entities, depending on the incoming Rotation speed.", + "block.create.encased_fan.tooltip.condition3": "When blowing through special blocks", + "block.create.encased_fan.tooltip.behaviour3": "_Liquids_ and _Fire_ particles are emitted into the air flow. This can be used to _process items_.", + + "block.create.nozzle.tooltip": "NOZZLE", + "block.create.nozzle.tooltip.summary": "Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.", + + "block.create.hand_crank.tooltip": "HAND CRANK", + "block.create.hand_crank.tooltip.summary": "A simple _source_ of _Rotational Force_ that requires the interaction of players. Be careful not to wear yourself out!", + "block.create.hand_crank.tooltip.condition1": "When Used", + "block.create.hand_crank.tooltip.behaviour1": "Provides _Rotational Force_ to an attached contraption. _Sneak to reverse_ the rotation.", + + "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "Fine craftsmanship for _decorating_ a space and _keeping track of time_.", + "block.create.cuckoo_clock.tooltip.condition1": "When Powered by Kinetics", + "block.create.cuckoo_clock.tooltip.behaviour1": "Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.", + + "block.create.turntable.tooltip": "TURNTABLE", + "block.create.turntable.tooltip.summary": "Turns _Rotational Force_ into refined Motion Sickness.", + + "block.create.millstone.tooltip": "MILLSTONE", + "block.create.millstone.tooltip.summary": "A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", + "block.create.millstone.tooltip.condition1": "When Powered by Kinetics", + "block.create.millstone.tooltip.behaviour1": "Starts applying _milling recipes_ to any items inserted from the side or the top of the block.", + "block.create.millstone.tooltip.condition2": "When R-Clicked", + "block.create.millstone.tooltip.behaviour2": "Collects the outputs manually.", + + "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", + "block.create.crushing_wheel.tooltip.summary": "Large rotatable wheels that _break down_ anything.", + "block.create.crushing_wheel.tooltip.condition1": "When attached to other Crushing Wheel", + "block.create.crushing_wheel.tooltip.behaviour1": "Forms a crushing machine for processing a variety of things. The Wheels' teeth have to connect and moving with the _same speed_ in _opposite directions_.", + + "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", + "block.create.mechanical_press.tooltip.summary": "A forceful piston for compressing items beneath it. Requires constant _Rotational Force_.", + "block.create.mechanical_press.tooltip.condition1": "When Powered by Redstone", + "block.create.mechanical_press.tooltip.behaviour1": "_Starts_ to compress items dropped below it.", + "block.create.mechanical_press.tooltip.condition2": "When Above a Mechanical Belt", + "block.create.mechanical_press.tooltip.behaviour2": "_Automatically_ compresses bypassing items on the Belt.", + "block.create.mechanical_press.tooltip.condition3": "When above Basin", + "block.create.mechanical_press.tooltip.behaviour3": "Starts to _compact items_ in the basin whenever all necessary ingredients are present.", + + "block.create.basin.tooltip": "BASIN", + "block.create.basin.tooltip.summary": "A handy _item container_ used in processing with the _Mechanical Mixer_ and the _Mechanical Press_. Supports _Redstone Comparators_. Comes with a handy filter, specifying which items should be created in this Basin.", + "block.create.basin.tooltip.condition1": "Auto-Output", + "block.create.basin.tooltip.behaviour1": "When _open inventories_ such as belts, other basins, depots, item drains and others are _below one side_ of a basin, they will automatically receive any _item/fluid outputs_ created in the basin. This is useful for automation.", + + "block.create.blaze_burner.tooltip": "BLAZE BURNER", + "block.create.blaze_burner.tooltip.summary": "A block to heat a basin when housing a tamed blaze.", + "block.create.blaze_burner.tooltip.condition1": "When placed below a basin", + "block.create.blaze_burner.tooltip.behaviour1": "Provides _heat_ to basin recipes.", + "block.create.blaze_burner.tooltip.condition2": "When fuel is used on the blaze heater", + "block.create.blaze_burner.tooltip.behaviour2": "Increases the remaining burn time by the furnace burn time of the used item. Consumes the item. Use _Blaze Cake_ for high temperatures.", + + "block.create.reinforced_rail.tooltip": "REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "A timber stabilized rail, _does not need supports_.", + + "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", + "block.create.mechanical_mixer.tooltip.summary": "A kinetic whisk providing automated shapeless crafting recipes of multiple ingredients. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", + "block.create.mechanical_mixer.tooltip.condition1": "When above Basin", + "block.create.mechanical_mixer.tooltip.behaviour1": "Starts to mix items in the basin whenever all necessary ingredients are present. To prevent unwanted recipes, use the filter slot on the basin or cut the rotational force until all desired ingredients have been added.", + + "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", + "block.create.mechanical_crafter.tooltip.summary": "A kinetic assembler for _automating_ any _shaped crafting_ recipe. Place _multiple in a grid_ corresponding to your recipe, and _arrange their belts_ to create a _flow_ that exits the grid on one of the crafters.", + "block.create.mechanical_crafter.tooltip.condition1": "When Powered by Kinetics", + "block.create.mechanical_crafter.tooltip.behaviour1": "_Starts the crafting process_ as soon as _all crafters_ in the grid have been _given an item_.", + "block.create.mechanical_crafter.tooltip.condition2": "On Redstone Pulse", + "block.create.mechanical_crafter.tooltip.behaviour2": "_Forces_ the start of the _crafting process_ with all currently given _items_ in the grid.", + "block.create.mechanical_crafter.tooltip.control1": "When Wrenched at Front", + "block.create.mechanical_crafter.tooltip.action1": "_Cycles the direction_ an individual crafter _moves its items_ towards. To form a working grid, _arrange the belts in a flow_ which moves all items towards a final crafter. The final crafter must _point away_ from the grid.", + "block.create.mechanical_crafter.tooltip.control2": "When Wrenched at back", + "block.create.mechanical_crafter.tooltip.action2": "_Connects_ the _input inventory_ of adjacent crafters. Use this to _combine slots_ in the crafting grid and _save on input work_.", + + "block.create.furnace_engine.tooltip": "FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "A powerful source of _Rotational Power_ that requires a _running furnace_ to work.", + "block.create.furnace_engine.tooltip.condition1": "When Attached to Lit Furnace", + "block.create.furnace_engine.tooltip.behaviour1": "_Starts powering_ a _Flywheel_ placed in front of it (1m apart). Use a Blast Furnace for higher speeds.", + + "block.create.flywheel.tooltip": "FLYWHEEL", + "block.create.flywheel.tooltip.summary": "A large metal wheel to _harness and stabilize_ generated force by an _attached Engine_. Flywheels connect to engines if they are _1m apart_ and at a _90° Angle_ from each other.", + "block.create.flywheel.tooltip.condition1": "When Attached to Running Engine", + "block.create.flywheel.tooltip.behaviour1": "Provides _Rotational Force_ to a connected contraption based on the generator's strength and speed.", + + "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", + "block.create.portable_storage_interface.tooltip.summary": "A portable interchange point for _moving items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley. Two meeting interfaces have to _face each other_ and be spaced _1-2 blocks apart_.", + "block.create.portable_storage_interface.tooltip.condition1": "While Moving", + "block.create.portable_storage_interface.tooltip.behaviour1": "Interacts with stationary _portable storage interfaces_ to transfer items to or from the contraption. Components inserting into or extracting from the _Stationary Interface_ will interact with the inventories on the contraption _directly._ The structure will briefly stall as items are exchanged.", + "block.create.portable_storage_interface.tooltip.condition2": "When Powered by Redstone", + "block.create.portable_storage_interface.tooltip.behaviour2": "_Disengages_ any active connection immediately.", + + "block.create.portable_fluid_interface.tooltip": "PORTABLE FLUID INTERFACE", + "block.create.portable_fluid_interface.tooltip.summary": "A portable interchange point for _moving fluids_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley. Two meeting interfaces have to _face each other_ and be spaced _1-2 blocks apart_.", + "block.create.portable_fluid_interface.tooltip.condition1": "While Moving", + "block.create.portable_fluid_interface.tooltip.behaviour1": "Interacts with stationary _portable storage interfaces_ to transfer fluids to or from the contraption. Pipes inserting into or extracting from the _Stationary Interface_ will interact with the tanks on the contraption _directly._ The structure will briefly stall as Fluids are exchanged.", + "block.create.portable_fluid_interface.tooltip.condition2": "When Powered by Redstone", + "block.create.portable_fluid_interface.tooltip.behaviour2": "_Disengages_ any active connection immediately.", + + "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "A _configurable relay_ able to speed up or slow down the target component to any desired speed.", + "block.create.rotation_speed_controller.tooltip.condition1": "When Attached to Large Cogwheel", + "block.create.rotation_speed_controller.tooltip.behaviour1": "Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached on top_ of the controller.", + + "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", + "block.create.mechanical_piston.tooltip.summary": "A more advanced version of the _Piston._ It uses _Rotational Force_ to precisely move structures in front of it. _Piston Extension Poles_ at the rear define the _Range_ of this Device. Without extensions, the piston will not move. Use _Chassis_ or _Slime Blocks_ to move more than a single line of blocks.", + "block.create.mechanical_piston.tooltip.condition1": "When Powered by Kinetics", + "block.create.mechanical_piston.tooltip.behaviour1": "Starts moving the attached structure. Speed and direction correlate to incoming Rotation Speed.", + + "block.create.piston_extension_pole.tooltip": "PISTON POLE", + "block.create.piston_extension_pole.tooltip.summary": "Extends the range of _Mechanical Pistons_.", + "block.create.piston_extension_pole.tooltip.condition1": "When attached to Mechanical Piston", + "block.create.piston_extension_pole.tooltip.behaviour1": "Extends a piston's range by 1 block", + + "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", + "block.create.mechanical_bearing.tooltip.summary": "Used for rotating _larger structures_ with rotational force.", + "block.create.mechanical_bearing.tooltip.condition1": "When Powered by Kinetics", + "block.create.mechanical_bearing.tooltip.behaviour1": "Starts rotating attached blocks. Use _Chassis_, _Slime_ or _Super Glue_ to move more than a single block.", + + "block.create.windmill_bearing.tooltip": "WINDMILL BEARING", + "block.create.windmill_bearing.tooltip.summary": "Used for harnessing _Rotational Force_ from wind. Attach your own design and watch it spin!", + "block.create.windmill_bearing.tooltip.condition1": "When Right-clicked", + "block.create.windmill_bearing.tooltip.behaviour1": "Starts providing _Rotational Force_ generated from the rotation of its attached structure. The Structure has to include suitable _Sail Blocks_ or _Wool_. Use _Chassis_, _Slime_ or _Super Glue_ to move more than a single block.", + + "block.create.sail_frame.tooltip": "SAIL FRAME", + "block.create.sail_frame.tooltip.summary": "A useful building block and source of kinetic energy when part of a structure mounted onto a _Windmill Bearing_.", + + "block.create.white_sail.tooltip": "SAIL", + "block.create.white_sail.tooltip.summary": "A useful building block and source of kinetic energy when part of a structure mounted onto a _Windmill Bearing_. Comes in a variety of colours.", + "block.create.white_sail.tooltip.condition1": "When Right-clicked with Dye", + "block.create.white_sail.tooltip.behaviour1": "Changes color of the sail.", + + "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "An advanced version of the _Mechanical Bearing_ for rotating up to two _clock hands_ according to current _in-game time_.", + "block.create.clockwork_bearing.tooltip.condition1": "When Powered by Kinetics", + "block.create.clockwork_bearing.tooltip.behaviour1": "Starts rotating the attached Structure towards the _current hour_. If an independent second structure exists in front of the first one, it will serve as the _minute hand_.", + + "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "A _programmable utility component,_ which can change its _rotational through-put_ according to up to _5 consecutive instructions._ Use this to power Mechanical Bearings, Pistons or Pulleys with more control over timing and speed. May become less precise at higher speeds.", + "block.create.sequenced_gearshift.tooltip.condition1": "When Powered by Redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "_Starts executing_ programmed instructions based on the input speed.", + "block.create.sequenced_gearshift.tooltip.condition2": "When R-Clicked", + "block.create.sequenced_gearshift.tooltip.behaviour2": "Opens the _configuration interface._", + + "block.create.cart_assembler.tooltip": "CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "When placed on a _Rail_, can _assemble_ and _disassemble_ moving structures onto passing minecarts. Refer to [Ctrl] for rail type specific behaviour.", + "block.create.cart_assembler.tooltip.condition1": "Single Cart Contraptions", + "block.create.cart_assembler.tooltip.behaviour1": "With a _single_ assember, structures will anchor and rotate on a _single minecart_. Use a _wrench_ to specify desired _rotation behaviour_.", + "block.create.cart_assembler.tooltip.condition2": "Carriage Contraptions", + "block.create.cart_assembler.tooltip.behaviour2": "Two cart assembers _connected by_ a _structure_ will, once both contain a minecart, connect those carts with a _contraption mounted between_ the _two_ of them. The structure will behave similarly to a _Minecart Coupling_.", + "block.create.cart_assembler.tooltip.control1": "When placed above Rail", + "block.create.cart_assembler.tooltip.action1": "_Assembles_ onto passing carts _when powered_, _disassembles_ them otherwise.", + "block.create.cart_assembler.tooltip.control2": "When placed above Powered Rail", + "block.create.cart_assembler.tooltip.action2": "Assembles and _accelerates_ carts _when powered_, disassembles and _holds_ them otherwise.", + "block.create.cart_assembler.tooltip.control3": "When placed above Detector Rail", + "block.create.cart_assembler.tooltip.action3": "_Assembles unassembled_ carts, _disassembles assembled_ carts.", + "block.create.cart_assembler.tooltip.control4": "When placed above Activator Rail", + "block.create.cart_assembler.tooltip.action4": "_Disassembles_ carts when powered.", + + "block.create.rope_pulley.tooltip": "ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "Moves attached _blocks_ and _structures vertically_. Use _Chassis_, _Slime_ or _Super Glue_ to move more than a single block.", + "block.create.rope_pulley.tooltip.condition1": "When Powered by Kinetics", + "block.create.rope_pulley.tooltip.behaviour1": "Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", + + "block.create.linear_chassis.tooltip": "LINEAR CHASSIS", + "block.create.linear_chassis.tooltip.summary": "A configurable base block connecting structures for movement.", + "block.create.linear_chassis.tooltip.condition1": "When Moved", + "block.create.linear_chassis.tooltip.behaviour1": "_Moves_ all _attached Chassis_ with the same orientation, and a column of Blocks within its range. Blocks will only be pulled if the chassis' face is _Sticky_ (See [Ctrl]).", + "block.create.linear_chassis.tooltip.condition2": "With Wrench", + "block.create.linear_chassis.tooltip.behaviour2": "Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.linear_chassis.tooltip.control1": "When R-Clicked with Slime Ball", + "block.create.linear_chassis.tooltip.action1": "Makes the clicked face _Sticky_. When moved, the chassis will _pull_ attached Blocks, regardless of movement direction.", + + "block.create.secondary_linear_chassis.tooltip": "SECONDARY LINEAR CHASSIS", + "block.create.secondary_linear_chassis.tooltip.summary": "A second type of _Linear Chassis_ that does not connect to the other.", + + "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", + "block.create.radial_chassis.tooltip.summary": "A configurable base block connecting structures for movement.", + "block.create.radial_chassis.tooltip.condition1": "When Moved", + "block.create.radial_chassis.tooltip.behaviour1": "_Moves_ all _attached Chassis_ in a column, and a cylinder of blocks around itself. Blocks around it are only moved when they are within range and attached to a sticky side (See [Ctrl]).", + "block.create.radial_chassis.tooltip.condition2": "With Wrench", + "block.create.radial_chassis.tooltip.behaviour2": "Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", + "block.create.radial_chassis.tooltip.control1": "When R-Clicked with Slime Ball", + "block.create.radial_chassis.tooltip.action1": "Makes the clicked face _Sticky_. When Chassis move, all designated blocks attached to the sticky side are moved with it.", + + "block.create.mechanical_drill.tooltip": "MECHANICAL DRILL", + "block.create.mechanical_drill.tooltip.summary": "A mechanical device suitable for _breaking blocks_. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_drill.tooltip.condition1": "When Powered by Kinetics", + "block.create.mechanical_drill.tooltip.behaviour1": "Acts as a _stationary_ Block Breaker. Also _hurts entities_ in its effective area.", + "block.create.mechanical_drill.tooltip.condition2": "While Moving", + "block.create.mechanical_drill.tooltip.behaviour2": "Breaks Blocks with which the drill collides.", + + "block.create.mechanical_harvester.tooltip": "MECHANICAL HARVESTER", + "block.create.mechanical_harvester.tooltip.summary": "A mechanical plant cutter suitable for medium scale crop automation. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_harvester.tooltip.condition1": "While Moving", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Harvests_ all _mature crops_ which which the blade collides and reset them to their initial growth state.", + + "block.create.mechanical_plough.tooltip": "MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "A mechanical plough has a variety of uses. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", + "block.create.mechanical_plough.tooltip.condition1": "While Moving", + "block.create.mechanical_plough.tooltip.behaviour1": "_Breaks blocks_ which _cannot be collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills soil blocks_ as though a Hoe would be used on them.", + + "block.create.mechanical_saw.tooltip": "MECHANICAL SAW", + "block.create.mechanical_saw.tooltip.summary": "Suitable for _cutting trees_ effectively and for _cutting blocks_ into their carpentered counterparts. It is movable using _Mechanical Pistons_ or _Bearings_.", + "block.create.mechanical_saw.tooltip.condition1": "When facing up", + "block.create.mechanical_saw.tooltip.behaviour1": "Applies _Sawing_ and _Stonecutting Recipes_ to items dropped onto or inserted into it. When multiple outputs are possible, it cycles through them unless a _filter_ is assigned.", + "block.create.mechanical_saw.tooltip.condition2": "When facing horizontally", + "block.create.mechanical_saw.tooltip.behaviour2": "_Breaks logs_ in front of it. If the log supported a tree on its own, the _tree will collapse_ away from the saw.", + "block.create.mechanical_saw.tooltip.condition3": "While Moving", + "block.create.mechanical_saw.tooltip.behaviour3": "_Cuts_ all _Trees_ with which the saw collides.", + + "block.create.stockpile_switch.tooltip": "STOCKPILE SWITCH", + "block.create.stockpile_switch.tooltip.summary": "Toggles a Redstone signal based on the amount of _Stored Items_ in the attached Container. Comes with a handy filter. As opposed to a _Comparator,_ the _Stockpile Switch_ allows configuration of _thresholds,_ at which signals are inverted.", + "block.create.stockpile_switch.tooltip.condition1": "When R-Clicked", + "block.create.stockpile_switch.tooltip.behaviour1": "Opens the _Configuration Interface_.", + + "block.create.content_observer.tooltip": "CONTENT OBSERVER", + "block.create.content_observer.tooltip.summary": "_Detects Items_ inside _containers_ and _conveyors_ matching a configured _filter_. While the observed _inventory_, _belt_ or _chute contains_ a matching item, this component will emit a _Redstone Signal_. When an observed _funnel transfers_ a matching item, this component will emit a _Redstone Pulse_.", + + "block.create.redstone_link.tooltip": "REDSTONE LINK", + "block.create.redstone_link.tooltip.summary": "Endpoints for _Wireless Redstone_ connections. Can be assigned _Frequencies_ using any item. Signal range is limited, though reasonably far.", + "block.create.redstone_link.tooltip.condition1": "When Powered", + "block.create.redstone_link.tooltip.behaviour1": "Receiving Links of the same _Frequency_ will produce a Redstone signal.", + "block.create.redstone_link.tooltip.control1": "When R-Clicked with an Item", + "block.create.redstone_link.tooltip.action1": "Sets the _Frequency_ to that item. A total of _two different items_ can be used in combination for defining a Frequency.", + "block.create.redstone_link.tooltip.control2": "When R-Clicked while Sneaking", + "block.create.redstone_link.tooltip.action2": "Toggles between _Receiver_ and _Transmitter_ Mode.", + + "block.create.nixie_tube.tooltip": "NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "A fancy redstone-powered _Number_ and _Text Display_.", + "block.create.nixie_tube.tooltip.condition1": "When Powered", + "block.create.nixie_tube.tooltip.behaviour1": "Shows the current redstone _Signal Strength_ as its displayed value.", + "block.create.nixie_tube.tooltip.condition2": "With Name Tag", + "block.create.nixie_tube.tooltip.behaviour2": "Display _contents_ of your _name tag_ with several nixie tubes _arranged_ in a _line_.", + + "block.create.redstone_contact.tooltip": "REDSTONE CONTACT", + "block.create.redstone_contact.tooltip.summary": "Only emits redstone power in pairs. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", + "block.create.redstone_contact.tooltip.condition1": "When facing other Contact", + "block.create.redstone_contact.tooltip.behaviour1": "Provides a _Redstone Signal_.", + "block.create.redstone_contact.tooltip.condition2": "While Moving", + "block.create.redstone_contact.tooltip.behaviour2": "Triggers all stationary contacts it passes.", + + "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", + "block.create.adjustable_crate.tooltip.summary": "This _Item Container_ allows Manual control over its capacity. It can hold up to _16 Stacks_ of any Item. Supports _Redstone Comparators_.", + "block.create.adjustable_crate.tooltip.control1": "When R-Clicked", + "block.create.adjustable_crate.tooltip.action1": "Opens the _Interface_.", + + "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", + "block.create.creative_crate.tooltip.summary": "This _Storage Container_ allows infinite replication of any item. Place next to a _Schematicannon_ to remove any material requirements.", + "block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot", + "block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + + "block.create.deployer.tooltip": "DEPLOYER", + "block.create.deployer.tooltip.summary": "_Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit items_ to its own _Inventory_. Held items have to be _inserted_ and _extracted_ from the block directly.", + "block.create.deployer.tooltip.condition1": "When Powered by Kinetics", + "block.create.deployer.tooltip.behaviour1": "Extends its arm and _activates_ in the block space _2m ahead_ of itself.", + "block.create.deployer.tooltip.condition2": "R-Clicked with Wrench", + "block.create.deployer.tooltip.behaviour2": "Toggles punch mode. In _punch mode_, the Deployer will attempt to use its item to _break blocks_ or _hurt entities_.", + "block.create.deployer.tooltip.condition3": "When Filter assigned", + "block.create.deployer.tooltip.behaviour3": "Deployer will not activate unless held item _matches_ the _filter._ Items not matching cannot be inserted; Held items matching the filter cannot be extracted.", + + "block.create.brass_casing.tooltip": "BRASS CASING", + "block.create.brass_casing.tooltip.summary": "Sturdy machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._", + + "block.create.pulse_repeater.tooltip": "PULSE REPEATER", + "block.create.pulse_repeater.tooltip.summary": "A simple circuit for cutting passing redstone signals to a length of _1 tick_.", + + "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", + "block.create.adjustable_repeater.tooltip.summary": "An advanced _Redstone Repeater_ with a _configurable Delay_ up to 30 Minutes.", + + "block.create.adjustable_pulse_repeater.tooltip": "FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "A _Pulse Repeater_ with a _configurable Delay_ up to 30 Minutes.", + + "block.create.analog_lever.tooltip": "ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "A lever with more _precise control_ over its emitted _signal strength_.", + + "block.create.powered_toggle_latch.tooltip": "POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "A lever that can be toggled by a _Redstone Pulse_.", + + "block.create.powered_latch.tooltip": "POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "A lever that can be controlled by _Redstone Signals_. A signal on the _back enables_ it, a signal from the _side will reset_ it.", + + "block.create.controller_rail.tooltip": "CONTROLLER RAIL", + "block.create.controller_rail.tooltip.summary": "A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", + "block.create.controller_rail.tooltip.condition1": "When Powered by Redstone", + "block.create.controller_rail.tooltip.behaviour1": "_Accelerates_ or _Decelerates_ passing _minecarts_ corresponding to the _signal strength_. Propagates redstone power to adjacent controller rails. Powering two controller rails with different strengths will cause tracks between them to interpolate their signal.", + + "block.create.speedometer.tooltip": "SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "Measures and displays the _rotational speed_ of attached kinetic components. Supports _Redstone Comparators_.", + "block.create.speedometer.tooltip.condition1": "When Powered by Kinetics", + "block.create.speedometer.tooltip.behaviour1": "Indicates a color corresponding to the level of speed. _Green_ indicates Slow, _Blue_ Moderate and _Purple_ Fast rotation. Some mechanical components require a sufficient level of speed to work properly.", + + "block.create.stressometer.tooltip": "STRESSOMETER", + "block.create.stressometer.tooltip.summary": "Measures and displays the _overall stress_ of the attached kinetic network. Supports _Redstone Comparators_.", + "block.create.stressometer.tooltip.condition1": "When Powered by Kinetics", + "block.create.stressometer.tooltip.behaviour1": "Indicates a color corresponding to the level of stress. _Over-stressed networks_ will cease to move. Stress can be relieved by adding more _rotational sources_ to the network.", + + "item.create.sand_paper.tooltip": "SAND PAPER", + "item.create.sand_paper.tooltip.summary": "A rough paper that can be used to _polish materials_. Can be automatically applied using the Deployer.", + "item.create.sand_paper.tooltip.condition1": "When Used", + "item.create.sand_paper.tooltip.behaviour1": "Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking at them_", + + "item.create.super_glue.tooltip": "SUPER GLUE", + "item.create.super_glue.tooltip.summary": "Glue a block to another, and they will forever be inseparable.", + "item.create.super_glue.tooltip.condition1": "When Used", + "item.create.super_glue.tooltip.behaviour1": "Makes the _clicked face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged along_ when moved by _mechanical pistons_, _bearings_ and other controllers.", + "item.create.super_glue.tooltip.condition2": "When Held in Offhand", + "item.create.super_glue.tooltip.behaviour2": "_Automatically attaches_ blocks placed from the main hand to the _side_ they were _placed against._", + + "item.create.builders_tea.tooltip": "BUILDERS TEA", + "item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._", + + "item.create.refined_radiance.tooltip": "REFINED RADIANCE", + "item.create.refined_radiance.tooltip.summary": "A Chromatic material forged from _absorbed light_.", + + "item.create.shadow_steel.tooltip": "SHADOW STEEL", + "item.create.shadow_steel.tooltip.summary": "A Chromatic material forged _in the void_.", + + "item.create.minecart_coupling.tooltip": "MINECART COUPLING", + "item.create.minecart_coupling.tooltip.summary": "_Chains_ all your _Minecarts_ or _Carriage Contraptions_ together to form a majestic Train.", + "item.create.minecart_coupling.tooltip.condition1": "When Used on Minecart", + "item.create.minecart_coupling.tooltip.behaviour1": "_Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", + + "item.create.crafter_slot_cover.tooltip": "SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "Used to mark a _Mechanical Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients are diagonal_ to each other.", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Work in progress!", + "create.tooltip.randomWipDescription0": "Please keep this item away from children.", + "create.tooltip.randomWipDescription1": "A baby panda dies every time you use this item. Every. Time.", + "create.tooltip.randomWipDescription2": "Use at your own risk.", + "create.tooltip.randomWipDescription3": "This is not the item you are looking for, *finger-wiggles* please disperse.", + "create.tooltip.randomWipDescription4": "This item will self-destruct in 10 seconds. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Believe me, it's useless.", + "create.tooltip.randomWipDescription6": "By using this item, you hereby consent to our disclaimer and agree to its terms.", + "create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?", + "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file From bec13b8e7db02bd18f586456e3f1fcefce860fa9 Mon Sep 17 00:00:00 2001 From: Zelophed Date: Tue, 16 Feb 2021 22:50:11 +0100 Subject: [PATCH 111/147] Assisted Placement, Part IV-b --- .../create/foundation/gui/AllGuiTextures.java | 4 +- .../foundation/utility/ghost/GhostBlocks.java | 3 +- .../utility/placement/PlacementHelpers.java | 81 +++++++++++++++--- .../textures/gui/placement_indicator.png | Bin 0 -> 9385 bytes 4 files changed, 75 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/assets/create/textures/gui/placement_indicator.png diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 5528f791b..520cde09e 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -1,7 +1,6 @@ package com.simibubi.create.foundation.gui; import com.simibubi.create.Create; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.gui.screen.Screen; @@ -79,6 +78,9 @@ public enum AllGuiTextures { INDICATOR_YELLOW("widgets.png", 54, 18, 18, 6), INDICATOR_RED("widgets.png", 72, 18, 18, 6), + // PlacementIndicator + PLACEMENT_INDICATOR_SHEET("placement_indicator.png", 0, 0, 256, 256); + ; public static final int FONT_COLOR = 0x575F7A; diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java index 01d31b076..d5ae5d175 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.utility.ghost; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import net.minecraft.block.BlockState; +import net.minecraft.util.math.MathHelper; import java.util.HashMap; import java.util.Map; @@ -12,7 +13,7 @@ public class GhostBlocks { public static double getBreathingAlpha() { double period = 2500; double timer = System.currentTimeMillis() % period; - double offset = Math.cos((2d/period) * Math.PI * timer); + double offset = MathHelper.cos((float) ((2d/period) * Math.PI * timer)); return 0.75d - 0.2d * offset; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java index 0026d5fe6..002bc3e49 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.utility.placement; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingAngle; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.utility.AngleHelper; @@ -35,7 +36,7 @@ public class PlacementHelpers { private static final List helpers = new ArrayList<>(); private static int animationTick = 0; - private static final InterpolatedChasingValue angle = new InterpolatedChasingAngle().withSpeed(0.15f); + private static final InterpolatedChasingValue angle = new InterpolatedChasingAngle().withSpeed(0.25f); private static BlockPos target = null; private static BlockPos lastTarget = null; @@ -163,13 +164,7 @@ public class PlacementHelpers { //mc.fontRenderer.drawString(text, x, y, 0xFFFFFF | opacity); - boolean flag = AllConfigs.CLIENT.smoothPlacementIndicator.get(); - if (flag) - drawDirectionIndicator(event.getPartialTicks(), screenX, screenY, progress); - - else { - //TODO find something more in style - } + drawDirectionIndicator(event.getPartialTicks(), screenX, screenY, progress); //matrix.pop(); } } @@ -184,11 +179,17 @@ public class PlacementHelpers { Vec3d projTarget = VecHelper.projectToPlayerView(VecHelper.getCenterOf(lastTarget), partialTicks); Vec3d target = new Vec3d(projTarget.x, projTarget.y, 0); + if (projTarget.z > 0) { + target = target.inverse(); + } + Vec3d norm = target.normalize(); Vec3d ref = new Vec3d(0, 1, 0); float targetAngle = AngleHelper.deg(Math.acos(norm.dotProduct(ref))); - if (norm.x > 0) { + angle.withSpeed(0.25f); + + if (norm.x < 0) { targetAngle = 360 - targetAngle; } @@ -198,10 +199,21 @@ public class PlacementHelpers { angle.target(targetAngle); angle.tick(); + float snapSize = 22.5f; + float snappedAngle = (snapSize * Math.round(angle.get(0f) / snapSize)) % 360f; float length = 10; //TOD O if the target is off screen, use length to show a meaningful distance + boolean flag = AllConfigs.CLIENT.smoothPlacementIndicator.get(); + if (flag) + fadedArrow(centerX, centerY, r, g, b, a, length, snappedAngle); + + else + textured(centerX, centerY, a, snappedAngle); + } + + private static void fadedArrow(float centerX, float centerY, float r, float g, float b, float a, float length, float snappedAngle) { RenderSystem.pushMatrix(); RenderSystem.disableTexture(); RenderSystem.enableBlend(); @@ -210,8 +222,8 @@ public class PlacementHelpers { RenderSystem.shadeModel(GL11.GL_SMOOTH); RenderSystem.translated(centerX, centerY, 0); - RenderSystem.rotatef(angle.get(0.1f), 0, 0, -1); - //RenderSystem.scaled(3, 3, 3); + RenderSystem.rotatef(angle.get(0), 0, 0, 1); + //RenderSystem.rotatef(snappedAngle, 0, 0, 1); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder bufferbuilder = tessellator.getBuffer(); @@ -234,4 +246,51 @@ public class PlacementHelpers { RenderSystem.enableTexture(); RenderSystem.popMatrix(); } + + private static void textured(float centerX, float centerY, float alpha, float snappedAngle) { + RenderSystem.pushMatrix(); + RenderSystem.enableTexture(); + //RenderSystem.disableTexture(); + AllGuiTextures.PLACEMENT_INDICATOR_SHEET.bind(); + RenderSystem.enableBlend(); + //RenderSystem.disableAlphaTest(); + RenderSystem.enableAlphaTest(); + RenderSystem.defaultBlendFunc(); + RenderSystem.color4f(1f, 1f, 1f, 1f); + RenderSystem.shadeModel(GL11.GL_SMOOTH); + + RenderSystem.translated(centerX, centerY, 0); + //RenderSystem.rotatef(angle.get(0.1f), 0, 0, -1); + //RenderSystem.translated(0, 10, 0); + //RenderSystem.rotatef(angle.get(0.1f), 0, 0, 1); + RenderSystem.scaled(12, 12, 0); + + float index = snappedAngle / 22.5f; + float tex_size = 16f/256f; + + float tx = 0; + float ty = index * tex_size; + float tw = 1f; + float th = tex_size; + + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buffer = tessellator.getBuffer(); + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEXTURE); + + + buffer.vertex(-1, -1, 0).color(1f, 1f, 1f, alpha).texture(tx, ty).endVertex(); + buffer.vertex(-1, 1, 0).color(1f, 1f, 1f, alpha).texture(tx, ty + th).endVertex(); + buffer.vertex(1, 1, 0).color(1f, 1f, 1f, alpha).texture(tx + tw, ty + th).endVertex(); + buffer.vertex(1, -1, 0).color(1f, 1f, 1f, alpha).texture(tx + tw, ty).endVertex(); + + tessellator.draw(); + RenderSystem.shadeModel(GL11.GL_FLAT); + + //RenderSystem.enableTexture(); + + RenderSystem.disableBlend(); + //RenderSystem.enableAlphaTest(); + RenderSystem.popMatrix(); + } + } diff --git a/src/main/resources/assets/create/textures/gui/placement_indicator.png b/src/main/resources/assets/create/textures/gui/placement_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..cb53a47fcb3c027831ef62e2a077a255fb5ddeaf GIT binary patch literal 9385 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 literal 0 HcmV?d00001 From d2e30eeab516bcc4762731e224f179f65c809738 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 16 Feb 2021 14:47:03 -0800 Subject: [PATCH 112/147] finish merge remove old assets --- .../com/simibubi/create/AllEntityTypes.java | 3 +- .../com/simibubi/create/AllSpriteShifts.java | 8 ++-- .../com/simibubi/create/AllTileEntities.java | 2 + .../structureMovement/ContraptionLighter.java | 3 +- .../NonStationaryLighter.java | 1 - .../gantry/GantryContraption.java | 8 ++-- .../gantry/GantryContraptionEntity.java | 4 ++ .../GantryContraptionEntityRenderer.java | 18 ------- .../gantry/GantryPinionTileEntity.java | 4 ++ .../advanced/SpeedControllerRenderer.java | 2 +- .../relays/belt/BeltInstance.java | 20 ++++++-- .../relays/belt/BeltRenderer.java | 44 +++++++++--------- .../relays/belt/BeltTileEntity.java | 4 ++ .../create/textures/block/belt/black.png | Bin 12453 -> 0 bytes .../textures/block/belt/black_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/black_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/black_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/blue.png | Bin 12453 -> 0 bytes .../textures/block/belt/blue_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/blue_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/blue_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/brown.png | Bin 12453 -> 0 bytes .../textures/block/belt/brown_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/brown_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/brown_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/cyan.png | Bin 12453 -> 0 bytes .../textures/block/belt/cyan_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/cyan_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/cyan_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/gray.png | Bin 12453 -> 0 bytes .../textures/block/belt/gray_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/gray_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/gray_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/green.png | Bin 12453 -> 0 bytes .../textures/block/belt/green_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/green_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/green_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/light_blue.png | Bin 12453 -> 0 bytes .../block/belt/light_blue_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/light_blue_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/light_blue_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/light_gray.png | Bin 12453 -> 0 bytes .../block/belt/light_gray_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/light_gray_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/light_gray_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/lime.png | Bin 12453 -> 0 bytes .../textures/block/belt/lime_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/lime_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/lime_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/magenta.png | Bin 12453 -> 0 bytes .../textures/block/belt/magenta_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/magenta_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/magenta_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/orange.png | Bin 12453 -> 0 bytes .../textures/block/belt/orange_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/orange_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/orange_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/pink.png | Bin 12453 -> 0 bytes .../textures/block/belt/pink_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/pink_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/pink_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/purple.png | Bin 12453 -> 0 bytes .../textures/block/belt/purple_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/purple_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/purple_scroll.png | Bin 0 -> 1657 bytes .../assets/create/textures/block/belt/red.png | Bin 12453 -> 0 bytes .../textures/block/belt/red_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/red_diagonal_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/red_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/white.png | Bin 12453 -> 0 bytes .../textures/block/belt/white_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/white_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/white_scroll.png | Bin 0 -> 1657 bytes .../create/textures/block/belt/yellow.png | Bin 12453 -> 0 bytes .../textures/block/belt/yellow_diagonal.png | Bin 12453 -> 0 bytes .../block/belt/yellow_diagonal_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt/yellow_scroll.png | Bin 0 -> 1657 bytes .../textures/block/belt_offset_scroll.png | Bin 531 -> 0 bytes 78 files changed, 62 insertions(+), 59 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntityRenderer.java delete mode 100644 src/main/resources/assets/create/textures/block/belt/black.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/black_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/black_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/black_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/blue.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/blue_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/blue_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/blue_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/brown.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/brown_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/brown_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/brown_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/cyan.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/cyan_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/cyan_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/cyan_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/gray.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/gray_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/gray_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/gray_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/green.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/green_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/green_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/green_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/light_blue.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/light_blue_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/light_blue_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/light_blue_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/light_gray.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/light_gray_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/light_gray_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/light_gray_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/lime.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/lime_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/lime_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/lime_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/magenta.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/magenta_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/magenta_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/magenta_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/orange.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/orange_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/orange_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/orange_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/pink.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/pink_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/pink_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/pink_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/purple.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/purple_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/purple_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/purple_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/red.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/red_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/red_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/red_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/white.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/white_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/white_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/white_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/yellow.png delete mode 100644 src/main/resources/assets/create/textures/block/belt/yellow_diagonal.png create mode 100644 src/main/resources/assets/create/textures/block/belt/yellow_diagonal_scroll.png create mode 100644 src/main/resources/assets/create/textures/block/belt/yellow_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/belt_offset_scroll.png diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 2abaf4d66..ba2097ff8 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -3,7 +3,6 @@ package com.simibubi.create; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; import com.simibubi.create.content.contraptions.components.structureMovement.*; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueRenderer; import com.simibubi.create.foundation.utility.Lang; @@ -62,7 +61,7 @@ public class AllEntityTypes { RenderingRegistry.registerEntityRenderingHandler(ORIENTED_CONTRAPTION.get(), OrientedContraptionEntityRenderer::new); RenderingRegistry.registerEntityRenderingHandler(GANTRY_CONTRAPTION.get(), - GantryContraptionEntityRenderer::new); + ContraptionEntityRenderer::new); RenderingRegistry.registerEntityRenderingHandler(SUPER_GLUE.get(), SuperGlueRenderer::new); RenderingRegistry.registerEntityRenderingHandler(SEAT.get(), SeatEntity.Render::new); } diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index ed0693fd4..9aafdc586 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -52,7 +52,7 @@ public class AllSpriteShifts { CREATIVE_FLUID_TANK = getCT(CTType.CROSS, "creative_fluid_tank"); public static final SpriteShiftEntry BELT = SpriteShifter.get("block/belt", "block/belt_scroll"), - BELT_OFFSET = SpriteShifter.get("block/belt_offset", "block/belt_offset_scroll"), + BELT_OFFSET = SpriteShifter.get("block/belt_offset", "block/belt_scroll"), BELT_DIAGONAL = SpriteShifter.get("block/belt_diagonal", "block/belt_diagonal_scroll"), ANDESIDE_BELT_CASING = SpriteShifter.get("block/brass_casing_belt", "block/andesite_casing_belt"), CRAFTER_THINGIES = SpriteShifter.get("block/crafter_thingies", "block/crafter_thingies"); @@ -92,9 +92,9 @@ public class AllSpriteShifts { for (DyeColor color : DyeColor.values()) { String id = color.getName(); - DYED_BELTS.put(color, SpriteShifter.get("block/belt", "block/belt/" + id)); - DYED_OFFSET_BELTS.put(color, SpriteShifter.get("block/belt_offset", "block/belt/" + id)); - DYED_DIAGONAL_BELTS.put(color, SpriteShifter.get("block/belt_diagonal", "block/belt/" + id + "_diagonal")); + DYED_BELTS.put(color, SpriteShifter.get("block/belt", "block/belt/" + id + "_scroll")); + DYED_OFFSET_BELTS.put(color, SpriteShifter.get("block/belt_offset", "block/belt/" + id + "_scroll")); + DYED_DIAGONAL_BELTS.put(color, SpriteShifter.get("block/belt_diagonal", "block/belt/" + id + "_diagonal_scroll")); } } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 15b30d417..231836c8e 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -205,12 +205,14 @@ public class AllTileEntities { .tileEntity("gantry_shaft", GantryShaftTileEntity::new) .validBlocks(AllBlocks.GANTRY_SHAFT) .renderer(() -> KineticTileEntityRenderer::new) + .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry GANTRY_PINION = Create.registrate() .tileEntity("gantry_pinion", GantryPinionTileEntity::new) .validBlocks(AllBlocks.GANTRY_PINION) .renderer(() -> GantryPinionRenderer::new) + .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry MECHANICAL_PUMP = Create.registrate() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java index 7708c5488..ee1f26352 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionLighter.java @@ -17,14 +17,13 @@ public abstract class ContraptionLighter { bounds = getContraptionBounds(); - lightVolume = new LightVolume(contraptionBoundsToVolume(bounds)); + lightVolume = new LightVolume(contraptionBoundsToVolume(bounds.copy())); lightVolume.initialize(contraption.entity.world); scheduleRebuild = true; } protected GridAlignedBB contraptionBoundsToVolume(GridAlignedBB bounds) { - bounds = bounds.copy(); bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting bounds.minY = Math.max(bounds.minY, 0); bounds.maxY = Math.min(bounds.maxY, 255); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java index 141746638..f93fd9beb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/NonStationaryLighter.java @@ -10,7 +10,6 @@ public class NonStationaryLighter extends ContraptionLigh @Override protected GridAlignedBB contraptionBoundsToVolume(GridAlignedBB bounds) { - bounds = bounds.copy(); bounds.grow(2); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting bounds.minY = Math.max(bounds.minY, 0); bounds.maxY = Math.min(bounds.maxY, 255); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java index 8bc426b3e..0db060fb7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java @@ -1,9 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.gantry; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; -import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.*; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -60,4 +58,8 @@ public class GantryContraption extends TranslatingContraption { return super.shouldUpdateAfterMovement(info) && !AllBlocks.GANTRY_PINION.has(info.state); } + @Override + public ContraptionLighter makeLighter() { + return new NonStationaryLighter<>(this); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java index ac2aacbc7..c16b3d03d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.gantry; +import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; @@ -172,6 +173,9 @@ public class GantryContraptionEntity extends AbstractContraptionEntity { return ContraptionRotationState.NONE; } + @Override + public void doLocalTransforms(float partialTicks, MatrixStack[] matrixStacks) { } + public void updateClientMotion() { float modifier = movementAxis.getAxisDirection() .getOffset(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntityRenderer.java deleted file mode 100644 index b7eafa361..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntityRenderer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.simibubi.create.content.contraptions.components.structureMovement.gantry; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntityRenderer; - -import net.minecraft.client.renderer.entity.EntityRendererManager; - -public class GantryContraptionEntityRenderer extends AbstractContraptionEntityRenderer { - - public GantryContraptionEntityRenderer(EntityRendererManager p_i46179_1_) { - super(p_i46179_1_); - } - - @Override - protected void transform(GantryContraptionEntity contraptionEntity, float partialTicks, - MatrixStack[] matrixStacks) {} - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java index 000a944ba..15c4d6a86 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java @@ -164,4 +164,8 @@ public class GantryPinionTileEntity extends KineticTileEntity implements IDispla return te instanceof GantryShaftTileEntity && ((GantryShaftTileEntity) te).canAssembleOn(); } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index b3d245587..dd20003ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -30,8 +30,8 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer { BeltPart part = lastState.get(BeltBlock.PART); boolean start = part == BeltPart.START; boolean end = part == BeltPart.END; + DyeColor color = tile.color.orElse(null); for (boolean bottom : Iterate.trueAndFalse) { AllBlockPartials beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); - SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(diagonal, bottom); + SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); InstancedModel beltModel = beltPartial.renderOnBelt(modelManager, lastState); - Consumer setupFunc = setupFunc(spriteShift); + Consumer setupFunc = setupFunc(bottom, spriteShift); keys.add(beltModel.setupInstance(setupFunc)); @@ -83,8 +85,16 @@ public class BeltInstance extends KineticTileInstance { @Override public void onUpdate() { + DyeColor color = tile.color.orElse(null); + + boolean bottom = true; for (InstanceKey key : keys) { - key.modifyInstance(data -> data.setColor(tile.network).setRotationalSpeed(getScrollSpeed())); + + SpriteShiftEntry spriteShiftEntry = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); + key.modifyInstance(data -> data.setScrollTexture(spriteShiftEntry) + .setColor(tile.network) + .setRotationalSpeed(getScrollSpeed())); + bottom = false; } if (pulleyKey != null) { @@ -152,7 +162,7 @@ public class BeltInstance extends KineticTileInstance { return dir; } - private Consumer setupFunc(SpriteShiftEntry spriteShift) { + private Consumer setupFunc(boolean bottom, SpriteShiftEntry spriteShift) { return data -> { float rotX = (!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0) + (beltSlope == BeltSlope.DOWNWARD ? 180 : 0); float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 90 : 0); @@ -164,7 +174,7 @@ public class BeltInstance extends KineticTileInstance { .setSkyLight(world.getLightLevel(LightType.SKY, pos)) .setRotation(rotX, rotY, rotZ) .setRotationalSpeed(getScrollSpeed()) - .setRotationOffset(0) + .setRotationOffset(bottom ? 0.5f : 0f) .setScrollTexture(spriteShift) .setScrollMult(diagonal ? 3f / 8f : 0.5f); }; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 1af7f93f4..6717aa316 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.relays.belt; +import java.util.Optional; import java.util.Random; import com.mojang.blaze3d.matrix.MatrixStack; @@ -11,6 +12,9 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.render.ShadowRenderHelper; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -83,24 +87,16 @@ public class BeltRenderer extends SafeTileEntityRenderer { end = b; } + DyeColor color = te.color.orElse(null); + for (boolean bottom : Iterate.trueAndFalse) { AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); - SuperByteBuffer beltBuffer = beltPartial.renderOn(blockState) - .light(light); + SuperByteBuffer beltBuffer = beltPartial.renderOn(blockState) + .light(light); - SpriteShiftEntry spriteShift = null; - if (te.color.isPresent()) { - DyeColor color = te.color.get(); - spriteShift = (diagonal ? AllSpriteShifts.DYED_DIAGONAL_BELTS - : bottom ? AllSpriteShifts.DYED_OFFSET_BELTS : AllSpriteShifts.DYED_BELTS).get(color); - } else - spriteShift = diagonal ? AllSpriteShifts.BELT_DIAGONAL - : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; - - int cycleLength = diagonal ? 12 : 16; - int cycleOffset = bottom ? 8 : 0; + SpriteShiftEntry spriteShift = getSpriteShiftEntry(color, diagonal, bottom); // UV shift float speed = te.getSpeed(); @@ -113,7 +109,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { float spriteSize = spriteShift.getTarget().getMaxV() - spriteShift.getTarget().getMinV(); - double scroll = speed * time / (36 * 16); + double scroll = speed * time / (36 * 16) + (bottom ? 0.5 : 0.0); scroll = scroll - Math.floor(scroll); scroll = scroll * spriteSize * scrollMult; @@ -147,10 +143,13 @@ public class BeltRenderer extends SafeTileEntityRenderer { renderItems(te, partialTicks, ms, buffer, light, overlay); } - public static SpriteShiftEntry getSpriteShiftEntry(boolean diagonal, boolean bottom) { - if (diagonal) return AllSpriteShifts.BELT_DIAGONAL; - if (bottom) return AllSpriteShifts.BELT_OFFSET; - return AllSpriteShifts.BELT; + public static SpriteShiftEntry getSpriteShiftEntry(DyeColor color, boolean diagonal, boolean bottom) { + if (color != null) { + return (diagonal ? AllSpriteShifts.DYED_DIAGONAL_BELTS + : bottom ? AllSpriteShifts.DYED_OFFSET_BELTS : AllSpriteShifts.DYED_BELTS).get(color); + } else + return diagonal ? AllSpriteShifts.BELT_DIAGONAL + : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; } public static AllBlockPartials getBeltPartial(boolean diagonal, boolean start, boolean end, boolean bottom) { @@ -158,12 +157,11 @@ public class BeltRenderer extends SafeTileEntityRenderer { if (start) return AllBlockPartials.BELT_DIAGONAL_START; if (end) return AllBlockPartials.BELT_DIAGONAL_END; return AllBlockPartials.BELT_DIAGONAL_MIDDLE; + } else if (bottom) { + if (start) return AllBlockPartials.BELT_START_BOTTOM; + if (end) return AllBlockPartials.BELT_END_BOTTOM; + return AllBlockPartials.BELT_MIDDLE_BOTTOM; } else { - if (bottom) { - if (start) return AllBlockPartials.BELT_START_BOTTOM; - if (end) return AllBlockPartials.BELT_END_BOTTOM; - return AllBlockPartials.BELT_MIDDLE_BOTTOM; - } if (start) return AllBlockPartials.BELT_START; if (end) return AllBlockPartials.BELT_END; return AllBlockPartials.BELT_MIDDLE; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 1d1447521..8bce6836d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -21,6 +21,7 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.BeltTunnel import com.simibubi.create.content.contraptions.relays.belt.transport.ItemHandlerBeltSegment; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; @@ -44,11 +45,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.ModelDataMap; import net.minecraftforge.client.model.data.ModelProperty; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -260,6 +263,7 @@ public class BeltTileEntity extends KineticTileEntity { belt.color = Optional.ofNullable(colorIn); belt.markDirty(); belt.sendData(); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(belt)); } } diff --git a/src/main/resources/assets/create/textures/block/belt/black.png b/src/main/resources/assets/create/textures/block/belt/black.png deleted file mode 100644 index 7208c37dcedfbc46c2d7bebe83e22a1627c0a938..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/src/main/resources/assets/create/textures/block/belt/black_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/black_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..7f09c1f299e280148711165701bf38da75d854dc GIT binary patch literal 1657 zcmY+EO>Y}T7{_Pd*J~%S>(YicjvYvpLX%3+R-{lQS_L&xUnr;-Zbzx8&;7-*12QBcIg0h0nhhBAu77CVu#7R0#X*;{266b2+VKm%G~38^yEJ zh22);VRjSN&?5G@VLmZo}VdFSDx2RLvw7)woJ=3sMVwEI`b2eK-eZ>upX^7@gg2c{4!qor6B}r4}J0Y zemM*}hU41R`hoBJc*9W2W`Gi-49hZ6&isUDb#e`aA@h!7;!-jOk}w?GRBO0=@eJva zk}k}aU}@!P6_zv^M)EV5gq=Vw5xZTPehDgNrP6>U+qSUZzjR*p9zb>b#uYrUM60=X zaPXqmDxJ;)3@p*G+o;15Z5W-7k0GJ*wei<;<@GInD4kX;K~5^=D3+*spbHNy{rdYd zEEP_lkV%`I7@vKs$QqWP*7LBGsHavdk-tKNrK!>=EdBMM+-Hg2U7CQzaURq z>|w&vKP%5AOXNYZL=4CyaT28D0VE8=Fc`JE-eA)$cAl-}pIxI4k~Cvb2#+dN${RIy zmfh!<11R%A54@H|nk@AUa)&O|DwgPMGKdc>;YC9bN|uh4I7aQEAOE{lkt}f@Hn;cs zEFn4SV@DK*Q3H#Su!J2)J$a^SV8(RwuX_F{bO+)Jw)M_E$$65J^<%%J9>rVQ>S Z?7Lsy{qwt8K~gRjKfX2p^VKiD`5%FlcclOT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/black_scroll.png b/src/main/resources/assets/create/textures/block/belt/black_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc4f7df5b452ee76bce154b0455ce5e5673771b GIT binary patch literal 1657 zcmYk6T~FI)6vu7Hc5J74ffN$TfY1SL2Wh3!RxRDdnAlo0sjH^l?5g_)tJIs_P3qn5 zceU*^O#2km-m13Sq`n9UENy`m2nBWWl&#(6B6}uLshROrg zv!_RgOLJGMtyWa*FMK?Ix#frbh5U{AD?MRzd;h|Fr#o?CW?Z*2I<&F=GF#~PyfjHp zm9}>F^>-^H7pBL5eYg~c;pnN8?J!D`1Z!Q_Sw$WwW_>?= zvANfYf)uI$U2nA8?a4|xiaK$e*p?Y%m>dagwM1KcwL>b$GL6Gli%3}8b}EcI61bN^ z1gyz_sanCupoZ(0&ZN!Gvz1K{#BmHN?0CdKXouvd24Zn)@Ct(9>1rd2BFi$_f&d>)J%*bpPnU*Y$jtgeSc=M97L&=`fJX3EHi~0kLr)6;ZA-cf?U-=(fNG7_F@Yy7Q{x|b<{*a zBQ^Z-R}GMVtllEZtS;5%fxt_4*(!7E2suf=HNqpV^{HkIS3yn#!89~T|V%}nzkaOZ7Ycr z;e%^i>S_>%KBUto1d^z-N|j`gIlu?>2Cd~*F^A{1|2QLsv=wXN16#RESYx32===VY zn(Bkuy>`7x_iiC*v4#&S1OGq&UL{744}>8KsW@WA&2cQ@12a&Q=78HP7+5Kt6{SoX zgQv?I7DXhBX| zH3zJZzDu-S87Yvs_4vR*mg|jUJ`jmMC_aP`NHM0HMiV|DOMZ}p|9B4Y0frG9AITsx zJ&+neu8Kx`{9WqCW?o(B8lNy=;4d{C@qxX}p~nYkAQ=$wWRCDb=74@S^Uc@8ch3K; PP%nOTYvHF4zr6njQPPo0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/blue.png b/src/main/resources/assets/create/textures/block/belt/blue.png deleted file mode 100644 index 1fde542ce1ea946d40f878a204f881336fced063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 F_&@Wi=#BsY diff --git a/src/main/resources/assets/create/textures/block/belt/blue_diagonal.png b/src/main/resources/assets/create/textures/block/belt/blue_diagonal.png deleted file mode 100644 index 9f09d64cb691c95620f8e84fbd1fcf6a2629c862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 T`o#5?n$Em(dHTnf-k$p(%NCiY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/blue_scroll.png b/src/main/resources/assets/create/textures/block/belt/blue_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..abaa0bb26c939739322292894a9d46fc0cc20523 GIT binary patch literal 1657 zcmYk6%WoT16vpR{?RnU>Cu!6?X^2>$qBcm7HYAQH1Wem(Dumdu<3FGh2%@SqX@hty z(}WGML@ZgdLkPiwA|P&(vOo>(mfB6?B=)@QF~8$mxxVsTpE-|v&UeoJ=8HEkU(9Dm zvxZ^h7cQ0F;=hk)!ZF#`EAM^HpL^xfJMSAtZa^MoeD%$+VOXaZO7m~e^s5Q$ewZ2= zJ~4Ufnenlq;`F33dfqekF3g|vgZOx#cX58YE7&i8G+{nyC2ce3x)b9gcDj}CJ8riF z$FYui{n@O;55aZqfm0U{3frsWPYoT*X3ciH9fn~%_sK@)b+x;xl=|)V21?4i{d<|c z86NH2yBEY}<@u|1-X^9MB1{d>;9c0hg^1PU4-8Rp z1ufZm)g=*=PD#P-xM6Lqqo;Dofa+lSMtD%ADlvE9va_&qWKt=+uEmL159@X5lF>Hu z+pC;mj?A(*>2@cK+IYn;dg+>9s|;;@p3mjXMiAJ)E{4sNI=`Gm4a~YZxKbOh>9M(> zR$&fQE*Jpqd7k;o4UK`b(c;I_LK4-jvS8RhyCfL!_-}F%Z#@SLGzTS1*9HcH!9e#V zgCB;ybHJv%L?m5eXOW+(sGRyA&%wzg@yy2>12H&}LGMg6IH-7kuN4Y~tm8;Y5v#Zo z9#-4cGEOu{dm~UY(_{`5!(EbWJfH!?3-OPbIevELMFJ3tvr`heyLtM|bKFietn^W% z5&Uq)R_b7EFc_E)@BegE+Y5q-8P;~I7=5J<_jiL#CHZ+tZYx*(>662~e8?60pn>Z; zh5i9p(f@1-KIFGnPmT>TgC~3_Tcut;Pz=PNhE`PncV~ymfeFS>!81AA0#fjBRDu;RE@-ySLy2uQE7pRhJK_Sh^n0Mo73z<#m*` zv&(`3EfeWtK&6|5Ue}gX%Tm?cilO8n;RB?m4}6!*ks>yl(@7&=4dRhy4*L(OT<%iu z9AG0J#ArV)gMlxAcUSlzpwY^AX->XNbdd8XiPQ*TL@R_3b_c^_K5!mr!dkV<2WX%( kAV}n+JMcl~0F{;cC%5*&pWlA?om9Q>#^uuYuf2Qof2nDwG5`Po literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/brown.png b/src/main/resources/assets/create/textures/block/belt/brown.png deleted file mode 100644 index 944db3c46c00212592fdced649b146e42afb33ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/src/main/resources/assets/create/textures/block/belt/brown_diagonal.png b/src/main/resources/assets/create/textures/block/belt/brown_diagonal.png deleted file mode 100644 index 1049031616b8749495c1da97379981dbde894efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/src/main/resources/assets/create/textures/block/belt/brown_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/brown_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f49327979e44bb28f56b967c443ac8e508eaad GIT binary patch literal 1657 zcmY*ZOOx9~5FW{TS+Zow-t{g?Z0{o>#kz_r2vuyjK`ll0lAAp&b$|Qm!%uAUhRGPS&mWw9 zhJP2o14G9C-So>J@K^up!K1Gkv)c5N*!Mr~Go}sB&p!P8)RPXhzqoYgs6V*dUCjMM zukq*0g&$=w6C_DeS(Y8!*tL{NlDb~|*Wdn@aRkAk+mLp9(TX(hpS~*$PTzkAOkR|B z{|=a&25BnGD7u=?t{CfTuNOfC`(XAujyYt48O8jKxu0b6^NSgj<%VhA>$~&{4}~yS*@@RDN*(9s~$YfGW!i=ip78+%ia03Bqu4J)bbvQ+;3w zf`$JISb_{plBAbOdIRW6rRT#L9xU6IC9nkK^pV0fmat<1UG=&SEH$zvu++WTAuP4r zCa{#I+|8rOg2!1tzPy4Tco>adU|(Y?A1;fUT>gipL)XH~a+&G{B|*Xr37KTFu4G4! z_B*g7>M-#+?%*lq=U;uwI`}z5`PoUw0Z&*$YD-okYxs7J|6RYS;uM)Aw z(ziNhDG`>$s^GL^>p-5s5|kAf;qSQR;0`~e!jbhB#R<>>HEB?1Kchv_52#2G#po%a zCPJ@vR1-v4qN*|lJ&iY@A9P){^%}Yqr_hFyus3uS(JmvtR2!%R^}{$J@v*DNNh*L; zVF?i$QW=DVB@omIOQhYh@dOPEW2N9o<#TVu&1EMYErMU3tNmIQ?0VYD7l z?S`hZ0{w`&ba6SQIv|YATw*e+h7)Mx5VYoHV98K3noEX3a|v}2b7>n(uo0Gil&-sU t3ro0ZGnY&iJX9-f*nrT}%QzWxxZMb5Qb;Qo=<-}#LnVmlTBdJCLH*bcDaFq*j!c!ae)&D?yR)`fEy<+oPd9T z#2*0(!2t!+7a{;gzaPnxE?-9{LzdA?++L&Bz7k$@M= z@^mhiL@plK+6v5hoDvnXhQZ9>lqP(W8F+=kBMViA0mQpynO8PNM=mNGFIv(yu;1+s` zO*%+0uuE6XlNG1g(#c_8$3`ZQ_qxJq>{oms5Bgo=jF803^{atB0(Ib}fe+G4)B!ZQ z4%tF7gN@eHa+j_V48jKi&F=s2QYNty60Q-_ET`eK#R|iU58MYD@^HfkXrMhHV5#}Q dOJ|q@div$JpWET+CoVLOK74fe^9Nsi{V#LNqiFyD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/cyan.png b/src/main/resources/assets/create/textures/block/belt/cyan.png deleted file mode 100644 index 414590282c3d2e7871549c0d8d3b499ffd4ed52b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/src/main/resources/assets/create/textures/block/belt/cyan_diagonal.png b/src/main/resources/assets/create/textures/block/belt/cyan_diagonal.png deleted file mode 100644 index 3bcf44a874bb019d473cdaa775241bd68f684a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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

Pv0#TBF-wnGsCVV1`n6Cm6fw_v`o7`EwtH z0&fI3jtj*n$3Mn1ir;`Hz<#~;>9=_3pG_uia$K;N{&?=2@Ah(>G8`X2b#W}l4=8EE zAKc$RJlOZ|jzz9b)t7#E*V6cmHJ;~v-`9>F_D6=oKi!YUdRL!h1q|T@W*>g|r;s)= z^~BgQ_QBZkQ8>O$M%OZMs>zF(DJrV0$TGL`SW|?IvDs|4UWo>>#%8PKF~=^IUyTJT zR;~GP50Sw0S!(lx(7}q95g0RITzyneS3qtF2YGPVjV4OA*?E0QpuRD54RgDi|jep!SS zh7U3^%+lHICf=B`x2@>yA3V>aVGVzO2bP~t2sTj_1WoEzrN1}SC|i-A7qJT60n5O1 zuP5!Y<)*Tb#Jbz0^3d(w2Glkj9(nk$RugKC#?H*;M#aJ?6F_%+DTXe$k)vzRCt&ec z!Wj@IWZqX5e&_)I_ZnVwH&u~v2CUe({98`bsHDiPyRh!eC40BtQPOdmhxQ}lSdkEd zX*3UL&g?W;;x-KUCr`YO7ZApv@*4K&(+oy%2D}v&8W!1Kd915qI#&Why%9ZUJ_A&6 zjQkcUl>t@Rs!72HVXN3lvKwKbJrrqPOni?~6QOHa~Yo zBo31S+rddaG6?b*OIYQ_ou({pSIN^faa`6JNU)?jLfrG6EiPr@E!H z15mqRP$lyTpYt(6!kxwg_rX(TZtwuVN?BqDVBc%147J#Q-_oy!u2V_48L(gpyLXf@ zmZ*JufU)E_4&4gN;Ni?B-+A;GW2sY@02SVP4RUNfi#?$nQKfZBmLz{=mDZ&ktxKpv znOupo)GknzrC9JKOBSt5+RYm%3f(MW3>0C6v4pzhUik2>eXqA!ibeVh`F348)BGm| zmKZ|NV73dCJTlk}_253DF69ba^w1F6u1l6;6p%9D!z>(h$#KC_yDm)w3tE?|U@2{2 zjc%4$WMR4W3{P)qQf5_yvBc_<`0gR>hDm7HnOQirE>)_r+xOs4-}!Rl>Y3q_n8?K^ L&W$gep8euEGclTE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/cyan_scroll.png b/src/main/resources/assets/create/textures/block/belt/cyan_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..87951f7f27c14cf51adefc2024a920fa281631f6 GIT binary patch literal 1657 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 K^SA%%Z~q@Qi%xg| diff --git a/src/main/resources/assets/create/textures/block/belt/gray_diagonal.png b/src/main/resources/assets/create/textures/block/belt/gray_diagonal.png deleted file mode 100644 index ff2bdc34c991ed9cd02ecf3292e39510ff10a903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 zcmaLdS&tsabq3(!NSuv}NRCWWR>UO|DZ^Z#eOKVvGGf7ikOaBOT`q%M1;{_ho&Q3R z-w*=Z-TjQ&s2v zPW4az_?5OKk;w+uYdICe=|0=Z?^sI8T-4x zKRz~gYV7T|{_xNKa_^q+J@X$Q>^Xky(bG>T9Xs)R$1Z*Jxy%dCoPGb&Z88Lx+!SZ?24Ou3dQXt$+H*pN=2cx9{aQ-kRFG zb>PsE6DLnjPVU`z@X*Z6lvBy{^yHyO_8)lk^r`MK5A!I=whq~-Cgtu27Y9TSH)HZ~xGqYvoNk#8+6Eg?gC ze`UpE?)CvqPV9986lB|58@H}~iV=XOCnr5};>>etp#TjwHo<~MCVI~=eHA-bKW}Dl!%a~Ef+J{(q_OR-8&`e<&{OAL0SKvKDE5T_ z4kti?WwflUtOJx@0n+!)%l|Fy19CTq-Y-7?dH{i_@bag>l%9L$6zw(YIWBB+c8 zklt^7`4K=G2`nQ7%K5oF!4q4Brj?adP?y)no_Ok6;CBH5XZVJLw2~Gvbm6(z^kJmQ zE5wkV6k@2%RSX?}>~WRzhT2qLn>&DR7oalQatCN-eNP){%gcQW2Tb0ofGymc)27~2 z-a3fMFtoKf2%v(6Fo4h*lLe3`0fG`ka1@kemX}v7DFp~gC(k~gIZz;UTCf)H&B-@9 zcIJQ#gG@|3#5e#HHOWs;O@Ip0%`ZPO>Dvo908%tRcRL^gE93iq2Z+fqw0Qr106`CB zA5glN7DKsPLvC{NVSxJ7BtJE|w*aLwQ-gH&+)Ip;!3+;DIcE+W0o5C>t*v?U@xIBr zciA0?!Gs|h47uw8e!yih6c9y{OAM*p`nd9I40!|~kDU4LivWcnuriil+IMg^fGo7`Y^@W%Gw?$W}%OYTJ@3T32&!C>Fyh73a63wUW4hHRN^WS$kEm`vqN%3>%a1rU7G z`wthOpz%lm-Cw+`%U54{PPyZ?SD%*-*4Ot>ZK`9Wxy!=0zPbC+uYR_8cWz-3z3WT& z=2uqMoJw3?yL$Eh!rj%u_<#NU-;IcI&j6&Mr_aB<;(oV0$7E7xnG8cJt0^r&Iu4*@ z+``bz#K5Ih!kjTL0s8pT&vk!q0lYPU^kcRz%-@k-yLPQ18;rmApZ}^d3%~UG52h!! z_djy@)albxQxhDkluK12edOT2gWvl7(`PR}@%T}d$MpmgKwInci}&UsC_u#!lc~dG z(g6D8gJ0+#AW(E4hLp%$zjh5nYa0(?r~t*&_W|+r0mRb-RG!{K$3ua^u`-TK9DHSt z%pNlXt)%RXkLCx$knWkR7?Qa+ce|Oa17ua{GsN>BJUn~y)G6G+Aq7ZDW2ggk@~QI} z%J__@-?R77V9=z;d+&b;O)}E|$J4K`E*j4{O|z^*+uIu@J+wa_lVPX;F&P|AC6F;0 zEyQHBkjlCQXvolDP{b$?RYzuz;>H?f=`@6uJDxn(ruF(t0~9EMWzz2%Yo6YiIdlG1 zlOCZaLt3EZ4C$I<$+We5ZNre!Y=dD46`+lcA)t&aDou^UvqwQ8t)yCaiBY>oRwP+H1M8^Qh1EhNga7o<)B7Ojm@=7>XcbjY5+6161 zCIb@rt@n~1LoL)dS(_m&Uub-n+u)2Vyb|ZEbD@O5bWR8Oj@+9X|k& zJ}?v z#~BV0mpnZgR)z{Bm+|x(jP%%@0|51L$Olj{loEZgonK7FP>r8ZH97IH-va>@^oE?K zn)F!S)j|k@MhX!7XmG^SbF8F?PB~VOJ0glUIxVD}h0U4W-va>zO}LRJQzk2hG6%vC zVsZwJG}0r0bmMIuR=E;qaqw=*xaD^&Efhdd#?#Y66bHw;wlyfK5<--VK@gc)CbgHcD9p7zJd~yVd&=9^Tp7J z7HZO?1Jsuuq8=P=q8=qZWR!r_*FqU`ajc#67y!_h9$;81v*;Um7Kx@7zrKBsI4hGy zoPiQ?7WoPglc}tagkeY^T1XfsnhZ$*MS4V>VMt|zWY^OV8lVzqkhx0>0b~YB0a77D z&gJ^bLPm0pXCs_AgeqP+cIWw9w8>YyQ41m1`Rs)T73m7AiorkW0jL zc$)28R-mdFa@X@LSZWbNpyU*W0SF^~aTY%SkXa5y&3GA}z8|Qv%7JAKkX9H*UZ)%v zJPvELH;iN5^#cvi%0jrw`V&}VoqUa2?29x0Jb-G(L*uM4Oc=`2ZVhnR2Lwkd$V7Vh z86Xd92!%3Xm|CVMI*uYeG?>b54wR={9}L&#K1sw`fVAU?{GPkB8}%r=#nW3P0w~f0`Z(4+o>YS}i`_5%Xd#zv z2mu6TXR;Q`3#NiKB45*1w9uW~O$&h%hLT1L1yEm{p-o?PglU&Ny|mHM9c5vTRY(e+ z*s9VvR)h}YLI8PiN1WX*VxS4QGFcOe_wR=x6PjYn%M_F#poNBXbfX*~)ePD4^np^Q ztEfjjy~@!-f(*C_o`A`~?gtt4*y2Kvd7%Ibn!+T*WC0X>eTEF*Sgda}T8Mp(0SpCw z03|MzF(D$_vK<2=R76Nn!(0ZaC<^YuDB~PC)Og}EP>sYT{Yk`@;cpU3+4(KB$ zD?l*GOPLHHvz(^Tt3HaMsKqekR^l<7iMWtz0GY&nK(r8X76)Hi==$~RO&#q3!V$;H z(ekG!PM+f6D=rl2QI1vA;{h$Sxi-gSz#&EoL3C^ds*E({JY_#n6)i+6?gHvDWX=Fo zJ3tkNDRCxq@W2e|kuXdwTydd|jTUT-gO?FxfGX0%fRAI{jhwLyhTtfM5Chp)*RS_Y zrjNc_j0B=M8kEDcG67W5Lzh-LZ$2W<0E)}!-9WKM1(5nYi6Q55u-bwQBWGWFaI7sZ zR1Dc8D=h>{L=ixb9DTAvc{(m}mOxeZ$aFlSg)9tK2=(3C0W{nr%QQ>smwrhPlinlQ z0g9(LjI$8ca#Yfzky3G?=5h8OGQky<$@&a2nVAqkFj*zSP(bua>N7+~c*JDLDi?7U zC_!e9&9{K$x;NCdSIsXz%dX1`GAQpKoJKQR=ir;`X0l=AY$uclRxL-iVMNX%&Z32C zkIbfBR-T&rG8hUVT>??dE{+Z#8Ad(aie*&Ldwzn(pSl&5);ZR;B~|7MO_oYjk{+IQ zwBN)S@;68NaY-s;L=4= zAIbp&EBj@j#OpJ1dHv|31RQwVWW5&LXWJrC8Vl`^No^%!|YrhPR3hPB6 z8EP?EF$7S5M=>~HO6Jiq}ujD(m&|i;ngoO52`_la&S$Xu3k9QjnIbWs74!JP<5e74m1 zu^fa@>qK->E!J6u{OTt|1RQ*bVvY@U5vL0Wzn$)Osn$45|==p^_oE zsi0L^SfTBy@*V{%5s(C}09sn!b+RL$>SSPxfb?a^Zj2}l!G{>VmhG~mXpMpZL&}Sx zjkO21rz`;QaV&|VB}U{CG6cI`sbWN+)YOmH=VY|3U#pz<%j*Y;TRA#9h99B~b&(q$ zh?7c;D2q>0JPBH5i<8N;ZWNgeks-wpGy!B;to<_0YTS^MMySm`+P-sB4o3&2Rd8vQ zYmTM&sg81m*)J)Ck>!ukF}4P%3MJPQ09Q3RU8vf?-AlG z8+d(lft3gdK;`N6ZpiWUWEc$b^fJ*xA|M>AI&rLR4!8iQ#98bm1;`n3W}Zd9f)XuM zA(?O!SRJ5Ql>;b@NO^kVtiBxzL6IJ|rxKDWPanrh`9yle!B^ygr>BLo`O+q_)?>1g zuQhlwzALQfb1&%AccjPCLW?Mp9s!z6w2*31i>5(|vwW(f`!+Kk+zql{Mhh9D@$@5( zwIU#KtO5>+fb7lzCJRF##$+-PMg1*Kup-V9MN7~sA`zx!^6e0Yd^?08fNH-i-wx42 z0F?&Gei<#4FJo{~o<5r|Q5^6jMr5hXfR{E4U`SYx7K+J4(Sjo;1FOCr64vv8z*uRa zgkIEScC$wx=u!&C#!}s_9oX3mbCu5x(GR<@{A)dBXt0m3_uzjiGXlzA|U-WIu diff --git a/src/main/resources/assets/create/textures/block/belt/gray_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/gray_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..17be8d10ee308dd9b691ef3d2b9b750eb3c4a355 GIT binary patch literal 1657 zcmY+EOLH4V5P+rCz9iX_*78G1@GFUxgJW0424Xw*fs`rYONyenW@^;in(dwL>Hem_{P6JylZoqzNF*|O z@M!-do*8~irh@#s{^_?o;-5Ww@_8hZ%!*$$^38X-NJL*f*njWiEi1aDAG*<%n~SS= z=35ud+jk$l{NveKM8ZUw%uJ!AQ_0lK&83yK#ra$^9*lo@kex1YV1 zuiKS=-#I?6%8;ZoGkZOi8X1G@+hY=f3x-($6T)*vJ~{Xm4r zbeulXI$o4Iw7XrU>o`ky-o~0$;eIs6!JxETO?JdTlD{fvzy^dIj_0{kxfQ!waeCe36Pp0=UM`CSz>=!zM}Pkw zQ-*I?y0yB)$pW_{t0oIa5t+jJF1Z^BJ%FNZTypc^vgP6$LcT~$S{y&oMz^7SWA|K6F%YrORSzX z>aOR@DM1>sHh9MP2nm_v?C~DMY2R+f~AGG z=0+@8X+!DBzQpZudOe8{F_cFQYFhLqL-wWONnIS8Krj1})23wLB&BRk(Z~RnWM2Y{ z%f4jWHhWxUNoE#FKOf!FJ@$RW($&6%5d+UsqR2Zfv%g*Xs_^5}r$6v{`s zOdMiF(1i*zh$5(^bbJ%V-{olKroHdHGyc!?9$dY0u_d-YrfFKs)TPO5JX8F0md^d~ z=k3Ql>^qlk+|{&rM*TzDqbKc}X5^D$}euIu(5KU;Mp)pC(gFJ8WdNracLrn!;M&&@f$-jN%u*6Rv>XZKL4 zR9c#QFM38af*Eu)5{9UhHXO%4J~Dx(ZJIhpP-q)QxOJ~ehF8vR0&V5-(;J;b4nLOO zlS6O*l<#?sM#J+1vGIc~%u=mcw8;S)sm=qGJ%eY;oYDrb0tuT)SOE?KpZdTDxrzWQ z*EfnXsGubcZVpmhmWl=2Ht>kFT&=1qK}p1PW*?q{t%fkc#w*h9{!vh^Eq`c<$Mu@y ze4Kgi2I2gPvB38cOK}7nubFHI@$m?9l>cdVB z*q}rNx#=eH*OzA#iA2n@6eQ2{h*+sq%9{n0D2`}DfSGR62f#2(NL5g>A!6KAV%(39 z4PyXtdVB<;QZD8P`k78RoUmyc)y?(Ijh|LjceWxMg+ewRUtU=cf}k~NFMVBeJ%4X1 z<~O1rreCc8F6xZPiM(NRSALQu<&U{pi@@#$c?hX!ArgFQCXO(N*F=W2h)r+_W^B~a4MP-&MwVFx`0aYUuIdC&`+%TonDD)gVNoUz)RaQO%Och@dGLu;nB-ofnlsl7c z2kqL@4Ew;VY8+D~b>NEviz9gO4I%pg6Xb+dkmv|LBnMbh9QcBbomQxJb{c!N54=+c z`7S{NX(x>OYG4m7@je7pO=6rh2P=n37-0pu!axc|RPn+5y+tDFcreLHlsKq5e3NhR0^$pQZ5dyi{_6Stlz)KeF(Og=q-^Zp;as;?aY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/green.png b/src/main/resources/assets/create/textures/block/belt/green.png deleted file mode 100644 index cd41d7c14de80bef4b15180b1dddd73db839a69a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 K7k~aY|MY*62$mcG diff --git a/src/main/resources/assets/create/textures/block/belt/green_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/green_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..55f29f0de9415c6adec83f1c2b129df2d5942463 GIT binary patch literal 1657 zcmYk6&u`pB6vxN**y|tr+f}pKY<^JMQdA*+t0@wPpwRqi8YLAMgpl|TK;poi6P)1$ z9O25Z6YYgmw19-lg+nV5KqQ-_ZIboc-u3v$+U7eu+a)9K^V>J?&AjpZ%=>s_eW_$N zO+rX%WqI*B-c|hObQ$u~!*@T&%Xn}3&G!khZ2ptTXJ0f3(JrnmF1#^cljgL4BI(?j z*^5t2d#(+$folv=gi^voySW*q^e9)U0*g23;>Mwz+X7c(eqyI0jE*#IJBVAnL>ZNkBO55 z=F%oVgMC**d1M}R!-G^;ZPv#};vWjnSjk%|!-;P@QN+v7LB&8FX8){b2YmNeF29Hg z-JilB}{nEF<8PJlrW6L`?0TgSS*EK?c%_4$+84X zAm`MxwqOYo59l(C0$A$2Ou*9g)M?IAy;_;{j5vj0MaT&xkr{QEri=U<)cZCp}X z+-MSM$Pzv+jQDC?o?r>ykITrZ;Vj+oVHwo{-qyxxkPMc@Gsek0YXuGyEMXOjAiUJI zCai2H5G)~nJmh|?-HKT*Sxe>K?}3c_fQsP6>6R;;MCxOSYGTpi=0pyJP&nLayl@|~ zf~w3Ef+0)rhLecb3o5c@-LU=}K^^#gz|G)t)eify0BOt;GEAEab2v+J9K(&X#J$&= zbKACHY223p6=t(2d-}MAJ&`%TK%>6&4e?qzSb|5-b%G#-2Uvm<+z)+Y#L}oQ*>BJ2 zYIc$(v?EXii(m}#x2!u_Mn@eeDLZ=&wW3|_g{H^eevtp-udu9iq45x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/green_scroll.png b/src/main/resources/assets/create/textures/block/belt/green_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..eac299196c9a82d6cd47e780f8af36b23ee1ef77 GIT binary patch literal 1657 zcmYk6yKh`Y6vprSv3vJzY;Wu&n?&NFAQWDbLxTcNY$sM8hz8M6(}2W(5Yf<4Pyr=1 zB2-X$EybarKxrbVK$h2QlVl%W?|t99{AR~lGTNPc=FFTq-+6rV)$N;WrNXI#q9~<} z_0<42>nF1`5sAAe!|_UkXrguM%X);{`Y?@%kcZtG0bHnLK+Zf2U}SYD-8 zC^-BOT-TnzG>2gB49+Ysc!h#qtCr{LrR@D`SL-DY{XC!S?RB{xpPkMDg68StgFzTi zj9ZP}_O5^*U-kUHpKp&QlL<@9G&qfH8ahJ0pM+sjxKMHW!i~c*D`K2*&U6?n%Ge$=KVf*nCBek zG|PpKWF#p|1bw~k_XBS`E)|QKABNez$5E;mZq4UW#85xmFS}aN_t~Yy7MZVk6B^G9)%)z*xkfiYv4rijXF< z4(DC=WR|cbOUw-X69dS>Kdr-7AKUrd%>o2dofdRrhm)}IlyXnPOUokgN z3D*R3?E6oD*v0H<>1n#G`H#lO!+sdX)Nt5);`?Ess-r;Gd^hk;V=?>s0%)T zQpS*O4JCA0U_g>qG?Q)`1TmTA3XvsJi$v$ywm}9t$5PG+3`}NxK(Ap$S5XHGK7=QH zkgg;j=tzG+F9|-N7kLcBP`@EKm3BlOW|cmnXq;zTL-g@APk7*;u9ctXgS?(fvBjKq zV#hHhAE*>?gX{rm>PEa8*du$qOFbXtqL*fMn7&KmA;LzUld|Nr^+51J1daCpcd0{@ zDnJ4{LKG)7d>W*1n&k-}xQ}RvVa5k&AUz;pNhaWfi~;?pD_?*7^W9&*dn<3 I-}~h5fAW8$od5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/light_blue.png b/src/main/resources/assets/create/textures/block/belt/light_blue.png deleted file mode 100644 index c19b5d0c5b5c1fe6d7ab774a824feb084c4e4ec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 K-#mZugZ}`1z>>-U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/light_blue_scroll.png b/src/main/resources/assets/create/textures/block/belt/light_blue_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..946398440068e14e671985035e418aceb76ba208 GIT binary patch literal 1657 zcmY+EU2GIp6vyw(?#|cJ-7Tfk@@3V6n)*OnG+>O0rU*@?v;;_e<53f63zm0de6Wcx z8WV|{Xls1J@Z^)NiTa|T3B({R2^Fy0C?9PB?R@Oc&iXrZ>jrOj@0>aJo{#@I=RXre zgZrAiO`cM!segapA)Y1v9gfNV;hoV>c(`NxUwc!je2e@I_3@`|N?Bd~eJ>r}-E4GN z*CV67t+ivzM#C_+ZhmC8w!y#r+NY)`Z$D^r0)-m_$zmfnJInG%4IP_&Sf(QNqH^|tKLzNDc815 zj0~l?ZCROIXAd_xU_C5w8;{P{@0%bYo;DAime5LNY}<0?e=)BA>g3G73XcVgH(HzXf0S>>alF3h-dwm9RjM0G-co*3 zbnb)OOZQAh{L!s#nh$o$hkT&~4P4hLG`GNtmhKne1D%Co^gu9ZK3w@fAJ9V#asb2c z^Ye5T3{oWyf)qo2dJ>r%l$9N9lobsaf}r9aIfYWHB%{Ic%#>|s8+_n4O1&`AeSi;A zC5%ebXXr!b;An#nI+W%^wzG#>)_g!ObqonIB%ETB@zLnCp2B(*kS%)nAQAY72gV-e zgLY4+IAX_(P|44%+@kh1a-P-oxeD*`f^g8%q{ zU|TtMYkM#8-S0oA`n*cxm@28m^4-Ai_#YbOiQjPNUMrL9cTI zgJd;4t_*Rs#s|Ke@PP_)MsdklDFYwlCH(@e@d1CJp$-i`Km#2C0n2)M4nCw9P#XhZzH@o=!h3Jw PQ1$N}>^t}JvA6#P^U#=U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/light_gray.png b/src/main/resources/assets/create/textures/block/belt/light_gray.png deleted file mode 100644 index ca67d7c8eb87a736c79e51ac1fe5e2c7fe3fee09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/src/main/resources/assets/create/textures/block/belt/light_gray_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/light_gray_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..0f0ef3be771d7c659051d8ad22a2fde26cb37f19 GIT binary patch literal 1657 zcmY+ES#ujj5P)^=>hK}Ogc##Pk(~pKxk42-B*8L{EmtKWByk*`$UlH8{sC{i!wc{m zxZc3wC~Q&=JYYj&rxF~=(ylDYQ6wK)dsm0^jYceHYSi01+nVm4{-!^4jT!T6&GY$>DT5_xJbv2Tnu>jxR2J9}0K;y|U(Fi4Rz7$-5i545lN) zugX6Rzy1n}WtrPW4dur55C~@DJ|{cK){F68ajm1-WELh(&^zd=lXg&gMPm| z9BQ+6a;CZW;%l*FVs(3aOV_h9B&kHA#{z+tg}GUmvz}gmBo2r)-kQ8tDwQ@L=e!;_ zQ}KH2S*=)$fBfR}*2ku<`Bl|p?CqU?`;w+~z?d$59YM*PAw{(t-F+j_k&j&<(l*T~89SF06MRX8-y!KkAB$FW|z z{R0~b4{U=Lo4U?wMo$xxoRz8wk6AW$$#~atQittw*;U@%C5K|M$f|JP7}Z-M zW}*%Z>X1&{$!B%+H%3nJfzTvW)O4q$vqBDhbt~dnysP(@{i-{W%7RcwyFaDnfeIz9 zZ#*s(fa+1PeDCg(V5v12lq^Bc;Lwm{3CV;mzh8x==UzSoOFhp%Em%4fYBzVXFg$c> z6qdF&OL`_p0C?B5btEkL13@@&yY~NMiTgliTgAMrnk*beWY!uifpaWAEm)Fu&~=?X zOiNUXUFDE|)-xI>J9&PFS5aw>md~6TvZpWFv~AR=S;Yo5_~-OlY1RQd!BVv%!$8_N zMWO>(OO}Ka{={Q6KEtY>UNfzVoDw9YVeAquEJ4tYVYs*tR7A2Qx;{<7#xDbbhcLdjHCu+(T!f~9cqUzUoZ zFI~BQgQjqhCE5`bv0}3{a(1G(`$&VOuwbd#my!=*Ng_lHTBAWpmSkT_Wi~|81lsIN zg)AilCn;rXs@E!ZUjhr!m&iu;rGqTVlSS%U>VJJnvLyRbZ)5;(7%}iHC5r4zw|@Q( YeYEeh@ssIU3q!}$xr^gpjotY82`7-KfdBvi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/light_gray_scroll.png b/src/main/resources/assets/create/textures/block/belt/light_gray_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc6bca7aa245421f9c644304e89f7217c2e7733 GIT binary patch literal 1657 zcmZ{lOK%%x6o$uR&(*OVr<5i%7Z+M8l!i-bQLk##x{bpnO-li>;~#*;KVZk66|iCj z8xRX9P?rsfl%$nfSRgc{hM}1=2r=Ry~nmIh4AH9Ae8_SuCL9DNL zZ?1n|EEXHs|Kw(1{PoB0$6kE)_T4`TKK|0-j?kAInfc}B{c=T5I!lJ+-Uub85jF|iKX_n$eVrbVvFd!$ z!@04y(NdkC0*RPJTmi1v>(oaNa#aD<+5FX7tu{A(3t8IW$-zp>%5uqZOfq8K+}>6! zaipU35H=$;Dt99!F~Yh06?(Wc{X;65)OURU*7sipVf^xIZ-Nc8kR#amIdtF<-ekn8 zdZ6h{CNuW>^>z~sNddO#*I#NA7QBC(yO~a>UE5ZWV48|B zTUjaN1Ucf30A}A;JphJT!m5hW4LxjCmoSt5VKKnKef_<#z|FpL_Ep6a26})8Hc+5LD}M9_ zt;$=HetdI{QExvQP>WPj1t;4Vk5_ogLK{2BsG$nI&cp z8KvAb4xN2~R&{Y+b!p3M(%JpRg^i6GklHmg%QT{>m3#V->vsJ*`%}U&*Z!@ki({%} z9@%Mfa|92$5duGeLzJ*jSp|uyV)8_bO2|Pk*kA&gS;9p8?mobSyqB;+PP>eHYv6|G(*wxWETLsus0gz#NIoD@8i6@&?}I03clUvOGE1B5 mW!VSTKq?>*2@|ppC^<(rzPMu-d-=DaY2%kB@?T$g@1sX3=(U#s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/lime.png b/src/main/resources/assets/create/textures/block/belt/lime.png deleted file mode 100644 index ca40f812bff32012e3a3d4cc5780ea55c963e287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 Lul)XJ{`&s`)eu8# diff --git a/src/main/resources/assets/create/textures/block/belt/lime_diagonal.png b/src/main/resources/assets/create/textures/block/belt/lime_diagonal.png deleted file mode 100644 index ac8405b3cfc9af15461a4a6c76cf39bb18a2441c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/src/main/resources/assets/create/textures/block/belt/lime_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/lime_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..8a964537b1156498af9b081ccaa041464fd6332d GIT binary patch literal 1657 zcmZ9M%WoS+9LIOp``&oH>p0|5Lfcd+P@4ly1Sx_85NLA=2q8gQpy3Vz3GojgF5Ec* zcPIxA?SZO-e}IQn9u-Q`CXVg+k@!Iz?A;lAclpka*+h)Szx{c3cINk+-)Fv`y}Eii zZO)j2Af#8WEWd`QgWnllg8ls9gD>$gKD@H_ksw&(>?aCed^IHqYJO$;`PY|R@r=4d z#QC|?`A28Fhn)*ooj>n%np+f~@g|C56h$*n7}Eu{^u6b})6V^ zO^82zc~IZ*yiT~cSLY#dXELv;>1gvNk;JfEYqA4E8u_cvQQP;cq9UizRYgvENW{{e zP*=jjJC>noa^LsQzp2!ByIVI29RzeRL}q*ySorPjNK@s-br*jnG=zoG%55Ju_qdAD zq+tY`qb{vIxrmzdwGog>gaA@+$sHO{Mx8;>@`&fwWfMwtn-pY2{ zUTd2oB;E%@79P6SqsZ8!BIq$M&Lk?I2qip-QCBeWsECyI{VLbzjzcO-whstZ3 z>dq_mdmjFtY%F8s(DIr;8YmA7Y4e)_Y+=pn_ec^+;@Ib;Zp+7tgb++)bwJBsbHP%# z7{Y(%(gI!}G!7N@Lv?2kBgg@7Qz|OW1RCr@<0(Xx=A4oOccqY`;elEm#6U|MdG3?gJ`v7_-FV;h`rM)kGv<2^JG% z+-W>;A2dyI=jHl6hB0RI*YI^sLA2Qa;0GObU?JgVz{V{7A8!yfc2?jlQOd5(=uQ`| zx#ZVVoTWsU02Ou^_@P!jhdmKFPL=7BBFojgu`ZREE2C zLdk#=w_KV8DkZuEESN4K8?H+yS>h)P+k8OcTbjkX$1HJOnuv7?lhCj;w{W;F-TyX# Z|DgJ*wfKARF+LYoURquL?uGSF{sn)2m>K{8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/lime_scroll.png b/src/main/resources/assets/create/textures/block/belt/lime_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..12f08decb357208a3df9efab035e144d3fa87f06 GIT binary patch literal 1657 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 diff --git a/src/main/resources/assets/create/textures/block/belt/magenta_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/magenta_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..3915737687c6fdfb8309a2a18521bb2f2248771c GIT binary patch literal 1657 zcmYk6-%}e^6vy}X-AxEdN{gihNl~Z{#ToUXluFY&{3tJhp#jI2>VKd!J~-o}Z@&Aa z{tb@RHwzDr(keayBebKXA;~5rAx#1#yLXe_?f2%Em^*jRp1phSJ?Gx@x#ydu#C#}l zDIf?!XyNY6GTsq9Fa|tDEhuXqK}P8V_VvTZvT-W`OIahTrmFkyo~}u$Orh0s&qo3WnS$$jTq)b-3(;V?Qh(xX z70XqrClFZbxla_gH`@1hcwE=Do^Uh}(4mAP=b(gpgI9|;ulqB@Ll=XFAx9&<%}WJJ z?Q1V?r|JHQcWj!6JS48f)KS9?{w1zSqL;}Zu>-<3Ziy>ZyINBVsv@Ins?zB#iEbIc z>8f|fTQLYx8n!)UFPe6CQ(SkNuG4H`XM7b%=y^X&L}i|=;!{FHSQyd=dokmAU{FQY4@5UB^nM*>5l4(F;=mv+vFh@Vji#zw7C2c*2p^< zgv5KZ#lk~x(8i{?W;x=Nl{l%_rMhL^v=^&Z1?Rxrw_7I|C`F%TZI0Z7#HWHiKttw< zqzy<{Que?2>~2I;*dDCv)BX*lhlRAEKY)x2OLf}lMAA|EyEdj^r8rw@TpU)V@zi+~DB#w@*{Wk7WV zmYUm)rBE=)SpqrZ(Fx8HBs%Ca3<8$kDt!Q!hA#Irmd-`O&OpI&=(Tb@MfZ>0s+lVw z0C>-4^N^gSO=(@0{Qp^+7LpaadZHD1)_CHOMD&*IfFmse|c&7^7SGZvhfmnSh|kxFifC(g^~r_bkp~vis<67W9Qp)Bp_?U?BT$49&JwFj!tCpVueDiJjU$8@vh4yj ztg*U;TZ+1r&Xw4v5$H6pOG*JL15RA>(&Q=4?X$WBEZTL+N@Q&lYjm^3PZlyKq=}DP wdRCV(2_BFK{Nr^A3K~3f35D0C$AMpc z59_)2jkN1dO&+lm{Y-v1wt9|Z z4dn`{l*13gb?upv=OJ!c*Cxjg52aFOA)h@ooH-M|*{@o^N54c-T&etndtz3rHJPNI z{5T^ra#+RYx>@{u@%QLuU0aFHgqy!LhQy>A-c(e`~^)6ljo zb0TpZ4FsHn#IjRr3hz7jOM^oVKjglmh6Qas=!+fx5q2Q*{JCG-jDgKnRMFd2vOFr1U>V7@?sbTh*fh? zB{yCtlP6lj!y}o?8YnuK%Pm8f#?`;P$Gi5nI_u5 zI@hz=Y|3$DN?{lhu@yXOL=}{1j?#u8XQoLFBy+m8f>Z{b^NZ|Kd!~vQ_j9u^VE{2d zcM4)x+nGN3+=96&Lu;C8+g8o_bH}*nB#lI)Q1@%2h4lSOqu1*V=iI*^)Pt~lD4$9^ z%x-nRXgu@`R{Yq+*g-s`vw2|Px=yw*0xG5pGYStNj2W22`P@ih=uCGls#b4Iph77;u#ukd6dvHqJ_;eu>X+E1`d|+GlU7?8#v$3t?swK?1pf2l z0{gg+2j!kgA>wA5j+0co^tjWJWg%dD2}KRu>>M{tHE9&i#d~<5t@0yK);<$mgFdKT zQkh_5TS@K#9$L5UufYSaa&T;w+DE=9usA9od_x40+$EUcfv_?qwhBxuE-cj?_$oIr zEweH~0rx70c>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/orange.png b/src/main/resources/assets/create/textures/block/belt/orange.png deleted file mode 100644 index d4356e9787af5ad7e02c6d09a4d751b34fa70644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 TKPed8^YPEz{qUds%|HGxO#f{z diff --git a/src/main/resources/assets/create/textures/block/belt/orange_diagonal.png b/src/main/resources/assets/create/textures/block/belt/orange_diagonal.png deleted file mode 100644 index 7e774efee137d2dfb9e863840d09dc3f961296ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 TZ(T0nL0fryZTW|{KKS$*#hHb~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/pink.png b/src/main/resources/assets/create/textures/block/belt/pink.png deleted file mode 100644 index e8271fcff0aeb55502fcd341ff3455b437fd3d39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 zcmZwNOORg0bqDZo2Bgsg39t=PY-5|3k$DIqgb{2E6gFTSmtU1CXOX~yhXJRON~*HR zDp{mLDjPeS*hv+JDidIlDtl$S0)i~e(>BHuMh{{qHW&;u(u^$4d^19m-|7E1tq(c3 zq&t24p6>qlIj8&l``qvT&wci$4eQ>&ZZH^ZxaH;>zu@n6^?%Kz`-SUYzu%v=e}40q z|8g)`|K9pPG5F@cZ5|9hGPvc&>%VmOs)_5i?fS{Y=1uQA_Z+o@4}Eac@X(oi{`dJE z+dlf-k6%%v@WPAx6h6Lv%efmqv1`vGzxdS~r>$G3{>?XDKmVdj-u%VFFW-7)=has{ z``nAfuKxJ8r=R)p$3D3I^bah*x_8f}&F|NId3ky3#UHu${4XDzoB95W-(EWQjv5#F ziHQmK55MoCBgbDG4v+oG4S)T&5B|mawQK+CkN*BwZ~k)Eo=1m^$H=cb^_1b_63Nx8 zPR-+*sa0RN=AP5mp7u|V{mtZt_3JiC8;-m`RkVQOmC`i*C-U%%ErHEY*S zZNKnZHBaw**bE69dpI0^ddGcdFJJ!J!Tmr0eY{=IJo^*F%rDNrdf>pq(&Tj?z3u42 zf|{Eyy9@d!Uw%|sbAS|F3LalSbYNj&=?gpW(bc*&Ykqh1s8>(E{MhQ%r<{BCWy<5T zRVD^~spDtg^mfwF0Nr}kR{?rs_SMPBNjTmGXn5qmUwsvz>o2>;^@IDV(-_KYr>4^6sh=01^HuTrcOP7(^kEhZHGce&F6Q1<nqtKbz>0i&31A_s#S6s-WPI#9Zdh|F+Llct|>$%nq2ba3K*13$)EYQkfPw%B{kQ^`ngOz?yv+ho zFn{+b^qu2n7Of~K1AY1mE;G%rc9c?cnQX^bXXd7VJ-s)8GH_gIcx-`psbR9z-+cMq zaXH<=5hdxzrTp5=zO`#tQ~B~>86Y+4pWatf${JuXWo-dcaPclG2goKtso#12Yr|uw zeD3PId5gErg9;}F>Ft8emqV|^#l=OV*NZaQ;pyxWs?@l4?_m+kN$R1!}EG#X+9gAt0#Rd@cR8EiDYI6GNr*qmvhi85> zdw`fLU{cN+(9fqXy#vDL=o5pd_m;`d-*mZqOr~J>jlie3)hd5#|ARDS5l2Ixzxpfs z3LwG?aqbH?ZzJ3_q)7qVc@LDoIdlNTT;##hP$#_0Kv|UDe&VBlS|0N9V+4rBbCfB_ zTMNm(6gsFCQj7RI&wZ^l)Bx#`hJt%VL)&;)G^7`6X5+?<1!%4Sk=IKm;H_(Z@hD>& zIEzw^fIt|^8gFv48!DQz2GrlO{a%}!!u)Wk@Wk#%Y`YYyrf<^$rpA`YKHq)e>s+(~ z89=HSJtk`~M*gF`uz0j<$ne@J>ogCvk%e z?=m{W(q?TcdmmW4dimBX?zBO9tBFAsTnc8zKF{obWW$CHgv-lCs9HnKWL-n*yM~mr zZ7Gc6z{`)WS~Y1=>M@?9cYr8fp{aw0{<#AZ>8;dpK#?p!wJ6Kw=+OdDV|Ch;Oo?%V zM`iaVTctRl=K70nGu9-N`9nhh=?lbYNF_YlD*$AM;~El}M9S}meQ*S+9vvYf^t^#=Cz{QtrvCCNlMr?6l?*lYc zfQH3G2&I9y$^b$C?14vUh{<$Xfr*A%U?P*XrAbzsS!F|G*dRz?`t8IB5b{UZs~{8U zKX&m&pSkMKc$`XZ{m>KlQ|Rwz51w=8CG+#c!-r-T`0>$&xr5URvvWs|%pKyx#A*%b zD{+8hS>OSbIb;`#hSWquR7FFg*qehFjpq>#1=sIssPtfr2Os|jfZzZK0?42VAol>8 zo_(7bVP5p%b2d}xX{Vq0&R}uPn$_Wy>(;H=c;Ry&Qx|KaA%Gz3fGBM4@KLXHNQ`g?WO#tWcA>#@Aye3P!OpN< zxB)VXNN>q)8f?ohhwW06OM#k>4v!w#zrT~qNt4#bvcQ28x}Sf($h`(BC~w(#1CxFK zrEjP-hN;ugj&r_vyaC#?_kW-PW%nz;450HiUWc4*I_nH;K$BP)+vUCx{OCt7mAxh= zUU;FLip%ZU{d0xuF1pR#a5rs5J&Ih$5yk_b-qHyIOW5P2F~o3ygioHPDr-we3hWU2 z`po{~0^Yi^DEk`d11ONefkV!2-g?&3d)`oXybHdS24R z1uBKwZJD<=J|+uWv~76|4h<9vZUL&XDaKoc#)XP{cng7=8li1O?wy<&lnZ&=s7JA7 z^xIQ*XOCS|;X;Y@nut)i5H?}QBsR{4S|{N`MLqO3S_278o;x6A(&K>O;BP7wY};O; zF~m;V773Jw8ad-{p&mWbdz)~fdDv?sXEQ8Jk4C3d`!Dn$@fKn(^)+sT$4xlAM|+8y zimU@%sL}V6xX`$UikvjIXbu9x{Ne;Q!F_c!?m`|hJaHbNXb2!&s3J+*e1o={Ov&V-RHkfLj|aX?yjNuQrMzJ2~adtT&QWt zwyTSRvl8kFv^Y@IA0Wf4DK69wD8$rs_8RAY{a_KQ03yI*{M{WY}871*mbM5DY>&XQ+>=s9Cd|m~>a)7=;ss%;lr1Sn9na%p0!jV;z1prHgNzSpS-8HUm- z1+C_XMZYzq$JWj0O#IuyPd$=EJ=~Q=dIf2i;zG^BD$9kePUNiOKwATm_RbjY0EzR@ zG`83Q3CxVHFDeNjk|%MYXh?VUx11& zmI?qek~I+O0Y|6@D6=zfhYJ<;n45X<@%tTF=}4lDLJ^I3mWRj><|E4{#w&Qd;=*fC z4;Geat2JPl#)W18%8)TxRHeqOn2b{@yGld&t(Qiz5EXoU*_ROAdGBnO}(XUj#- z0;qE#fYex&!~ik`mqSib4>Sx6i8cyyDR{K0U_JJ678dm;P1;ByXCHdcrBo6?M~=)# zRRA%WIPm*y@mSLkeNc~o=$iW#7wiPcsh@_RH!wgfjGQqJLyZIS)yd^?8z$Q* z4aH>Y05S)vO7_?WMcx?X6#_`%^OduBy8}WS0jfAKmK!Ao5Dl6Yby@?O>q`A-+dVvu zs1k^w;E4+%msX(q1lH1-D~T$AGUF&IQ&&!4dUD@`dMAu}s4NXF9wo0Yml|&sob(SJ zuFM%pm1-0!FwNG9PdR{6(7aKPO4fERlp`n|rH39^Lp^k2pqBM${nMxj6)rSCJfaQ7 zy9gzsA!jty$r%%m*dh(BaG^{?+Z8}3xDYDY$k`|_q}xPRlHt`MXO;D6%@bJZxY972 zwo(BX)yfr*AQmQubpv0ESPXAmXok0Vt&QG$VVn!4GSmZG^r+v&FHKIS9?hqY%-6<} zL{;cF3uvWnxR7#jp}FY*q986eiu8@`>RAsN%iXMO2^30?6$iWvAd^<6dpLBeoWhAj zRU>CT4U@-hH9N4wDQIG9+`gr55ChmsFD9*7B&?r&mmAsH`SGv~F z9(l4RE=dMW7KZa-+6k;9E(CqZndx>7#aXqnr5FPsChHoq1|+Jy4H|cocP~J*rJ;9` zGk|96fI>co0w}vmkMz#On!9eQFF@0{P&y3b&~SwdwMf6CvfqS9A1p#&O-_}r-GfXS zAbXU&5R*agRRR+Ya#rOnP1$m)y>T!Y#6`;{BaUzvxq-cnmv*k0{2#|FA+(<*jLV>(m(NHI6 zrG*0Yc%@+spF~xs9*OkwLJB&Rh6xuEF)0)mN~BLb6;hKRk{3!ECV{oqfc=Yod*&=S zj2#WxYGlr`OHdfMHWHUJ>IcubSY8OS&V>{LsFAaGC8`jOW5*Z5g`hdXg)Z0$8JCl- zu_)oG+-L>Xt&9VPbdYfwIU!%9_t8wIS&tp}oppSxT`qv2gee)To~W`0?4bk%R{m+@BIdDEkL(tS^mbA` z2&|P}Pb#lW)-bQ_pWEKXo?CZc~ zlkjbK^qsf?D(Zm?z5G~xbZlvuOhaV~rWERtub?YjXvckxEuJtL>3n|=TkNSk^`#+s zrIkcgKXe21@Qu5EG#H$5YyB3$NPM8c(bjS?M;2EY?RYETAS0Q(&J&S-u=`)BCOe)F zkf9-rnH`L93gJbeA==htP+9B2noFkvr@TVcRsaoF0JY;NqNXom#&FLSoh531|7Rnj zmeZf(sF+|l8<%?rlr8uqUepd-2gL;4_MJTiT!vvy)z0f)F~MGj$^xV>4FJjj9aDl7 zK+#YKBw$BFd7ZXLr{goqfkD)Y7R90jC3BynAf5;AI5$B7jg~8xCiKMVG>} zL`1F$v_(0MIVv0SBwi%+GFkDW<+6!o@GUu_-6LKU4S^LvMU&e1GF~K=M4gHHEG*dj zJSEJJXF%Xf(#oPt)Q>`KO34v<6ztiP?#6kMAnVXq+o=C+frL=ZNuM~QD!d4n#0!WK z=F>^Z?R&2UNeG^F_2%kG++6Zl}LGTlZ~R05Oem>fvpzf&Ph8Sykdi zFVK+R&zZEhsBGrY$r&;At}JK;V-PmO{`S6h*anVah)!1(P4QW$oO#qLL$*_hFNPXuB05y}q$TmKaG`h(`2Z>nwZtvM z8W^CYCG9gIXDVT$R0UTKD8>yr(@*>T+~{Y^>bqW;&f|Dmvibo?_Nsrx);?=1fHcTA zV>7h<8;_Oq5gQ;eg;=R*#cm!?IuCdyl|a}U(3}8^wHEb*hyYS=QPQIVi?OgxrRPce zuGrI(bp)NO-_H>~ktelMttSKMr2|sPE@7muAuKJs1Yz~rd`QNZqM_O)TI8v1cfv>P zQ5H~>?$ZIJCSOG9kuZzdb_Le_7)$?pCgW0ut;c~;o>Uc<))ytYag%BM+D!d;p>~O; z>;g1cwt^FwGzTcX^Q9DW1Wlf_PJHbnHcrksy6RWF$SKE%g=hDVejTO<+io@$YrtbH l20dV!gzc&ixqRS{uikRrV|(6KF}UTEpS|%vZn*95{tr@QO}+pC diff --git a/src/main/resources/assets/create/textures/block/belt/pink_diagonal.png b/src/main/resources/assets/create/textures/block/belt/pink_diagonal.png deleted file mode 100644 index c4441a5ed9fb2b7e79f08dc7e0fbc13e2dd9f9ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/purple.png b/src/main/resources/assets/create/textures/block/belt/purple.png deleted file mode 100644 index a34dadade8261845c069143f5ea80bdd4e2c5ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 NJ#+Nkpa1#~{{?|(?5+R+ diff --git a/src/main/resources/assets/create/textures/block/belt/purple_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/purple_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..e88f5ee041150a5ed3831b668db447aa499c6fe3 GIT binary patch literal 1657 zcmYk6&u<$=6vt=R_O5^18#_*9J55MPTa*BadmxU)p^+=<164&+DULZ*LYzV3KR|Hc z&H(}c0fk$CNr2!VfL4i%KuzP{P8_GZUVGQxwY~0lJdW{b_U+r5w=-|v`^@|1_N@p(;!EF5eS~)q&ytge{Pyg#AMkR0elzn0A)XL@IP(3E^MnX%>D2YzEs0wajty>g zd2#K^g4&cfW;0JKf7Z2Q{Kgu`al_#-9(XJ6yL!}q5R^g({}gx(VFK2w^sLz{!!)^- zU_WfVw+W?h86=j6vgW-5OPe4%1c#&C$~gr-Upnpg2jQT*P&yq9ET$-0V^;E<%i6L0 zSN&Y!y>9o;8=r{wfnN%(MBZ^a1#dudyPZ&c!5Jt4zb9&4Uz5^{3-cbA%O(Z=e4u6+ z-9`RJRehoNnw824bBQTY?-h~v=Hy2_XO(IV8Xz2Fb9P_VWqnw4*lp;7!#?Q)VjgvV zbvmqT;jBv(?RvMn?%O?iRn94o&ECN5^>H$`3MBN#upkQd?N}D;@@Q}iqc8PGkaO-; z<_wbAelOK0XZryvQrD?p@>AdZ~i#0Gxw;#2MGf-rsh!vBuJxF}o zaR!9xsQpkBg|Ks_qW+7C=|)c+&oniq%Kw4%P?ru`_aPJEyINPDcrsCfj%8I-z>;AY zFr#@u+l=h1(o@AOLElbZ!vtJoQ1$v<5-(r`EMe9r(6E4|LziefE}j6PP{36z*8vrj zQsqq18-S`IYkB2w%979HVJv~1)wy>WOOWWG%jFWmQf#;bmKI_W%F;|Qzy+$NXz|-u>|AsolZouxDWMq-Y|QtGmt1t-40GnS@P|+b)Cn3 zKt`IH43?%{X9s{pHfa)L83NY{vExqTh5I0ij*xS?s{V&h*ujX-6XFyd@K)883imtm zKwZMkfCNj}ec}mY3DR#{Lc|dj(==f=zSB5EYvvhaX;PN}6?W(iy4*q$d%|->mDVMP z-Ck-P(z;ZnbqQ4{Up%2KjS3WHN%CB;60jK8 zrP_H3b!nO<7Fo!;mLJ{HEY=;f1dY|DdCz6&Fhax5OhVa?fn{2kpnv!ESMMKu_#g^H OlD=^(^~=t^FJA*LR+moz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/purple_scroll.png b/src/main/resources/assets/create/textures/block/belt/purple_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7dd16d5019aae560f8088344d89e3835ec6392 GIT binary patch literal 1657 zcmYk6OK%%h6vxNo$IN*Ai1YBHNn1-OjvztADTt;!P!Np-5o%hsNj7|gR^l75W6!Fv zWQ7n5O51e9niiz8Xo6be7AFSOHh9KPW;`!D{H||^dSzc9pT|A_^FR08FFslMFq=M= zRum<>d~xX#zaxCBy2}3L%j;k9W8Ap7_L-uXW8xcAZhl=>l+^6<(tDTB7h=`aGe1@- zPgJK$u~_W%WO2W#HSI@l&)0r=_?X~#>N6)o=5T(?+WfQiTr~}&dZwZ!`q`0DB_8T} zDw8jy(>fmn!_a0bb%e&@oikIVOggO|9Ub|;zfjyzT4(LBMXI0gKSW7}`wxC&_rqRe zXU7ZGnzrKfdIJ6%=B18nZFlZTzf>|o7;-WZN3eoD&kHY1uHk8Dno3YiQMT=SsZ_j_ zp2hs0~oj$=JK_)cX}!;|0^H7tx@3Hsh(FbKj(#)MIyunGM&yc^CPWUMMb)KD*O zbREm`_xLLz5tE1uz~La+vNzF#Tx3A?X6{PYwW$GFmch=#%8_laX&9+`aUJV{;|P|J z8i%(zqd2S~>JOw6Y$&nLkFJ7hC;TyMnyTx0zrOs&kK*rEu7-UNvm{4i<8LK1({(NS z0CG_SMd$PR#Z%X04V;Y@Kb92y$b&=T=Q69J20W&dAKA`vA22`;N|wY%4FroCBuhQt zNBX@p?1NduCRrj9me^T~lh>#Lxg zdwrp_AyO+!T+>ok|H;1J(35JvJHCJL_e84B{uf+2tbUWFD}p1aYhA z!#UB19`s3C@s{(zjqJEKcL{HT1&^NR%}=buY}*rkIO(*!g;C!JE&5q=Rb=2hm%aSz zJjhB&g^9iG@9KJz&MGnG&~-&w7?=lAQ3E@7jvb}!G!FH#RbGidf?I-C9szC@ugK!$ zn!HOA2{BqK$zIOXx^CyGbC-GGuV@^%YIq;pcCd$vCGl{!;6Tj7CQ6W#RzRX7q6S;c zG%86BdWj7t1S(#-;Xx|%z<=IN`7R*?2^&k!0|IC}P8;OnvOmJP({F`=Cr7&jVv1GawKN6U>9G0e$!5n@f+^ TuKvV<%JK&*OW(i$>F56eN$;)g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/red.png b/src/main/resources/assets/create/textures/block/belt/red.png deleted file mode 100644 index 9de781a48537247f542019983f387c085ed9bcc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/src/main/resources/assets/create/textures/block/belt/red_diagonal.png b/src/main/resources/assets/create/textures/block/belt/red_diagonal.png deleted file mode 100644 index ec53e50c9852ace919885eae10b137186ac679a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 OeD3A*|Mm6n{qV2g1tzTk diff --git a/src/main/resources/assets/create/textures/block/belt/red_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/red_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..611567dde2a20dd7f613d4dcf3f7a5dd54cd4d14 GIT binary patch literal 1657 zcmYk6&u<$=6vt<0$KD^#`bQ$_(BL#_LwjfeHAQXGQ$Z<-Ra8=x3#yQ~asr9}fEx#H zoPZ--`Ee~hKrf^mK!QVpl0fs@ZW6D5t-Ukr-Qhc)*krVR`#kTxoi}ej^FCX?zv#K= zT|$UgURrn;?>v4}Hii7+=%cUjaz0*q?-N2YW9ny+FTWlqBz?8K@W#qq!I(<_%Z-;W zUbuRt)NJ^Rt>lS}x8nq1dKiWwrM$w}Wf858TKU4*Uu)YGQ!v1L<9c(QhTQTT@IU8)(9VI_+do9p$VMni0eL# z4U5Iu!q}@B$F|cWxq|E3P`vyolw3A*eRKa#t9zj|o^c$rkk1Cw#pH;V{Y!b4+ zU(qRPWros>=>6^A zZne3~#V?*CqF6*d?T4@E$X#YyVe~*q$q2UuPTrzyQj(2+Wndc)E6vm% zMD)kZgj@3|f*uvKkmVL{a}-Gx3eQlP5V0@B>S&sCb^HocjHR~Rn7wvL)!*CmH()?+ z8mdsrU}*X$UzS%+L5*e!&J00# zl>>s)*&$4`G+0KxgCxO@rI0Jt#wxBT?gLH)Jc1?dhj=JMiPOYKHA|RhxYM8$_rWq) zDUq84Z#e0A+e#tZx)8r#I-jZ4RrKTWJY>1a0}*MEhAbh&7sIH}k|hLgomB8B?|^K+ z{)%R4*p~nmtenV`+lsD*N?lzb-Iu;k(@FmXEWxAQ@H?Fl9$*Q|8X*Ig$Z21CUs5}j zoMj2^2ozyPv!wb`JDhx}*k`GbYflx?mu_uW|B+xxYJ{-DUcW)jnA8;!ZYlcG&cTs7 z2c)rxzQo0e=UDwB>YD29#msz~bx!+|ZR@_&*y;DBvn(M7--6sBq~Dj$u!Jw^zI1VL j2t#kgVD#^_(AEF&-si#2`k&JXBIUdH7ruM*gHQhh(PE+< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/red_scroll.png b/src/main/resources/assets/create/textures/block/belt/red_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..c09915c6894d2e34808d9e46067e5c14482e6d41 GIT binary patch literal 1657 zcmYL}O>7%Q6vt=R_I^3`CQkEF+I+PV2o(uhKx%pb1rqA?kfw+WH?Ewh)Du^3+&KY9 z&Il<-gw&*$79g`pomI-Yvc9_V(e(*y(Rr+`^RrWn z7iTQXn!7L^{rUH9fAH2DFaPq}UpT*g^_7vZwEOse$$zr<%r5%=;{16xKPZh?2Cn0I z&R94R1Rg&G-*>NuV+ao`?)=4>u^`AzjF-<&f09PCiYuy}bj%b7rk}h)`7O zsN0T{Y@-$Z)MyI)_YazNt#`^nmSrrRLLO`6LOzFZVB2xryOX4B`L1hsqR3JTYsbkg z4Fj{mz;q;FO~fB(LYqMj+w)W8aO+gZX_lsG((4=3UVnhwLMqmeDlRg+HXp5ZwVl;< zav&?qK*A@V6Tpd5+a(`8$mIl79~_-FlLS=ACJkl=yM(L(-FJw{?rEoEvw;~^BgRse zG4}`QP^rMi61!?EYH0mnVY*Z-+TA$b3SHgL-Hv-&q9{`wOu@$TvTZkXLPU^D4kR6h z;im4B!@e!mL@Rzu8G%Y{mjnFQ4qK7~7VkVgs>hN8G8+^Jfnl)Kl$ICL)B|z=IrxWtn49tn>H5Dq&d$JK#0h4;q!c;)e9kYI%Yo+!q$Ei= zvDxeGOE`<-7;6MD4|DJV^X@;#?8>35hb?+}vV4tgAT3|Nh6BQlmE}qR5UznRUd`Lav zL$N##4Se4#PfWs!*Gs{W4-O2Y2f504I5{!4@;tJi)_yPi&j(I_!3XO&YHQ&`SNH(R z)kERK{V~r#Hw`8?%8KSNXGc*&WeFiwqO?eK&2{tifx*(u2n>AgBm=_-^fpcp7G~(f zt=AeS7_a;u18w5UvR&>L)UT2OW5 zcHu94;HFUr^DeOmBspdHYT%DR9~!anLGIG957Waw@GePZ@G*8qzHC|2he;3Qk~G@U zy96JI2PBS0&`FOAAEjqGobiEp(uX7&@c|l`6Ae$W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/white.png b/src/main/resources/assets/create/textures/block/belt/white.png deleted file mode 100644 index 3edb40a1a070f06384f4bb2c67bf8013851dd276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 BqsssQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/white_scroll.png b/src/main/resources/assets/create/textures/block/belt/white_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..8251b3b1f3108e618b4cc5bffbffa7f36f21b69d GIT binary patch literal 1657 zcmY+EOKcNY6o&2bYsMya0-}Uc(x@vCuxSNKoCmTSLP86I3L&v$(FH6JAWGXjfF>a? z9!Y?}0#bHt5xZ7xCAK6$V!{p)Ds|H&MgioR@r<1~eAg#3;mW>q=G=4c`Oo8@!Gj0( zmW4kLdpw@9)|RFpc$V|8);0Fg^r^c%jMFVg&w4zOb?Wc++!?F%c!Jwnn-Yg>D!kRf ze_h|k%Jn<8d{wn+LwwhchTYBY7Shd$omnTpwmh~sv8yDso$vYozn4peWi4VD)m0lq z{-v_=wT@%!dT>pwA{^HFAs9wz-}n0w#zuRqzSyuP9M+bXmtEKG=(&;DbMQs#sn_d$ zJU)dIc;gc(_Dm)-^Xiq8*UohgTG_0E-`+JeH#c`{WI*hK0Y7fY0lyDndg_VenLuc1j(=-c(LN323KKaEZ+-mA} zV@(dooN7GCp}qS$TB7qRknr*Q6kyx3M~C~-gIq;G)!8#LKR*vDWJ!aa#VJ>&CdUmU z$c>z4EK5}hNg~$PC%9>mY8RDY+# z*M5UAoqDou`&On?g{GUPZJ#`T47bgjKHFK-_|IQ|nD5^@PL3YFUwC8NPS)$qyj!5N z7uwFKX=TK}+*~PqaEpA1M9ZOpVd&9{b+Dpk-*@og?#)ZwNDn^pA=!LrdKDi412MqB zM82Mxp|j+ms>Fft;pR}EK$ivslCq+KRoQHg%Hpi5gcA~V2!;G5K46Vf7Ct3Dpx1D^ z*4IWKR`WqZ2_NG137I9V(W^Q-jw5`KK9o8wQ)t;%i4Q6Qf9V6LaOMsc0-fTBom+H0 zAhSddR9f^4K48QYurqV)SWBldDDgp+m0on7JI+^xI>;;u5`03z0DE0ylCJ%Js}DZ# zsv5^s$vnboR4l>6-3T&EC_%1rKubqToJJ+ZK`+=+lZsU`OZczwfjY={i8CM-!>F$Y z{>bzJhQS9lOY{MDm->JOK4K?wU6Iq|0CJTyTKTprPESs7ACL%*;O6oa&@?kr@fAKO ne4p|G8b|~LJgEeHkUpTlID7xkAIFaDSEyU}9B6uwJl6dIzH7N; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/yellow.png b/src/main/resources/assets/create/textures/block/belt/yellow.png deleted file mode 100644 index ef615bfcf0419a0038124848c8d4fb544cde2caf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 diff --git a/src/main/resources/assets/create/textures/block/belt/yellow_diagonal_scroll.png b/src/main/resources/assets/create/textures/block/belt/yellow_diagonal_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..d8622414f9c6c5234029ff3015560cf1a92027fc GIT binary patch literal 1657 zcmY+ETTdHD6vt=p>s<`qkfxLXMv1_*d8lZJu&acqKoy)IS_P!4FKxa-EAa?f-bF>yE~=$7jyWoH^$==lf6R?!=8= zgE1D*&P?COH-X=vE@J$l_|;GN#J-;S{2Rv1Zu$xA$Dex`Q?F&GKUzpz!l1h43PV?t z*HZnJa_R0Z^Vet9?Yxg=ya|F3MbSu7OAX44YktD&{^P}t2o)w^{j!kEACqM!{Q+N) z9v_9^`K;g!L%1_emXfL|s-nEuYUrxCohvjN!Nr8JlPd&4$c19beakYBOSQF4=kWMc z>@bWkXS*~x=(M`uPsMdz?dY-$Lx&JgT!7HkX^st7CdZ^?e~%f9Nmin>>RGPqWZtX4 zw%u|q+}k_gE^%SFUp4jc$!Z`9VJ?3}0m3!z-RdZn-J^=A$P&7$$gS=-*y5j}u7sc5 zR%4nb*BvLDW_JGU$!h5Nf#)}HGrkK($aW#pRJJe`XAu+8;1<+N>jCDjUY5Bte1ryv zqb*FErLyyAMF_)?!uoKDwDXe&BB-edn%wSHDyg5GI*aQK>_R7S2WD@_Ps)y6@Zl2g zeuLaYubuh0@tG&gq@!xBCf3f*vKfXwprwPFt>p}ay<&*H=cf$Z0e@w>L&T7IO;eLS z(x&aUUjwqH$_rC;htn$VaN*pOme6;Jl`76}YrgBcFrz%6-J9qD zOZ!I=&RE`@JoD?)O<1{O&6c(`L$24inJ^(`9T`_z25KuwL?G=wo9-uk` zORrpFDQ=paC6F^Z(#cuEhz`19F%2x;NL8oCr2fm7h@}gOuBw~xJU8=h{gv&WR)f9$ z0vy2UySsUeV9C(Kr_V!4jKC757Vh4?X(A6NRiX$Q-uN=G0+uw{pPNu#{;kP854n8@ zd$=BD>R)>b9pv00BFp9{FOmVgjrGTt=4OY03yQwDk@L>5|D!-%ifH3i<{JwDrrBM%>xt>e7R`1d2jCODIR62pY~3>eAE=d7$s@CQBBvbY7Qo#1cmc zKI}FN)X>0xb;;f@QXb$aYAe;HvWTof!($3Pq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/belt/yellow_scroll.png b/src/main/resources/assets/create/textures/block/belt/yellow_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..256e1e45b4f3434396b918d726275e3c9ea95c3d GIT binary patch literal 1657 zcmY+EOLG)e6vw-Jx_i2N-U*n5Bp3+=C@y#iBnT-IVkIF+31Q>T9ZRk98@O}h%9T>( zH&B*VsbMxssvsn4xzH*#$^@911SWxGZqK9J-!@{}uK8!Eb-6w~igUyYxHGr;Z=q6^47N^Y_{-rLvXs{h|GRNxPlNcSVuy zd2Tva2m+5k1m91dd?SzW)6dQQ13l>=NEGtfJzbf}Q;9^oy!1yqisDk~5!VxQb@eeq z+BeJ9P1T66UU0sh@w3$1$I-V`Gi%*a>l4i6HW z)~=fv?iW)Otd|9>x$)Zt(_)ds{QV?3Tt4TjFk&^DE$!26wQ+l`&w8>^CkJG-7C&Ja z&W@#@ZiK6A5uX|oK6XL?hs}8Yo}7bRB5*V_YGMs4WSs^(3oTccDsA6)XV0h6KHJ)| zP++Db9@r;Yw%R+{gN;w@E}gZdD$8Cbm9n;#x>XFrR^r;YA2y^)x;Ppep9cqB;&UU& zB?pqu<#KZq0hy5l0XfBvr3DqXL5u(N838Gf#*eA>TK)DSVvK^~h!n>f8#&-CIhb;V zRS!d?;{90qFkqw8Rl<`hv9snb5?_#mf2R+g6X`w(lup-(fGIoOd|FcrzqYg4Y~XnU zsnKWC7A-sr^|}9=EH%0nLIt6I7=OsQkTxdsd}j@jM?q9o*x-Yp8WT?A-{C`SPzU`kp#xGUjJz87BhT?J)r1e=mp;Jm4j+>BP|Amow$pMa z2SpAbm!vs;@h&O&zGy-$Vz;lbvVTTXgM>gcJ%LiznBOu_Z`OwLMWAm@WpM7XP)fjN5Pg%_iM_i?+9I(+s#ZecP-qWuq5S_d5?r`&;mU`!A8bo9j+5aK**M#OfYy>_ zOP+b2_vUHn)ys|C-E45!Z_)J`*m=0#gNPs^NLQg1%0j{D5zp5z@bU9kWRGnNW=7X% zC`%QSRGxu|Kt#|gp8*mPm>EQbY-ug(x`r(T&JD94MI9_cWB|a-vtS~EAI2Em z`yt-bH~@1B#^{Kw@@&RkL_kC+OEqc5jK{W}C^St2qen3NC&H!NMJAfI5L8u#rM3Sk zoQl-@Atw1@obd+$=iDS>;3Oiry?Y%4KHR^HfcNj;#t+`y-pndek8O(|zxE)?aolfl zd}tveIPSM-TLyr57ZE%hc3_|5`_J8^!D_L<=6VgIM^qPAs8$x%mZ&eE!P*kmmZ&bS zU`&C!T42>&!srp3>ou0vf`Su&A9m>a3~lEk|4?=~waU@d7S0W5DuYj7zD*jW{S87D zT1AkwrOX~ik7$}^>cXF{12cnt4rBD}=M?nRfnC>4U04`{x~@^GA^IR~U2tMbC3R(% z_B4G=%TDhhF~ntQx#2N&VY)@+iIo*jRzUW{7{Ofc<696hTKPN=&hy|r5B`^V@E6nQ VX$heXfAs(W002ovPDHLkV1lHz_ul{j From ed04fd1d52105e37c29e360f78f815d3ef4ecbe3 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Tue, 16 Feb 2021 19:54:49 -0300 Subject: [PATCH 113/147] Update es_es.json --- .../resources/assets/create/lang/es_es.json | 1450 ++++++++--------- 1 file changed, 725 insertions(+), 725 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 9a01ded06..e9ac18a14 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -52,7 +52,7 @@ "block.create.chiseled_weathered_limestone": "Piedra caliza erosionada cincelada", "block.create.chocolate": "Chocolate", "block.create.chute": "Ducto", - "block.create.clockwork_bearing": "Cojinete de reloj", + "block.create.clockwork_bearing": "Rodamiento de reloj", "block.create.clutch": "Embrague", "block.create.cogwheel": "Rueda dentada", "block.create.content_observer": "Observador de contenidos", @@ -164,7 +164,7 @@ "block.create.gantry_pinion": "Piñón de grúa", "block.create.gantry_shaft": "Eje de grúa", "block.create.gearbox": "Caja de transmisión", - "block.create.gearshift": "Palanca de cambios", + "block.create.gearshift": "Caja de cambios", "block.create.glass_fluid_pipe": "Tubo de cristal para fluidos", "block.create.granite_bricks": "Ladrillos de granito", "block.create.granite_bricks_slab": "Losa de ladrillos de granito", @@ -186,7 +186,7 @@ "block.create.horizontal_framed_glass": "Cristal con marco horizontal", "block.create.horizontal_framed_glass_pane": "Panel de cristal con marco horizontal", "block.create.hose_pulley": "Polea de manguera", - "block.create.item_drain": "Drenaje de elementos", + "block.create.item_drain": "Drenador de elementos", "block.create.jungle_window": "Ventana de jungla", "block.create.jungle_window_pane": "Panel de ventana de jungla", "block.create.large_cogwheel": "Rueda dentada grande", @@ -236,7 +236,7 @@ "block.create.mechanical_press": "Prensa mecánica", "block.create.mechanical_pump": "Bomba mecánica", "block.create.mechanical_saw": "Sierra mecánica", - "block.create.metal_bracket": "Soporte de metal", + "block.create.metal_bracket": "Soporte de metal para ejes", "block.create.millstone": "Piedra de molino", "block.create.minecart_anchor": "Ancla de vagonetas", "block.create.mossy_andesite": "Andesita musgosa", @@ -347,7 +347,7 @@ "block.create.red_valve_handle": "Asa de válvula roja", "block.create.redstone_contact": "Contacto de Redstone", "block.create.redstone_link": "Enlace de Redstone", - "block.create.refined_radiance_casing": "Revestimiento radiante", + "block.create.refined_radiance_casing": "Revestimiento radiante refinado", "block.create.reinforced_rail": "Raíl reforzado", "block.create.rope": "Soga", "block.create.rope_pulley": "Polea de cuerda", @@ -376,7 +376,7 @@ "block.create.spruce_window": "Ventana de abeto", "block.create.spruce_window_pane": "Panel de ventana de abeto", "block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso", - "block.create.stockpile_switch": "Interruptor de la reserva", + "block.create.stockpile_switch": "Interruptor de acopio", "block.create.stressometer": "Estresómetro", "block.create.tiled_glass": "Vidrio esmaltado", "block.create.tiled_glass_pane": "Panel de vidrio esmaltado", @@ -398,7 +398,7 @@ "block.create.white_seat": "Asiento blanco", "block.create.white_valve_handle": "Asa de válvula blanco", "block.create.windmill_bearing": "Rodamiento del molino de viento", - "block.create.wooden_bracket": "Soporte de madera", + "block.create.wooden_bracket": "Soporte de madera para ejes", "block.create.yellow_sail": "Vela amarilla", "block.create.yellow_seat": "Asiento amarillo", "block.create.yellow_valve_handle": "Asa de válvula amarillo", @@ -418,7 +418,7 @@ "item.create.andesite_alloy": "Aleación de andesita", "item.create.attribute_filter": "Filtro de atributos", "item.create.bar_of_chocolate": "Barra de chocolate", - "item.create.belt_connector": "Cinturón mecánico", + "item.create.belt_connector": "Cinturón conector", "item.create.blaze_cake": "Pastel Blaze", "item.create.blaze_cake_base": "Base de pastel Blaze", "item.create.brass_hand": "Mano de bronce", @@ -532,7 +532,7 @@ "advancement.create.aesthetics": "Boom, Estética!", "advancement.create.aesthetics.desc": "Colocar los soportes en un eje, tubo y rueda dentada.", "advancement.create.reinforced": "Boom, Reforzado!", - "advancement.create.reinforced.desc": "Utilización de bloques de encaje en un eje, un tubo y un cinturón mecánico.", + "advancement.create.reinforced.desc": "Utilización de bloques de revestimiento en un eje, un tubo y un cinturón mecánico.", "advancement.create.water_wheel": "Aprovechar la hidráulica", "advancement.create.water_wheel.desc": "Coloca una Rueda hidráulica e intenta hacerla girar.", "advancement.create.chocolate_wheel": "Potencia de buen gusto", @@ -580,11 +580,11 @@ "advancement.create.chocolate": "Un mundo de imaginación", "advancement.create.chocolate.desc": "Obtener un cubo de chocolate fundido.", "advancement.create.item_drain": "Drenaje de la ropa", - "advancement.create.item_drain.desc": "Ver cómo se vacía un elemento fluido mediante un drenaje de elementos.", + "advancement.create.item_drain.desc": "Ver cómo se vacía un elemento fluido mediante una drenadora de elementos.", "advancement.create.chained_item_drain": "Déjalo rodar!", - "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenajes de objetos encadenados.", + "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenadores de elementos encadenados.", "advancement.create.glass_pipe": "Espía del flujo", - "advancement.create.glass_pipe.desc": "Observe cómo se propaga el fluido a través de un tubo de fluido con ventanas. Las tuberías de fluido rectas se convierten en ventanas cuando se utiliza una llave en ellas.", + "advancement.create.glass_pipe.desc": "Observe cómo se propaga el fluido a través de una tubería de fluídos con ventanas. Las tuberías de fluido rectas se convierten en ventanas cuando se utiliza una llave en ellas.", "advancement.create.pipe_collision": "No cruzar nunca los arroyos", "advancement.create.pipe_collision.desc": "Vea cómo se unen dos fluidos en su red de tuberías.", "advancement.create.pipe_spill": "¡Hay una fuga!", @@ -602,7 +602,7 @@ "advancement.create.clockwork_bearing": "Artilugio a la hora", "advancement.create.clockwork_bearing.desc": "Ensamblar una estructura montada sobre un rodamiento de relojería.", "advancement.create.nixie_tube": "Signos de estilo", - "advancement.create.nixie_tube.desc": "Obtener y colocar un par de tubos Nixie.", + "advancement.create.nixie_tube.desc": "Obtener y colocar un par de Tubos Nixie.", "advancement.create.deployer": "Picar, colocar y atacar", "advancement.create.deployer.desc": "Coloca y potencia un Desplegador, el reflejo perfecto de ti mismo.", "advancement.create.speed_controller": "Los ingenieros lo odian!", @@ -624,7 +624,7 @@ "advancement.create.fist_bump": "¡Pégale, hermano!", "advancement.create.fist_bump.desc": "Hacer que dos Desplegadores se den un puñetazo.", "advancement.create.crushing_wheel": "Un par de gigantes", - "advancement.create.crushing_wheel.desc": "Crea algunas ruedas de trituración para descomponer más materiales de forma más eficaz.", + "advancement.create.crushing_wheel.desc": "Crea algunas Ruedas de trituración para descomponer más materiales de forma más eficaz.", "advancement.create.blaze_cake": "Fiebre del azúcar", "advancement.create.blaze_cake.desc": "Hornea en tu Quemador de Blaze una Tarta especial.", "advancement.create.chromatic_compound": "Minerales bipolares", @@ -688,7 +688,7 @@ "create.recipe.sandpaper_polishing": "Pulido con papel de lija", "create.recipe.mystery_conversion": "Conversión misteriosa", "create.recipe.spout_filling": "Llenar por el pico", - "create.recipe.draining": "Drenaje de elementos", + "create.recipe.draining": "Drenador de elementos", "create.recipe.processing.chance": "%1$s%% Chance", "create.recipe.heat_requirement.none": "No es necesario calentar", "create.recipe.heat_requirement.heated": "Calentado", @@ -838,7 +838,7 @@ "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto_ de alto estrés.", "create.gui.adjustable_crate.title": "Caja ajustable", "create.gui.adjustable_crate.storageSpace": "Espacio de almacenamiento", - "create.gui.stockpile_switch.title": "Interruptor de la reserva", + "create.gui.stockpile_switch.title": "Interruptor de acopio", "create.gui.stockpile_switch.invert_signal": "Invertir señal", "create.gui.stockpile_switch.move_to_lower_at": "Pasar al carril inferior en %1$s%%", "create.gui.stockpile_switch.move_to_upper_at": "Pasar al carril superior en %1$s%%", @@ -965,7 +965,7 @@ "create.materialChecklist": "Lista de control del material", "create.materialChecklist.blocksNotLoaded": "* Descargo de Responsabilidad *\n\nLa lista de materiales puede ser inexacta debido a que no se han cargado los chunks pertinentes.", - "create.gui.filter.deny_list": "Lista de denegación", + "create.gui.filter.deny_list": "Lista de denegados", "create.gui.filter.deny_list.description": "Los elementos pasan si NO coinciden con ninguno de los anteriores. Una lista de denegación vacía acepta todo.", "create.gui.filter.allow_list": "Lista de permitidos", "create.gui.filter.allow_list.description": "Los elementos pasan si coinciden con alguno de los anteriores. Una lista de permitidos vacía rechaza todo.", @@ -984,8 +984,8 @@ "create.item_attributes.washable.inverted": "no se puede lavar", "create.item_attributes.smokable": "puede ser ahumado", "create.item_attributes.smokable.inverted": "no puede ser ahumado", - "create.item_attributes.crushable": "puede ser aplastado", - "create.item_attributes.crushable.inverted": "no puede ser aplastado", + "create.item_attributes.crushable": "puede ser triturado", + "create.item_attributes.crushable.inverted": "no puede ser triturado", "create.item_attributes.blastable": "es fundible en el alto horno", "create.item_attributes.blastable.inverted": "no es fundible en el alto horno", "create.item_attributes.enchanted": "está encantado", @@ -1020,778 +1020,778 @@ "create.item_attributes.book_copy_first.inverted": "no es una copia de primera generación", "create.item_attributes.book_copy_second": "es una copia de segunda generación", "create.item_attributes.book_copy_second.inverted": "no es una copia de segunda generación", - "create.item_attributes.book_copy_tattered": "is a tattered mess", - "create.item_attributes.book_copy_tattered.inverted": "is not a tattered mess", - "create.item_attributes.astralsorcery_crystal": "has crystal attribute %1$s", - "create.item_attributes.astralsorcery_crystal.inverted": "does not have crystal attribute %1$s", - "create.item_attributes.astralsorcery_constellation": "is attuned to %1$s", - "create.item_attributes.astralsorcery_constellation.inverted": "is not attuned to %1$s", - "create.item_attributes.astralsorcery_perk_gem": "has perk attribute %1$s", - "create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s", - "create.item_attributes.astralsorcery_amulet": "improves %1$s", - "create.item_attributes.astralsorcery_amulet.inverted": "does not improve %1$s", + "create.item_attributes.book_copy_tattered": "es un desordenado desastre", + "create.item_attributes.book_copy_tattered.inverted": "no es un desordenado desastre", + "create.item_attributes.astralsorcery_crystal": "tiene el atributo de cristal %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "no tiene atributo de cristal %1$s", + "create.item_attributes.astralsorcery_constellation": "está en sintonía con %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "no está en sintonía con %1$s", + "create.item_attributes.astralsorcery_perk_gem": "tiene el atributo ventaja %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "no tiene el atributo ventaja %1$s", + "create.item_attributes.astralsorcery_amulet": "mejora %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "no mejora %1$s", - "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", - "create.gui.attribute_filter.selected_attributes": "Selected attributes:", - "create.gui.attribute_filter.add_attribute": "Add attribute to List", - "create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List", - "create.gui.attribute_filter.allow_list_disjunctive": "Allow-List (Any)", - "create.gui.attribute_filter.allow_list_disjunctive.description": "Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.allow_list_conjunctive": "Allow-List (All)", - "create.gui.attribute_filter.allow_list_conjunctive.description": "Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.deny_list": "Deny-List", - "create.gui.attribute_filter.deny_list.description": "Items pass if they do NOT have any of the selected attributes.", - "create.gui.attribute_filter.add_reference_item": "Add Reference Item", + "create.gui.attribute_filter.no_selected_attributes": "No hay atributos seleccionados", + "create.gui.attribute_filter.selected_attributes": "Atributos seleccionados:", + "create.gui.attribute_filter.add_attribute": "Añadir atributo a la lista", + "create.gui.attribute_filter.add_inverted_attribute": "Añadir atributo invertido a la Lista", + "create.gui.attribute_filter.allow_list_disjunctive": "Lista de permitidos (Cualquiera)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Los elementos pasan si tienen alguno de los atributos seleccionados", + "create.gui.attribute_filter.allow_list_conjunctive": "Lista de permitidos (Todos)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Los elementos pasan sólo si tienen TODOS los atributos seleccionados", + "create.gui.attribute_filter.deny_list": "Lista de denegados", + "create.gui.attribute_filter.deny_list.description": "Los elementos pasan si NO tienen ninguno de los atributos seleccionados", + "create.gui.attribute_filter.add_reference_item": "Añadir elemento de referencia", - "create.tooltip.holdKey": "Hold [%1$s]", - "create.tooltip.holdKeyOrKey": "Hold [%1$s] or [%2$s]", + "create.tooltip.holdKey": "Mantener [%1$s]", + "create.tooltip.holdKeyOrKey": "Mantener [%1$s] o [%2$s]", "create.tooltip.keyShift": "Shift", "create.tooltip.keyCtrl": "Ctrl", - "create.tooltip.speedRequirement": "Speed Requirement: %1$s", - "create.tooltip.speedRequirement.none": "None", - "create.tooltip.speedRequirement.medium": "Moderate", - "create.tooltip.speedRequirement.high": "Fast", - "create.tooltip.stressImpact": "Stress Impact: %1$s", - "create.tooltip.stressImpact.low": "Low", - "create.tooltip.stressImpact.medium": "Moderate", - "create.tooltip.stressImpact.high": "High", - "create.tooltip.stressImpact.overstressed": "Overstressed", - "create.tooltip.capacityProvided": "Stress Capacity: %1$s", - "create.tooltip.capacityProvided.low": "Small", - "create.tooltip.capacityProvided.medium": "Medium", - "create.tooltip.capacityProvided.high": "Large", - "create.tooltip.capacityProvided.asGenerator": "(As Generator)", - "create.tooltip.generationSpeed": "Generates at %1$s %2$s", - "create.tooltip.analogStrength": "Analog Strength: %1$s/15", + "create.tooltip.speedRequirement": "Requisitos de velocidad: %1$s", + "create.tooltip.speedRequirement.none": "Ninguno", + "create.tooltip.speedRequirement.medium": "Moderado", + "create.tooltip.speedRequirement.high": "Rápido", + "create.tooltip.stressImpact": "Impacto del estrés: %1$s", + "create.tooltip.stressImpact.low": "Bajo", + "create.tooltip.stressImpact.medium": "Moderado", + "create.tooltip.stressImpact.high": "Alto", + "create.tooltip.stressImpact.overstressed": "Sobrecargado", + "create.tooltip.capacityProvided": "Capacidad de estrés: %1$s", + "create.tooltip.capacityProvided.low": "Pequeña", + "create.tooltip.capacityProvided.medium": "Media", + "create.tooltip.capacityProvided.high": "Grande", + "create.tooltip.capacityProvided.asGenerator": "(Como Generador)", + "create.tooltip.generationSpeed": "Genera en %1$s %2$s", + "create.tooltip.analogStrength": "Fuerza analógica: %1$s/15", - "create.mechanical_arm.extract_from": "Take items from %1$s", - "create.mechanical_arm.deposit_to": "Deposit items to %1$s", - "create.mechanical_arm.summary": "Mechanical Arm has %1$s input(s) and %2$s output(s).", - "create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.", + "create.mechanical_arm.extract_from": "Extraer elementos de %1$s", + "create.mechanical_arm.deposit_to": "Depositar elementos en %1$s", + "create.mechanical_arm.summary": "El brazo mecánico tiene %1$s entrada(s) y %2$s salida(s)", + "create.mechanical_arm.points_outside_range": "%1$s punto(s) de interacción seleccionado(s) eliminado(s) debido a las limitaciones de rango", - "create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available", + "create.logistics.when_multiple_outputs_available": "Cuando hay múltiples salidas disponibles", "create.mechanical_arm.selection_mode.round_robin": "Round Robin", - "create.mechanical_arm.selection_mode.forced_round_robin": "Forced Round Robin", - "create.mechanical_arm.selection_mode.prefer_first": "Prefer First Target", + "create.mechanical_arm.selection_mode.forced_round_robin": "Round Robin forzado", + "create.mechanical_arm.selection_mode.prefer_first": "Preferir el primer objetivo": "Preferir el primer objetivo", - "create.tunnel.selection_mode.split": "Split", - "create.tunnel.selection_mode.forced_split": "Forced Split", + "create.tunnel.selection_mode.split": "División", + "create.tunnel.selection_mode.forced_split": "División forzada", "create.tunnel.selection_mode.round_robin": "Round Robin", - "create.tunnel.selection_mode.forced_round_robin": "Forced Round Robin", - "create.tunnel.selection_mode.prefer_nearest": "Prefer Nearest", - "create.tunnel.selection_mode.randomize": "Randomize", - "create.tunnel.selection_mode.synchronize": "Synchronize Inputs", + "create.tunnel.selection_mode.forced_round_robin": "Round Robin forzado": "Round Robin forzado", + "create.tunnel.selection_mode.prefer_nearest": "Preferir el más cercano": "Preferir el más cercano", + "create.tunnel.selection_mode.randomize": "Aleatorio": "Aleatorizar", + "create.tunnel.selection_mode.synchronize": "Sincronizar entradas": "Sincronizar entradas", - "create.tooltip.chute.header": "Chute Information", - "create.tooltip.chute.items_move_down": "Items move Downward", - "create.tooltip.chute.items_move_up": "Items move Upward", - "create.tooltip.chute.no_fans_attached": "No attached fans", - "create.tooltip.chute.fans_push_up": "Fans push from Below", - "create.tooltip.chute.fans_push_down": "Fans push from Above", - "create.tooltip.chute.fans_pull_up": "Fans pull from Above", - "create.tooltip.chute.fans_pull_down": "Fans pull from Below", - "create.tooltip.chute.contains": "Contains: %1$s x%2$s", + "create.tooltip.chute.header": "Información del ducto", + "create.tooltip.chute.items_move_down": "Los elementos se mueven hacia abajo", + "create.tooltip.chute.items_move_up": "Los elementos se mueven hacia arriba", + "create.tooltip.chute.no_fans_attached": "No hay ventiladores adjuntos", + "create.tooltip.chute.fans_push_up": "Los ventiladores empujan desde abajo", + "create.tooltip.chute.fans_push_down": "Los ventiladores empujan desde arriba", + "create.tooltip.chute.fans_pull_up": "Los ventiladores tiran desde arriba", + "create.tooltip.chute.fans_pull_down": "Los ventiladores tiran desde abajo", + "create.tooltip.chute.contains": "Contiene: %1$s x%2$s", - "create.hint.hose_pulley.title": "Bottomless Supply", - "create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", - "create.hint.mechanical_arm_no_targets.title": "No Targets", - "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", - "create.hint.horizontal_funnel.title": "Horizontal Funnels", - "create.hint.horizontal_funnel": "cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", - "create.hint.upward_funnel.title": "Funnels facing upward", - "create.hint.upward_funnel": "can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", - "create.hint.empty_bearing.title": "Update Bearing", - "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", - "create.hint.full_deployer.title": "Deployer Item Overflow", - "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.hint.hose_pulley.title": "Suministro sin fondo", + "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita", + "create.hint.mechanical_arm_no_targets.title": "No hay objetivos", + "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona cinturones, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_." + "create.hint.horizontal_funnel.title": "Embudos horizontales", + "create.hint.horizontal_funnel": "No puede transferir entre inventarios _directamente_. Intenta pasar un _cinturón_ o un _depósito_ por debajo de tu embudo para extraer artículos de los inventarios", + "create.hint.upward_funnel.title": "Embudos hacia arriba", + "create.hint.upward_funnel": "sólo pueden transferir objetos insertados por _brazos_, y _ductos_ impulsados por ventilador, o elementos _lanzados_ hacia ellos. Intenta construir algunos _ductos_ si quieres mover tus objetos _verticalmente_", + "create.hint.empty_bearing.title": "Rodamiento de reloj", + "create.hint.empty_bearing": "_Haz clic con el botón derecho del ratón_ en el rodamiento con la _mano vacía_ para _adherir_ la estructura que acabas de construir delante de él", + "create.hint.full_deployer.title": "Desbordamiento de elementos del desplegador", + "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _elementos_ en exceso que necesitan ser _extraídos._ Usa un _tolva,_embudo_ u otro medio para liberarlo de su desbordamiento." - "create.gui.config.overlay1": "Hi :)", - "create.gui.config.overlay2": "This is a sample overlay", - "create.gui.config.overlay3": "Click or drag with your mouse", - "create.gui.config.overlay4": "to move this preview", - "create.gui.config.overlay5": "Press ESC to exit this screen", - "create.gui.config.overlay6": "and save the new position", - "create.gui.config.overlay7": "Run /create overlay reset", - "create.gui.config.overlay8": "to reset to the default position", + "create.gui.config.overlay1": "Hola :)", + "create.gui.config.overlay2": "Esta es una muestra de la superposición", + "create.gui.config.overlay3": "Haga clic o arrastre con el ratón", + "create.gui.config.overlay4": "para mover esta vista previa", + "create.gui.config.overlay5": "Pulsar ESC para salir de esta pantalla", + "create.gui.config.overlay6": "y guardar la nueva posición", + "create.gui.config.overlay7": "Ejecute /create overlay reset", + "create.gui.config.overlay8": "para restablecer la posición por defecto", "create.command.killTPSCommand": "killtps", - "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Server tick is currently slowed by %s ms :o", - "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Server tick is slowed by %s ms now >:)", - "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Server tick is back to regular speed :D", - "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", - "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.status.slowed_by.0": "[Crear]: El tick del servidor está actualmente ralentizado en %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Crear]: El tick del servidor está ralentizado en %s ms ahora >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: El tick del servidor ha vuelto a su velocidad normal :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: usar /killtps stop para que el servidor vuelva a la velocidad normal", + "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.subtitle.schematicannon_launch_block": "Schematicannon shoots", - "create.subtitle.schematicannon_finish": "Schematicannon finishes", - "create.subtitle.slime_added": "Slime squishes", - "create.subtitle.mechanical_press_activation": "Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "Metal clanks", - "create.subtitle.blockzapper_place": "Blocks zap into place", - "create.subtitle.blockzapper_confirm": "Affirmative Ding", - "create.subtitle.blockzapper_deny": "Declining Boop", - "create.subtitle.block_funnel_eat": "Funnel CHOMPS", - "create.subtitle.blaze_munch": "Blaze munches happily", + "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", + "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", + "create.subtitle.slime_added": "Slime aplastado", + "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", + "create.subtitle.mechanical_press_item_break": "Clanks de metal", + "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", + "create.subtitle.blockzapper_confirm": "Ding afirmativo", + "create.subtitle.blockzapper_deny": "Boop declinante", + "create.subtitle.block_funnel_eat": "CHOMPS del embudo", + "create.subtitle.blaze_munch": "Blaze mastica felizmente", "_": "->------------------------] Item Descriptions [------------------------<-", - "item.create.example_item.tooltip": "EXAMPLE ITEM (just a marker that this tooltip exists)", - "item.create.example_item.tooltip.summary": "A brief description of the item. _Underscores_ highlight a term.", - "item.create.example_item.tooltip.condition1": "When this", - "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", - "item.create.example_item.tooltip.condition2": "And When this", - "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", - "item.create.example_item.tooltip.control1": "When Ctrl pressed", - "item.create.example_item.tooltip.action1": "These controls are displayed.", + "item.create.example_item.tooltip": "EJEMPLO DE ITEM (sólo un marcador de que este tooltip existe)", + "item.create.example_item.tooltip.summary": "Una breve descripción del elemento. Los puntajes bajos resaltan un término", + "item.create.example_item.tooltip.condition1": "Cuando este", + "item.create.example_item.tooltip.behaviour1": "Entonces este elemento hace esto. (los comportamientos se muestran en el turno)", + "item.create.example_item.tooltip.condition2": "Y cuando esto", + "item.create.example_item.tooltip.behaviour2": "Puedes añadir tantos comportamientos como quieras", + "item.create.example_item.tooltip.control1": "Cuando se pulsa Ctrl", + "item.create.example_item.tooltip.action1": "Se muestran estos controles", - "block.create.andesite_encased_shaft.tooltip": "ANDESITE ENCASED SHAFT", - "block.create.andesite_encased_shaft.tooltip.summary": "_Creative only_ item. Encase shafts _in-world_ using _Andesite Casing_. Casing blocks will not be consumed.", + "block.create.andesite_encased_shaft.tooltip": "EJE REVESTIDO DE ANDESITA", + "block.create.andesite_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de andesita_. Los bloques de revestimiento _no se consumirán_.", - "block.create.brass_encased_shaft.tooltip": "BRASS ENCASED SHAFT", - "block.create.brass_encased_shaft.tooltip.summary": "_Creative only_ item. Encase shafts _in-world_ using _Brass Casing_. Casing blocks will not be consumed.", + "block.create.brass_encased_shaft.tooltip": "EJE REVESTIDO DE BRONCE", + "block.create.brass_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de bronce_. Los bloques de revestimiento _no se consumirán_.", - "block.create.wooden_bracket.tooltip": "WOODEN BRACKET", - "block.create.wooden_bracket.tooltip.summary": "_Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with a cozy and wooden bit of reinforcement.", + "block.create.wooden_bracket.tooltip": "SOPORTE DE MADERA PARA EJES", + "block.create.wooden_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un refuerzo acogedor y de madera.", - "block.create.metal_bracket.tooltip": "METAL BRACKET", - "block.create.metal_bracket.tooltip.summary": "_Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with an industrial and sturdy bit of reinforcement.", + "block.create.metal_bracket.tooltip": "SOPORTE DE METAL PARA EJES", + "block.create.metal_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un poco de refuerzo industrial robusto.", - "block.create.andesite_casing.tooltip": "ANDESITE CASING", - "block.create.andesite_casing.tooltip.summary": "Simple machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._", + "block.create.andesite_casing.tooltip": "REVESTIDORA DE ANDESITA", + "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _encastrar ejes_ y _cinturones mecánicos._", - "block.create.andesite_funnel.tooltip": "ANDESITE FUNNEL", - "block.create.andesite_funnel.tooltip.summary": "A general item transfer component, transitioning items between means of transportation. Can be controlled with a _redstone signal_.", - "block.create.andesite_funnel.tooltip.condition1": "General Behaviour", - "block.create.andesite_funnel.tooltip.behaviour1": "The _open face_ will _collect ground items_ in the block space in front of it and _insert_ them into any container on the opposite side of the funnel.", - "block.create.andesite_funnel.tooltip.condition2": "When mounted on belts, depots and similar", - "block.create.andesite_funnel.tooltip.behaviour2": "_Collects_ or _Places_ items onto the mounted component, from or to the _inventory behind_ itself. Whenever the funnel has specific directionality, it can be reversed using a Wrench.", - "block.create.andesite_funnel.tooltip.condition3": "When vertically between two inventories", - "block.create.andesite_funnel.tooltip.behaviour3": "Will _transfer_ items _downward_, much like a buffer-less hopper.", + "block.create.andesite_funnel.tooltip": "EMBUDO DE ANDESITA", + "block.create.andesite_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_.", + "block.create.andesite_funnel.tooltip.condition1": "Comportamiento general", + "block.create.andesite_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo", + "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en cinturones, depósitos y similares", + "block.create.andesite_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave.", + "block.create.andesite_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", + "block.create.andesite_funnel.tooltip.behaviour3": "Transferirá los artículos hacia abajo, como una tolva sin búfer.", - "block.create.andesite_tunnel.tooltip": "ANDESITE TUNNEL", - "block.create.andesite_tunnel.tooltip.summary": "A protective cover for your _Mechanical_ _Belts!_ _Andesite Tunnels_ can split off one item from a stack when another belt or depot is placed at the side of the main belt.", - "block.create.andesite_tunnel.tooltip.control1": "R-Click with Wrench on Side", - "block.create.andesite_tunnel.tooltip.action1": "_Adjusts window shutters_ if the tunnel has a window on that face.", + "block.create.andesite_tunnel.tooltip": "TÚNEL DE ANDESITA", + "block.create.andesite_tunnel.tooltip.summary": "Una cubierta protectora para sus _Cinturones Mecánicos_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otro cinturón o depósito al lado del cinturón principal.", + "block.create.andesite_tunnel.tooltip.control1": "Click derecho con la Llave Inglesa en el lateral", + "block.create.andesite_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", - "block.create.brass_funnel.tooltip": "BRASS FUNNEL", - "block.create.brass_funnel.tooltip.summary": "A general item transfer component, transitioning items between means of transportation. Can be controlled with a _redstone signal_. Comes with a handy _filter_.", - "block.create.brass_funnel.tooltip.condition1": "General Behaviour", - "block.create.brass_funnel.tooltip.behaviour1": "The _open face_ will _collect ground items_ in the block space in front of it and _insert_ them into any container on the opposite side of the funnel.", - "block.create.brass_funnel.tooltip.condition2": "When mounted on belts, depots and similar", - "block.create.brass_funnel.tooltip.behaviour2": "_Collects_ or _Places_ items onto the mounted component, from or to the _inventory behind_ itself. Whenever the funnel has specific directionality, it can be reversed using a Wrench.", - "block.create.brass_funnel.tooltip.condition3": "When vertically between two inventories", - "block.create.brass_funnel.tooltip.behaviour3": "Will _transfer_ items _downward_, much like a buffer-less hopper.", + "block.create.brass_funnel.tooltip": "EMBUDO DE BRONCE", + "block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_. Viene con un práctico _filtro_.", + "block.create.brass_funnel.tooltip.condition1": "Comportamiento General", + "block.create.brass_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo.", + "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en cinturones, depósitos y similares", + "block.create.brass_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave Inglesa.", + "block.create.brass_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", + "block.create.brass_funnel.tooltip.behaviour3": "Transfiere los artículos hacia abajo, como una tolva sin búfer.", - "block.create.brass_tunnel.tooltip": "BRASS TUNNEL", - "block.create.brass_tunnel.tooltip.summary": "A fancy protective cover for your _Mechanical_ _Belts!_ _Brass Tunnels_ also come with a number of _Filtering_ and _Splitting_ options for your items.", - "block.create.brass_tunnel.tooltip.condition1": "When placed side by side", - "block.create.brass_tunnel.tooltip.behaviour1": "_Brass Tunnels_ connect to each other allowing for content from one _Belt_ to be redirected to another.", - "block.create.brass_tunnel.tooltip.condition2": "Filtering", - "block.create.brass_tunnel.tooltip.behaviour2": "_Brass Tunnels_ come with filters for both _Input_ and _Output_. If an _Item_ isn't permitted from the filtered output of a _Tunnel_ it will be transferred to the output of a connected _Tunnel_.", - "block.create.brass_tunnel.tooltip.condition3": "Splitting", - "block.create.brass_tunnel.tooltip.behaviour3": "_Brass Tunnels_ can be configured to change the method in which _Items_ are sorted onto connected _Belts_.", - "block.create.brass_tunnel.tooltip.control1": "R-Click with Wrench on Side", - "block.create.brass_tunnel.tooltip.action1": "_Adjusts window shutters_ if the tunnel has a window on that face.", - "block.create.brass_tunnel.tooltip.control2": "Scroll with Wrench on Top", - "block.create.brass_tunnel.tooltip.action2": "Change the splitting method of connected _Tunnels_.", + "block.create.brass_tunnel.tooltip": "TÚNEL DE BRONCE", + "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _Cinturones mecánicos_. Los _Túneles de bronce_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", + "block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro", + "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de bronce se conectan entre sí y permiten redirigir el contenido de un cinturón a otro.", + "block.create.brass_tunnel.tooltip.condition2": "Filtrado", + "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles de bronces_ vienen con filtros tanto para la _Entrada_ como para la _Salida_. Si un _Elemento_ no está permitido desde la salida filtrada de un _Túnel_ será transferido a la salida de un _Túnel_ conectado.", + "block.create.brass_tunnel.tooltip.condition3": "Dividiendo", + "block.create.brass_tunnel.tooltip.behaviour3": "Los _Túneles de bronce_ pueden ser configurados para cambiar el método en el que los _Elementos_ son ordenados en los _Túneles_ conectados.", + "block.create.brass_tunnel.tooltip.control1": "Cuando haces click derecho con una Llave Inglesa", + "block.create.brass_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", + "block.create.brass_tunnel.tooltip.control2": "Scroll con Llave Inglesa en la parte superior", + "block.create.brass_tunnel.tooltip.action2": "Cambiar el método de división de los _Túneles_ conectados.", - "block.create.copper_casing.tooltip": "COPPER CASING", - "block.create.copper_casing.tooltip.summary": "Robust machine casing with a variety of uses. Safe for decoration.", - "block.create.copper_casing.tooltip.condition1": "When used on Fluid Pipe", - "block.create.copper_casing.tooltip.behaviour1": "_Encases_ the _Fluid Pipe_ with the _Copper Casing_. Encased Fluid pipes will _lock their connections_ in place, no longer reacting to changes to neighbouring pipes.", + "block.create.copper_casing.tooltip": "REVESTIDORA DE COBRE", + "block.create.copper_casing.tooltip.summary": "Robusta máquina de revestimientos con una gran variedad de usos. Seguro para la decoración.", + "block.create.copper_casing.tooltip.condition1": "Cuando se utiliza en una tubería de fluídos", + "block.create.copper_casing.tooltip.behaviour1": "_Reviste_ la _Tubería de fluídos_ con _Revestimiento de cobre_. Las tuberías de fluídos revestidas _bloquean sus conexiones_ en su lugar, dejando de reaccionar a los cambios en las tuberías vecinas.", - "block.create.encased_fluid_pipe.tooltip": "ENCASED FLUID PIPE", - "block.create.encased_fluid_pipe.tooltip.summary": "A _Fluid Pipe_ encased with the _Copper Casing_.", + "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUÍDOS REVESTIDO", + "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluídos revestido con cobre.", - "block.create.copper_valve_handle.tooltip": "COPPER VALVE HANDLE", - "block.create.copper_valve_handle.tooltip.summary": "A precise _source_ of _Rotational Force_ that requires the interaction of players. Be careful not to wear yourself out!", - "block.create.copper_valve_handle.tooltip.condition1": "When Used", - "block.create.copper_valve_handle.tooltip.behaviour1": "Provides _Rotational Force_ to an attached contraption. _Sneak to reverse_ the rotation.", + "block.create.copper_valve_handle.tooltip": "ASA DE VÁLVULA DE COBRE", + "block.create.copper_valve_handle.tooltip.summary": "Una precisa _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. ¡Ten cuidado de no agotarte!", + "block.create.copper_valve_handle.tooltip.condition1": "Cuando se utiliza", + "block.create.copper_valve_handle.tooltip.behaviour1": "Proporciona _Fuerza de rotación_ a un artilugio acoplado. _Shift_ para _invertir_ la rotación.", - "block.create.seat.tooltip": "SEAT", - "block.create.seat.tooltip.summary": "Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", - "block.create.seat.tooltip.condition1": "Right click on Seat", - "block.create.seat.tooltip.behaviour1": "Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.seat.tooltip": "ASIENTO", + "block.create.seat.tooltip.summary": "¡Siéntate y disfruta del viaje! Anclará a un jugador en un _contrafuerte_ en movimiento. También es ideal para los muebles estáticos. Viene en una variedad de colores.", + "block.create.seat.tooltip.condition1": "Click derecho en el asiento", + "block.create.seat.tooltip.behaviour1": "Sienta al jugador en el _Asiento_. Pulsa shift izquierdo para dejar el _Asiento_.", - "block.create.chute.tooltip": "CHUTE", - "block.create.chute.tooltip.summary": "_Collect_ and transport items vertically or diagonally. Can both take and place items into _item containers_. You can also interact with chutes from the side using _hoppers_ or _mounted funnels_.", - "block.create.chute.tooltip.condition1": "When powered by a fan", - "block.create.chute.tooltip.behaviour1": "_Fan_ powered chutes can convey _Items_ upwards, and suck _items_ off of _Depots_ and _Belts_.", + "block.create.chute.tooltip": "DUCTO", + "block.create.chute.tooltip.summary": "_Recoge_ y _Transporta_ elementos en vertical o en diagonal. Puede tanto coger como colocar objetos en _contenedores de objetos_. También puede interactuar con los ductos desde el lateral utilizando _tolvas_ o _embudos montados_.", + "block.create.chute.tooltip.condition1": "Cuando se alimenta con un ventilador", + "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de los _cinturones_.", - "block.create.depot.tooltip": "DEPOT", - "block.create.depot.tooltip.summary": "A handy location to place your _Items_. Provides an interaction point for several machines", - "block.create.depot.tooltip.condition1": "Right Click on Depot", - "block.create.depot.tooltip.behaviour1": "Places or takes an _Item_ from the _Depot_. _Blocks_ and _Contraptions_ that would interact with a _Belt_ also work on a _Depot_.", + "block.create.depot.tooltip": "DEPÓSITO", + "block.create.depot.tooltip.summary": "Un lugar práctico para colocar sus _elementos_. Proporciona un punto de interacción para varias máquinas", + "block.create.depot.tooltip.condition1": "Click derecho en el depósito", + "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con un _Cinturón_ también funcionan en un _Depósito_.", - "item.create.blaze_cake.tooltip": "BLAZE CAKE", - "item.create.blaze_cake.tooltip.summary": "A Delicious treat for your hard-working _Blaze Burners_. Gets them all fired up!", + "item.create.blaze_cake.tooltip": "TORTA DE BLAZE", + "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _Quemadores de blaze_. Los pone en marcha!.", - "item.create.empty_blaze_burner.tooltip": "EMPTY BLAZE BURNER", - "item.create.empty_blaze_burner.tooltip.summary": "A little iron home for your fiery friends. I'm sure you could put them to good use.", - "item.create.empty_blaze_burner.tooltip.condition1": "When used on a Blaze or Blaze spawner", - "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captures_ a Blaze in the item", + "item.create.empty_blaze_burner.tooltip": "QUEMADOR DE BLAZE VACÍO", + "item.create.empty_blaze_burner.tooltip.summary": "Un pequeño hogar de hierro para tus amigos fogosos. Estoy seguro de que podrías darles un buen uso.", + "item.create.empty_blaze_burner.tooltip.condition1": "Cuando se utiliza en un Blaze o en un generador de Blaze", + "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captura_ un Blaze en el elemento", - "block.create.fluid_pipe.tooltip": "FLUID PIPE", - "block.create.fluid_pipe.tooltip.summary": "Used for moving _fluids_ around. Needs a _Mechanical Pump_ to get the _fluid_ moving.", - "block.create.fluid_pipe.tooltip.condition1": "Fluid Transfer", - "block.create.fluid_pipe.tooltip.behaviour1": "Can connect to _fluid containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", - "block.create.fluid_pipe.tooltip.control1": "Right-clicked with Wrench", - "block.create.fluid_pipe.tooltip.action1": "Places a window on the pipe if available", + "block.create.fluid_pipe.tooltip": "TUBERÍA DE FLUÍDOS DE COBRE", + "block.create.fluid_pipe.tooltip.summary": "Se utiliza para mover _fluidos_. Necesita una _bomba mecánica_ para que el _fluído_ se mueva.", + "block.create.fluid_pipe.tooltip.condition1": "Transferencia de fluidos", + "block.create.fluid_pipe.tooltip.behaviour1": "Puede conectarse a _contenedores de fluidos_ como _depósitos_ o _cuencas_. Los extremos expuestos de los _tubos_ también pueden drenar o colocar bloques de fluido. ¡Cuidado con las fugas!", + "block.create.fluid_pipe.tooltip.control1": "Cuando haces clic derecho con una Llave Inglesa", + "block.create.fluid_pipe.tooltip.action1": "Coloca una ventana en la tubería si está disponible", - "block.create.hose_pulley.tooltip": "HOSE PULLEY", - "block.create.hose_pulley.tooltip.summary": "Used for _placing_ or _draining_ large _fluid bodies_ in the world.", - "block.create.hose_pulley.tooltip.condition1": "When Powered by Kinetics", - "block.create.hose_pulley.tooltip.behaviour1": "_Raises_ or _Lowers_ the hose, location of the hose determines up to which _height extraction_ or _filling_ will act.", - "block.create.hose_pulley.tooltip.condition2": "When Fluids pulled from Pulley", - "block.create.hose_pulley.tooltip.behaviour2": "Starts _taking fluid_ blocks from the body the hose end was lowered into. Very _large bodies_ of fluids will be _considered infinite_.", - "block.create.hose_pulley.tooltip.condition3": "When Fluids pushed to Pulley", - "block.create.hose_pulley.tooltip.behaviour3": "Starts _filling fluid_ into the world _up to_ the _hose_ ends' _height_.", + "block.create.hose_pulley.tooltip": "POLEA DE MANGUERA", + "block.create.hose_pulley.tooltip.summary": "Se utiliza para _colocar_ o _drenar_ grandes _cuerpos fluidos_ en el mundo", + "block.create.hose_pulley.tooltip.condition1": "Cuando se alimenta por cinética", + "block.create.hose_pulley.tooltip.behaviour1": "_Sube_ o _baja_ la manguera, la ubicación de la manguera determina hasta qué _altura de extracción_ o _llenado_ actuará.", + "block.create.hose_pulley.tooltip.condition2": "Cuando los fluidos se extraen de la polea", + "block.create.hose_pulley.tooltip.behaviour2": "Comienza a _tomar bloques de fluidos_ del cuerpo al que se bajó el extremo de la manguera. Los cuerpos muy _grandes_ de fluidos se _considerarán infinitos_.", + "block.create.hose_pulley.tooltip.condition3": "Cuando los fluidos son empujados a la polea", + "block.create.hose_pulley.tooltip.behaviour3": "Comienza a _llenar de fluido_ el mundo hasta la _altura_ de los extremos de la _manguera_", - "block.create.fluid_tank.tooltip": "FLUID TANK", - "block.create.fluid_tank.tooltip.summary": "_Stores_ all your favourite _fluids_. Scales in width and height.", - "block.create.fluid_tank.tooltip.condition1": "Right-clicked with Wrench", - "block.create.fluid_tank.tooltip.behaviour1": "Changes the optional window", + "block.create.fluid_tank.tooltip": "TANQUE DE FLUÍDOS", + "block.create.fluid_tank.tooltip.summary": "Almacena todos tus _líquidos_ favoritos. Escala en anchura y altura.", + "block.create.fluid_tank.tooltip.condition1": "Cuando se hace click derecho con la Llave Inglesa", + "block.create.fluid_tank.tooltip.behaviour1": "Cambia la ventana opcional", - "block.create.creative_fluid_tank.tooltip": "CREATIVE FLUID TANK", - "block.create.creative_fluid_tank.tooltip.summary": "This _Fluid Tank_ allows infinite replication of any Fluid. Scales in width and height.", - "block.create.creative_fluid_tank.tooltip.condition1": "When Fluid in Tank", - "block.create.creative_fluid_tank.tooltip.behaviour1": "Anything _extracting_ from this tank will provide an _endless supply_ of the fluid specified. Fluids _inserted_ into this tank will be _voided._", - "block.create.creative_fluid_tank.tooltip.condition2": "Right-clicked with Wrench", - "block.create.creative_fluid_tank.tooltip.behaviour2": "Changes the optional window", + "block.create.creative_fluid_tank.tooltip": "TANQUE DE FLUÍDOS CREATIVO", + "block.create.creative_fluid_tank.tooltip.summary": "Este _Tanque de Fluídos_ permite la replicación infinita de cualquier Fluido. Escala en anchura y altura.", + "block.create.creative_fluid_tank.tooltip.condition1": "Cuando hay fluido en el tanque", + "block.create.creative_fluid_tank.tooltip.behaviour1": "Todo lo que se _extraiga_ de este tanque proporcionará un _suministro ilimitado_ del fluido especificado. Los fluidos _insertados_ en este tanque serán _evitados._", + "block.create.creative_fluid_tank.tooltip.condition2": "Cuando se hace clic derecho con una Llave Inglesa", + "block.create.creative_fluid_tank.tooltip.behaviour2": "Cambia la ventana opcional", - "block.create.fluid_valve.tooltip": "FLUID VALVE", - "block.create.fluid_valve.tooltip.summary": "Halts the flow of fluid down a pipe.", - "block.create.fluid_valve.tooltip.condition1": "Controllable flow", - "block.create.fluid_valve.tooltip.behaviour1": "Applied _rotational force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational force_ to re-open the valve.", + "block.create.fluid_valve.tooltip": "VALVULA DE FLUÍDOS", + "block.create.fluid_valve.tooltip.summary": "Detiene el flujo de un fluido por una tubería", + "block.create.fluid_valve.tooltip.condition1": "Flujo controlable", + "block.create.fluid_valve.tooltip.behaviour1": "La _fuerza de rotación_ aplicada obligará a la _válvula_ a cerrarse, cesando el flujo de _fluidos_. Invierta la dirección de la _fuerza de rotación_ para volver a abrir la válvula", - "block.create.mechanical_pump.tooltip": "MECHANICAL PUMP", - "block.create.mechanical_pump.tooltip.summary": "Takes _rotational force_ and uses it to move _fluid_ along a _pipe_. Has a maximum range of effect in both directions. (16 blocks by default)", - "block.create.mechanical_pump.tooltip.condition1": "Fluid Flow", - "block.create.mechanical_pump.tooltip.behaviour1": "Applied _rotational force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational force_ to switch the direction that the _fluid_ flows.", - "block.create.mechanical_pump.tooltip.control1": "Right-clicked with Wrench", - "block.create.mechanical_pump.tooltip.action1": "Reverses the direction of the _pump_, switching the default direction of the flow", + "block.create.mechanical_pump.tooltip": "BOMBA MECÁNICA", + "block.create.mechanical_pump.tooltip.summary": "Toma la _fuerza de rotación_ y la utiliza para mover el _fluído_ a lo largo de un _tubo_. Tiene un rango máximo de efecto en ambas direcciones. (16 bloques por defecto)", + "block.create.mechanical_pump.tooltip.condition1": "Flujo de fluido", + "block.create.mechanical_pump.tooltip.behaviour1": "La _fuerza de rotación_ aplicada crea una presión que obliga al _fluido_ a pasar por la red de _tuberías_. Invierte la dirección de la _fuerza de rotación_ para cambiar la dirección en la que fluye el _fluido_", + "block.create.mechanical_pump.tooltip.control1": "Pulsando con el botón derecho del ratón con la Llave Inglesa", + "block.create.mechanical_pump.tooltip.action1": "Invierte la dirección de la _bomba_, cambiando la dirección por defecto del flujo", - "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", - "block.create.smart_fluid_pipe.tooltip.summary": "A _fluid pipe_ with a filter. Can specify which _fluids_ pass through.", - "block.create.smart_fluid_pipe.tooltip.condition1": "When Fluids are pushed into it", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "Smart pipes receiving fluid that does not match its filter will block the flow.", - "block.create.smart_fluid_pipe.tooltip.condition2": "When adjacent to fluid container", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "Smart pipes _starting_ a _flow_ from any container will only extract fluids that _match_ its _filter._", + "block.create.smart_fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS INTELIGENTE", + "block.create.smart_fluid_pipe.tooltip.summary": "Una _tubería de fluidos_ con un filtro. Puede especificar qué _fluídos_ pasan por ella", + "block.create.smart_fluid_pipe.tooltip.condition1": "Cuando se introducen fluídos en ella", + "block.create.smart_fluid_pipe.tooltip.behaviour1": "Las tuberías inteligentes que reciban fluidos que no coincidan con su filtro bloquearán el flujo", + "block.create.smart_fluid_pipe.tooltip.condition2": "Cuando es adyacente a un contenedor de fluido", + "block.create.smart_fluid_pipe.tooltip.behaviour2": "Las tuberías inteligentes que _inicien_ un _flujo_ desde cualquier contenedor sólo extraerán fluidos que _coincidan_ con su _filtro._", - "block.create.spout.tooltip": "SPOUT", - "block.create.spout.tooltip.summary": "An injector for refilling your _fluid items._", - "block.create.spout.tooltip.condition1": "Fluid Transfer", - "block.create.spout.tooltip.behaviour1": "When a _fluid container item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", - "block.create.spout.tooltip.condition2": "Fluid Automation", - "block.create.spout.tooltip.behaviour2": "The spout placed above a _belt_ or _depot_ will react automatically with a _fluid container item_ that passes beneath it.", + "block.create.spout.tooltip": "SURTIDOR", + "block.create.spout.tooltip.summary": "Un inyector para rellenar tus elementos de _fluidos._", + "block.create.spout.tooltip.condition1": "Transferencia de fluidos", + "block.create.spout.tooltip.behaviour1": "Cuando se coloca un _contenedor de fluidos_ como un _cubo_ o una _botella_ debajo, el caño intentará rellenarlo con su propio _fluido_ almacenado", + "block.create.spout.tooltip.condition2": "Automatización de fluídos", + "block.create.spout.tooltip.behaviour2": "El caño colocado encima de un _cinturón_ o _depósito_ reaccionará automáticamente con un contenedor de fluídos_ que pase por debajo", - "block.create.item_drain.tooltip": "ITEM DRAIN", - "block.create.item_drain.tooltip.summary": "A grated depot for emptying your _fluid items._", - "block.create.item_drain.tooltip.condition1": "Fluid Transfer", - "block.create.item_drain.tooltip.behaviour1": "When a _fluid container item_ such as a _bucket_ or _bottle_ is inserted from the side, the drain will attempt to empty it into its own _fluid container_. The item will then be ejected on the opposite side.", + "block.create.item_drain.tooltip": "DRENADOR DE ELEMENTOS", + "block.create.item_drain.tooltip.summary": "Un depósito rallado para vaciar tus _artículos fluidos._", + "block.create.item_drain.tooltip.condition1": "Transferencia de fluidos", + "block.create.item_drain.tooltip.behaviour1": "Cuando un _contenedor de fluidos_, como un _cubo_ o una _botella_, se inserta desde el lateral, el desagüe intentará vaciarlo en su propio _contenedor de fluidos_. El artículo será entonces expulsado por el lado opuesto", - "block.create.mechanical_arm.tooltip": "MECHANICAL ARM", - "block.create.mechanical_arm.tooltip.summary": "Advanced contraption for re-locating _items_.", - "block.create.mechanical_arm.tooltip.condition1": "Item Transfer", - "block.create.mechanical_arm.tooltip.behaviour1": "Can take or place items into any _accessible inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical Crafters_.", - "block.create.mechanical_arm.tooltip.control1": "While in Hand", - "block.create.mechanical_arm.tooltip.action1": "Right-Click an _accessible item inventory_ to set it as a _source_ for the _Mechanical Arm_. Right-click twice to set it as the _destination_.", - "block.create.mechanical_arm.tooltip.control2": "Scroll with Wrench", - "block.create.mechanical_arm.tooltip.action2": "Sets the ordering behaviour for _items_ output by the _mechanical Arm_.", + "block.create.mechanical_arm.tooltip": "BRAZO MECÁNICO", + "block.create.mechanical_arm.tooltip.summary": "Artilugio avanzado para reubicar _elementos_", + "block.create.mechanical_arm.tooltip.condition1": "Transferencia de elementos", + "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Cinturones_, _Depósitos_, _Embudos_ y _Mecanizadores_", + "block.create.mechanical_arm.tooltip.control1": "Mientras está en la mano", + "block.create.mechanical_arm.tooltip.action1": "Haz clic con el botón derecho en un _objeto accesible del inventario_ para establecerlo como _fuente_ para el _brazo mecánico_. Haz clic con el botón derecho del ratón dos veces para establecerlo como _destino_", + "block.create.mechanical_arm.tooltip.control2": "Scroll con Llave Inglesa", + "block.create.mechanical_arm.tooltip.action2": "Establece el comportamiento de orden de los _items_ emitidos por el _brazo mecánico_", - "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", - "item.create.wand_of_symmetry.tooltip.summary": "Perfectly mirrors Block placement across configured planes.", - "item.create.wand_of_symmetry.tooltip.condition1": "When in Hotbar", - "item.create.wand_of_symmetry.tooltip.behaviour1": "Stays Active", - "item.create.wand_of_symmetry.tooltip.control1": "R-Click on Ground", - "item.create.wand_of_symmetry.tooltip.action1": "_Creates_ or _Moves_ the Mirror", - "item.create.wand_of_symmetry.tooltip.control2": "R-Click in the Air", - "item.create.wand_of_symmetry.tooltip.action2": "_Removes_ the active Mirror", - "item.create.wand_of_symmetry.tooltip.control3": "R-Click while Sneaking", - "item.create.wand_of_symmetry.tooltip.action3": "Opens the _Configuration Interface_", + "item.create.wand_of_symmetry.tooltip": "VARITA DE SIMETRÍA", + "item.create.wand_of_symmetry.tooltip.summary": "Refleja perfectamente la colocación de bloques en los planos configurados", + "item.create.wand_of_symmetry.tooltip.condition1": "Mientras está en el inventario rápido", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Permanece activo", + "item.create.wand_of_symmetry.tooltip.control1": "Click derecho en el suelo", + "item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _Mueve_ el Espejo", + "item.create.wand_of_symmetry.tooltip.control2": "Click derecho en el aire", + "item.create.wand_of_symmetry.tooltip.action2": "_Quita_ el Espejo activo", + "item.create.wand_of_symmetry.tooltip.control3": "Click derecho mientras se agacha", + "item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz de Configuración_", "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Novel gadget for placing or exchanging blocks at a distance.", - "item.create.handheld_blockzapper.tooltip.control1": "L-Click at Block", - "item.create.handheld_blockzapper.tooltip.action1": "Sets blocks placed by the tool to the targeted block.", - "item.create.handheld_blockzapper.tooltip.control2": "R-Click at Block", - "item.create.handheld_blockzapper.tooltip.action2": "_Places_ or _Replaces_ the targeted block.", - "item.create.handheld_blockzapper.tooltip.control3": "R-Click while Sneaking", - "item.create.handheld_blockzapper.tooltip.action3": "Opens the _Configuration Interface_.", + "item.create.handheld_blockzapper.tooltip.summary": "Novedoso gadget para colocar o intercambiar bloques a distancia", + "item.create.handheld_blockzapper.tooltip.control1": "Click izquierdo en un bloque", + "item.create.handheld_blockzapper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", + "item.create.handheld_blockzapper.tooltip.control2": "Click derecho en un bloque", + "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ o _Reemplaza_ el bloque objetivo", + "item.create.handheld_blockzapper.tooltip.control3": "Click derecho mientras se agacha", + "item.create.handheld_blockzapper.tooltip.action3": "Abre la _Interfaz de Configuración_", - "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", - "item.create.handheld_worldshaper.tooltip.summary": "Handy tool for creating _landscapes_ and _terrain features_.", - "item.create.handheld_worldshaper.tooltip.control1": "L-Click at Block", - "item.create.handheld_worldshaper.tooltip.action1": "Sets blocks placed by the tool to the targeted block.", - "item.create.handheld_worldshaper.tooltip.control2": "R-Click at Block", - "item.create.handheld_worldshaper.tooltip.action2": "Applies the currently selected _Brush_ and _Tool_ at the targeted location.", - "item.create.handheld_worldshaper.tooltip.control3": "R-Click while Sneaking", - "item.create.handheld_worldshaper.tooltip.action3": "Opens the _Configuration Interface_", + "item.create.handheld_worldshaper.tooltip": "WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "Práctica herramienta para crear _paisajes_ y _características del terreno_", + "item.create.handheld_worldshaper.tooltip.control1": "Click izquierdo en un bloque", + "item.create.handheld_worldshaper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", + "item.create.handheld_worldshaper.tooltip.control2": "Click derecho en un bloque", + "item.create.handheld_worldshaper.tooltip.action2": "Aplica el _pincel_ y la _herramienta_ actualmente seleccionadas en el lugar deseado.", + "item.create.handheld_worldshaper.tooltip.control3": "Click derecho mientras se agacha", + "item.create.handheld_worldshaper.tooltip.action3": "Abre la _Interfaz de Configuración_", - "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", - "item.create.tree_fertilizer.tooltip.summary": "A powerful combination of minerals suitable for speeding up the growth of common tree types.", - "item.create.tree_fertilizer.tooltip.condition1": "When used on a Sapling", - "item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees _regardless_ of their _spacing conditions_", + "item.create.tree_fertilizer.tooltip": "FERTILIZANTE PARA ÁRBOLES", + "item.create.tree_fertilizer.tooltip.summary": "Una potente combinación de minerales adecuada para acelerar el crecimiento de los tipos de árboles más comunes", + "item.create.tree_fertilizer.tooltip.condition1": "Cuando se utiliza en un árbol joven", + "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles _independientemente_ de sus condiciones de _espacio_", "item.create.deforester.tooltip": "DEFORESTER", - "item.create.deforester.tooltip.summary": "A _radiant axe_ able to chop down trees in a split second.", + "item.create.deforester.tooltip.summary": "Un hacha _radiante_ capaz de talar árboles en una fracción de segundo", - "item.create.extendo_grip.tooltip": "EXTENDO GRIP", - "item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder.", - "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", - "item.create.extendo_grip.tooltip.behaviour1": "Increases _reach distance_ of items used in the _Main-Hand_.", + "item.create.extendo_grip.tooltip": "AGARRE EXTENDIDO", + "item.create.extendo_grip.tooltip.summary": "¡Boioioing! Aumenta enormemente la _distancia de alcance_ del portador", + "item.create.extendo_grip.tooltip.condition1": "Cuando está fuera de la mano", + "item.create.extendo_grip.tooltip.behaviour1": "Aumenta la _distancia de alcance_ de los objetos usados en la _mano principal_", - "item.create.filter.tooltip": "FILTER", - "item.create.filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", - "item.create.filter.tooltip.condition1": "When in filter slot", - "item.create.filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", - "item.create.filter.tooltip.condition2": "When R-Clicked", - "item.create.filter.tooltip.behaviour2": "Opens the _configuration interface_.", + "item.create.filter.tooltip": "FILTRO", + "item.create.filter.tooltip.summary": "Controla las salidas_ y _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de elementos_ o varios _filtros anidados_", + "item.create.filter.tooltip.condition1": "Cuando está en la ranura del filtro", + "item.create.filter.tooltip.behaviour1": "Controla_ el flujo del elemento según su _configuración_", + "item.create.filter.tooltip.condition2": "Cuando se hace clic derecho", + "item.create.filter.tooltip.behaviour2": "Abre la interfaz de _configuración_", - "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", - "item.create.attribute_filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of_ item _attributes_ and _categories_.", - "item.create.attribute_filter.tooltip.condition1": "When in filter slot", - "item.create.attribute_filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", - "item.create.attribute_filter.tooltip.condition2": "When R-Clicked", - "item.create.attribute_filter.tooltip.behaviour2": "Opens the _configuration interface_.", + "item.create.attribute_filter.tooltip": "FILTRO DE ATRIBUTOS", + "item.create.attribute_filter.tooltip.summary": "Controla las salidas_ y las _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de _atributos_ y _categorías_ de artículos", + "item.create.attribute_filter.tooltip.condition1": "Cuando está en la ranura del filtro", + "item.create.attribute_filter.tooltip.behaviour1": "Controla el flujo del elemento según su _configuración_", + "item.create.attribute_filter.tooltip.condition2": "Cuando se hace clic derecho", + "item.create.attribute_filter.tooltip.behaviour2": "Abre la interfaz de _configuración_", - "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", - "item.create.empty_schematic.tooltip.summary": "Used as a recipe ingredient and for writing at the _Schematic Table_.", + "item.create.empty_schematic.tooltip": "ESQUEMA VACÍO", + "item.create.empty_schematic.tooltip.summary": "Se utiliza como ingrediente de las recetas y para escribir en la _tabla de esquemas_", - "item.create.schematic.tooltip": "SCHEMATIC", - "item.create.schematic.tooltip.summary": "Holds a structure to be positioned and placed into the world. Position the Hologram as desired and use a _Schematicannon_ to build it.", - "item.create.schematic.tooltip.condition1": "When Held", - "item.create.schematic.tooltip.behaviour1": "Can be positioned using the Tools on Screen.", - "item.create.schematic.tooltip.control1": "R-Click while Sneaking", - "item.create.schematic.tooltip.action1": "Opens an _Interface_ for entering exact _Coordinates_.", + "item.create.schematic.tooltip": "ESQUEMA", + "item.create.schematic.tooltip.summary": "Contiene una estructura para ser posicionada y colocada en el mundo. Posiciona el holograma como se desee y utiliza un _Esquematicannon_ para construirlo", + "item.create.schematic.tooltip.condition1": "Cuando se mantiene", + "item.create.schematic.tooltip.behaviour1": "Se puede posicionar utilizando las herramientas en pantalla", + "item.create.schematic.tooltip.control1": "Click derecho mientras se agacha", + "item.create.schematic.tooltip.action1": "Abre una _Interfaz_ para introducir las _Coordenadas_ exactas", - "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", - "item.create.schematic_and_quill.tooltip.summary": "Used for saving a Structure in your world to a .nbt file.", - "item.create.schematic_and_quill.tooltip.condition1": "Step 1", - "item.create.schematic_and_quill.tooltip.behaviour1": "Select two corner points using R-Click.", - "item.create.schematic_and_quill.tooltip.condition2": "Step 2", - "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ on the faces to adjust the size. R-Click again to Save.", - "item.create.schematic_and_quill.tooltip.control1": "R-Click", - "item.create.schematic_and_quill.tooltip.action1": "Select a corner point / confirm save.", - "item.create.schematic_and_quill.tooltip.control2": "Ctrl Held", - "item.create.schematic_and_quill.tooltip.action2": "Select points in _mid-air_. _Scroll_ to adjust the distance.", - "item.create.schematic_and_quill.tooltip.control3": "R-Click while Sneaking", - "item.create.schematic_and_quill.tooltip.action3": "_Resets_ and removes the selection.", + "item.create.schematic_and_quill.tooltip": "ESQUEMA Y PLUMA", + "item.create.schematic_and_quill.tooltip.summary": "Se utiliza para guardar una estructura de tu mundo en un archivo .nbt", + "item.create.schematic_and_quill.tooltip.condition1": "Paso 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos puntos de esquina usando click derecho", + "item.create.schematic_and_quill.tooltip.condition2": "Paso 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ en las caras para ajustar el tamaño. Click derecho de nuevo para guardar", + "item.create.schematic_and_quill.tooltip.control1": "Click derecho", + "item.create.schematic_and_quill.tooltip.action1": "Seleccionar un punto de esquina / confirmar guardar", + "item.create.schematic_and_quill.tooltip.control2": "Al mantener Ctrl", + "item.create.schematic_and_quill.tooltip.action2": "Seleccionar puntos en _medio del aire_. Scroll para ajustar la distancia", + "item.create.schematic_and_quill.tooltip.control3": "Click derecho mientras se agacha", + "item.create.schematic_and_quill.tooltip.action3": "Reinicia_ y elimina la selección", "block.create.schematicannon.tooltip": "SCHEMATICANNON", "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _Esquema_ desplegado en el Mundo. Utiliza elementos de los inventarios adyacentes y _Pólvora_ como combustible.", "block.create.schematicannon.tooltip.control1": "Cuando se hace clic derecho", - "block.create.schematicannon.tooltip.action1": "Abre la _Interfaz_", - - "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", - "block.create.schematic_table.tooltip.summary": "Writes saved Schematics onto an _Empty Schematic_.", - "block.create.schematic_table.tooltip.condition1": "When given an Empty Schematic", - "block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder.", - - "block.create.shaft.tooltip": "SHAFT", - "block.create.shaft.tooltip.summary": "_Relays Rotation_ in a straight line.", - - "block.create.cogwheel.tooltip": "COGWHEEL", - "block.create.cogwheel.tooltip.summary": "_Relays Rotation_ in a straight line, and to adjacent _Cogwheels_.", - - "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", - "block.create.large_cogwheel.tooltip.summary": "A larger version of the _Cogwheel_, allowing for _change_ in _Rotation Speed_ when connected to its smaller Counterpart.", - - "block.create.encased_shaft.tooltip": "ENCASED SHAFT", - "block.create.encased_shaft.tooltip.summary": "_Relays Rotation_ in a straight line. Suitable for propagating Rotation through Walls.", - - "block.create.gearbox.tooltip": "GEARBOX", - "block.create.gearbox.tooltip.summary": "_Relays Rotation_ in _four directions_ Reverses straight connections.", - - "block.create.gearshift.tooltip": "GEARSHIFT", - "block.create.gearshift.tooltip.summary": "A control to toggle rotation direction for connected shafts.", - "block.create.gearshift.tooltip.condition1": "When Powered", - "block.create.gearshift.tooltip.behaviour1": "_Reverses_ the outgoing rotation.", - - "block.create.clutch.tooltip": "CLUTCH", - "block.create.clutch.tooltip.summary": "A control to engage/disengage rotation for connected shafts.", - "block.create.clutch.tooltip.condition1": "When Powered", - "block.create.clutch.tooltip.behaviour1": "_Stops_ conveying rotation to the other side.", - - "block.create.encased_chain_drive.tooltip": "ENCASED_CHAIN_DRIVE", - "block.create.encased_chain_drive.tooltip.summary": "_Relays Rotation_ in a straight line and to adjacent _Encased Chain Drives_. Chain drives connect in a group when placed next to another on any face without a shaft. Their orientation does not have to match.", - "block.create.encased_chain_drive.tooltip.condition1": "When Connected", - "block.create.encased_chain_drive.tooltip.behaviour1": "Attached Blocks will relay _rotation speed_ and direction of this component.", - - "block.create.adjustable_chain_gearshift.tooltip": "ADJUSTABLE CHAIN GEARSHIFT", - "block.create.adjustable_chain_gearshift.tooltip.summary": "_Relays Rotation_ in a straight line and to adjacent _Encased Chain Drives_. _Analog redstone_ provided to this block will control which size of drive wheel is engaged with attached chain drives.", - "block.create.adjustable_chain_gearshift.tooltip.condition1": "Redstone Control", - "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Without_ a signal, adjacent chain drives will relay the _same speed._ With a _full strength_ signal, adjacent chain drives will relay exactly _twice its speed._ Anything inbetween will give results between 1-2x its speed.", - - "item.create.belt_connector.tooltip": "BELT CONNECTOR", - "item.create.belt_connector.tooltip.summary": "Connects two or more _Shafts_ with a _Mechanical Belt_. Connected shafts will have the exact same rotation speed and direction. The Belt can act as a _Conveyor_ for _Items_ and _Entities_.", - "item.create.belt_connector.tooltip.control1": "R-Clicked on Shaft", - "item.create.belt_connector.tooltip.action1": "Selects the shaft as one pulley of the Belt. Both selected Shafts have to _line up_ either _Vertically_, _Horizontally_, or _Diagonally_ toward the Belt's Direction.", - "item.create.belt_connector.tooltip.control2": "R-Click while Sneaking", - "item.create.belt_connector.tooltip.action2": "_Resets_ the first selected position for the Belt.", - - "item.create.goggles.tooltip": "GOGGLES", - "item.create.goggles.tooltip.summary": "A pair of glasses to augment your vision with useful _kinetic information_.", - "item.create.goggles.tooltip.condition1": "When worn", - "item.create.goggles.tooltip.behaviour1": "Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", - "item.create.goggles.tooltip.condition2": "When looking at gauge", - "item.create.goggles.tooltip.behaviour2": "Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", - - "item.create.wrench.tooltip": "WRENCH", - "item.create.wrench.tooltip.summary": "A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", - "item.create.wrench.tooltip.control1": "Right-Click a kinetic block", - "item.create.wrench.tooltip.action1": "_Rotates components_ toward or away from the face with which you interacted.", - "item.create.wrench.tooltip.control2": "R-Click while Sneaking", - "item.create.wrench.tooltip.action2": "_Disassembles Kinetic components_ and places them back in _your inventory_.", - - "block.create.creative_motor.tooltip": "CREATIVE MOTOR", - "block.create.creative_motor.tooltip.summary": "A configurable source of _Rotational Force_.", - - "block.create.water_wheel.tooltip": "WATER WHEEL", - "block.create.water_wheel.tooltip.summary": "Provides _Rotational Force_ taken from adjacent _Water Currents_.", - - "block.create.encased_fan.tooltip": "ENCASED FAN", - "block.create.encased_fan.tooltip.summary": "Converts _Rotational Force_ to _Air Currents_ and back. Has a variety of uses.", - "block.create.encased_fan.tooltip.condition1": "When Powered by Redstone", - "block.create.encased_fan.tooltip.behaviour1": "Provides _rotational force_ from any _heat sources_ immediately below itself. The fan has to be facing down.", - "block.create.encased_fan.tooltip.condition2": "When Powered by Kinetics", - "block.create.encased_fan.tooltip.behaviour2": "_Pushes_ or _Pulls_ Entities, depending on the incoming Rotation speed.", - "block.create.encased_fan.tooltip.condition3": "When blowing through special blocks", - "block.create.encased_fan.tooltip.behaviour3": "_Liquids_ and _Fire_ particles are emitted into the air flow. This can be used to _process items_.", - - "block.create.nozzle.tooltip": "NOZZLE", - "block.create.nozzle.tooltip.summary": "Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.", - - "block.create.hand_crank.tooltip": "HAND CRANK", - "block.create.hand_crank.tooltip.summary": "A simple _source_ of _Rotational Force_ that requires the interaction of players. Be careful not to wear yourself out!", - "block.create.hand_crank.tooltip.condition1": "When Used", - "block.create.hand_crank.tooltip.behaviour1": "Provides _Rotational Force_ to an attached contraption. _Sneak to reverse_ the rotation.", - - "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", - "block.create.cuckoo_clock.tooltip.summary": "Fine craftsmanship for _decorating_ a space and _keeping track of time_.", - "block.create.cuckoo_clock.tooltip.condition1": "When Powered by Kinetics", - "block.create.cuckoo_clock.tooltip.behaviour1": "Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.", - - "block.create.turntable.tooltip": "TURNTABLE", - "block.create.turntable.tooltip.summary": "Turns _Rotational Force_ into refined Motion Sickness.", - - "block.create.millstone.tooltip": "MILLSTONE", - "block.create.millstone.tooltip.summary": "A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", - "block.create.millstone.tooltip.condition1": "When Powered by Kinetics", - "block.create.millstone.tooltip.behaviour1": "Starts applying _milling recipes_ to any items inserted from the side or the top of the block.", - "block.create.millstone.tooltip.condition2": "When R-Clicked", - "block.create.millstone.tooltip.behaviour2": "Collects the outputs manually.", - - "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", - "block.create.crushing_wheel.tooltip.summary": "Large rotatable wheels that _break down_ anything.", - "block.create.crushing_wheel.tooltip.condition1": "When attached to other Crushing Wheel", - "block.create.crushing_wheel.tooltip.behaviour1": "Forms a crushing machine for processing a variety of things. The Wheels' teeth have to connect and moving with the _same speed_ in _opposite directions_.", - - "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", - "block.create.mechanical_press.tooltip.summary": "A forceful piston for compressing items beneath it. Requires constant _Rotational Force_.", - "block.create.mechanical_press.tooltip.condition1": "When Powered by Redstone", - "block.create.mechanical_press.tooltip.behaviour1": "_Starts_ to compress items dropped below it.", - "block.create.mechanical_press.tooltip.condition2": "When Above a Mechanical Belt", - "block.create.mechanical_press.tooltip.behaviour2": "_Automatically_ compresses bypassing items on the Belt.", - "block.create.mechanical_press.tooltip.condition3": "When above Basin", - "block.create.mechanical_press.tooltip.behaviour3": "Starts to _compact items_ in the basin whenever all necessary ingredients are present.", - - "block.create.basin.tooltip": "BASIN", - "block.create.basin.tooltip.summary": "A handy _item container_ used in processing with the _Mechanical Mixer_ and the _Mechanical Press_. Supports _Redstone Comparators_. Comes with a handy filter, specifying which items should be created in this Basin.", - "block.create.basin.tooltip.condition1": "Auto-Output", - "block.create.basin.tooltip.behaviour1": "When _open inventories_ such as belts, other basins, depots, item drains and others are _below one side_ of a basin, they will automatically receive any _item/fluid outputs_ created in the basin. This is useful for automation.", - - "block.create.blaze_burner.tooltip": "BLAZE BURNER", - "block.create.blaze_burner.tooltip.summary": "A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_burner.tooltip.condition1": "When placed below a basin", - "block.create.blaze_burner.tooltip.behaviour1": "Provides _heat_ to basin recipes.", - "block.create.blaze_burner.tooltip.condition2": "When fuel is used on the blaze heater", - "block.create.blaze_burner.tooltip.behaviour2": "Increases the remaining burn time by the furnace burn time of the used item. Consumes the item. Use _Blaze Cake_ for high temperatures.", - - "block.create.reinforced_rail.tooltip": "REINFORCED RAIL", - "block.create.reinforced_rail.tooltip.summary": "A timber stabilized rail, _does not need supports_.", - - "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", - "block.create.mechanical_mixer.tooltip.summary": "A kinetic whisk providing automated shapeless crafting recipes of multiple ingredients. Requires constant _Rotational Force_ and a _Basin_ placed below (with a gap in between).", - "block.create.mechanical_mixer.tooltip.condition1": "When above Basin", - "block.create.mechanical_mixer.tooltip.behaviour1": "Starts to mix items in the basin whenever all necessary ingredients are present. To prevent unwanted recipes, use the filter slot on the basin or cut the rotational force until all desired ingredients have been added.", - - "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", - "block.create.mechanical_crafter.tooltip.summary": "A kinetic assembler for _automating_ any _shaped crafting_ recipe. Place _multiple in a grid_ corresponding to your recipe, and _arrange their belts_ to create a _flow_ that exits the grid on one of the crafters.", - "block.create.mechanical_crafter.tooltip.condition1": "When Powered by Kinetics", - "block.create.mechanical_crafter.tooltip.behaviour1": "_Starts the crafting process_ as soon as _all crafters_ in the grid have been _given an item_.", - "block.create.mechanical_crafter.tooltip.condition2": "On Redstone Pulse", - "block.create.mechanical_crafter.tooltip.behaviour2": "_Forces_ the start of the _crafting process_ with all currently given _items_ in the grid.", - "block.create.mechanical_crafter.tooltip.control1": "When Wrenched at Front", - "block.create.mechanical_crafter.tooltip.action1": "_Cycles the direction_ an individual crafter _moves its items_ towards. To form a working grid, _arrange the belts in a flow_ which moves all items towards a final crafter. The final crafter must _point away_ from the grid.", - "block.create.mechanical_crafter.tooltip.control2": "When Wrenched at back", - "block.create.mechanical_crafter.tooltip.action2": "_Connects_ the _input inventory_ of adjacent crafters. Use this to _combine slots_ in the crafting grid and _save on input work_.", - - "block.create.furnace_engine.tooltip": "FURNACE ENGINE", - "block.create.furnace_engine.tooltip.summary": "A powerful source of _Rotational Power_ that requires a _running furnace_ to work.", - "block.create.furnace_engine.tooltip.condition1": "When Attached to Lit Furnace", - "block.create.furnace_engine.tooltip.behaviour1": "_Starts powering_ a _Flywheel_ placed in front of it (1m apart). Use a Blast Furnace for higher speeds.", - - "block.create.flywheel.tooltip": "FLYWHEEL", - "block.create.flywheel.tooltip.summary": "A large metal wheel to _harness and stabilize_ generated force by an _attached Engine_. Flywheels connect to engines if they are _1m apart_ and at a _90° Angle_ from each other.", - "block.create.flywheel.tooltip.condition1": "When Attached to Running Engine", - "block.create.flywheel.tooltip.behaviour1": "Provides _Rotational Force_ to a connected contraption based on the generator's strength and speed.", - - "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", - "block.create.portable_storage_interface.tooltip.summary": "A portable interchange point for _moving items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley. Two meeting interfaces have to _face each other_ and be spaced _1-2 blocks apart_.", - "block.create.portable_storage_interface.tooltip.condition1": "While Moving", - "block.create.portable_storage_interface.tooltip.behaviour1": "Interacts with stationary _portable storage interfaces_ to transfer items to or from the contraption. Components inserting into or extracting from the _Stationary Interface_ will interact with the inventories on the contraption _directly._ The structure will briefly stall as items are exchanged.", - "block.create.portable_storage_interface.tooltip.condition2": "When Powered by Redstone", - "block.create.portable_storage_interface.tooltip.behaviour2": "_Disengages_ any active connection immediately.", - - "block.create.portable_fluid_interface.tooltip": "PORTABLE FLUID INTERFACE", - "block.create.portable_fluid_interface.tooltip.summary": "A portable interchange point for _moving fluids_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley. Two meeting interfaces have to _face each other_ and be spaced _1-2 blocks apart_.", - "block.create.portable_fluid_interface.tooltip.condition1": "While Moving", - "block.create.portable_fluid_interface.tooltip.behaviour1": "Interacts with stationary _portable storage interfaces_ to transfer fluids to or from the contraption. Pipes inserting into or extracting from the _Stationary Interface_ will interact with the tanks on the contraption _directly._ The structure will briefly stall as Fluids are exchanged.", - "block.create.portable_fluid_interface.tooltip.condition2": "When Powered by Redstone", - "block.create.portable_fluid_interface.tooltip.behaviour2": "_Disengages_ any active connection immediately.", - - "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", - "block.create.rotation_speed_controller.tooltip.summary": "A _configurable relay_ able to speed up or slow down the target component to any desired speed.", - "block.create.rotation_speed_controller.tooltip.condition1": "When Attached to Large Cogwheel", - "block.create.rotation_speed_controller.tooltip.behaviour1": "Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached on top_ of the controller.", - - "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", - "block.create.mechanical_piston.tooltip.summary": "A more advanced version of the _Piston._ It uses _Rotational Force_ to precisely move structures in front of it. _Piston Extension Poles_ at the rear define the _Range_ of this Device. Without extensions, the piston will not move. Use _Chassis_ or _Slime Blocks_ to move more than a single line of blocks.", - "block.create.mechanical_piston.tooltip.condition1": "When Powered by Kinetics", - "block.create.mechanical_piston.tooltip.behaviour1": "Starts moving the attached structure. Speed and direction correlate to incoming Rotation Speed.", - - "block.create.piston_extension_pole.tooltip": "PISTON POLE", - "block.create.piston_extension_pole.tooltip.summary": "Extends the range of _Mechanical Pistons_.", - "block.create.piston_extension_pole.tooltip.condition1": "When attached to Mechanical Piston", - "block.create.piston_extension_pole.tooltip.behaviour1": "Extends a piston's range by 1 block", - - "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", - "block.create.mechanical_bearing.tooltip.summary": "Used for rotating _larger structures_ with rotational force.", - "block.create.mechanical_bearing.tooltip.condition1": "When Powered by Kinetics", - "block.create.mechanical_bearing.tooltip.behaviour1": "Starts rotating attached blocks. Use _Chassis_, _Slime_ or _Super Glue_ to move more than a single block.", - - "block.create.windmill_bearing.tooltip": "WINDMILL BEARING", - "block.create.windmill_bearing.tooltip.summary": "Used for harnessing _Rotational Force_ from wind. Attach your own design and watch it spin!", - "block.create.windmill_bearing.tooltip.condition1": "When Right-clicked", - "block.create.windmill_bearing.tooltip.behaviour1": "Starts providing _Rotational Force_ generated from the rotation of its attached structure. The Structure has to include suitable _Sail Blocks_ or _Wool_. Use _Chassis_, _Slime_ or _Super Glue_ to move more than a single block.", - - "block.create.sail_frame.tooltip": "SAIL FRAME", - "block.create.sail_frame.tooltip.summary": "A useful building block and source of kinetic energy when part of a structure mounted onto a _Windmill Bearing_.", - - "block.create.white_sail.tooltip": "SAIL", - "block.create.white_sail.tooltip.summary": "A useful building block and source of kinetic energy when part of a structure mounted onto a _Windmill Bearing_. Comes in a variety of colours.", - "block.create.white_sail.tooltip.condition1": "When Right-clicked with Dye", - "block.create.white_sail.tooltip.behaviour1": "Changes color of the sail.", - - "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", - "block.create.clockwork_bearing.tooltip.summary": "An advanced version of the _Mechanical Bearing_ for rotating up to two _clock hands_ according to current _in-game time_.", - "block.create.clockwork_bearing.tooltip.condition1": "When Powered by Kinetics", - "block.create.clockwork_bearing.tooltip.behaviour1": "Starts rotating the attached Structure towards the _current hour_. If an independent second structure exists in front of the first one, it will serve as the _minute hand_.", - - "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", - "block.create.sequenced_gearshift.tooltip.summary": "A _programmable utility component,_ which can change its _rotational through-put_ according to up to _5 consecutive instructions._ Use this to power Mechanical Bearings, Pistons or Pulleys with more control over timing and speed. May become less precise at higher speeds.", - "block.create.sequenced_gearshift.tooltip.condition1": "When Powered by Redstone", - "block.create.sequenced_gearshift.tooltip.behaviour1": "_Starts executing_ programmed instructions based on the input speed.", - "block.create.sequenced_gearshift.tooltip.condition2": "When R-Clicked", - "block.create.sequenced_gearshift.tooltip.behaviour2": "Opens the _configuration interface._", - - "block.create.cart_assembler.tooltip": "CART ASSEMBLER", - "block.create.cart_assembler.tooltip.summary": "When placed on a _Rail_, can _assemble_ and _disassemble_ moving structures onto passing minecarts. Refer to [Ctrl] for rail type specific behaviour.", - "block.create.cart_assembler.tooltip.condition1": "Single Cart Contraptions", - "block.create.cart_assembler.tooltip.behaviour1": "With a _single_ assember, structures will anchor and rotate on a _single minecart_. Use a _wrench_ to specify desired _rotation behaviour_.", - "block.create.cart_assembler.tooltip.condition2": "Carriage Contraptions", - "block.create.cart_assembler.tooltip.behaviour2": "Two cart assembers _connected by_ a _structure_ will, once both contain a minecart, connect those carts with a _contraption mounted between_ the _two_ of them. The structure will behave similarly to a _Minecart Coupling_.", - "block.create.cart_assembler.tooltip.control1": "When placed above Rail", - "block.create.cart_assembler.tooltip.action1": "_Assembles_ onto passing carts _when powered_, _disassembles_ them otherwise.", - "block.create.cart_assembler.tooltip.control2": "When placed above Powered Rail", - "block.create.cart_assembler.tooltip.action2": "Assembles and _accelerates_ carts _when powered_, disassembles and _holds_ them otherwise.", - "block.create.cart_assembler.tooltip.control3": "When placed above Detector Rail", - "block.create.cart_assembler.tooltip.action3": "_Assembles unassembled_ carts, _disassembles assembled_ carts.", - "block.create.cart_assembler.tooltip.control4": "When placed above Activator Rail", - "block.create.cart_assembler.tooltip.action4": "_Disassembles_ carts when powered.", - - "block.create.rope_pulley.tooltip": "ROPE PULLEY", - "block.create.rope_pulley.tooltip.summary": "Moves attached _blocks_ and _structures vertically_. Use _Chassis_, _Slime_ or _Super Glue_ to move more than a single block.", - "block.create.rope_pulley.tooltip.condition1": "When Powered by Kinetics", - "block.create.rope_pulley.tooltip.behaviour1": "Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", - - "block.create.linear_chassis.tooltip": "LINEAR CHASSIS", - "block.create.linear_chassis.tooltip.summary": "A configurable base block connecting structures for movement.", - "block.create.linear_chassis.tooltip.condition1": "When Moved", - "block.create.linear_chassis.tooltip.behaviour1": "_Moves_ all _attached Chassis_ with the same orientation, and a column of Blocks within its range. Blocks will only be pulled if the chassis' face is _Sticky_ (See [Ctrl]).", - "block.create.linear_chassis.tooltip.condition2": "With Wrench", - "block.create.linear_chassis.tooltip.behaviour2": "Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", - "block.create.linear_chassis.tooltip.control1": "When R-Clicked with Slime Ball", - "block.create.linear_chassis.tooltip.action1": "Makes the clicked face _Sticky_. When moved, the chassis will _pull_ attached Blocks, regardless of movement direction.", - - "block.create.secondary_linear_chassis.tooltip": "SECONDARY LINEAR CHASSIS", - "block.create.secondary_linear_chassis.tooltip.summary": "A second type of _Linear Chassis_ that does not connect to the other.", - - "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", - "block.create.radial_chassis.tooltip.summary": "A configurable base block connecting structures for movement.", - "block.create.radial_chassis.tooltip.condition1": "When Moved", - "block.create.radial_chassis.tooltip.behaviour1": "_Moves_ all _attached Chassis_ in a column, and a cylinder of blocks around itself. Blocks around it are only moved when they are within range and attached to a sticky side (See [Ctrl]).", - "block.create.radial_chassis.tooltip.condition2": "With Wrench", - "block.create.radial_chassis.tooltip.behaviour2": "Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", - "block.create.radial_chassis.tooltip.control1": "When R-Clicked with Slime Ball", - "block.create.radial_chassis.tooltip.action1": "Makes the clicked face _Sticky_. When Chassis move, all designated blocks attached to the sticky side are moved with it.", - - "block.create.mechanical_drill.tooltip": "MECHANICAL DRILL", - "block.create.mechanical_drill.tooltip.summary": "A mechanical device suitable for _breaking blocks_. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", - "block.create.mechanical_drill.tooltip.condition1": "When Powered by Kinetics", - "block.create.mechanical_drill.tooltip.behaviour1": "Acts as a _stationary_ Block Breaker. Also _hurts entities_ in its effective area.", - "block.create.mechanical_drill.tooltip.condition2": "While Moving", - "block.create.mechanical_drill.tooltip.behaviour2": "Breaks Blocks with which the drill collides.", - - "block.create.mechanical_harvester.tooltip": "MECHANICAL HARVESTER", - "block.create.mechanical_harvester.tooltip.summary": "A mechanical plant cutter suitable for medium scale crop automation. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", - "block.create.mechanical_harvester.tooltip.condition1": "While Moving", - "block.create.mechanical_harvester.tooltip.behaviour1": "_Harvests_ all _mature crops_ which which the blade collides and reset them to their initial growth state.", - - "block.create.mechanical_plough.tooltip": "MECHANICAL PLOUGH", - "block.create.mechanical_plough.tooltip.summary": "A mechanical plough has a variety of uses. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", - "block.create.mechanical_plough.tooltip.condition1": "While Moving", - "block.create.mechanical_plough.tooltip.behaviour1": "_Breaks blocks_ which _cannot be collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills soil blocks_ as though a Hoe would be used on them.", - - "block.create.mechanical_saw.tooltip": "MECHANICAL SAW", - "block.create.mechanical_saw.tooltip.summary": "Suitable for _cutting trees_ effectively and for _cutting blocks_ into their carpentered counterparts. It is movable using _Mechanical Pistons_ or _Bearings_.", - "block.create.mechanical_saw.tooltip.condition1": "When facing up", - "block.create.mechanical_saw.tooltip.behaviour1": "Applies _Sawing_ and _Stonecutting Recipes_ to items dropped onto or inserted into it. When multiple outputs are possible, it cycles through them unless a _filter_ is assigned.", - "block.create.mechanical_saw.tooltip.condition2": "When facing horizontally", - "block.create.mechanical_saw.tooltip.behaviour2": "_Breaks logs_ in front of it. If the log supported a tree on its own, the _tree will collapse_ away from the saw.", - "block.create.mechanical_saw.tooltip.condition3": "While Moving", - "block.create.mechanical_saw.tooltip.behaviour3": "_Cuts_ all _Trees_ with which the saw collides.", - - "block.create.stockpile_switch.tooltip": "STOCKPILE SWITCH", - "block.create.stockpile_switch.tooltip.summary": "Toggles a Redstone signal based on the amount of _Stored Items_ in the attached Container. Comes with a handy filter. As opposed to a _Comparator,_ the _Stockpile Switch_ allows configuration of _thresholds,_ at which signals are inverted.", - "block.create.stockpile_switch.tooltip.condition1": "When R-Clicked", - "block.create.stockpile_switch.tooltip.behaviour1": "Opens the _Configuration Interface_.", - - "block.create.content_observer.tooltip": "CONTENT OBSERVER", - "block.create.content_observer.tooltip.summary": "_Detects Items_ inside _containers_ and _conveyors_ matching a configured _filter_. While the observed _inventory_, _belt_ or _chute contains_ a matching item, this component will emit a _Redstone Signal_. When an observed _funnel transfers_ a matching item, this component will emit a _Redstone Pulse_.", - - "block.create.redstone_link.tooltip": "REDSTONE LINK", - "block.create.redstone_link.tooltip.summary": "Endpoints for _Wireless Redstone_ connections. Can be assigned _Frequencies_ using any item. Signal range is limited, though reasonably far.", - "block.create.redstone_link.tooltip.condition1": "When Powered", - "block.create.redstone_link.tooltip.behaviour1": "Receiving Links of the same _Frequency_ will produce a Redstone signal.", - "block.create.redstone_link.tooltip.control1": "When R-Clicked with an Item", - "block.create.redstone_link.tooltip.action1": "Sets the _Frequency_ to that item. A total of _two different items_ can be used in combination for defining a Frequency.", - "block.create.redstone_link.tooltip.control2": "When R-Clicked while Sneaking", - "block.create.redstone_link.tooltip.action2": "Toggles between _Receiver_ and _Transmitter_ Mode.", - - "block.create.nixie_tube.tooltip": "NIXIE TUBE", - "block.create.nixie_tube.tooltip.summary": "A fancy redstone-powered _Number_ and _Text Display_.", - "block.create.nixie_tube.tooltip.condition1": "When Powered", - "block.create.nixie_tube.tooltip.behaviour1": "Shows the current redstone _Signal Strength_ as its displayed value.", - "block.create.nixie_tube.tooltip.condition2": "With Name Tag", - "block.create.nixie_tube.tooltip.behaviour2": "Display _contents_ of your _name tag_ with several nixie tubes _arranged_ in a _line_.", - - "block.create.redstone_contact.tooltip": "REDSTONE CONTACT", - "block.create.redstone_contact.tooltip.summary": "Only emits redstone power in pairs. It is movable with _Mechanical Pistons_, _Bearings_ or other controllers.", - "block.create.redstone_contact.tooltip.condition1": "When facing other Contact", - "block.create.redstone_contact.tooltip.behaviour1": "Provides a _Redstone Signal_.", - "block.create.redstone_contact.tooltip.condition2": "While Moving", - "block.create.redstone_contact.tooltip.behaviour2": "Triggers all stationary contacts it passes.", - - "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", - "block.create.adjustable_crate.tooltip.summary": "This _Item Container_ allows Manual control over its capacity. It can hold up to _16 Stacks_ of any Item. Supports _Redstone Comparators_.", - "block.create.adjustable_crate.tooltip.control1": "When R-Clicked", - "block.create.adjustable_crate.tooltip.action1": "Opens the _Interface_.", - - "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", - "block.create.creative_crate.tooltip.summary": "This _Storage Container_ allows infinite replication of any item. Place next to a _Schematicannon_ to remove any material requirements.", - "block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot", - "block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", - - "block.create.deployer.tooltip": "DEPLOYER", - "block.create.deployer.tooltip.summary": "_Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit items_ to its own _Inventory_. Held items have to be _inserted_ and _extracted_ from the block directly.", - "block.create.deployer.tooltip.condition1": "When Powered by Kinetics", - "block.create.deployer.tooltip.behaviour1": "Extends its arm and _activates_ in the block space _2m ahead_ of itself.", - "block.create.deployer.tooltip.condition2": "R-Clicked with Wrench", - "block.create.deployer.tooltip.behaviour2": "Toggles punch mode. In _punch mode_, the Deployer will attempt to use its item to _break blocks_ or _hurt entities_.", - "block.create.deployer.tooltip.condition3": "When Filter assigned", - "block.create.deployer.tooltip.behaviour3": "Deployer will not activate unless held item _matches_ the _filter._ Items not matching cannot be inserted; Held items matching the filter cannot be extracted.", - - "block.create.brass_casing.tooltip": "BRASS CASING", - "block.create.brass_casing.tooltip.summary": "Sturdy machine casing with a variety of uses. Safe for decoration. Can be used to _encase Shafts_ and _Mechanical Belts._", - - "block.create.pulse_repeater.tooltip": "PULSE REPEATER", - "block.create.pulse_repeater.tooltip.summary": "A simple circuit for cutting passing redstone signals to a length of _1 tick_.", - - "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", - "block.create.adjustable_repeater.tooltip.summary": "An advanced _Redstone Repeater_ with a _configurable Delay_ up to 30 Minutes.", - - "block.create.adjustable_pulse_repeater.tooltip": "FLEX PULSE REPEATER", - "block.create.adjustable_pulse_repeater.tooltip.summary": "A _Pulse Repeater_ with a _configurable Delay_ up to 30 Minutes.", - - "block.create.analog_lever.tooltip": "ANALOG LEVER", - "block.create.analog_lever.tooltip.summary": "A lever with more _precise control_ over its emitted _signal strength_.", - - "block.create.powered_toggle_latch.tooltip": "POWERED TOGGLE LATCH", - "block.create.powered_toggle_latch.tooltip.summary": "A lever that can be toggled by a _Redstone Pulse_.", - - "block.create.powered_latch.tooltip": "POWERED LATCH", - "block.create.powered_latch.tooltip.summary": "A lever that can be controlled by _Redstone Signals_. A signal on the _back enables_ it, a signal from the _side will reset_ it.", - - "block.create.controller_rail.tooltip": "CONTROLLER RAIL", - "block.create.controller_rail.tooltip.summary": "A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", - "block.create.controller_rail.tooltip.condition1": "When Powered by Redstone", - "block.create.controller_rail.tooltip.behaviour1": "_Accelerates_ or _Decelerates_ passing _minecarts_ corresponding to the _signal strength_. Propagates redstone power to adjacent controller rails. Powering two controller rails with different strengths will cause tracks between them to interpolate their signal.", - - "block.create.speedometer.tooltip": "SPEEDOMETER", - "block.create.speedometer.tooltip.summary": "Measures and displays the _rotational speed_ of attached kinetic components. Supports _Redstone Comparators_.", - "block.create.speedometer.tooltip.condition1": "When Powered by Kinetics", - "block.create.speedometer.tooltip.behaviour1": "Indicates a color corresponding to the level of speed. _Green_ indicates Slow, _Blue_ Moderate and _Purple_ Fast rotation. Some mechanical components require a sufficient level of speed to work properly.", - - "block.create.stressometer.tooltip": "STRESSOMETER", - "block.create.stressometer.tooltip.summary": "Measures and displays the _overall stress_ of the attached kinetic network. Supports _Redstone Comparators_.", - "block.create.stressometer.tooltip.condition1": "When Powered by Kinetics", - "block.create.stressometer.tooltip.behaviour1": "Indicates a color corresponding to the level of stress. _Over-stressed networks_ will cease to move. Stress can be relieved by adding more _rotational sources_ to the network.", - - "item.create.sand_paper.tooltip": "SAND PAPER", - "item.create.sand_paper.tooltip.summary": "A rough paper that can be used to _polish materials_. Can be automatically applied using the Deployer.", - "item.create.sand_paper.tooltip.condition1": "When Used", - "item.create.sand_paper.tooltip.behaviour1": "Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking at them_", - - "item.create.super_glue.tooltip": "SUPER GLUE", - "item.create.super_glue.tooltip.summary": "Glue a block to another, and they will forever be inseparable.", - "item.create.super_glue.tooltip.condition1": "When Used", - "item.create.super_glue.tooltip.behaviour1": "Makes the _clicked face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged along_ when moved by _mechanical pistons_, _bearings_ and other controllers.", - "item.create.super_glue.tooltip.condition2": "When Held in Offhand", - "item.create.super_glue.tooltip.behaviour2": "_Automatically attaches_ blocks placed from the main hand to the _side_ they were _placed against._", - - "item.create.builders_tea.tooltip": "BUILDERS TEA", - "item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._", - - "item.create.refined_radiance.tooltip": "REFINED RADIANCE", - "item.create.refined_radiance.tooltip.summary": "A Chromatic material forged from _absorbed light_.", - - "item.create.shadow_steel.tooltip": "SHADOW STEEL", - "item.create.shadow_steel.tooltip.summary": "A Chromatic material forged _in the void_.", - - "item.create.minecart_coupling.tooltip": "MINECART COUPLING", - "item.create.minecart_coupling.tooltip.summary": "_Chains_ all your _Minecarts_ or _Carriage Contraptions_ together to form a majestic Train.", - "item.create.minecart_coupling.tooltip.condition1": "When Used on Minecart", - "item.create.minecart_coupling.tooltip.behaviour1": "_Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.", - - "item.create.crafter_slot_cover.tooltip": "SLOT COVER", - "item.create.crafter_slot_cover.tooltip.summary": "Used to mark a _Mechanical Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients are diagonal_ to each other.", + "block.create.schematicannon.tooltip.action1": "Abre la _Interfaz_ de configuración", + + "block.create.schematic_table.tooltip": "TABLA DE ESQUEMAS", + "block.create.schematic_table.tooltip.summary": "Escribe los esquemas guardados en un _esquema vacío_", + "block.create.schematic_table.tooltip.condition1": "Cuando se da un esquema vacío", + "block.create.schematic_table.tooltip.behaviour1": "Carga un archivo elegido de la carpeta de esquemas", + + "block.create.shaft.tooltip": "EJE", + "block.create.shaft.tooltip.summary": "_Retransmite la rotación_ en línea recta", + + "block.create.cogwheel.tooltip": "RUEDA DENTADA", + "block.create.cogwheel.tooltip.summary": "_Retransmite la rotación_ en línea recta, y a las _ruedas dentadas_ adyacentes", + + "block.create.large_cogwheel.tooltip": "RUEDA DENTADA GRANDE", + "block.create.large_cogwheel.tooltip.summary": "Una versión más grande de la _Rueda dentada_, que permite _cambiar_ la _Velocidad de Rotación_ cuando se conecta a su contraparte más pequeña", + + "block.create.encased_shaft.tooltip": "EJE REVESTIDO", + "block.create.encased_shaft.tooltip.summary": "_Retransmite la rotación_ en línea recta. Adecuado para propagar la Rotación a través de Muros", + + "block.create.gearbox.tooltip": "CAJA DE TRANSMISIÓN", + "block.create.gearbox.tooltip.summary": "_Retransmite la rotación_ en _cuatro direcciones_. Invierte las conexiones rectas", + + "block.create.gearshift.tooltip": "CAJA DE CAMBIOS", + "block.create.gearshift.tooltip.summary": "Un control para alternar la dirección de rotación de los ejes conectados", + "block.create.gearshift.tooltip.condition1": "Cuando se alimenta", + "block.create.gearshift.tooltip.behaviour1": "_Invierte_ la rotación de salida", + + "bloque.crear.embrague.información.sobre.herramientas": "EMBRAGUE", + "block.create.clutch.tooltip.summary": "Un control para conectar/desconectar la rotación de los ejes conectados", + "block.create.clutch.tooltip.condition1": "Cuando se acciona", + "block.create.clutch.tooltip.behaviour1": "_Detiene_ el transporte de la rotación al otro lado", + + "block.create.encased_chain_drive.tooltip": "CADENA DE TRANSMISIÓN REVESTIDA", + "block.create.encased_chain_drive.tooltip.summary": "_Retransmite la rotación_ en línea recta y a las cadenas de transmisión adyacentes. Las cadenas de transmisión se conectan en un grupo cuando se colocan junto a otra en cualquier cara sin eje. Su orientación no tiene que coincidir", + "block.create.encased_chain_drive.tooltip.condition1": "Cuando se conecta", + "block.create.encased_chain_drive.tooltip.behaviour1": "Los bloques conectados transmitirán la _velocidad de rotación_ y la dirección de este componente", + + "block.create.adjustable_chain_gearshift.tooltip": "CADENA DE TRANSMISIÓN AJUSTABLE", + "block.create.adjustable_chain_gearshift.tooltip.summary": "_Retransmite el giro_ en línea recta y a las _cadenas adyacentes_. El Redstone analógo proporcionada a este bloque controlará qué tamaño de rueda motriz se acopla a las cadenas de transmisión adyacentes", + "block.create.adjustable_chain_gearshift.tooltip.condition1": "Control de Redstone", + "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Sin señal_, los accionamientos de cadena adyacentes transmitirán la _misma velocidad._ Con una señal de _fuerza completa_, los accionamientos de cadena adyacentes transmitirán exactamente _el doble de su velocidad._ Cualquier cosa entre medias dará resultados entre 1-2x su velocidad", + + "item.create.belt_connector.tooltip": "CINTURÓN CONECTOR", + "item.create.belt_connector.tooltip.summary": "Conecta dos o más _ejes_ con un _Cinturón conector_. Los ejes conectados tendrán exactamente la misma velocidad y dirección de rotación. La correa puede actuar como _Transportador_ para _Estados_ y _Entidades_", + "item.create.belt_connector.tooltip.control1": "Click derecho en el eje", + "item.create.belt_connector.tooltip.action1": "Selecciona el eje como una polea del cinturón. Los dos ejes seleccionados tienen que estar _alineados_ ya sea _Verticalmente_, _Horizontalmente_ o _Diagonalmente_ hacia la dirección de la correa", + "item.create.belt_connector.tooltip.control2": "Click derecho mientras te agachas", + "item.create.belt_connector.tooltip.action2": "_Reinicia_ la primera posición seleccionada para el Cinturón", + + "item.create.goggles.tooltip": "GAFAS DEL INGENIERO", + "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar tu visión con útil información _cinética_", + "item.create.goggles.tooltip.condition1": "Cuando se llevan puestas", + "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _Nivel de velocidad_ de un componente cinético colocado, así como el _Impacto de estrés_ y la _Capacidad_ de los componentes individuales." + "item.create.goggles.tooltip.condition2": "Al mirar el medidor", + "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre _Velocidad_ o _Estrés_ de la red a la que está conectado el medidor", + + "item.create.wrench.tooltip": "LLAVE INGLESA", + "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artilugios cinéticos. Se puede utilizar para _Rotar_, _Desmantelar_ y para _Configurar_ componentes", + "item.create.wrench.tooltip.control1": "Click con el botón derecho en un bloque cinético", + "item.create.wrench.tooltip.action1": "_Rota los componentes_ hacia o desde la cara con la que ha interactuado", + "item.create.wrench.tooltip.control2": "Click derecho mientras te agachas", + "item.create.wrench.tooltip.action2": "Desmonta los componentes cinéticos_ y los devuelve a _tu inventario_", + + "block.create.creative_motor.tooltip": "MOTOR CREATIVO", + "block.create.creative_motor.tooltip.summary": "Una fuente configurable de _Fuerza Rotativa_", + + "block.create.water_wheel.tooltip": "RUEDA HIDRÁULICA MECÁNICA", + "block.create.water_wheel.tooltip.summary": "Proporciona _Fuerza de rotación_ tomada de las _Corrientes de agua_ adyacentes", + + "block.create.encased_fan.tooltip": "VENTILADOR REVESTIDO", + "block.create.encased_fan.tooltip.summary": "Convierte la _fuerza de rotación_ en _corrientes de aire_ y viceversa. Tiene una gran variedad de usos", + "block.create.encased_fan.tooltip.condition1": "Cuando es alimentado por Redstone", + "block.create.encased_fan.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a partir de cualquier _fuente de calor_ inmediatamente inferior. El ventilador debe estar orientado hacia abajo", + "block.create.encased_fan.tooltip.condition2": "Cuando es impulsado por la cinética", + "block.create.encased_fan.tooltip.behaviour2": "_Empuja_ o _Tira_ de Entidades, dependiendo de la velocidad de Rotación entrante", + "block.create.encased_fan.tooltip.condition3": "Al soplar a través de bloques especiales", + "block.create.encased_fan.tooltip.behaviour3": "Se emiten partículas de _Líquidos_ y _Fuego_ en el flujo de aire. Esto puede utilizarse para _procesar objetos_", + + "block.create.nozzle.tooltip": "BOQUILLA", + "block.create.nozzle.tooltip.summary": "Se acopla a la parte delantera de un _ventilador revestido_ para distribuir su efecto sobre las entidades en _todas las direcciones_", + + "block.create.hand_crank.tooltip": "MANIVELA", + "block.create.hand_crank.tooltip.summary": "Una sencilla _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. Ten cuidado de no agotarte!", + "block.create.hand_crank.tooltip.condition1": "Cuando se usa", + "block.create.hand_crank.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a un artilugio acoplado. _Se puede revertir_ la rotación", + + "block.create.cuckoo_clock.tooltip": "RELOJ CUCÚ", + "block.create.cuckoo_clock.tooltip.summary": "Fina artesanía para _decorar_ un espacio y _contar el tiempo_", + "block.create.cuckoo_clock.tooltip.condition1": "Cuando es alimentado por cinética", + "block.create.cuckoo_clock.tooltip.behaviour1": "Muestra la _hora actual_ y toca una melodía dos veces al día. Se activa_ una vez al _mediodía_ y al anochecer, en cuanto _los jugadores pueden dormir_", + + "block.create.turntable.tooltip": "PLATAFORMA GIRATORIA", + "block.create.turntable.tooltip.summary": "Convierte la _fuerza de rotación_ en un refinado mareo", + + "block.create.millstone.tooltip": "PIEDRA DEL MOLINO", + "block.create.millstone.tooltip.summary": "Un componente cinético adecuado para _moler_ materiales insertados. Puede ser alimentado por una rueda dentada adyacente o conectándose al eje de la parte inferior. Los resultados tienen que ser extraídos del componente", + "block.create.millstone.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.millstone.tooltip.behaviour1": "Comienza a aplicar _recetas de fresado_ a cualquier elemento insertado desde el lateral o la parte superior del bloque", + "block.create.millstone.tooltip.condition2": "Cuando se hace clic derecho", + "block.create.millstone.tooltip.behaviour2": "Recoge las salidas manualmente", + + "block.create.crushing_wheel.tooltip": "RUEDA DE TRITURACIÓN", + "block.create.crushing_wheel.tooltip.summary": "Grandes ruedas giratorias que _rompen_ cualquier cosa", + "block.create.crushing_wheel.tooltip.condition1": "Cuando se une a otra rueda trituradora", + "block.create.crushing_wheel.tooltip.behaviour1": "Forma una máquina trituradora para procesar una variedad de cosas. Los dientes de las ruedas tienen que conectarse y moverse con la _misma velocidad_ en _direcciones opuestas_", + + "block.create.mechanical_press.tooltip": "PRENSA MECÁNICA", + "block.create.mechanical_press.tooltip.summary": "Un pistón de fuerza para comprimir los objetos que tiene debajo. Requiere una _fuerza de rotación_ constante", + "block.create.mechanical_press.tooltip.condition1": "Cuando es impulsado por Redstone", + "block.create.mechanical_press.tooltip.behaviour1": "Comienza a _comprimir_ los objetos que caen debajo", + "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de un cinturón conector", + "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en el Cinturón", + "block.create.mechanical_press.tooltip.condition3": "Cuando está por encima de la Cuenca", + "block.create.mechanical_press.tooltip.behaviour3": "Comienza a _compactar artículos_ en la cuenca siempre que estén presentes todos los ingredientes necesarios", + + "block.create.basin.tooltip": "CUENCA", + "block.create.basin.tooltip.summary": "Un práctico _contenedor de elementos_ utilizado en el procesamiento con la _Mezcladora mecánica_ y la _Prensa mecánica_. Soporta _Comparadores de Redstone_. Viene con un práctico filtro que especifica qué elementos deben crearse en esta cuenca", + "block.create.basin.tooltip.condition1": "Salida automática", + "block.create.basin.tooltip.behaviour1": "Cuando los _inventarios abiertos_ como cintas, otras cuencas, depósitos, desagües de fluídos y otros están _bajo un lado_ de una cuenca, recibirán automáticamente cualquier _salida de artículos/fluidos_ creada en la cuenca. Esto es útil para la automatización", + + "block.create.blaze_burner.tooltip": "QUEMADOR DE BLAZE", + "block.create.blaze_burner.tooltip.summary": "Un bloque donde se aloja un blaze domado para calentar una cuenca", + "block.create.blaze_burner.tooltip.condition1": "Cuando se coloca debajo de una cuenca", + "block.create.blaze_burner.tooltip.behaviour1": "Proporciona _calor_ a las recetas de la cuenca", + "block.create.blaze_burner.tooltip.condition2": "Cuando se utiliza el combustible en el Quemador de Blaze", + "block.create.blaze_burner.tooltip.behaviour2": "Aumenta el tiempo de combustión restante en el tiempo de combustión del horno del elemento utilizado. Consume el objeto. Utiliza _Torta de Blaze_ para altas temperaturas", + + "block.create.reinforced_rail.tooltip": "RAÍL REFORZADO", + "block.create.reinforced_rail.tooltip.summary": "Raíl estabilizado con madera, _no necesita soportes_", + + "block.create.mechanical_mixer.tooltip": "MEZCLADOR MECÁNICO", + "block.create.mechanical_mixer.tooltip.summary": "Un batidor cinético que proporciona recetas de elaboración automatizada de múltiples ingredientes. Requiere una _fuerza de rotación_ constante y una _cuenca_ colocada debajo (con un espacio intermedio)", + "block.create.mechanical_mixer.tooltip.condition1": "Cuando está por encima de la Cuenca", + "block.create.mechanical_mixer.tooltip.behaviour1": "Comienza a mezclar los elementos en la cuenca siempre que estén presentes todos los ingredientes necesarios. Para evitar recetas no deseadas, utilice la ranura del filtro de la cuenca o reduzca la fuerza de rotación hasta que se hayan añadido todos los ingredientes deseados", + + "block.create.mechanical_crafter.tooltip": "MECANIZADOR", + "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus cinturones_ para crear un _flujo_ que salga de la cuadrícula en uno de los Mecanizadores", + "block.create.mechanical_crafter.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.mechanical_crafter.tooltip.behaviour1": "_Empieza el proceso de creación_ en cuanto _todos los crafters_ de la parrilla hayan recibido un objeto_", + "block.create.mechanical_crafter.tooltip.condition2": "Con pulso de Redstone", + "block.create.mechanical_crafter.tooltip.behaviour2": "_Fuerza_ el inicio del proceso de _creación_ con todos los _artículos_ dados actualmente en la parrilla", + "block.create.mechanical_crafter.tooltip.control1": "Cuando se arranca por delante", + "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un mecanizador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza los cinturones en un flujo_ que mueva todos los objetos hacia un mecanizador final. El mecanizador final debe _apuntar hacia fuera_ de la rejilla", + "block.create.mechanical_crafter.tooltip.control2": "Cuando se arranca hacia atrás", + "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los mecanizadores adyacentes. Usa esto para _combinar ranuras_ en el grid de crafteo y _guardar el la entrada de trabajo_", + + "block.create.furnace_engine.tooltip": "MOTOR DEL HORNO", + "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _Poder Rotatorio_ que requiere un _horno en funcionamiento_ para funcionar", + "block.create.furnace_engine.tooltip.condition1": "Cuando se conecta a un horno encendido", + "block.create.furnace_engine.tooltip.behaviour1": "_Empieza a alimentar_ un _Horno_ colocado delante de él (a 1m de distancia). Utiliza un Alto Horno para obtener mayores velocidades", + + "block.create.flywheel.tooltip": "RUEDA DE INERCIA", + "block.create.flywheel.tooltip.summary": "Una gran rueda metálica para _conducir y estabilizar_ la fuerza generada por un _motor conectado_. Las ruedas de inercia se conectan a los motores si están a _1m de distancia_ y en un _ángulo de 90º_ entre ellos", + "block.create.flywheel.tooltip.condition1": "Cuando está unida a un motor en marcha", + "block.create.flywheel.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a un artilugio conectado en función de la fuerza y la velocidad del generador", + + "block.create.portable_storage_interface.tooltip": "INTERFAZ DE ALMACENAMIENTO PORTÁTIL", + "block.create.portable_storage_interface.tooltip.summary": "Un punto de intercambio portátil para _mover elementos_ hacia y desde una _estructura_ movida por un pistón, rodamiento, vagoneta o polea. Para cumplirse dos interfaces tienen que _enfrentarse_ y estar separadas _1-2 bloques_", + "block.create.portable_storage_interface.tooltip.condition1": "Mientras se mueve", + "block.create.portable_storage_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátil_ estacionarias para transferir elementos hacia o desde el artilugio. Los componentes que se inserten o extraigan de la _interfaz estacionaria_ interactuarán con los inventarios del artilugio _directamente._ La estructura se detendrá brevemente mientras se intercambian los elementos." + "block.create.portable_storage_interface.tooltip.condition2": "Cuando es alimentado por Redstone", + "block.create.portable_storage_interface.tooltip.behaviour2": "Desactiva_ cualquier conexión activa inmediatamente", + + "block.create.portable_fluid_interface.tooltip": "INTERFAZ DE FLUIDO PORTÁTIL", + "block.create.portable_fluid_interface.tooltip.summary": "Punto de intercambio portátil para _mover fluidos_ hacia y desde una _estructura_ movida por un pistón, rodamiento, vagoneta o polea. Para cumplirse dos interfaces tienen que _enfrentarse_ y estar separadas _1-2 bloques_", + "block.create.portable_fluid_interface.tooltip.condition1": "Mientras se mueve", + "block.create.portable_fluid_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátiles_ estacionarias para transferir fluidos hacia o desde el artilugio. Las tuberías que se inserten en la _interfaz estacionaria_ o se extraigan de ella interactuarán con los depósitos del artilugio _directamente._ La estructura se paralizará brevemente mientras se intercambian fluidos." + "block.create.portable_fluid_interface.tooltip.condition2": "Cuando se alimenta con Redstone", + "block.create.portable_fluid_interface.tooltip.behaviour2": "_Desconecta_ cualquier conexión activa inmediatamente", + + "block.create.rotation_speed_controller.tooltip": "CONTROLADOR DE VELOCIDAD DE ROTACIÓN", + "block.create.rotation_speed_controller.tooltip.summary": "Un _relé_ configurable_ capaz de acelerar o ralentizar el componente de destino a cualquier velocidad deseada", + "block.create.rotation_speed_controller.tooltip.condition1": "Cuando se adjunta a una rueda dentada grande", + "block.create.rotation_speed_controller.tooltip.behaviour1": "Transmite la fuerza de rotación entrante a la rueda, intentando _igualar_ la _velocidad_ a la que está configurada. La _rueda mecánica_ tiene que estar _adherida en la parte superior_ del controlador", + + "block.create.mechanical_piston.tooltip": "PISTÓN MECÁNICO", + "block.create.mechanical_piston.tooltip.summary": "Una versión más avanzada del _Pistón_. Utiliza la _Fuerza de rotación_ para mover con precisión las estructuras que tiene delante. las pértigas de extensión del pistón_ en la parte trasera definen el _alcance_ de este dispositivo. Sin las extensiones, el pistón no se moverá. Utiliza _Chasis_ o _Bloques de Slime_ para mover más de una línea de bloques", + "block.create.mechanical_piston.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.mechanical_piston.tooltip.behaviour1": "Comienza a mover la estructura adjunta. La velocidad y la dirección se correlacionan con la velocidad de rotación entrante", + + "block.create.piston_extension_pole.tooltip": "PÉRTIGA DE EXTENSIÓN", + "block.create.piston_extension_pole.tooltip.summary": "Amplía la gama de _Pistones mecánicos_", + "block.create.piston_extension_pole.tooltip.condition1": "Cuando se acopla a un pistón mecánico", + "block.create.piston_extension_pole.tooltip.behaviour1": "Extiende el alcance de un pistón en 1 bloque", + + "block.create.mechanical_bearing.tooltip": "RODAMIENTO MECÁNICO", + "block.create.mechanical_bearing.tooltip.summary": "Se utiliza para girar _estructuras más grandes_ con fuerza de rotación", + "block.create.mechanical_bearing.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.mechanical_bearing.tooltip.behaviour1": "Inicia la rotación de los bloques adjuntos. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque", + + "block.create.windmill_bearing.tooltip": "RODAMIENTO DEL MOLINO DE VIENTO", + "block.create.windmill_bearing.tooltip.summary": "Se utiliza para aprovechar la _fuerza de rotación_ del viento. Coloca tu propio diseño y mira cómo gira!", + "block.create.windmill_bearing.tooltip.condition1": "Al hacer clic con el botón derecho", + "block.create.windmill_bearing.tooltip.behaviour1": "Comienza a proporcionar _Fuerza de rotación_ generada por la rotación de su estructura adjunta. La estructura tiene que incluir bloques de vela o lana adecuados. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque." + + "block.create.sail_frame.tooltip": "MARCO DE VELA", + "block.create.sail_frame.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada sobre un _Rodamiento de molino_", + + "block.create.white_sail.tooltip": "VELA", + "block.create.white_sail.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada en un _Rodamiento de molino_. Viene en una variedad de colores", + "block.create.white_sail.tooltip.condition1": "Cuando se hace clic con el botón derecho del ratón con tinte", + "block.create.white_sail.tooltip.behaviour1": "Cambia el color de la vela", + + "block.create.clockwork_bearing.tooltip": "RODAMIENTO DE RELOJ", + "block.create.clockwork_bearing.tooltip.summary": "Una versión avanzada del _rodamiento mecánico_ para hacer girar hasta dos _manecillas de reloj_ según la _hora actual_ en el _juego_", + "block.create.clockwork_bearing.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.clockwork_bearing.tooltip.behaviour1": "Comienza a girar la estructura adjunta hacia la _hora actual_. Si existe una segunda estructura independiente delante de la primera, servirá de _manecilla de las horas_", + + "block.create.sequenced_gearshift.tooltip": "CAMBIO DE MARCHAS SECUENCIADO", + "block.create.sequenced_gearshift.tooltip.summary": "Un _componente de utilidad programable_, que puede cambiar su _rendimiento rotacional_ según hasta _5 instrucciones consecutivas._ Utilízalo para alimentar Rodamientos Mecánicos, Pistones o Poleas con más control sobre la sincronización y la velocidad. Puede ser menos preciso a velocidades más altas", + "block.create.sequenced_gearshift.tooltip.condition1": "Cuando es impulsado por Redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "_Ejecuta_ las instrucciones programadas en función de la velocidad de entrada", + "block.create.sequenced_gearshift.tooltip.condition2": "Cuando se hace clic derecho", + "block.create.sequenced_gearshift.tooltip.behaviour2": "Abre la _interfaz de configuración._", + + "block.create.cart_assembler.tooltip": "ENSAMBLADOR DE VAGONETAS", + "block.create.cart_assembler.tooltip.summary": "Cuando se coloca en un _Raíl_, puede _ensamblar_ y _desensamblar_ estructuras móviles en las vagonetas que pasan. Consulta [Ctrl] para conocer el comportamiento específico del tipo de raíl", + "block.create.cart_assembler.tooltip.condition1": "Artilugio de vagoneta simple", + "block.create.cart_assembler.tooltip.behaviour1": "Con un _miembro único_, las estructuras se anclarán y girarán en _una sola vagoneta_. Utilice una _Llave Inglesa_ para especificar el _comportamiento de rotación_ deseado", + "block.create.cart_assembler.tooltip.condition2": "Artilugio de vagonetas", + "block.create.cart_assembler.tooltip.behaviour2": "Dos ensambladores de vagonetas _conectadas por_ una _estructura_, una vez que ambos contengan una vagoneta, las conectará con un artilugio montado _entre los dos_. La estructura se comportará de forma similar a un _acoplador de vagonetas_", + "block.create.cart_assembler.tooltip.control1": "Cuando se coloca sobre un Rail", + "block.create.cart_assembler.tooltip.action1": "_Se monta_ en las vagonetas que pasan _cuando está alimentado_, _se desmonta_ en caso contrario", + "block.create.cart_assembler.tooltip.control2": "Cuando se coloca sobre un raíl energizado", + "block.create.cart_assembler.tooltip.action2": "Monta y _acelera_ las vagonetas _cuando está alimentado_, desmonta y _sostiene_ en caso contrario", + "block.create.cart_assembler.tooltip.control3": "Cuando se coloca sobre el raíl detector", + "block.create.cart_assembler.tooltip.action3": "_Monta vagonetas sin montar_, _desmonta vagonetas montadas_", + "block.create.cart_assembler.tooltip.control4": "Cuando se coloca sobre el raíl activador", + "block.create.cart_assembler.tooltip.action4": "Desmonta_ vagonetas cuando se activa", + + "block.create.rope_pulley.tooltip": "POLEA DE CUERDA", + "block.create.rope_pulley.tooltip.summary": "Mueve verticalmente los _bloques_ y _estructuras_ adjuntos. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque", + "block.create.rope_pulley.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.rope_pulley.tooltip.behaviour1": "Comienza a mover la estructura adjunta. La velocidad y la dirección se correlacionan con la velocidad de rotación entrante", + + "block.create.linear_chassis.tooltip": "CHASIS LINEAL", + "block.create.linear_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", + "block.create.linear_chassis.tooltip.condition1": "Cuando se mueve", + "block.create.linear_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis adjuntos_ con la misma orientación, y una columna de Bloques dentro de su rango. Los bloques sólo serán arrastrados si la cara del chasis es _Pegajosa_ (Ver [Ctrl])", + "block.create.linear_chassis.tooltip.condition2": "Con Llave Inglesa", + "block.create.linear_chassis.tooltip.behaviour2": "Configura el _rango_ para este bloque de chasis. Mantenga pulsada la tecla CTRL para modificar también el rango de todos los bloques de chasis adjuntos", + "block.create.linear_chassis.tooltip.control1": "Cuando se hace clic derecho con slime", + "block.create.linear_chassis.tooltip.action1": "Hace que la cara sobre la que se ha hecho clic sea _pegajosa_. Cuando se mueva, el chasis _tirará_ de los bloques adjuntos, independientemente de la dirección del movimiento", + + "block.create.secondary_linear_chassis.tooltip": "CHASIS LINEAL SECUNDARIO", + "block.create.secondary_linear_chassis.tooltip.summary": "Un segundo tipo de _Chasis lineal_ que no se conecta al otro", + + "bloque.crear.chasis_radial.tooltip": "CHASIS DE ROTACIÓN", + "block.create.radial_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", + "block.create.radial_chassis.tooltip.condition1": "Cuando se mueve", + "block.create.radial_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis_ adjuntos en una columna, y un cilindro de bloques a su alrededor. Los bloques que lo rodean sólo se mueven cuando están dentro del rango y están adheridos a un lado pegajoso (Ver [Ctrl])." + "block.create.radial_chassis.tooltip.condition2": "Con Llave Inglesa", + "block.create.radial_chassis.tooltip.behaviour2": "Configura el _rango_ para este bloque de chasis. Mantenga pulsada la tecla CTRL para modificar también el rango de todos los bloques de chasis adjuntos", + "block.create.radial_chassis.tooltip.control1": "Cuando se hace clic derecho con slime", + "block.create.radial_chassis.tooltip.action1": "Hace que la cara sobre la que se ha hecho clic sea _pegajosa_. Cuando el chasis se mueve, todos los bloques designados unidos a la cara pegajosa se mueven con él", + + "block.create.mechanical_drill.tooltip": "TALADRO MECÁNICO", + "block.create.mechanical_drill.tooltip.summary": "Un dispositivo mecánico adecuado para _romper bloques_. Se puede mover con _pistones mecánicos_, _rodamientos_ u otros controladores", + "block.create.mechanical_drill.tooltip.condition1": "Cuando se mueve con cinética", + "block.create.mechanical_drill.tooltip.behaviour1": "Actúa como un rompebloques _estacionario_. También _hace daño a las entidades_ en su área efectiva", + "block.create.mechanical_drill.tooltip.condition2": "Mientras se mueve", + "block.create.mechanical_drill.tooltip.behaviour2": "Rompe los bloques con los que colisiona el taladro", + + "block.create.mechanical_harvester.tooltip": "COSECHADORA MECÁNICA", + "block.create.mechanical_harvester.tooltip.summary": "Una cosechadora mecánica adecuada para la automatización de cultivos a mediana escala. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros controladores", + "block.create.mechanical_harvester.tooltip.condition1": "Mientras se mueve", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Corta_ todos los _cultivos maduros_ con los que la cuchilla colisiona y los restablece a su estado de crecimiento inicial", + + "block.create.mechanical_plough.tooltip": "ARADO MECÁNICO", + "block.create.mechanical_plough.tooltip.summary": "Un arado mecánico tiene varios usos. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros mandos", + "block.create.mechanical_plough.tooltip.condition1": "Mientras se mueve", + "block.create.mechanical_plough.tooltip.behaviour1": "_Rompe bloques_ con los que _no se puede colisionar_, como antorchas, raíles o capas de nieve. _Aplica_ su _movimiento_ a las _entidades_ sin dañarlas. _Labra bloques de tierra_ como si se usara una azada en ellos", + + "block.create.mechanical_saw.tooltip": "SIERRA MECÁNICA", + "block.create.mechanical_saw.tooltip.summary": "Adecuada para _cortar árboles_ de forma eficaz y para _cortar bloques_ en sus homólogos carpinteros. Se puede mover mediante _pistones mecánicos_ o _rodamientos_", + "block.create.mechanical_saw.tooltip.condition1": "Cuando está orientado hacia arriba", + "block.create.mechanical_saw.tooltip.behaviour1": "Aplica las recetas _Serrar_ y _Estallar_ a los objetos que se dejan caer o se introducen en ella. Cuando hay varias salidas posibles, las recorre a menos que se asigne un _filtro_", + "block.create.mechanical_saw.tooltip.condition2": "Cuando se orienta horizontalmente", + "block.create.mechanical_saw.tooltip.behaviour2": "Rompe los troncos_ que tiene delante. Si el tronco soportaba un árbol por sí mismo, el _árbol se derrumbará_ lejos de la sierra", + "block.create.mechanical_saw.tooltip.condition3": "Mientras se mueve", + "block.create.mechanical_saw.tooltip.behaviour3": "_Corta_ todos los _Árboles_ con los que colisiona la sierra", + + "block.create.stockpile_switch.tooltip": "INTERRUPTOR DE ACOPIO", + "block.create.stockpile_switch.tooltip.summary": "Activa una señal de Redstone en función de la cantidad de _Artículos almacenados_ en el Contenedor adjunto. Viene con un práctico filtro. A diferencia de un _Comparador,_ el _Interruptor de acopio_ permite la configuración de _Umbrales,_ a partir de los cuales se invierten las señales", + "block.create.stockpile_switch.tooltip.condition1": "Cuando haces click derecho", + "block.create.stockpile_switch.tooltip.behaviour1": "Abre la _Interfaz de Configuración_", + + "block.create.content_observer.tooltip": "OBSERVADOR DE CONTENIDO", + "block.create.content_observer.tooltip.summary": "_Detecta artículos_ dentro de _contenedores_ y _transportadores_ que coinciden con un _filtro_ configurado. Mientras el _inventario_, la _cinta_ o la _canaleta_ observados contengan_ un artículo que coincida, este componente emitirá una _señal de Redstone_. Cuando un _túnel observado transfiere_ un artículo coincidente, este componente emitirá un _Pulso de Redstone_", + + "block.create.redstone_link.tooltip": "ENLACE DE REDSTONE", + "block.create.redstone_link.tooltip.summary": "Puntos finales para conexiones _Inalámbricas Redstone_. Se pueden asignar _frecuencias_ utilizando cualquier elemento. El alcance de la señal es limitado, aunque razonablemente lejano", + "block.create.redstone_link.tooltip.condition1": "Cuando se alimenta", + "block.create.redstone_link.tooltip.behaviour1": "Recibir enlaces de la misma _Frecuencia_ producirá una señal de Redstone", + "block.create.redstone_link.tooltip.control1": "Cuando se hace Clic derecho con un ítem", + "block.create.redstone_link.tooltip.action1": "Establece la _Frecuencia_ a ese elemento. Se pueden utilizar un total de _dos elementos diferentes_ en combinación para definir una Frecuencia", + "block.create.redstone_link.tooltip.control2": "Cuando se hace clic derecho mientras se agacha", + "block.create.redstone_link.tooltip.action2": "Cambia entre el modo _Receptor_ y _Transmisor_", + + "block.create.nixie_tube.tooltip": "TUBO NIXIE", + "block.create.nixie_tube.tooltip.summary": "Un elegante _visualizador_ de _números y texto_ potenciados por Redstone", + "block.create.nixie_tube.tooltip.condition1": "Cuando se alimenta", + "block.create.nixie_tube.tooltip.behaviour1": "Muestra el valor actual de la _Fuerza de la señal Redstone_", + "block.create.nixie_tube.tooltip.condition2": "Con etiqueta de nombre", + "block.create.nixie_tube.tooltip.behaviour2": "Mostrar el _contenido_ de su _etiqueta de nombre_ con varios tubos nixie _ordenados_ en una _línea_", + + "block.create.redstone_contact.tooltip": "CONTACTO DE REDSTONE", + "block.create.redstone_contact.tooltip.summary": "Solo emite energía de Redstone por parejas. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros controladores", + "block.create.redstone_contact.tooltip.condition1": "Cuando se enfrenta a otro Contacto", + "block.create.redstone_contact.tooltip.behaviour1": "Proporciona una _señal de Redstone_", + "block.create.redstone_contact.tooltip.condition2": "Mientras se mueve", + "block.create.redstone_contact.tooltip.behaviour2": "Activa todos los contactos estacionarios que pasa", + + "block.create.adjustable_crate.tooltip": "CAJA AJUSTABLE", + "block.create.adjustable_crate.tooltip.summary": "Este _Contenedor de Artículos_ permite el control manual de su capacidad. Puede contener hasta _16 pilas_ de cualquier objeto. Soporta _Comparadores de Redstone_", + "block.create.adjustable_crate.tooltip.control1": "Cuando haces click derecho", + "block.create.adjustable_crate.tooltip.action1": "Abre la _Interfaz_", + + "block.create.creative_crate.tooltip": "CAJA CREATIVA", + "block.create.creative_crate.tooltip.summary": "Este _Contenedor de Almacenamiento_ permite la replicación infinita de cualquier elemento. Colócalo junto a un _Schematicannon_ para eliminar cualquier requisito de material", + "block.create.creative_crate.tooltip.condition1": "Cuando el artículo está en la ranura del filtro", + "block.create.creative_crate.tooltip.behaviour1": "Todo lo que se _extraiga_ de este contenedor proporcionará un _suministro ilimitado_ del elemento especificado. Los elementos _insertados_ en esta caja serán _evitados._", + + "block.create.deployer.tooltip": "DESPLEGADOR", + "block.create.deployer.tooltip.summary": "_Lanza_, _Usa_ y _Activa_. Esta máquina intentará _imitar_ a un _jugador_ en la medida de lo posible. Puede _tomar_ y _depositar objetos_ en su propio _inventario_. Los objetos guardados deben ser _insertados_ y _extraídos_ del bloque directamente", + "block.create.deployer.tooltip.condition1": "Cuando se alimenta de cinética", + "block.create.deployer.tooltip.behaviour1": "Extiende su brazo y se _activa_ en el espacio del bloque _2m por delante_ de sí mismo", + "block.create.deployer.tooltip.condition2": "Click derecho con la Llave Inglesa", + "block.create.deployer.tooltip.behaviour2": "Activa el modo puñetazo. En el _modo puñetazo_, el Desplegador intentará usar su objeto para _romper bloques_ o _herir entidades_", + "block.create.deployer.tooltip.condition3": "Cuando se asigna el filtro", + "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos." + + "block.create.brass_casing.tooltip": "REVESTIDORA DE BRONCE", + "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _cinturones conectores._", + + "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSO", + "block.create.pulse_repeater.tooltip.summary": "Un circuito sencillo para cortar las señales de Redstone que pasan a una longitud de _1 tick_", + + "block.create.adjustable_repeater.tooltip": "REPETIDOR AJUSTABLE", + "block.create.adjustable_repeater.tooltip.summary": "Un avanzado _repetidor de Redstone_ con un _retraso configurable_ de hasta 30 minutos", + + "block.create.adjustable_pulse_repeater.tooltip": "REPETIDOR DE PULSO AJUSTABLE", + "block.create.adjustable_pulse_repeater.tooltip.summary": "Un _repetidor de pulsos_ con un _retardo configurable_ de hasta 30 minutos", + + "block.create.analog_lever.tooltip": "PALANCA ANALÓGICA", + "block.create.analog_lever.tooltip.summary": "Una palanca con un control más _preciso_ sobre su fuerza de _señal_ emitida", + + "block.create.powered_toggle_latch.tooltip": "PALANCA MECANIZADA", + "block.create.powered_toggle_latch.tooltip.summary": "Una palanca que puede ser accionada por un _Pulso de Redstone_", + + "block.create.powered_latch.tooltip": "PALANCA DE CIERRE MECANIZADA", + "block.create.powered_latch.tooltip.summary": "Una palanca que puede ser controlada por _señales de Redstone_. Una señal en la _trasera la habilita_, una señal desde el _lado la reinicia_", + + "block.create.controller_rail.tooltip": "RAÍL DE CONTROL", + "block.create.controller_rail.tooltip.summary": "Un _raíl energizado unidireccional_ capaz de _controlar con precisión_ la _velocidad de movimiento_ de una vagoneta", + "block.create.controller_rail.tooltip.condition1": "Cuando es impulsado por Redstone", + "block.create.controller_rail.tooltip.behaviour1": "_Acelera_ o _Desacelera_ pasando _vagonetas_ correspondientes a la _fuerza de la señal_. Propaga la energía de Redstone a los Raíles de control adyacentes. Al alimentar dos Raíles de control con diferentes intensidades, los carriles entre ellos interpolarán su señal", + + "block.create.speedometer.tooltip": "VELOCÍMETRO", + "block.create.speedometer.tooltip.summary": "Mide y muestra la _velocidad de rotación_ de los componentes cinéticos acoplados. Es compatible con _comparadores de Redstone_", + "block.create.speedometer.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.speedometer.tooltip.behaviour1": "Indica un color correspondiente al nivel de velocidad. El _Verde_ indica Lento, el _Azul_ Moderado y el _Púrpura_ Rápido. Algunos componentes mecánicos requieren un nivel de velocidad suficiente para funcionar correctamente", + + "block.create.stressometer.tooltip": "ESTRESÓMETRO", + "block.create.stressometer.tooltip.summary": "Mide y muestra el _estrés global_ de la red cinética adjunta. Es compatible con _comparadores de Redstone_", + "block.create.stressometer.tooltip.condition1": "Cuando se alimenta con cinética", + "block.create.stressometer.tooltip.behaviour1": "Indica un color correspondiente al nivel de estrés. Las redes demasiado estresadas dejarán de moverse. El estrés puede aliviarse añadiendo más _fuentes de rotación_ a la red", + + "item.create.sand_paper.tooltip": "PAPEL DE LIJA", + "item.create.sand_paper.tooltip.summary": "Un papel rugoso que se puede utilizar para _pulir materiales_. Se puede aplicar automáticamente con el Desplegador", + "item.create.sand_paper.tooltip.condition1": "Cuando se usa", + "item.create.sand_paper.tooltip.behaviour1": "Aplica el pulido a los objetos sostenidos en la _mano libre_ o tirados en el _suelo_ cuando se _miran_", + + "item.create.super_glue.tooltip": "SÚPER PEGAMENTO", + "item.create.super_glue.tooltip.summary": "Pega un bloque a otro y serán inseparables para siempre", + "item.create.super_glue.tooltip.condition1": "Cuando se usa", + "item.create.super_glue.tooltip.behaviour1": "Hace que la cara _clicada_ de un bloque sea _pegajosa_. Los bloques unidos a caras pegajosas serán _arrastrados_ cuando se muevan por _pistones mecánicos_, _rodamientos_ y otros controladores", + "item.create.super_glue.tooltip.condition2": "Cuando se sostiene en la mano", + "item.create.super_glue.tooltip.behaviour2": "_Adjunta automáticamente_ los bloques colocados desde la mano principal al _lado_ contra el que fueron _colocados._", + + "item.create.builders_tea.tooltip": "TÉ DEL CONSTRUCTOR", + "item.create.builders_tea.tooltip.summary": "La bebida perfecta para empezar el día- _Motivante_ y _Saturante._", + + "item.create.refined_radiance.tooltip": "RESPLANDOR REFINADO", + "item.create.refined_radiance.tooltip.summary": "Material cromático forjado a partir de _luz absorbida_", + + "item.create.shadow_steel.tooltip": "ACERO SOMBRÍO", + "item.create.shadow_steel.tooltip.summary": "Un material cromático forjado _en el vacío_", + + "item.create.minecart_coupling.tooltip": "ENSAMBLADOR DE VAGONETAS", + "item.create.minecart_coupling.tooltip.summary": "_Encadena_ todas tus _Vagonetas_ o _Artilugios de vagoneta_ para formar un majestuoso Tren", + "item.create.minecart_coupling.tooltip.condition1": "Cuando se utiliza en Vagonetas", + "item.create.minecart_coupling.tooltip.behaviour1": "_Acopla_ dos Vagonetas, intentando mantenerlas a una _distancia constante_ mientras se mueven", + + "item.create.crafter_slot_cover.tooltip": "TAPA DE LA RANURA DEL MECANIZADOR", + "item.create.crafter_slot_cover.tooltip.summary": "Se utiliza para marcar a un _Mecanizador_ una ranura vacía en una receta. Los mecanizadores no tienen que formar necesariamente una cuadrícula completa. Esto es útil cuando hay recetas en las que los _ingredientes están en diagonal_ entre sí", "create.tooltip.wip": "WIP", - "create.tooltip.workInProgress": "Work in progress!", - "create.tooltip.randomWipDescription0": "Please keep this item away from children.", - "create.tooltip.randomWipDescription1": "A baby panda dies every time you use this item. Every. Time.", - "create.tooltip.randomWipDescription2": "Use at your own risk.", - "create.tooltip.randomWipDescription3": "This is not the item you are looking for, *finger-wiggles* please disperse.", - "create.tooltip.randomWipDescription4": "This item will self-destruct in 10 seconds. 10, 9, 8...", - "create.tooltip.randomWipDescription5": "Believe me, it's useless.", - "create.tooltip.randomWipDescription6": "By using this item, you hereby consent to our disclaimer and agree to its terms.", - "create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?", - "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", + "create.tooltip.workInProgress": "¡Trabajo en curso!", + "create.tooltip.randomWipDescription0": "Por favor, mantenga este artículo fuera del alcance de los niños", + "create.tooltip.randomWipDescription1": "Un bebé panda muere cada vez que usas este objeto. Cada vez. Cada vez", + "create.tooltip.randomWipDescription2": "Úsalo bajo tu propio riesgo", + "create.tooltip.randomWipDescription3": "Este no es el objeto que buscas, *mueve los dedos* por favor, dispérsate", + "create.tooltip.randomWipDescription4": "Este objeto se autodestruirá en 10 segundos. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Créeme, es inútil", + "create.tooltip.randomWipDescription6": "Al utilizar este elemento, aceptas nuestra exención de responsabilidad y estás de acuerdo con sus términos", + "create.tooltip.randomWipDescription7": "Este quizás no es para ti. ¿Qué tal ese?", + "create.tooltip.randomWipDescription8": "Úsalo y arrepiéntete de tu decisión inmediatamente", - "_": "Thank you for translating Create!" + "_": "Gracias por traducir Create!" -} \ No newline at end of file +} From 7aa175dd9cd46dcb695d9c23a7ed73c171c3ca4f Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 16 Feb 2021 15:13:48 -0800 Subject: [PATCH 114/147] fix gantry cogs skipping every half rotation --- .../structureMovement/gantry/GantryPinionRenderer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java index 86a498d12..7772d70de 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -59,7 +60,7 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer { .rotateY(alongFirst ^ facing.getAxis() == Axis.Z ? 90 : 0); ms.translate(0, -9 / 16f, 0); - ms.multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe / 2f)); + ms.multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe)); ms.translate(0, 9 / 16f, 0); msr.unCentre(); @@ -70,6 +71,12 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer { ms.pop(); } + public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { + float time = AnimationTickHolder.getRenderTick(); + float offset = getRotationOffsetForPosition(te, pos, axis); + return ((time * te.getSpeed() * 3f / 20 + offset) % 360) / 180 * (float) Math.PI; + } + @Override protected BlockState getRenderedBlockState(KineticTileEntity te) { return shaft(getRotationAxisOf(te)); From c4c57c6ba12df653cfacb95bc2f816782ce82a3a Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Tue, 16 Feb 2021 23:41:47 -0300 Subject: [PATCH 115/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index e9ac18a14..57c388c0a 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -1073,7 +1073,7 @@ "create.mechanical_arm.selection_mode.round_robin": "Round Robin", "create.mechanical_arm.selection_mode.forced_round_robin": "Round Robin forzado", - "create.mechanical_arm.selection_mode.prefer_first": "Preferir el primer objetivo": "Preferir el primer objetivo", + "create.mechanical_arm.selection_mode.prefer_first": "Preferir el primer objetivo", "create.tunnel.selection_mode.split": "División", "create.tunnel.selection_mode.forced_split": "División forzada", From 36553c6ee041228e22e9d67d35bee3668bc916aa Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 01:01:01 -0300 Subject: [PATCH 116/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 57c388c0a..e57c1e945 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -1078,7 +1078,7 @@ "create.tunnel.selection_mode.split": "División", "create.tunnel.selection_mode.forced_split": "División forzada", "create.tunnel.selection_mode.round_robin": "Round Robin", - "create.tunnel.selection_mode.forced_round_robin": "Round Robin forzado": "Round Robin forzado", + "create.tunnel.selection_mode.forced_round_robin": "Round Robin forzado", "create.tunnel.selection_mode.prefer_nearest": "Preferir el más cercano": "Preferir el más cercano", "create.tunnel.selection_mode.randomize": "Aleatorio": "Aleatorizar", "create.tunnel.selection_mode.synchronize": "Sincronizar entradas": "Sincronizar entradas", From a4c96be51c5d21643b17e693a36ac02d1dea8028 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 08:24:41 -0300 Subject: [PATCH 117/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index e57c1e945..5d3c13cf5 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -1079,9 +1079,9 @@ "create.tunnel.selection_mode.forced_split": "División forzada", "create.tunnel.selection_mode.round_robin": "Round Robin", "create.tunnel.selection_mode.forced_round_robin": "Round Robin forzado", - "create.tunnel.selection_mode.prefer_nearest": "Preferir el más cercano": "Preferir el más cercano", - "create.tunnel.selection_mode.randomize": "Aleatorio": "Aleatorizar", - "create.tunnel.selection_mode.synchronize": "Sincronizar entradas": "Sincronizar entradas", + "create.tunnel.selection_mode.prefer_nearest": "Preferir el más cercano", + "create.tunnel.selection_mode.randomize": "Aleatorizar", + "create.tunnel.selection_mode.synchronize": "Sincronizar entradas", "create.tooltip.chute.header": "Información del ducto", "create.tooltip.chute.items_move_down": "Los elementos se mueven hacia abajo", @@ -1110,14 +1110,14 @@ "create.gui.config.overlay2": "Esta es una muestra de la superposición", "create.gui.config.overlay3": "Haga clic o arrastre con el ratón", "create.gui.config.overlay4": "para mover esta vista previa", - "create.gui.config.overlay5": "Pulsar ESC para salir de esta pantalla", + "create.gui.config.overlay5": "Pulse ESC para salir de esta pantalla", "create.gui.config.overlay6": "y guardar la nueva posición", "create.gui.config.overlay7": "Ejecute /create overlay reset", "create.gui.config.overlay8": "para restablecer la posición por defecto", "create.command.killTPSCommand": "killtps", - "create.command.killTPSCommand.status.slowed_by.0": "[Crear]: El tick del servidor está actualmente ralentizado en %s ms :o", - "create.command.killTPSCommand.status.slowed_by.1": "[Crear]: El tick del servidor está ralentizado en %s ms ahora >:)", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: El tick del servidor está actualmente ralentizado en %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: El tick del servidor está ralentizado en %s ms ahora >:)", "create.command.killTPSCommand.status.slowed_by.2": "[Create]: El tick del servidor ha vuelto a su velocidad normal :D", "create.command.killTPSCommand.status.usage.0": "[Create]: usar /killtps stop para que el servidor vuelva a la velocidad normal", "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", From 159e298e8b1235811eb9255f56d1bbce7a71c06c Mon Sep 17 00:00:00 2001 From: Zelophed Date: Wed, 17 Feb 2021 02:34:55 +0100 Subject: [PATCH 118/147] paletted contraptions - use minecraft's palette-map during serialization and deserialization to reduce compound size in most cases - also update the placement_indicator sprite sheet --- .../structureMovement/Contraption.java | 159 ++++++++++++------ .../create/foundation/gui/AllGuiTextures.java | 2 +- .../resources/META-INF/accesstransformer.cfg | 5 +- .../textures/gui/placement_indicator.png | Bin 9385 -> 9488 bytes 4 files changed, 110 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 6fc93a511..45638b9a3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -28,11 +28,7 @@ import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBl import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.NBTProcessors; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.*; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.*; import net.minecraft.block.material.PushReaction; @@ -41,6 +37,7 @@ import net.minecraft.fluid.Fluids; import net.minecraft.fluid.IFluidState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.INBT; import net.minecraft.nbt.ListNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.state.properties.BlockStateProperties; @@ -55,6 +52,7 @@ import net.minecraft.util.Rotation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.palette.PaletteHashMap; import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; @@ -67,6 +65,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import net.minecraftforge.registries.GameData; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -595,51 +594,16 @@ public abstract class Contraption { presentTileEntities.clear(); renderedTileEntities.clear(); - nbt.getList("Blocks", 10) - .forEach(c -> { - CompoundNBT comp = (CompoundNBT) c; - BlockInfo info = new BlockInfo(NBTUtil.readBlockPos(comp.getCompound("Pos")), - NBTUtil.readBlockState(comp.getCompound("Block")), - comp.contains("Data") ? comp.getCompound("Data") : null); - blocks.put(info.pos, info); - - if (world.isRemote) { - Block block = info.state.getBlock(); - CompoundNBT tag = info.nbt; - MovementBehaviour movementBehaviour = AllMovementBehaviours.of(block); - if (tag == null || (movementBehaviour != null && movementBehaviour.hasSpecialMovementRenderer())) - return; - - tag.putInt("x", info.pos.getX()); - tag.putInt("y", info.pos.getY()); - tag.putInt("z", info.pos.getZ()); - - TileEntity te = TileEntity.create(tag); - if (te == null) - return; - te.setLocation(new WrappedWorld(world) { - - @Override - public BlockState getBlockState(BlockPos pos) { - if (!pos.equals(te.getPos())) - return Blocks.AIR.getDefaultState(); - return info.state; - } - - }, te.getPos()); - if (te instanceof KineticTileEntity) - ((KineticTileEntity) te).setSpeed(0); - te.getBlockState(); - presentTileEntities.put(info.pos, te); - renderedTileEntities.add(te); - } - }); + INBT blocks = nbt.get("Blocks"); + //used to differentiate between the 'old' and the paletted serialization + boolean usePalettedDeserialization = blocks != null && blocks.getId() == 10 && ((CompoundNBT) blocks).contains("Palette"); + readBlocksCompound(blocks, world, usePalettedDeserialization); actors.clear(); nbt.getList("Actors", 10) .forEach(c -> { CompoundNBT comp = (CompoundNBT) c; - BlockInfo info = blocks.get(NBTUtil.readBlockPos(comp.getCompound("Pos"))); + BlockInfo info = this.blocks.get(NBTUtil.readBlockPos(comp.getCompound("Pos"))); MovementContext context = MovementContext.readNBT(world, info, comp, this); getActors().add(MutablePair.of(info, context)); }); @@ -704,15 +668,8 @@ public abstract class Contraption { public CompoundNBT writeNBT(boolean spawnPacket) { CompoundNBT nbt = new CompoundNBT(); nbt.putString("Type", getType().id); - ListNBT blocksNBT = new ListNBT(); - for (BlockInfo block : this.blocks.values()) { - CompoundNBT c = new CompoundNBT(); - c.put("Block", NBTUtil.writeBlockState(block.state)); - c.put("Pos", NBTUtil.writeBlockPos(block.pos)); - if (block.nbt != null) - c.put("Data", block.nbt); - blocksNBT.add(c); - } + + CompoundNBT blocksNBT = writeBlocksCompound(); ListNBT actorsNBT = new ListNBT(); for (MutablePair actor : getActors()) { @@ -789,6 +746,100 @@ public abstract class Contraption { return nbt; } + private CompoundNBT writeBlocksCompound() { + CompoundNBT compound = new CompoundNBT(); + PaletteHashMap palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState); + ListNBT blockList = new ListNBT(); + + for (BlockInfo block : this.blocks.values()) { + int id = palette.idFor(block.state); + CompoundNBT c = new CompoundNBT(); + c.putLong("Pos", block.pos.toLong()); + c.putInt("State", id); + if (block.nbt != null) + c.put("Data", block.nbt); + blockList.add(c); + } + + ListNBT paletteNBT = new ListNBT(); + palette.writePaletteToList(paletteNBT); + compound.put("Palette", paletteNBT); + compound.put("BlockList", blockList); + + return compound; + } + + private void readBlocksCompound(INBT compound, World world, boolean usePalettedDeserialization) { + PaletteHashMap palette = null; + ListNBT blockList; + if (usePalettedDeserialization) { + CompoundNBT c = ((CompoundNBT) compound); + palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState); + palette.read(c.getList("Palette", 10)); + + blockList = c.getList("BlockList", 10); + } else { + blockList = (ListNBT) compound; + } + + PaletteHashMap finalPalette = palette; + blockList.forEach(e -> { + CompoundNBT c = (CompoundNBT) e; + + BlockInfo info = usePalettedDeserialization ? readBlockInfo(c, finalPalette) : legacyReadBlockInfo(c); + + this.blocks.put(info.pos, info); + + if (world.isRemote) { + Block block = info.state.getBlock(); + CompoundNBT tag = info.nbt; + MovementBehaviour movementBehaviour = AllMovementBehaviours.of(block); + if (tag == null || (movementBehaviour != null && movementBehaviour.hasSpecialMovementRenderer())) + return; + + tag.putInt("x", info.pos.getX()); + tag.putInt("y", info.pos.getY()); + tag.putInt("z", info.pos.getZ()); + + TileEntity te = TileEntity.create(tag); + if (te == null) + return; + te.setLocation(new WrappedWorld(world) { + + @Override + public BlockState getBlockState(BlockPos pos) { + if (!pos.equals(te.getPos())) + return Blocks.AIR.getDefaultState(); + return info.state; + } + + }, te.getPos()); + if (te instanceof KineticTileEntity) + ((KineticTileEntity) te).setSpeed(0); + te.getBlockState(); + presentTileEntities.put(info.pos, te); + renderedTileEntities.add(te); + } + + }); + } + + private static BlockInfo readBlockInfo(CompoundNBT blockListEntry, PaletteHashMap palette) { + return new BlockInfo( + BlockPos.fromLong(blockListEntry.getLong("Pos")), + Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))), + blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null + ); + } + + private static BlockInfo legacyReadBlockInfo(CompoundNBT blockListEntry) { + return new BlockInfo( + NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")), + NBTUtil.readBlockState(blockListEntry.getCompound("Block")), + blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null + ); + } + public void removeBlocksFromWorld(World world, BlockPos offset) { storage.values() .forEach(MountedStorage::removeStorageFromWorld); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 520cde09e..c66f911bb 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -79,7 +79,7 @@ public enum AllGuiTextures { INDICATOR_RED("widgets.png", 72, 18, 18, 6), // PlacementIndicator - PLACEMENT_INDICATOR_SHEET("placement_indicator.png", 0, 0, 256, 256); + PLACEMENT_INDICATOR_SHEET("placement_indicator.png", 0, 0, 16, 256); ; diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 22c960e77..254548d6f 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -26,4 +26,7 @@ public net.minecraft.world.server.ServerTickList field_205374_d # pendingTickLis public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet # GameRenderer -public net.minecraft.client.renderer.GameRenderer func_215311_a(Lnet/minecraft/client/renderer/ActiveRenderInfo;FZ)D #getFOVModifier \ No newline at end of file +public net.minecraft.client.renderer.GameRenderer func_215311_a(Lnet/minecraft/client/renderer/ActiveRenderInfo;FZ)D #getFOVModifier + +# IResizeCallback +public net.minecraft.util.palette.IResizeCallback \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/gui/placement_indicator.png b/src/main/resources/assets/create/textures/gui/placement_indicator.png index cb53a47fcb3c027831ef62e2a077a255fb5ddeaf..d433d9b2d532806e2c64c137b9dc8dd6ac94cb99 100644 GIT binary patch delta 5670 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 P00000NkvXXu0mjfTwE@e From d187dc0b38d75524580d0e26b93e4c0eb766e40b Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 14:50:28 -0300 Subject: [PATCH 119/147] Update es_es.json --- .../resources/assets/create/lang/es_es.json | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 5d3c13cf5..53b2b7240 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -30,13 +30,13 @@ "block.create.black_sail": "Vela negra", "block.create.black_seat": "Asiento negro", "block.create.black_valve_handle": "Asa de válvula negra", - "block.create.blaze_burner": "Blaze Burner", + "block.create.blaze_burner": "Quemador de Blaze", "block.create.blue_sail": "Vela azul", "block.create.blue_seat": "Asiento azul", "block.create.blue_valve_handle": "Asa de válvula azul", "block.create.brass_belt_funnel": "Cinturón de embudo de bronce", "block.create.brass_block": "Bloque de bronce", - "block.create.brass_casing": "Recubridor de bronce", + "block.create.brass_casing": "Revestidor de bronce", "block.create.brass_encased_shaft": "Eje revestido de bronce", "block.create.brass_funnel": "Embudo de bronce", "block.create.brass_tunnel": "Túnel de bronce", @@ -60,8 +60,8 @@ "block.create.copper_block": "Bloque de cobre", "block.create.copper_casing": "Bloque de caliza", "block.create.copper_ore": "Mineral de cobre", - "block.create.copper_shingles": "Teja de cobre", - "block.create.copper_tiles": "Baldosa de cobre", + "block.create.copper_shingles": "Bloque de baldosa de cobre", + "block.create.copper_tiles": "Bloque de tejas de cobre", "block.create.copper_valve_handle": "Asa de válvula de cobre", "block.create.creative_crate": "Caja creativa", "block.create.creative_fluid_tank": "Tanque de fluídos creativo", @@ -220,7 +220,7 @@ "block.create.limestone_cobblestone_wall": "Pared de adoquines de piedra caliza", "block.create.limestone_pillar": "Pilar de piedra caliza", "block.create.linear_chassis": "Chasis lineal", - "block.create.lit_blaze_burner": "Lit Blaze Burner", + "block.create.lit_blaze_burner": "Quemador de Blaze encendido", "block.create.magenta_sail": "Vela magenta", "block.create.magenta_seat": "Asiento magenta", "block.create.magenta_valve_handle": "Asa de válvula magenta", @@ -337,7 +337,7 @@ "block.create.powered_latch": "Palanca motorizada", "block.create.powered_toggle_latch": "Palanca de cierre motorizada", "block.create.pulley_magnet": "Imán de la polea", - "block.create.pulse_repeater": "Repetidor de pulsos", + "block.create.pulse_repeater": "Repetidor de pulsos de Redstone", "block.create.purple_sail": "Vela morada", "block.create.purple_seat": "Asiento morado", "block.create.purple_valve_handle": "Asa de válvula morada", @@ -419,8 +419,8 @@ "item.create.attribute_filter": "Filtro de atributos", "item.create.bar_of_chocolate": "Barra de chocolate", "item.create.belt_connector": "Cinturón conector", - "item.create.blaze_cake": "Pastel Blaze", - "item.create.blaze_cake_base": "Base de pastel Blaze", + "item.create.blaze_cake": "Pastel de Blaze", + "item.create.blaze_cake_base": "Base de Pastel de Blaze", "item.create.brass_hand": "Mano de bronce", "item.create.brass_ingot": "Lingote de bronce", "item.create.brass_nugget": "Pepita de bronce", @@ -433,25 +433,25 @@ "item.create.copper_ingot": "Lingote de cobre", "item.create.copper_nugget": "Pepita de cobre", "item.create.copper_sheet": "Lámina de cobre", - "item.create.crafter_slot_cover": "Tapa de la ranura del Mecanizador", - "item.create.crushed_aluminum_ore": "Mineral de aluminio triturado", - "item.create.crushed_brass": "Bronce triturado", - "item.create.crushed_copper_ore": "Mineral de cobre triturado", - "item.create.crushed_gold_ore": "Mineral de oro triturado", - "item.create.crushed_iron_ore": "Mineral de hierro triturado", - "item.create.crushed_lead_ore": "Mineral de plomo triturado", - "item.create.crushed_nickel_ore": "Mineral de níquel triturado", - "item.create.crushed_osmium_ore": "Mineral de osmio triturado", - "item.create.crushed_platinum_ore": "Mineral de platino triturado", - "item.create.crushed_quicksilver_ore": "Mineral de mercurio triturado", - "item.create.crushed_silver_ore": "Mineral de plata triturado", - "item.create.crushed_tin_ore": "Mineral de estaño triturado", - "item.create.crushed_uranium_ore": "Mineral de uranio triturado", - "item.create.crushed_zinc_ore": "Mineral de zinc triturado", + "item.create.crafter_slot_cover": "Tapa de ranura del Mecanizador", + "item.create.crushed_aluminum_ore": "Mineral de aluminio molido", + "item.create.crushed_brass": "Bronce molido", + "item.create.crushed_copper_ore": "Mineral de cobre molido", + "item.create.crushed_gold_ore": "Mineral de oro molido", + "item.create.crushed_iron_ore": "Mineral de hierro molido", + "item.create.crushed_lead_ore": "Mineral de plomo molido", + "item.create.crushed_nickel_ore": "Mineral de níquel molido", + "item.create.crushed_osmium_ore": "Mineral de osmio molido", + "item.create.crushed_platinum_ore": "Mineral de platino molido", + "item.create.crushed_quicksilver_ore": "Mineral de mercurio molido", + "item.create.crushed_silver_ore": "Mineral de plata molido", + "item.create.crushed_tin_ore": "Mineral de estaño molido", + "item.create.crushed_uranium_ore": "Mineral de uranio molido", + "item.create.crushed_zinc_ore": "Mineral de zinc molido", "item.create.deforester": "Deforestador", "item.create.dough": "Masilla", "item.create.electron_tube": "Tubo de electrones", - "item.create.empty_blaze_burner": "Quemador Blaze vacío", + "item.create.empty_blaze_burner": "Quemador de Blaze vacío", "item.create.empty_schematic": "Esquema vacío", "item.create.extendo_grip": "Agarre extendido", "item.create.filter": "Filtro", @@ -568,7 +568,7 @@ "advancement.create.compact": "Compactación automática", "advancement.create.compact.desc": "Utiliza una prensa y una palangana para compactar algunos elementos.", "advancement.create.brass": "Aleaciones reales", - "advancement.create.brass.desc": "Utiliza Cobre Triturado y Zinc Triturado para crear algo de bronce.", + "advancement.create.brass.desc": "Utiliza Cobre molido y Zinc molido para crear algo de bronce.", "advancement.create.brass_casing": "La Edad de Bronce", "advancement.create.brass_casing.desc": "Utiliza el bronce recién obtenido y algo de madera para crear un revestimiento más avanzado.", "advancement.create.copper_casing": "La Edad de Cobre", @@ -620,13 +620,13 @@ "advancement.create.arm_many_targets": "Organize-o-Tron", "advancement.create.arm_many_targets.desc": "Programar un brazo mecánico con diez o más posiciones de salida.", "advancement.create.arm_blaze_burner": "Combust-o-Tron", - "advancement.create.arm_blaze_burner.desc": "Instruya un brazo mecánico para alimentar su Quemador Blaze.", + "advancement.create.arm_blaze_burner.desc": "Instruya un brazo mecánico para alimentar su Quemador de Blaze.", "advancement.create.fist_bump": "¡Pégale, hermano!", "advancement.create.fist_bump.desc": "Hacer que dos Desplegadores se den un puñetazo.", "advancement.create.crushing_wheel": "Un par de gigantes", "advancement.create.crushing_wheel.desc": "Crea algunas Ruedas de trituración para descomponer más materiales de forma más eficaz.", "advancement.create.blaze_cake": "Fiebre del azúcar", - "advancement.create.blaze_cake.desc": "Hornea en tu Quemador de Blaze una Tarta especial.", + "advancement.create.blaze_cake.desc": "Hornea en tu Quemador de Blaze un pastel especial.", "advancement.create.chromatic_compound": "Minerales bipolares", "advancement.create.chromatic_compound.desc": "Crea una Barra de Compuesto Cromático.", "advancement.create.shadow_steel": "Retorno del vacío", @@ -984,8 +984,8 @@ "create.item_attributes.washable.inverted": "no se puede lavar", "create.item_attributes.smokable": "puede ser ahumado", "create.item_attributes.smokable.inverted": "no puede ser ahumado", - "create.item_attributes.crushable": "puede ser triturado", - "create.item_attributes.crushable.inverted": "no puede ser triturado", + "create.item_attributes.crushable": "puede ser molido", + "create.item_attributes.crushable.inverted": "no puede ser molido", "create.item_attributes.blastable": "es fundible en el alto horno", "create.item_attributes.blastable.inverted": "no es fundible en el alto horno", "create.item_attributes.enchanted": "está encantado", @@ -1051,7 +1051,7 @@ "create.tooltip.speedRequirement.none": "Ninguno", "create.tooltip.speedRequirement.medium": "Moderado", "create.tooltip.speedRequirement.high": "Rápido", - "create.tooltip.stressImpact": "Impacto del estrés: %1$s", + "create.tooltip.stressImpact": "Impacto de estrés: %1$s", "create.tooltip.stressImpact.low": "Bajo", "create.tooltip.stressImpact.medium": "Moderado", "create.tooltip.stressImpact.high": "Alto", @@ -1060,7 +1060,7 @@ "create.tooltip.capacityProvided.low": "Pequeña", "create.tooltip.capacityProvided.medium": "Media", "create.tooltip.capacityProvided.high": "Grande", - "create.tooltip.capacityProvided.asGenerator": "(Como Generador)", + "create.tooltip.capacityProvided.asGenerator": "(Como generador)", "create.tooltip.generationSpeed": "Genera en %1$s %2$s", "create.tooltip.analogStrength": "Fuerza analógica: %1$s/15", @@ -1096,7 +1096,7 @@ "create.hint.hose_pulley.title": "Suministro sin fondo", "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita", "create.hint.mechanical_arm_no_targets.title": "No hay objetivos", - "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona cinturones, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_." + "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona cinturones, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.", "create.hint.horizontal_funnel.title": "Embudos horizontales", "create.hint.horizontal_funnel": "No puede transferir entre inventarios _directamente_. Intenta pasar un _cinturón_ o un _depósito_ por debajo de tu embudo para extraer artículos de los inventarios", "create.hint.upward_funnel.title": "Embudos hacia arriba", @@ -1104,20 +1104,20 @@ "create.hint.empty_bearing.title": "Rodamiento de reloj", "create.hint.empty_bearing": "_Haz clic con el botón derecho del ratón_ en el rodamiento con la _mano vacía_ para _adherir_ la estructura que acabas de construir delante de él", "create.hint.full_deployer.title": "Desbordamiento de elementos del desplegador", - "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _elementos_ en exceso que necesitan ser _extraídos._ Usa un _tolva,_embudo_ u otro medio para liberarlo de su desbordamiento." + "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _elementos_ en exceso que necesitan ser _extraídos._ Usa un _tolva,_embudo_ u otro medio para liberarlo de su desbordamiento.", "create.gui.config.overlay1": "Hola :)", "create.gui.config.overlay2": "Esta es una muestra de la superposición", "create.gui.config.overlay3": "Haga clic o arrastre con el ratón", "create.gui.config.overlay4": "para mover esta vista previa", - "create.gui.config.overlay5": "Pulse ESC para salir de esta pantalla", + "create.gui.config.overlay5": "Pulsar ESC para salir de esta pantalla", "create.gui.config.overlay6": "y guardar la nueva posición", "create.gui.config.overlay7": "Ejecute /create overlay reset", "create.gui.config.overlay8": "para restablecer la posición por defecto", "create.command.killTPSCommand": "killtps", - "create.command.killTPSCommand.status.slowed_by.0": "[Create]: El tick del servidor está actualmente ralentizado en %s ms :o", - "create.command.killTPSCommand.status.slowed_by.1": "[Create]: El tick del servidor está ralentizado en %s ms ahora >:)", + "create.command.killTPSCommand.status.slowed_by.0": "[Crear]: El tick del servidor está actualmente ralentizado en %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Crear]: El tick del servidor está ralentizado en %s ms ahora >:)", "create.command.killTPSCommand.status.slowed_by.2": "[Create]: El tick del servidor ha vuelto a su velocidad normal :D", "create.command.killTPSCommand.status.usage.0": "[Create]: usar /killtps stop para que el servidor vuelva a la velocidad normal", "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", @@ -1225,7 +1225,7 @@ "block.create.depot.tooltip.condition1": "Click derecho en el depósito", "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con un _Cinturón_ también funcionan en un _Depósito_.", - "item.create.blaze_cake.tooltip": "TORTA DE BLAZE", + "item.create.blaze_cake.tooltip": "PASTEL DE BLAZE", "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _Quemadores de blaze_. Los pone en marcha!.", "item.create.empty_blaze_burner.tooltip": "QUEMADOR DE BLAZE VACÍO", @@ -1435,7 +1435,7 @@ "item.create.goggles.tooltip": "GAFAS DEL INGENIERO", "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar tu visión con útil información _cinética_", "item.create.goggles.tooltip.condition1": "Cuando se llevan puestas", - "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _Nivel de velocidad_ de un componente cinético colocado, así como el _Impacto de estrés_ y la _Capacidad_ de los componentes individuales." + "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _Nivel de velocidad_ de un componente cinético colocado, así como el _Impacto de estrés_ y la _Capacidad_ de los componentes individuales.", "item.create.goggles.tooltip.condition2": "Al mirar el medidor", "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre _Velocidad_ o _Estrés_ de la red a la que está conectado el medidor", @@ -1542,14 +1542,14 @@ "block.create.portable_storage_interface.tooltip": "INTERFAZ DE ALMACENAMIENTO PORTÁTIL", "block.create.portable_storage_interface.tooltip.summary": "Un punto de intercambio portátil para _mover elementos_ hacia y desde una _estructura_ movida por un pistón, rodamiento, vagoneta o polea. Para cumplirse dos interfaces tienen que _enfrentarse_ y estar separadas _1-2 bloques_", "block.create.portable_storage_interface.tooltip.condition1": "Mientras se mueve", - "block.create.portable_storage_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátil_ estacionarias para transferir elementos hacia o desde el artilugio. Los componentes que se inserten o extraigan de la _interfaz estacionaria_ interactuarán con los inventarios del artilugio _directamente._ La estructura se detendrá brevemente mientras se intercambian los elementos." + "block.create.portable_storage_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátil_ estacionarias para transferir elementos hacia o desde el artilugio. Los componentes que se inserten o extraigan de la _interfaz estacionaria_ interactuarán con los inventarios del artilugio _directamente._ La estructura se detendrá brevemente mientras se intercambian los elementos.", "block.create.portable_storage_interface.tooltip.condition2": "Cuando es alimentado por Redstone", "block.create.portable_storage_interface.tooltip.behaviour2": "Desactiva_ cualquier conexión activa inmediatamente", "block.create.portable_fluid_interface.tooltip": "INTERFAZ DE FLUIDO PORTÁTIL", "block.create.portable_fluid_interface.tooltip.summary": "Punto de intercambio portátil para _mover fluidos_ hacia y desde una _estructura_ movida por un pistón, rodamiento, vagoneta o polea. Para cumplirse dos interfaces tienen que _enfrentarse_ y estar separadas _1-2 bloques_", "block.create.portable_fluid_interface.tooltip.condition1": "Mientras se mueve", - "block.create.portable_fluid_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátiles_ estacionarias para transferir fluidos hacia o desde el artilugio. Las tuberías que se inserten en la _interfaz estacionaria_ o se extraigan de ella interactuarán con los depósitos del artilugio _directamente._ La estructura se paralizará brevemente mientras se intercambian fluidos." + "block.create.portable_fluid_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátiles_ estacionarias para transferir fluidos hacia o desde el artilugio. Las tuberías que se inserten en la _interfaz estacionaria_ o se extraigan de ella interactuarán con los depósitos del artilugio _directamente._ La estructura se paralizará brevemente mientras se intercambian fluidos.", "block.create.portable_fluid_interface.tooltip.condition2": "Cuando se alimenta con Redstone", "block.create.portable_fluid_interface.tooltip.behaviour2": "_Desconecta_ cualquier conexión activa inmediatamente", @@ -1576,7 +1576,7 @@ "block.create.windmill_bearing.tooltip": "RODAMIENTO DEL MOLINO DE VIENTO", "block.create.windmill_bearing.tooltip.summary": "Se utiliza para aprovechar la _fuerza de rotación_ del viento. Coloca tu propio diseño y mira cómo gira!", "block.create.windmill_bearing.tooltip.condition1": "Al hacer clic con el botón derecho", - "block.create.windmill_bearing.tooltip.behaviour1": "Comienza a proporcionar _Fuerza de rotación_ generada por la rotación de su estructura adjunta. La estructura tiene que incluir bloques de vela o lana adecuados. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque." + "block.create.windmill_bearing.tooltip.behaviour1": "Comienza a proporcionar _Fuerza de rotación_ generada por la rotación de su estructura adjunta. La estructura tiene que incluir bloques de vela o lana adecuados. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque.", "block.create.sail_frame.tooltip": "MARCO DE VELA", "block.create.sail_frame.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada sobre un _Rodamiento de molino_", @@ -1633,7 +1633,7 @@ "bloque.crear.chasis_radial.tooltip": "CHASIS DE ROTACIÓN", "block.create.radial_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", "block.create.radial_chassis.tooltip.condition1": "Cuando se mueve", - "block.create.radial_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis_ adjuntos en una columna, y un cilindro de bloques a su alrededor. Los bloques que lo rodean sólo se mueven cuando están dentro del rango y están adheridos a un lado pegajoso (Ver [Ctrl])." + "block.create.radial_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis_ adjuntos en una columna, y un cilindro de bloques a su alrededor. Los bloques que lo rodean sólo se mueven cuando están dentro del rango y están adheridos a un lado pegajoso (Ver [Ctrl]).", "block.create.radial_chassis.tooltip.condition2": "Con Llave Inglesa", "block.create.radial_chassis.tooltip.behaviour2": "Configura el _rango_ para este bloque de chasis. Mantenga pulsada la tecla CTRL para modificar también el rango de todos los bloques de chasis adjuntos", "block.create.radial_chassis.tooltip.control1": "Cuando se hace clic derecho con slime", @@ -1713,12 +1713,12 @@ "block.create.deployer.tooltip.condition2": "Click derecho con la Llave Inglesa", "block.create.deployer.tooltip.behaviour2": "Activa el modo puñetazo. En el _modo puñetazo_, el Desplegador intentará usar su objeto para _romper bloques_ o _herir entidades_", "block.create.deployer.tooltip.condition3": "Cuando se asigna el filtro", - "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos." + "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos.", "block.create.brass_casing.tooltip": "REVESTIDORA DE BRONCE", "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _cinturones conectores._", - "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSO", + "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSOS DE REDSTONE", "block.create.pulse_repeater.tooltip.summary": "Un circuito sencillo para cortar las señales de Redstone que pasan a una longitud de _1 tick_", "block.create.adjustable_repeater.tooltip": "REPETIDOR AJUSTABLE", @@ -1777,7 +1777,7 @@ "item.create.minecart_coupling.tooltip.condition1": "Cuando se utiliza en Vagonetas", "item.create.minecart_coupling.tooltip.behaviour1": "_Acopla_ dos Vagonetas, intentando mantenerlas a una _distancia constante_ mientras se mueven", - "item.create.crafter_slot_cover.tooltip": "TAPA DE LA RANURA DEL MECANIZADOR", + "item.create.crafter_slot_cover.tooltip": "TAPA DE RANURA DEL MECANIZADOR", "item.create.crafter_slot_cover.tooltip.summary": "Se utiliza para marcar a un _Mecanizador_ una ranura vacía en una receta. Los mecanizadores no tienen que formar necesariamente una cuadrícula completa. Esto es útil cuando hay recetas en las que los _ingredientes están en diagonal_ entre sí", "create.tooltip.wip": "WIP", From a5d6262424a8d99096a036d76c961f4fbbf66ec7 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 17 Feb 2021 11:24:40 -0800 Subject: [PATCH 120/147] fix mechanical crafter cogs --- .../crafter/MechanicalCrafterInstance.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java index 8b7a327ec..74c889e01 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java @@ -23,7 +23,7 @@ public class MechanicalCrafterInstance extends SingleRotatingInstance { InstancedTileRenderRegistry.instance.register(type, MechanicalCrafterInstance::new)); } - public MechanicalCrafterInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public MechanicalCrafterInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } @@ -33,12 +33,14 @@ public class MechanicalCrafterInstance extends SingleRotatingInstance { Supplier ms = () -> { MatrixStack stack = new MatrixStack(); - MatrixStacker.of(stack) - .centre() - .rotateZ(90) - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing)) - .unCentre(); + MatrixStacker stacker = MatrixStacker.of(stack).centre(); + + if (facing.getAxis() == Direction.Axis.X) + stacker.rotateZ(90); + else if (facing.getAxis() == Direction.Axis.Z) + stacker.rotateX(90); + + stacker.unCentre(); return stack; }; return rotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, lastState, facing, ms); From 2f9607a1962e3f9983945048ec6ea5bb2aa6f72f Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 16:29:35 -0300 Subject: [PATCH 121/147] Update es_es.json --- .../resources/assets/create/lang/es_es.json | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 53b2b7240..b2fa00290 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -9,12 +9,12 @@ "block.create.adjustable_pulse_repeater": "Repetidor de pulso ajustable", "block.create.adjustable_repeater": "Repetidor ajustable", "block.create.analog_lever": "Palanca analógica", - "block.create.andesite_belt_funnel": "Cinturón de embudo de andesita", + "block.create.andesite_belt_funnel": "Embudo de correa de andesita", "block.create.andesite_bricks": "Ladrillos de andesita", "block.create.andesite_bricks_slab": "Losa de ladrillos de andesita", "block.create.andesite_bricks_stairs": "Escaleras de ladrillos de andesita", "block.create.andesite_bricks_wall": "Pared de ladrillos de andesita", - "block.create.andesite_casing": "Andesita revestida", + "block.create.andesite_casing": "Revestidor de andesita", "block.create.andesite_cobblestone": "Adoquín de andesita", "block.create.andesite_cobblestone_slab": "Losa de adoquín de andesita", "block.create.andesite_cobblestone_stairs": "Escaleras de adoquines de andesita", @@ -24,7 +24,7 @@ "block.create.andesite_pillar": "Poste de andesita", "block.create.andesite_tunnel": "Túnel de Andesita", "block.create.basin": "Cuenca", - "block.create.belt": "Cinturón mecánico", + "block.create.belt": "Correa", "block.create.birch_window": "Ventana de abedul", "block.create.birch_window_pane": "Panel de ventana de abedul", "block.create.black_sail": "Vela negra", @@ -34,7 +34,7 @@ "block.create.blue_sail": "Vela azul", "block.create.blue_seat": "Asiento azul", "block.create.blue_valve_handle": "Asa de válvula azul", - "block.create.brass_belt_funnel": "Cinturón de embudo de bronce", + "block.create.brass_belt_funnel": "Embudo de correa de bronce", "block.create.brass_block": "Bloque de bronce", "block.create.brass_casing": "Revestidor de bronce", "block.create.brass_encased_shaft": "Eje revestido de bronce", @@ -58,7 +58,7 @@ "block.create.content_observer": "Observador de contenidos", "block.create.controller_rail": "Raíl de control", "block.create.copper_block": "Bloque de cobre", - "block.create.copper_casing": "Bloque de caliza", + "block.create.copper_casing": "Revestidor de caliza", "block.create.copper_ore": "Mineral de cobre", "block.create.copper_shingles": "Bloque de baldosa de cobre", "block.create.copper_tiles": "Bloque de tejas de cobre", @@ -347,7 +347,7 @@ "block.create.red_valve_handle": "Asa de válvula roja", "block.create.redstone_contact": "Contacto de Redstone", "block.create.redstone_link": "Enlace de Redstone", - "block.create.refined_radiance_casing": "Revestimiento radiante refinado", + "block.create.refined_radiance_casing": "Revestidor de radiante", "block.create.reinforced_rail": "Raíl reforzado", "block.create.rope": "Soga", "block.create.rope_pulley": "Polea de cuerda", @@ -367,7 +367,7 @@ "block.create.scoria_pillar": "Pilar de escoria", "block.create.secondary_linear_chassis": "Chasis lineal secundario", "block.create.sequenced_gearshift": "Palanca de cambios secuencial", - "block.create.shadow_steel_casing": "Revestimiento sombrío", + "block.create.shadow_steel_casing": "Revestidor sombrío", "block.create.shaft": "Eje", "block.create.smart_chute": "Ducto inteligente", "block.create.smart_fluid_pipe": "Tubería de fluídos inteligente", @@ -418,7 +418,7 @@ "item.create.andesite_alloy": "Aleación de andesita", "item.create.attribute_filter": "Filtro de atributos", "item.create.bar_of_chocolate": "Barra de chocolate", - "item.create.belt_connector": "Cinturón conector", + "item.create.belt_connector": "Conector de correa", "item.create.blaze_cake": "Pastel de Blaze", "item.create.blaze_cake_base": "Base de Pastel de Blaze", "item.create.brass_hand": "Mano de bronce", @@ -500,19 +500,19 @@ "advancement.create.overstressed": "Sobrecargado", "advancement.create.overstressed.desc": "Experimenta los límites del estrés.", "advancement.create.belt": "Paseo de algas", - "advancement.create.belt.desc": "Conectar dos ejes con un cinturón mecánico.", + "advancement.create.belt.desc": "Conectar dos ejes con una correa.", "advancement.create.tunnel": "Cúbrete!", - "advancement.create.tunnel.desc": "Embellece tu cinturón mecánico con un Túnel.", + "advancement.create.tunnel.desc": "Embellece tu correa con un Túnel.", "advancement.create.splitter_tunnel": "Divide y vencerás", "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de bronce.", "advancement.create.chute": "Caída en picado", - "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical del cinturón.", + "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la correa.", "advancement.create.upward_chute": "Abducción aérea", "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela hacia un paracaídas impulsado por un ventilador.", "advancement.create.belt_funnel": "Colgantes con forma de embudo", "advancement.create.belt_funnel.desc": "Coloca un embudo lateral encima de una cinta o depósito para crear un tipo especial.", "advancement.create.belt_funnel_kiss": "Los loros y las aletas", - "advancement.create.belt_funnel_kiss.desc": "Haz besar dos embudos montados con un cinturón.", + "advancement.create.belt_funnel_kiss.desc": "Haz besar dos embudos montados con una correa.", "advancement.create.fan": "Maestro mecánico del aire", "advancement.create.fan.desc": "Monta la corriente de aire proporcionada por un ventilador revestido.", "advancement.create.fan_lava": "Calentador geotérmico", @@ -532,7 +532,7 @@ "advancement.create.aesthetics": "Boom, Estética!", "advancement.create.aesthetics.desc": "Colocar los soportes en un eje, tubo y rueda dentada.", "advancement.create.reinforced": "Boom, Reforzado!", - "advancement.create.reinforced.desc": "Utilización de bloques de revestimiento en un eje, un tubo y un cinturón mecánico.", + "advancement.create.reinforced.desc": "Utilizar bloques de revestimiento en un eje, un tubo y una correa.", "advancement.create.water_wheel": "Aprovechar la hidráulica", "advancement.create.water_wheel.desc": "Coloca una Rueda hidráulica e intenta hacerla girar.", "advancement.create.chocolate_wheel": "Potencia de buen gusto", @@ -1096,9 +1096,9 @@ "create.hint.hose_pulley.title": "Suministro sin fondo", "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita", "create.hint.mechanical_arm_no_targets.title": "No hay objetivos", - "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona cinturones, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.", + "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona correas, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.", "create.hint.horizontal_funnel.title": "Embudos horizontales", - "create.hint.horizontal_funnel": "No puede transferir entre inventarios _directamente_. Intenta pasar un _cinturón_ o un _depósito_ por debajo de tu embudo para extraer artículos de los inventarios", + "create.hint.horizontal_funnel": "No puede transferir entre inventarios _directamente_. Intenta pasar una _correa_ o un _depósito_ por debajo de tu embudo para extraer artículos de los inventarios", "create.hint.upward_funnel.title": "Embudos hacia arriba", "create.hint.upward_funnel": "sólo pueden transferir objetos insertados por _brazos_, y _ductos_ impulsados por ventilador, o elementos _lanzados_ hacia ellos. Intenta construir algunos _ductos_ si quieres mover tus objetos _verticalmente_", "create.hint.empty_bearing.title": "Rodamiento de reloj", @@ -1158,20 +1158,20 @@ "block.create.metal_bracket.tooltip": "SOPORTE DE METAL PARA EJES", "block.create.metal_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un poco de refuerzo industrial robusto.", - "block.create.andesite_casing.tooltip": "REVESTIDORA DE ANDESITA", - "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _encastrar ejes_ y _cinturones mecánicos._", + "block.create.andesite_casing.tooltip": "REVESTIDOR DE ANDESITA", + "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _encastrar ejes_ y _correas._", "block.create.andesite_funnel.tooltip": "EMBUDO DE ANDESITA", "block.create.andesite_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_.", "block.create.andesite_funnel.tooltip.condition1": "Comportamiento general", "block.create.andesite_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo", - "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en cinturones, depósitos y similares", + "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en correas, depósitos y similares", "block.create.andesite_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave.", "block.create.andesite_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", "block.create.andesite_funnel.tooltip.behaviour3": "Transferirá los artículos hacia abajo, como una tolva sin búfer.", "block.create.andesite_tunnel.tooltip": "TÚNEL DE ANDESITA", - "block.create.andesite_tunnel.tooltip.summary": "Una cubierta protectora para sus _Cinturones Mecánicos_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otro cinturón o depósito al lado del cinturón principal.", + "block.create.andesite_tunnel.tooltip.summary": "¡Una cubierta protectora para sus _correas_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otra correa o depósito al lado de la correa principal.", "block.create.andesite_tunnel.tooltip.control1": "Click derecho con la Llave Inglesa en el lateral", "block.create.andesite_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", @@ -1179,15 +1179,15 @@ "block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_. Viene con un práctico _filtro_.", "block.create.brass_funnel.tooltip.condition1": "Comportamiento General", "block.create.brass_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo.", - "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en cinturones, depósitos y similares", + "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en correas, depósitos y similares", "block.create.brass_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave Inglesa.", "block.create.brass_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", "block.create.brass_funnel.tooltip.behaviour3": "Transfiere los artículos hacia abajo, como una tolva sin búfer.", "block.create.brass_tunnel.tooltip": "TÚNEL DE BRONCE", - "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _Cinturones mecánicos_. Los _Túneles de bronce_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", + "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _correas_. Los _Túneles de bronce_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", "block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro", - "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de bronce se conectan entre sí y permiten redirigir el contenido de un cinturón a otro.", + "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de bronce se conectan entre sí y permiten redirigir el contenido de una correa a otra.", "block.create.brass_tunnel.tooltip.condition2": "Filtrado", "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles de bronces_ vienen con filtros tanto para la _Entrada_ como para la _Salida_. Si un _Elemento_ no está permitido desde la salida filtrada de un _Túnel_ será transferido a la salida de un _Túnel_ conectado.", "block.create.brass_tunnel.tooltip.condition3": "Dividiendo", @@ -1197,7 +1197,7 @@ "block.create.brass_tunnel.tooltip.control2": "Scroll con Llave Inglesa en la parte superior", "block.create.brass_tunnel.tooltip.action2": "Cambiar el método de división de los _Túneles_ conectados.", - "block.create.copper_casing.tooltip": "REVESTIDORA DE COBRE", + "block.create.copper_casing.tooltip": "REVESTIDOR DE COBRE", "block.create.copper_casing.tooltip.summary": "Robusta máquina de revestimientos con una gran variedad de usos. Seguro para la decoración.", "block.create.copper_casing.tooltip.condition1": "Cuando se utiliza en una tubería de fluídos", "block.create.copper_casing.tooltip.behaviour1": "_Reviste_ la _Tubería de fluídos_ con _Revestimiento de cobre_. Las tuberías de fluídos revestidas _bloquean sus conexiones_ en su lugar, dejando de reaccionar a los cambios en las tuberías vecinas.", @@ -1218,12 +1218,12 @@ "block.create.chute.tooltip": "DUCTO", "block.create.chute.tooltip.summary": "_Recoge_ y _Transporta_ elementos en vertical o en diagonal. Puede tanto coger como colocar objetos en _contenedores de objetos_. También puede interactuar con los ductos desde el lateral utilizando _tolvas_ o _embudos montados_.", "block.create.chute.tooltip.condition1": "Cuando se alimenta con un ventilador", - "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de los _cinturones_.", + "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de las _correas_.", "block.create.depot.tooltip": "DEPÓSITO", "block.create.depot.tooltip.summary": "Un lugar práctico para colocar sus _elementos_. Proporciona un punto de interacción para varias máquinas", "block.create.depot.tooltip.condition1": "Click derecho en el depósito", - "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con un _Cinturón_ también funcionan en un _Depósito_.", + "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con una _Correa_ también funcionan en un _Depósito_.", "item.create.blaze_cake.tooltip": "PASTEL DE BLAZE", "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _Quemadores de blaze_. Los pone en marcha!.", @@ -1285,7 +1285,7 @@ "block.create.spout.tooltip.condition1": "Transferencia de fluidos", "block.create.spout.tooltip.behaviour1": "Cuando se coloca un _contenedor de fluidos_ como un _cubo_ o una _botella_ debajo, el caño intentará rellenarlo con su propio _fluido_ almacenado", "block.create.spout.tooltip.condition2": "Automatización de fluídos", - "block.create.spout.tooltip.behaviour2": "El caño colocado encima de un _cinturón_ o _depósito_ reaccionará automáticamente con un contenedor de fluídos_ que pase por debajo", + "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _correa_ o _depósito_ reaccionará automáticamente con un contenedor de fluídos_ que pase por debajo", "block.create.item_drain.tooltip": "DRENADOR DE ELEMENTOS", "block.create.item_drain.tooltip.summary": "Un depósito rallado para vaciar tus _artículos fluidos._", @@ -1295,7 +1295,7 @@ "block.create.mechanical_arm.tooltip": "BRAZO MECÁNICO", "block.create.mechanical_arm.tooltip.summary": "Artilugio avanzado para reubicar _elementos_", "block.create.mechanical_arm.tooltip.condition1": "Transferencia de elementos", - "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Cinturones_, _Depósitos_, _Embudos_ y _Mecanizadores_", + "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Correas_, _Depósitos_, _Embudos_ y _Mecanizadores_", "block.create.mechanical_arm.tooltip.control1": "Mientras está en la mano", "block.create.mechanical_arm.tooltip.action1": "Haz clic con el botón derecho en un _objeto accesible del inventario_ para establecerlo como _fuente_ para el _brazo mecánico_. Haz clic con el botón derecho del ratón dos veces para establecerlo como _destino_", "block.create.mechanical_arm.tooltip.control2": "Scroll con Llave Inglesa", @@ -1425,12 +1425,12 @@ "block.create.adjustable_chain_gearshift.tooltip.condition1": "Control de Redstone", "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Sin señal_, los accionamientos de cadena adyacentes transmitirán la _misma velocidad._ Con una señal de _fuerza completa_, los accionamientos de cadena adyacentes transmitirán exactamente _el doble de su velocidad._ Cualquier cosa entre medias dará resultados entre 1-2x su velocidad", - "item.create.belt_connector.tooltip": "CINTURÓN CONECTOR", - "item.create.belt_connector.tooltip.summary": "Conecta dos o más _ejes_ con un _Cinturón conector_. Los ejes conectados tendrán exactamente la misma velocidad y dirección de rotación. La correa puede actuar como _Transportador_ para _Estados_ y _Entidades_", + "item.create.belt_connector.tooltip": "CORREA", + "item.create.belt_connector.tooltip.summary": "Conecta dos o más _ejes_ con una _Correa_. Los ejes conectados tendrán exactamente la misma velocidad y dirección de rotación. La correa puede actuar como _Transportador_ para _Estados_ y _Entidades_", "item.create.belt_connector.tooltip.control1": "Click derecho en el eje", - "item.create.belt_connector.tooltip.action1": "Selecciona el eje como una polea del cinturón. Los dos ejes seleccionados tienen que estar _alineados_ ya sea _Verticalmente_, _Horizontalmente_ o _Diagonalmente_ hacia la dirección de la correa", + "item.create.belt_connector.tooltip.action1": "Selecciona el eje como una polea de la correa. Los dos ejes seleccionados tienen que estar _alineados_ ya sea _Verticalmente_, _Horizontalmente_ o _Diagonalmente_ hacia la dirección de la correa", "item.create.belt_connector.tooltip.control2": "Click derecho mientras te agachas", - "item.create.belt_connector.tooltip.action2": "_Reinicia_ la primera posición seleccionada para el Cinturón", + "item.create.belt_connector.tooltip.action2": "_Reinicia_ la primera posición seleccionada para la correa", "item.create.goggles.tooltip": "GAFAS DEL INGENIERO", "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar tu visión con útil información _cinética_", @@ -1493,8 +1493,8 @@ "block.create.mechanical_press.tooltip.summary": "Un pistón de fuerza para comprimir los objetos que tiene debajo. Requiere una _fuerza de rotación_ constante", "block.create.mechanical_press.tooltip.condition1": "Cuando es impulsado por Redstone", "block.create.mechanical_press.tooltip.behaviour1": "Comienza a _comprimir_ los objetos que caen debajo", - "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de un cinturón conector", - "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en el Cinturón", + "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de una correa", + "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en la correa", "block.create.mechanical_press.tooltip.condition3": "Cuando está por encima de la Cuenca", "block.create.mechanical_press.tooltip.behaviour3": "Comienza a _compactar artículos_ en la cuenca siempre que estén presentes todos los ingredientes necesarios", @@ -1519,13 +1519,13 @@ "block.create.mechanical_mixer.tooltip.behaviour1": "Comienza a mezclar los elementos en la cuenca siempre que estén presentes todos los ingredientes necesarios. Para evitar recetas no deseadas, utilice la ranura del filtro de la cuenca o reduzca la fuerza de rotación hasta que se hayan añadido todos los ingredientes deseados", "block.create.mechanical_crafter.tooltip": "MECANIZADOR", - "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus cinturones_ para crear un _flujo_ que salga de la cuadrícula en uno de los Mecanizadores", + "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus correas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Mecanizadores", "block.create.mechanical_crafter.tooltip.condition1": "Cuando es impulsado por la cinética", "block.create.mechanical_crafter.tooltip.behaviour1": "_Empieza el proceso de creación_ en cuanto _todos los crafters_ de la parrilla hayan recibido un objeto_", "block.create.mechanical_crafter.tooltip.condition2": "Con pulso de Redstone", "block.create.mechanical_crafter.tooltip.behaviour2": "_Fuerza_ el inicio del proceso de _creación_ con todos los _artículos_ dados actualmente en la parrilla", "block.create.mechanical_crafter.tooltip.control1": "Cuando se arranca por delante", - "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un mecanizador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza los cinturones en un flujo_ que mueva todos los objetos hacia un mecanizador final. El mecanizador final debe _apuntar hacia fuera_ de la rejilla", + "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un mecanizador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las correas en un flujo_ que mueva todos los objetos hacia un mecanizador final. El mecanizador final debe _apuntar hacia fuera_ de la rejilla", "block.create.mechanical_crafter.tooltip.control2": "Cuando se arranca hacia atrás", "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los mecanizadores adyacentes. Usa esto para _combinar ranuras_ en el grid de crafteo y _guardar el la entrada de trabajo_", @@ -1715,8 +1715,8 @@ "block.create.deployer.tooltip.condition3": "Cuando se asigna el filtro", "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos.", - "block.create.brass_casing.tooltip": "REVESTIDORA DE BRONCE", - "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _cinturones conectores._", + "block.create.brass_casing.tooltip": "REVESTIDOR DE BRONCE", + "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _correas._", "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSOS DE REDSTONE", "block.create.pulse_repeater.tooltip.summary": "Un circuito sencillo para cortar las señales de Redstone que pasan a una longitud de _1 tick_", From bd49e9bc7fd81f444344f022b560141b8eb6bc25 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 16:39:07 -0300 Subject: [PATCH 122/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index b2fa00290..54eb62af8 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -9,7 +9,7 @@ "block.create.adjustable_pulse_repeater": "Repetidor de pulso ajustable", "block.create.adjustable_repeater": "Repetidor ajustable", "block.create.analog_lever": "Palanca analógica", - "block.create.andesite_belt_funnel": "Embudo de correa de andesita", + "block.create.andesite_belt_funnel": "Embudo de cinta de andesita", "block.create.andesite_bricks": "Ladrillos de andesita", "block.create.andesite_bricks_slab": "Losa de ladrillos de andesita", "block.create.andesite_bricks_stairs": "Escaleras de ladrillos de andesita", @@ -24,7 +24,7 @@ "block.create.andesite_pillar": "Poste de andesita", "block.create.andesite_tunnel": "Túnel de Andesita", "block.create.basin": "Cuenca", - "block.create.belt": "Correa", + "block.create.belt": "Cinta", "block.create.birch_window": "Ventana de abedul", "block.create.birch_window_pane": "Panel de ventana de abedul", "block.create.black_sail": "Vela negra", @@ -34,7 +34,7 @@ "block.create.blue_sail": "Vela azul", "block.create.blue_seat": "Asiento azul", "block.create.blue_valve_handle": "Asa de válvula azul", - "block.create.brass_belt_funnel": "Embudo de correa de bronce", + "block.create.brass_belt_funnel": "Embudo de cinta de bronce", "block.create.brass_block": "Bloque de bronce", "block.create.brass_casing": "Revestidor de bronce", "block.create.brass_encased_shaft": "Eje revestido de bronce", @@ -418,7 +418,7 @@ "item.create.andesite_alloy": "Aleación de andesita", "item.create.attribute_filter": "Filtro de atributos", "item.create.bar_of_chocolate": "Barra de chocolate", - "item.create.belt_connector": "Conector de correa", + "item.create.belt_connector": "Correa", "item.create.blaze_cake": "Pastel de Blaze", "item.create.blaze_cake_base": "Base de Pastel de Blaze", "item.create.brass_hand": "Mano de bronce", @@ -512,7 +512,7 @@ "advancement.create.belt_funnel": "Colgantes con forma de embudo", "advancement.create.belt_funnel.desc": "Coloca un embudo lateral encima de una cinta o depósito para crear un tipo especial.", "advancement.create.belt_funnel_kiss": "Los loros y las aletas", - "advancement.create.belt_funnel_kiss.desc": "Haz besar dos embudos montados con una correa.", + "advancement.create.belt_funnel_kiss.desc": "Haz besar dos embudos montados con una cinta.", "advancement.create.fan": "Maestro mecánico del aire", "advancement.create.fan.desc": "Monta la corriente de aire proporcionada por un ventilador revestido.", "advancement.create.fan_lava": "Calentador geotérmico", From 9d57a25104f405f01e9ca36384765675c82c3d27 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 16:42:37 -0300 Subject: [PATCH 123/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 54eb62af8..635070ec5 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -60,8 +60,8 @@ "block.create.copper_block": "Bloque de cobre", "block.create.copper_casing": "Revestidor de caliza", "block.create.copper_ore": "Mineral de cobre", - "block.create.copper_shingles": "Bloque de baldosa de cobre", - "block.create.copper_tiles": "Bloque de tejas de cobre", + "block.create.copper_shingles": "Bloque de tejas de cobre", + "block.create.copper_tiles": "Bloque de baldosas de cobre", "block.create.copper_valve_handle": "Asa de válvula de cobre", "block.create.creative_crate": "Caja creativa", "block.create.creative_fluid_tank": "Tanque de fluídos creativo", From 607ce9edca5198dcd26a4a169960e47f8bca4007 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 16:43:06 -0300 Subject: [PATCH 124/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 635070ec5..150d8cb1d 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -2,7 +2,7 @@ "_": "->------------------------] Game Elements [------------------------<-", - "block.create.acacia_window": "Ventana de Acacia", + "block.create.acacia_window": "Ventana de acacia", "block.create.acacia_window_pane": "Panel de ventana de acacia", "block.create.adjustable_chain_gearshift": "Cadena de transmisión ajustable", "block.create.adjustable_crate": "Caja ajustable", From 9048442fec0a85415a30d662f205528987cac029 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 16:52:50 -0300 Subject: [PATCH 125/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 150d8cb1d..e56f50918 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -138,7 +138,7 @@ "block.create.fancy_limestone_bricks_wall": "Pared de ladrillos de piedra caliza elegantes", "block.create.fancy_scoria_bricks": "Ladrillos de escoria elegantes", "block.create.fancy_scoria_bricks_slab": "Losa de ladrillos de escoria elegantes", - "block.create.fancy_scoria_bricks_stairs": "Escaleras de ladrills de escoria elegantes", + "block.create.fancy_scoria_bricks_stairs": "Escaleras de ladrillos de escoria elegantes", "block.create.fancy_scoria_bricks_wall": "Pared de ladrillos de escoria elegantes", "block.create.fancy_weathered_limestone_bricks": "Ladrillos de piedra de caliza erosionada elegantes", "block.create.fancy_weathered_limestone_bricks_slab": "Losa de ladrillos de caliza erosionada elegantes", From 22c03c4a140df45e5a488f2b360235e9e7930e28 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Wed, 17 Feb 2021 16:56:09 -0300 Subject: [PATCH 126/147] Update es_es.json accents suppressed --- .../resources/assets/create/lang/es_es.json | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index e56f50918..1beca701b 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -64,7 +64,7 @@ "block.create.copper_tiles": "Bloque de baldosas de cobre", "block.create.copper_valve_handle": "Asa de válvula de cobre", "block.create.creative_crate": "Caja creativa", - "block.create.creative_fluid_tank": "Tanque de fluídos creativo", + "block.create.creative_fluid_tank": "Tanque de fluidos creativo", "block.create.creative_motor": "Motor creativo", "block.create.crushing_wheel": "Rueda trituradora", "block.create.crushing_wheel_controller": "Controlador de Rueda trituradora", @@ -107,7 +107,7 @@ "block.create.dolomite_pillar": "Pilar de dolomita", "block.create.encased_chain_drive": "Cadena de transmisión revestida", "block.create.encased_fan": "Ventilador revestido", - "block.create.encased_fluid_pipe": "Tubería de fluídos de cobre revestida", + "block.create.encased_fluid_pipe": "Tubería de fluidos de cobre revestida", "block.create.fancy_andesite_bricks": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_slab": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_stairs": "Escaleras de ladrillos de andesita elegantes", @@ -144,7 +144,7 @@ "block.create.fancy_weathered_limestone_bricks_slab": "Losa de ladrillos de caliza erosionada elegantes", "block.create.fancy_weathered_limestone_bricks_stairs": "Escaleras de ladrillos de caliza erosionada elegantes", "block.create.fancy_weathered_limestone_bricks_wall": "Pared de ladrillos de caliza erosionada elegantes", - "block.create.fluid_pipe": "Tubería de fluídos de cobre", + "block.create.fluid_pipe": "Tubería de fluidos de cobre", "block.create.fluid_tank": "Depósito de fluidos", "block.create.fluid_valve": "Válvula de fluidos", "block.create.flywheel": "Rueda de inercia", @@ -332,7 +332,7 @@ "block.create.polished_weathered_limestone_slab": "Losa de piedra caliza erosionada pulida", "block.create.polished_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pulida", "block.create.polished_weathered_limestone_wall": "Pared de piedra caliza erosionada pulida", - "block.create.portable_fluid_interface": "Interfaz de fluídos portátil", + "block.create.portable_fluid_interface": "Interfaz de fluidos portátil", "block.create.portable_storage_interface": "Interfaz de almacenamiento portátil", "block.create.powered_latch": "Palanca motorizada", "block.create.powered_toggle_latch": "Palanca de cierre motorizada", @@ -370,7 +370,7 @@ "block.create.shadow_steel_casing": "Revestidor sombrío", "block.create.shaft": "Eje", "block.create.smart_chute": "Ducto inteligente", - "block.create.smart_fluid_pipe": "Tubería de fluídos inteligente", + "block.create.smart_fluid_pipe": "Tubería de fluidos inteligente", "block.create.speedometer": "Velocímetro", "block.create.spout": "Surtidor", "block.create.spruce_window": "Ventana de abeto", @@ -584,7 +584,7 @@ "advancement.create.chained_item_drain": "Déjalo rodar!", "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenadores de elementos encadenados.", "advancement.create.glass_pipe": "Espía del flujo", - "advancement.create.glass_pipe.desc": "Observe cómo se propaga el fluido a través de una tubería de fluídos con ventanas. Las tuberías de fluido rectas se convierten en ventanas cuando se utiliza una llave en ellas.", + "advancement.create.glass_pipe.desc": "Observe cómo se propaga el fluido a través de una tubería de fluidos con ventanas. Las tuberías de fluido rectas se convierten en ventanas cuando se utiliza una llave en ellas.", "advancement.create.pipe_collision": "No cruzar nunca los arroyos", "advancement.create.pipe_collision.desc": "Vea cómo se unen dos fluidos en su red de tuberías.", "advancement.create.pipe_spill": "¡Hay una fuga!", @@ -811,7 +811,7 @@ "create.logistics.filter": "Filtro", "create.logistics.recipe_filter": "Filtro de recetas", - "create.logistics.fluid_filter": "Filtro de fluídos", + "create.logistics.fluid_filter": "Filtro de fluidos", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", "create.logistics.filter.apply": "Filtro aplicado a %1$s.", @@ -1199,11 +1199,11 @@ "block.create.copper_casing.tooltip": "REVESTIDOR DE COBRE", "block.create.copper_casing.tooltip.summary": "Robusta máquina de revestimientos con una gran variedad de usos. Seguro para la decoración.", - "block.create.copper_casing.tooltip.condition1": "Cuando se utiliza en una tubería de fluídos", - "block.create.copper_casing.tooltip.behaviour1": "_Reviste_ la _Tubería de fluídos_ con _Revestimiento de cobre_. Las tuberías de fluídos revestidas _bloquean sus conexiones_ en su lugar, dejando de reaccionar a los cambios en las tuberías vecinas.", + "block.create.copper_casing.tooltip.condition1": "Cuando se utiliza en una tubería de fluidos", + "block.create.copper_casing.tooltip.behaviour1": "_Reviste_ la _Tubería de fluidos_ con _Revestimiento de cobre_. Las tuberías de fluidos revestidas _bloquean sus conexiones_ en su lugar, dejando de reaccionar a los cambios en las tuberías vecinas.", - "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUÍDOS REVESTIDO", - "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluídos revestido con cobre.", + "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUIDOS REVESTIDO", + "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluidos revestido con cobre.", "block.create.copper_valve_handle.tooltip": "ASA DE VÁLVULA DE COBRE", "block.create.copper_valve_handle.tooltip.summary": "Una precisa _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. ¡Ten cuidado de no agotarte!", @@ -1233,8 +1233,8 @@ "item.create.empty_blaze_burner.tooltip.condition1": "Cuando se utiliza en un Blaze o en un generador de Blaze", "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captura_ un Blaze en el elemento", - "block.create.fluid_pipe.tooltip": "TUBERÍA DE FLUÍDOS DE COBRE", - "block.create.fluid_pipe.tooltip.summary": "Se utiliza para mover _fluidos_. Necesita una _bomba mecánica_ para que el _fluído_ se mueva.", + "block.create.fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS DE COBRE", + "block.create.fluid_pipe.tooltip.summary": "Se utiliza para mover _fluidos_. Necesita una _bomba mecánica_ para que el _fluido_ se mueva.", "block.create.fluid_pipe.tooltip.condition1": "Transferencia de fluidos", "block.create.fluid_pipe.tooltip.behaviour1": "Puede conectarse a _contenedores de fluidos_ como _depósitos_ o _cuencas_. Los extremos expuestos de los _tubos_ también pueden drenar o colocar bloques de fluido. ¡Cuidado con las fugas!", "block.create.fluid_pipe.tooltip.control1": "Cuando haces clic derecho con una Llave Inglesa", @@ -1249,33 +1249,33 @@ "block.create.hose_pulley.tooltip.condition3": "Cuando los fluidos son empujados a la polea", "block.create.hose_pulley.tooltip.behaviour3": "Comienza a _llenar de fluido_ el mundo hasta la _altura_ de los extremos de la _manguera_", - "block.create.fluid_tank.tooltip": "TANQUE DE FLUÍDOS", + "block.create.fluid_tank.tooltip": "TANQUE DE FLUIDOS", "block.create.fluid_tank.tooltip.summary": "Almacena todos tus _líquidos_ favoritos. Escala en anchura y altura.", "block.create.fluid_tank.tooltip.condition1": "Cuando se hace click derecho con la Llave Inglesa", "block.create.fluid_tank.tooltip.behaviour1": "Cambia la ventana opcional", - "block.create.creative_fluid_tank.tooltip": "TANQUE DE FLUÍDOS CREATIVO", - "block.create.creative_fluid_tank.tooltip.summary": "Este _Tanque de Fluídos_ permite la replicación infinita de cualquier Fluido. Escala en anchura y altura.", + "block.create.creative_fluid_tank.tooltip": "TANQUE DE FLUIDOS CREATIVO", + "block.create.creative_fluid_tank.tooltip.summary": "Este _Tanque de Fluidos_ permite la replicación infinita de cualquier Fluido. Escala en anchura y altura.", "block.create.creative_fluid_tank.tooltip.condition1": "Cuando hay fluido en el tanque", "block.create.creative_fluid_tank.tooltip.behaviour1": "Todo lo que se _extraiga_ de este tanque proporcionará un _suministro ilimitado_ del fluido especificado. Los fluidos _insertados_ en este tanque serán _evitados._", "block.create.creative_fluid_tank.tooltip.condition2": "Cuando se hace clic derecho con una Llave Inglesa", "block.create.creative_fluid_tank.tooltip.behaviour2": "Cambia la ventana opcional", - "block.create.fluid_valve.tooltip": "VALVULA DE FLUÍDOS", + "block.create.fluid_valve.tooltip": "VALVULA DE FLUIDOS", "block.create.fluid_valve.tooltip.summary": "Detiene el flujo de un fluido por una tubería", "block.create.fluid_valve.tooltip.condition1": "Flujo controlable", "block.create.fluid_valve.tooltip.behaviour1": "La _fuerza de rotación_ aplicada obligará a la _válvula_ a cerrarse, cesando el flujo de _fluidos_. Invierta la dirección de la _fuerza de rotación_ para volver a abrir la válvula", "block.create.mechanical_pump.tooltip": "BOMBA MECÁNICA", - "block.create.mechanical_pump.tooltip.summary": "Toma la _fuerza de rotación_ y la utiliza para mover el _fluído_ a lo largo de un _tubo_. Tiene un rango máximo de efecto en ambas direcciones. (16 bloques por defecto)", + "block.create.mechanical_pump.tooltip.summary": "Toma la _fuerza de rotación_ y la utiliza para mover el _fluido_ a lo largo de un _tubo_. Tiene un rango máximo de efecto en ambas direcciones. (16 bloques por defecto)", "block.create.mechanical_pump.tooltip.condition1": "Flujo de fluido", "block.create.mechanical_pump.tooltip.behaviour1": "La _fuerza de rotación_ aplicada crea una presión que obliga al _fluido_ a pasar por la red de _tuberías_. Invierte la dirección de la _fuerza de rotación_ para cambiar la dirección en la que fluye el _fluido_", "block.create.mechanical_pump.tooltip.control1": "Pulsando con el botón derecho del ratón con la Llave Inglesa", "block.create.mechanical_pump.tooltip.action1": "Invierte la dirección de la _bomba_, cambiando la dirección por defecto del flujo", "block.create.smart_fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS INTELIGENTE", - "block.create.smart_fluid_pipe.tooltip.summary": "Una _tubería de fluidos_ con un filtro. Puede especificar qué _fluídos_ pasan por ella", - "block.create.smart_fluid_pipe.tooltip.condition1": "Cuando se introducen fluídos en ella", + "block.create.smart_fluid_pipe.tooltip.summary": "Una _tubería de fluidos_ con un filtro. Puede especificar qué _fluidos_ pasan por ella", + "block.create.smart_fluid_pipe.tooltip.condition1": "Cuando se introducen fluidos en ella", "block.create.smart_fluid_pipe.tooltip.behaviour1": "Las tuberías inteligentes que reciban fluidos que no coincidan con su filtro bloquearán el flujo", "block.create.smart_fluid_pipe.tooltip.condition2": "Cuando es adyacente a un contenedor de fluido", "block.create.smart_fluid_pipe.tooltip.behaviour2": "Las tuberías inteligentes que _inicien_ un _flujo_ desde cualquier contenedor sólo extraerán fluidos que _coincidan_ con su _filtro._", @@ -1284,8 +1284,8 @@ "block.create.spout.tooltip.summary": "Un inyector para rellenar tus elementos de _fluidos._", "block.create.spout.tooltip.condition1": "Transferencia de fluidos", "block.create.spout.tooltip.behaviour1": "Cuando se coloca un _contenedor de fluidos_ como un _cubo_ o una _botella_ debajo, el caño intentará rellenarlo con su propio _fluido_ almacenado", - "block.create.spout.tooltip.condition2": "Automatización de fluídos", - "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _correa_ o _depósito_ reaccionará automáticamente con un contenedor de fluídos_ que pase por debajo", + "block.create.spout.tooltip.condition2": "Automatización de fluidos", + "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _correa_ o _depósito_ reaccionará automáticamente con un contenedor de fluidos_ que pase por debajo", "block.create.item_drain.tooltip": "DRENADOR DE ELEMENTOS", "block.create.item_drain.tooltip.summary": "Un depósito rallado para vaciar tus _artículos fluidos._", @@ -1501,7 +1501,7 @@ "block.create.basin.tooltip": "CUENCA", "block.create.basin.tooltip.summary": "Un práctico _contenedor de elementos_ utilizado en el procesamiento con la _Mezcladora mecánica_ y la _Prensa mecánica_. Soporta _Comparadores de Redstone_. Viene con un práctico filtro que especifica qué elementos deben crearse en esta cuenca", "block.create.basin.tooltip.condition1": "Salida automática", - "block.create.basin.tooltip.behaviour1": "Cuando los _inventarios abiertos_ como cintas, otras cuencas, depósitos, desagües de fluídos y otros están _bajo un lado_ de una cuenca, recibirán automáticamente cualquier _salida de artículos/fluidos_ creada en la cuenca. Esto es útil para la automatización", + "block.create.basin.tooltip.behaviour1": "Cuando los _inventarios abiertos_ como cintas, otras cuencas, depósitos, desagües de fluidos y otros están _bajo un lado_ de una cuenca, recibirán automáticamente cualquier _salida de artículos/fluidos_ creada en la cuenca. Esto es útil para la automatización", "block.create.blaze_burner.tooltip": "QUEMADOR DE BLAZE", "block.create.blaze_burner.tooltip.summary": "Un bloque donde se aloja un blaze domado para calentar una cuenca", From 02db3f5a2c0f86e8a78968b537a8b0b6cf2fc666 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 17 Feb 2021 13:58:24 -0800 Subject: [PATCH 127/147] fix some problematic code. creating matrix stacks is expensive, apparently --- .../foundation/render/SuperByteBuffer.java | 4 ++-- .../render/backend/FastRenderDispatcher.java | 22 ++++++------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index 94d03f781..d85977d8e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -25,7 +25,7 @@ public class SuperByteBuffer extends TemplateBuffer { } // Vertex Position - private MatrixStack transforms; + private final MatrixStack transforms; // Vertex Texture Coords private SpriteShiftFunc spriteShiftFunc; @@ -152,7 +152,7 @@ public class SuperByteBuffer extends TemplateBuffer { .endVertex(); } - transforms = new MatrixStack(); + while (!transforms.isEmpty()) transforms.pop(); spriteShiftFunc = null; shouldColor = false; shouldLight = false; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index 07e7e91bf..4e7955e85 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -45,7 +45,13 @@ public class FastRenderDispatcher { CreateClient.kineticRenderer.tick(); - runQueue(queuedUpdates.get(world), CreateClient.kineticRenderer::update); + ConcurrentHashMap.KeySetView map = queuedUpdates.get(world); + map + .forEach(te -> { + map.remove(te); + + CreateClient.kineticRenderer.update(te); + }); } public static boolean available() { @@ -64,20 +70,6 @@ public class FastRenderDispatcher { RenderWork.enqueue(Minecraft.getInstance().worldRenderer::loadRenderers); } - private static void runQueue(@Nullable ConcurrentHashMap.KeySetView changed, Consumer action) { - if (changed == null) return; - - if (available()) { - // because of potential concurrency issues, we make a copy of what's in the set at the time we get here - ArrayList tiles = new ArrayList<>(changed); - - tiles.forEach(action); - changed.removeAll(tiles); - } else { - changed.clear(); - } - } - public static void renderLayer(RenderType layer, Matrix4f viewProjection, double cameraX, double cameraY, double cameraZ) { if (!Backend.canUseInstancing()) return; From 9b4d53d4526e73b26333d26e171d53bde878b15a Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 17 Feb 2021 14:27:49 -0800 Subject: [PATCH 128/147] fix one residual merge conflict. creating matrix stacks is expensive, but correct. --- .../components/structureMovement/Contraption.java | 2 +- .../simibubi/create/foundation/render/SuperByteBuffer.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 73305f376..1de138917 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -799,7 +799,7 @@ public abstract class Contraption { Block block = info.state.getBlock(); CompoundNBT tag = info.nbt; MovementBehaviour movementBehaviour = AllMovementBehaviours.of(block); - if (tag == null || (movementBehaviour != null && movementBehaviour.hasSpecialMovementRenderer())) + if (tag == null) return; tag.putInt("x", info.pos.getX()); diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index d85977d8e..90d7b54db 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -25,7 +25,7 @@ public class SuperByteBuffer extends TemplateBuffer { } // Vertex Position - private final MatrixStack transforms; + private MatrixStack transforms; // Vertex Texture Coords private SpriteShiftFunc spriteShiftFunc; @@ -152,7 +152,8 @@ public class SuperByteBuffer extends TemplateBuffer { .endVertex(); } - while (!transforms.isEmpty()) transforms.pop(); + transforms = new MatrixStack(); + spriteShiftFunc = null; shouldColor = false; shouldLight = false; From 310cbd484c20503bec40af836b52d93f18789754 Mon Sep 17 00:00:00 2001 From: muriplz <46825658+muriplz@users.noreply.github.com> Date: Thu, 18 Feb 2021 12:09:09 +0100 Subject: [PATCH 129/147] Update es_es.json --- .../resources/assets/create/lang/es_es.json | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 1beca701b..ce91bb5a8 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -34,12 +34,12 @@ "block.create.blue_sail": "Vela azul", "block.create.blue_seat": "Asiento azul", "block.create.blue_valve_handle": "Asa de válvula azul", - "block.create.brass_belt_funnel": "Embudo de cinta de bronce", - "block.create.brass_block": "Bloque de bronce", - "block.create.brass_casing": "Revestidor de bronce", - "block.create.brass_encased_shaft": "Eje revestido de bronce", - "block.create.brass_funnel": "Embudo de bronce", - "block.create.brass_tunnel": "Túnel de bronce", + "block.create.brass_belt_funnel": "Embudo de cinta de latón", + "block.create.brass_block": "Bloque de latón", + "block.create.brass_casing": "Revestidor de latón", + "block.create.brass_encased_shaft": "Eje revestido de latón", + "block.create.brass_funnel": "Embudo de latón", + "block.create.brass_tunnel": "Túnel de latón", "block.create.brown_sail": "Vela marrón", "block.create.brown_seat": "Asiento marrón", "block.create.brown_valve_handle": "Asa de válvula marrón", @@ -421,10 +421,10 @@ "item.create.belt_connector": "Correa", "item.create.blaze_cake": "Pastel de Blaze", "item.create.blaze_cake_base": "Base de Pastel de Blaze", - "item.create.brass_hand": "Mano de bronce", - "item.create.brass_ingot": "Lingote de bronce", - "item.create.brass_nugget": "Pepita de bronce", - "item.create.brass_sheet": "Lámina de bronce", + "item.create.brass_hand": "Mano de latón", + "item.create.brass_ingot": "Lingote de latón", + "item.create.brass_nugget": "Pepita de latón", + "item.create.brass_sheet": "Lámina de latón", "item.create.builders_tea": "Té del Constructor", "item.create.chest_minecart_contraption": "Artilugio de vagoneta con cofre", "item.create.chocolate_bucket": "Cubo de chocolate", @@ -435,7 +435,7 @@ "item.create.copper_sheet": "Lámina de cobre", "item.create.crafter_slot_cover": "Tapa de ranura del Mecanizador", "item.create.crushed_aluminum_ore": "Mineral de aluminio molido", - "item.create.crushed_brass": "Bronce molido", + "item.create.crushed_brass": "Latón molido", "item.create.crushed_copper_ore": "Mineral de cobre molido", "item.create.crushed_gold_ore": "Mineral de oro molido", "item.create.crushed_iron_ore": "Mineral de hierro molido", @@ -504,7 +504,7 @@ "advancement.create.tunnel": "Cúbrete!", "advancement.create.tunnel.desc": "Embellece tu correa con un Túnel.", "advancement.create.splitter_tunnel": "Divide y vencerás", - "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de bronce.", + "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de latón.", "advancement.create.chute": "Caída en picado", "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la correa.", "advancement.create.upward_chute": "Abducción aérea", @@ -568,9 +568,9 @@ "advancement.create.compact": "Compactación automática", "advancement.create.compact.desc": "Utiliza una prensa y una palangana para compactar algunos elementos.", "advancement.create.brass": "Aleaciones reales", - "advancement.create.brass.desc": "Utiliza Cobre molido y Zinc molido para crear algo de bronce.", - "advancement.create.brass_casing": "La Edad de Bronce", - "advancement.create.brass_casing.desc": "Utiliza el bronce recién obtenido y algo de madera para crear un revestimiento más avanzado.", + "advancement.create.brass.desc": "Utiliza Cobre molido y Zinc molido para crear algo de latón.", + "advancement.create.brass_casing": "La Edad de Latón", + "advancement.create.brass_casing.desc": "Utiliza el latón recién obtenido y algo de madera para crear un revestimiento más avanzado.", "advancement.create.copper_casing": "La Edad de Cobre", "advancement.create.copper_casing.desc": "Utiliza algunas láminas de cobre y madera para crear algunos revestimientos de cobre.", "advancement.create.spout": "Sploosh", @@ -718,16 +718,16 @@ "create.action.discard": "Descartar", "create.keyinfo.toolmenu": "Menú de la Herramienta de Enfoque", - "create.keyinfo.scrollup": "Simular la rueda del ratón hacia arriba (en el mundo)", - "create.keyinfo.scrolldown": "Simular la rueda del ratón hacia abajo (en el mundo)", + "create.keyinfo.scrollup": "Simular usar la rueda del ratón hacia arriba (en el mundo)", + "create.keyinfo.scrolldown": "Simular usar la rueda del ratón hacia abajo (en el mundo)", "create.gui.scrollInput.defaultTitle": "Seleccione una opción:", - "create.gui.scrollInput.scrollToModify": "Scroll para Modificar", - "create.gui.scrollInput.scrollToAdjustAmount": "Scroll para ajustar la cantidad", - "create.gui.scrollInput.scrollToSelect": "Scroll para Seleccionar", - "create.gui.scrollInput.shiftScrollsFaster": "Shift para Scroll Rápido", + "create.gui.scrollInput.scrollToModify": "Usa la rueda del ratón para Modificar", + "create.gui.scrollInput.scrollToAdjustAmount": "Usa la rueda del ratón para ajustar la cantidad", + "create.gui.scrollInput.scrollToSelect": "Usa la rueda del ratón para Seleccionar", + "create.gui.scrollInput.shiftScrollsFaster": "Shift para usar la rueda del ratón más rápido", "create.gui.toolmenu.focusKey": "Mantenga [%1$s] para enfocar", - "create.gui.toolmenu.cycle": "[SCROLL] para el ciclo", + "create.gui.toolmenu.cycle": "[RUEDA DEL RATÓN] para el ciclo", "create.gui.symmetryWand.mirrorType": "Espejado", "create.gui.symmetryWand.orientation": "Orientación", @@ -781,7 +781,7 @@ "create.blockzapper.component.retriever": "Recuperador", "create.blockzapper.component.scope": "Mira telescópica", "create.blockzapper.componentTier.none": "Ninguno", - "create.blockzapper.componentTier.brass": "Bronce", + "create.blockzapper.componentTier.brass": "Latón", "create.blockzapper.componentTier.chromatic": "Cromático", "create.blockzapper.leftClickToSet": "Clic izquierdo en un bloque para establecer el material", "create.blockzapper.empty": "Sin bloques!", @@ -887,17 +887,17 @@ "create.schematic.tool.deploy.description.0": "Mueve la estructura a un lugar.", "create.schematic.tool.deploy.description.1": "Haga clic con el botón derecho del ratón en el suelo para colocar.", "create.schematic.tool.deploy.description.2": "Mantenga [Ctrl] para seleccionar a una distancia fija.", - "create.schematic.tool.deploy.description.3": "[Ctrl]-Scroll para cambiar la distancia.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-Rueda del ratón para cambiar la distancia.", "create.schematic.tool.move.description.0": "Desplaza el esquema horizontalmente.", - "create.schematic.tool.move.description.1": "Apunta al Esquema y [CTRL]-Scroll para ponerlo.", + "create.schematic.tool.move.description.1": "Apunta al Esquema y [CTRL]-Rueda del ratón para ponerlo.", "create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.3": "", "create.schematic.tool.movey.description.0": "Desplaza el esquema verticalmente..", - "create.schematic.tool.movey.description.1": "[CTRL]-Scroll para moverlo hacia arriba/abajo.", + "create.schematic.tool.movey.description.1": "[CTRL]-Rueda del ratón para moverlo hacia arriba/abajo.", "create.schematic.tool.movey.description.2": "", "create.schematic.tool.movey.description.3": "", "create.schematic.tool.rotate.description.0": "Gira el esquema alrededor de su centro.", - "create.schematic.tool.rotate.description.1": "[CTRL]-Scroll para girar 90 grados.", + "create.schematic.tool.rotate.description.1": "[CTRL]-Rueda del ratón para girar 90 grados.", "create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.3": "", "create.schematic.tool.print.description.0": "Sitúa instantáneamente la estructura en el mundo.", @@ -905,7 +905,7 @@ "create.schematic.tool.print.description.2": "Esta herramienta es sólo para el Modo Creativo.", "create.schematic.tool.print.description.3": "", "create.schematic.tool.flip.description.0": "Voltea el Esquema a lo largo de la cara que seleccione.", - "create.schematic.tool.flip.description.1": "Apunta al esquema y [CTRL]-Scroll para voltearlo.", + "create.schematic.tool.flip.description.1": "Apunta al esquema y [CTRL]-Rueda del ratón para voltearlo.", "create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.3": "", @@ -1149,8 +1149,8 @@ "block.create.andesite_encased_shaft.tooltip": "EJE REVESTIDO DE ANDESITA", "block.create.andesite_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de andesita_. Los bloques de revestimiento _no se consumirán_.", - "block.create.brass_encased_shaft.tooltip": "EJE REVESTIDO DE BRONCE", - "block.create.brass_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de bronce_. Los bloques de revestimiento _no se consumirán_.", + "block.create.brass_encased_shaft.tooltip": "EJE REVESTIDO DE LATÓN", + "block.create.brass_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de latón_. Los bloques de revestimiento _no se consumirán_.", "block.create.wooden_bracket.tooltip": "SOPORTE DE MADERA PARA EJES", "block.create.wooden_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un refuerzo acogedor y de madera.", @@ -1175,7 +1175,7 @@ "block.create.andesite_tunnel.tooltip.control1": "Click derecho con la Llave Inglesa en el lateral", "block.create.andesite_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", - "block.create.brass_funnel.tooltip": "EMBUDO DE BRONCE", + "block.create.brass_funnel.tooltip": "EMBUDO DE LATÓN", "block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_. Viene con un práctico _filtro_.", "block.create.brass_funnel.tooltip.condition1": "Comportamiento General", "block.create.brass_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo.", @@ -1184,17 +1184,17 @@ "block.create.brass_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", "block.create.brass_funnel.tooltip.behaviour3": "Transfiere los artículos hacia abajo, como una tolva sin búfer.", - "block.create.brass_tunnel.tooltip": "TÚNEL DE BRONCE", - "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _correas_. Los _Túneles de bronce_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", + "block.create.brass_tunnel.tooltip": "TÚNEL DE LATÓN", + "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _correas_. Los _Túneles de latón_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", "block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro", - "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de bronce se conectan entre sí y permiten redirigir el contenido de una correa a otra.", + "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de latón se conectan entre sí y permiten redirigir el contenido de una correa a otra.", "block.create.brass_tunnel.tooltip.condition2": "Filtrado", - "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles de bronces_ vienen con filtros tanto para la _Entrada_ como para la _Salida_. Si un _Elemento_ no está permitido desde la salida filtrada de un _Túnel_ será transferido a la salida de un _Túnel_ conectado.", + "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles de latón_ vienen con filtros tanto para la _Entrada_ como para la _Salida_. Si un _Elemento_ no está permitido desde la salida filtrada de un _Túnel_ será transferido a la salida de un _Túnel_ conectado.", "block.create.brass_tunnel.tooltip.condition3": "Dividiendo", - "block.create.brass_tunnel.tooltip.behaviour3": "Los _Túneles de bronce_ pueden ser configurados para cambiar el método en el que los _Elementos_ son ordenados en los _Túneles_ conectados.", + "block.create.brass_tunnel.tooltip.behaviour3": "Los _Túneles de latón_ pueden ser configurados para cambiar el método en el que los _Elementos_ son ordenados en los _Túneles_ conectados.", "block.create.brass_tunnel.tooltip.control1": "Cuando haces click derecho con una Llave Inglesa", "block.create.brass_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", - "block.create.brass_tunnel.tooltip.control2": "Scroll con Llave Inglesa en la parte superior", + "block.create.brass_tunnel.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa en la parte superior", "block.create.brass_tunnel.tooltip.action2": "Cambiar el método de división de los _Túneles_ conectados.", "block.create.copper_casing.tooltip": "REVESTIDOR DE COBRE", @@ -1298,7 +1298,7 @@ "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Correas_, _Depósitos_, _Embudos_ y _Mecanizadores_", "block.create.mechanical_arm.tooltip.control1": "Mientras está en la mano", "block.create.mechanical_arm.tooltip.action1": "Haz clic con el botón derecho en un _objeto accesible del inventario_ para establecerlo como _fuente_ para el _brazo mecánico_. Haz clic con el botón derecho del ratón dos veces para establecerlo como _destino_", - "block.create.mechanical_arm.tooltip.control2": "Scroll con Llave Inglesa", + "block.create.mechanical_arm.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa", "block.create.mechanical_arm.tooltip.action2": "Establece el comportamiento de orden de los _items_ emitidos por el _brazo mecánico_", "item.create.wand_of_symmetry.tooltip": "VARITA DE SIMETRÍA", @@ -1313,7 +1313,7 @@ "item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz de Configuración_", "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Novedoso gadget para colocar o intercambiar bloques a distancia", + "item.create.handheld_blockzapper.tooltip.summary": "Novedoso artefacto para colocar o intercambiar bloques a distancia", "item.create.handheld_blockzapper.tooltip.control1": "Click izquierdo en un bloque", "item.create.handheld_blockzapper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", "item.create.handheld_blockzapper.tooltip.control2": "Click derecho en un bloque", @@ -1335,7 +1335,7 @@ "item.create.tree_fertilizer.tooltip.condition1": "Cuando se utiliza en un árbol joven", "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles _independientemente_ de sus condiciones de _espacio_", - "item.create.deforester.tooltip": "DEFORESTER", + "item.create.deforester.tooltip": "DEFORESTADOR", "item.create.deforester.tooltip.summary": "Un hacha _radiante_ capaz de talar árboles en una fracción de segundo", "item.create.extendo_grip.tooltip": "AGARRE EXTENDIDO", @@ -1372,15 +1372,15 @@ "item.create.schematic_and_quill.tooltip.condition1": "Paso 1", "item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos puntos de esquina usando click derecho", "item.create.schematic_and_quill.tooltip.condition2": "Paso 2", - "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ en las caras para ajustar el tamaño. Click derecho de nuevo para guardar", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Rueda del ratón_ en las caras para ajustar el tamaño. Click derecho de nuevo para guardar", "item.create.schematic_and_quill.tooltip.control1": "Click derecho", "item.create.schematic_and_quill.tooltip.action1": "Seleccionar un punto de esquina / confirmar guardar", "item.create.schematic_and_quill.tooltip.control2": "Al mantener Ctrl", - "item.create.schematic_and_quill.tooltip.action2": "Seleccionar puntos en _medio del aire_. Scroll para ajustar la distancia", + "item.create.schematic_and_quill.tooltip.action2": "Seleccionar puntos en _medio del aire_. Rueda del ratón para ajustar la distancia", "item.create.schematic_and_quill.tooltip.control3": "Click derecho mientras se agacha", "item.create.schematic_and_quill.tooltip.action3": "Reinicia_ y elimina la selección", - "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip": "ESQUEMATICAÑÓN", "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _Esquema_ desplegado en el Mundo. Utiliza elementos de los inventarios adyacentes y _Pólvora_ como combustible.", "block.create.schematicannon.tooltip.control1": "Cuando se hace clic derecho", "block.create.schematicannon.tooltip.action1": "Abre la _Interfaz_ de configuración", @@ -1469,7 +1469,7 @@ "block.create.hand_crank.tooltip.condition1": "Cuando se usa", "block.create.hand_crank.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a un artilugio acoplado. _Se puede revertir_ la rotación", - "block.create.cuckoo_clock.tooltip": "RELOJ CUCÚ", + "block.create.cuckoo_clock.tooltip": "RELOJ DE CUCO", "block.create.cuckoo_clock.tooltip.summary": "Fina artesanía para _decorar_ un espacio y _contar el tiempo_", "block.create.cuckoo_clock.tooltip.condition1": "Cuando es alimentado por cinética", "block.create.cuckoo_clock.tooltip.behaviour1": "Muestra la _hora actual_ y toca una melodía dos veces al día. Se activa_ una vez al _mediodía_ y al anochecer, en cuanto _los jugadores pueden dormir_", @@ -1527,7 +1527,7 @@ "block.create.mechanical_crafter.tooltip.control1": "Cuando se arranca por delante", "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un mecanizador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las correas en un flujo_ que mueva todos los objetos hacia un mecanizador final. El mecanizador final debe _apuntar hacia fuera_ de la rejilla", "block.create.mechanical_crafter.tooltip.control2": "Cuando se arranca hacia atrás", - "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los mecanizadores adyacentes. Usa esto para _combinar ranuras_ en el grid de crafteo y _guardar el la entrada de trabajo_", + "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los mecanizadores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", "block.create.furnace_engine.tooltip": "MOTOR DEL HORNO", "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _Poder Rotatorio_ que requiere un _horno en funcionamiento_ para funcionar", @@ -1581,7 +1581,7 @@ "block.create.sail_frame.tooltip": "MARCO DE VELA", "block.create.sail_frame.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada sobre un _Rodamiento de molino_", - "block.create.white_sail.tooltip": "VELA", + "block.create.white_sail.tooltip": "VELA BLANCA", "block.create.white_sail.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada en un _Rodamiento de molino_. Viene en una variedad de colores", "block.create.white_sail.tooltip.condition1": "Cuando se hace clic con el botón derecho del ratón con tinte", "block.create.white_sail.tooltip.behaviour1": "Cambia el color de la vela", @@ -1715,7 +1715,7 @@ "block.create.deployer.tooltip.condition3": "Cuando se asigna el filtro", "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos.", - "block.create.brass_casing.tooltip": "REVESTIDOR DE BRONCE", + "block.create.brass_casing.tooltip": "REVESTIDOR DE LATÓN", "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _correas._", "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSOS DE REDSTONE", From a52865666af8c8d2de3bc24014d491645ebe1a94 Mon Sep 17 00:00:00 2001 From: muriplz <46825658+muriplz@users.noreply.github.com> Date: Thu, 18 Feb 2021 12:19:40 +0100 Subject: [PATCH 130/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index ce91bb5a8..81d4b048d 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -1530,7 +1530,7 @@ "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los mecanizadores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", "block.create.furnace_engine.tooltip": "MOTOR DEL HORNO", - "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _Poder Rotatorio_ que requiere un _horno en funcionamiento_ para funcionar", + "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _Momento de Fuerza/ Torque_ que requiere un _horno en funcionamiento_ para funcionar", "block.create.furnace_engine.tooltip.condition1": "Cuando se conecta a un horno encendido", "block.create.furnace_engine.tooltip.behaviour1": "_Empieza a alimentar_ un _Horno_ colocado delante de él (a 1m de distancia). Utiliza un Alto Horno para obtener mayores velocidades", From f8d6f73f8ac2748a3fa32c4705fe63efc8bd6ba5 Mon Sep 17 00:00:00 2001 From: muriplz <46825658+muriplz@users.noreply.github.com> Date: Thu, 18 Feb 2021 12:26:59 +0100 Subject: [PATCH 131/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 81d4b048d..753df4cf4 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -1530,7 +1530,7 @@ "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los mecanizadores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", "block.create.furnace_engine.tooltip": "MOTOR DEL HORNO", - "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _Momento de Fuerza/ Torque_ que requiere un _horno en funcionamiento_ para funcionar", + "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _Momento de Fuerza/ Torque/ Fuerza Rotacional (WIP)_ que requiere un _horno en funcionamiento_ para funcionar", "block.create.furnace_engine.tooltip.condition1": "Cuando se conecta a un horno encendido", "block.create.furnace_engine.tooltip.behaviour1": "_Empieza a alimentar_ un _Horno_ colocado delante de él (a 1m de distancia). Utiliza un Alto Horno para obtener mayores velocidades", From 779b19b377d838e4e3828687913edb4f659bf9de Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Thu, 18 Feb 2021 16:01:05 +0000 Subject: [PATCH 132/147] Multiple Thread improvements. improved the threads. --- .../models/block/gantry_shaft/block_end.json | 6 +++--- .../block/gantry_shaft/block_middle.json | 4 ++-- .../block/gantry_shaft/block_single.json | 4 ++-- .../models/block/gantry_shaft/block_start.json | 4 ++-- .../create/textures/block/gantry_shaft.png | Bin 234 -> 322 bytes .../textures/block/gantry_shaft_flipped.png | Bin 233 -> 6223 bytes .../textures/block/gantry_shaft_powered.png | Bin 227 -> 320 bytes .../block/gantry_shaft_powered_flipped.png | Bin 231 -> 6189 bytes 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/create/models/block/gantry_shaft/block_end.json b/src/main/resources/assets/create/models/block/gantry_shaft/block_end.json index a459fd12b..23c06e41f 100644 --- a/src/main/resources/assets/create/models/block/gantry_shaft/block_end.json +++ b/src/main/resources/assets/create/models/block/gantry_shaft/block_end.json @@ -26,9 +26,9 @@ "to": [11, 11, 11], "shade": false, "faces": { - "north": {"uv": [8, 5, 14, 16], "texture": "#2"}, - "east": {"uv": [2, 5, 8, 16], "texture": "#2"}, - "south": {"uv": [4, 5, 10, 16], "texture": "#2"}, + "north": {"uv": [0, 5, 6, 16], "texture": "#2"}, + "east": {"uv": [6, 5, 12, 16], "texture": "#2"}, + "south": {"uv": [0, 5, 6, 16], "texture": "#2"}, "west": {"uv": [6, 5, 12, 16], "texture": "#2"} } }, diff --git a/src/main/resources/assets/create/models/block/gantry_shaft/block_middle.json b/src/main/resources/assets/create/models/block/gantry_shaft/block_middle.json index 8d4416d92..cc9ee7946 100644 --- a/src/main/resources/assets/create/models/block/gantry_shaft/block_middle.json +++ b/src/main/resources/assets/create/models/block/gantry_shaft/block_middle.json @@ -12,8 +12,8 @@ "shade": false, "faces": { "north": {"uv": [0, 0, 6, 16], "texture": "#2"}, - "east": {"uv": [2, 0, 8, 16], "texture": "#2"}, - "south": {"uv": [4, 0, 10, 16], "texture": "#2"}, + "east": {"uv": [6, 0, 12, 16], "texture": "#2"}, + "south": {"uv": [0, 0, 6, 16], "texture": "#2"}, "west": {"uv": [6, 0, 12, 16], "texture": "#2"} } } diff --git a/src/main/resources/assets/create/models/block/gantry_shaft/block_single.json b/src/main/resources/assets/create/models/block/gantry_shaft/block_single.json index cccb1fd78..495caf396 100644 --- a/src/main/resources/assets/create/models/block/gantry_shaft/block_single.json +++ b/src/main/resources/assets/create/models/block/gantry_shaft/block_single.json @@ -52,8 +52,8 @@ "to": [11, 11, 11], "shade": false, "faces": { - "north": {"uv": [4, 5, 10, 11], "rotation": 180, "texture": "#2"}, - "east": {"uv": [3, 5, 9, 11], "rotation": 180, "texture": "#2"}, + "north": {"uv": [0, 5, 6, 11], "rotation": 180, "texture": "#2"}, + "east": {"uv": [6, 5, 12, 11], "rotation": 180, "texture": "#2"}, "south": {"uv": [0, 5, 6, 11], "rotation": 180, "texture": "#2"}, "west": {"uv": [6, 5, 12, 11], "rotation": 180, "texture": "#2"} } diff --git a/src/main/resources/assets/create/models/block/gantry_shaft/block_start.json b/src/main/resources/assets/create/models/block/gantry_shaft/block_start.json index b77bfceba..15ab79845 100644 --- a/src/main/resources/assets/create/models/block/gantry_shaft/block_start.json +++ b/src/main/resources/assets/create/models/block/gantry_shaft/block_start.json @@ -27,8 +27,8 @@ "shade": false, "faces": { "north": {"uv": [0, 0, 6, 11], "texture": "#2"}, - "east": {"uv": [2, 0, 8, 11], "texture": "#2"}, - "south": {"uv": [4, 0, 10, 11], "texture": "#2"}, + "east": {"uv": [6, 0, 12, 11], "texture": "#2"}, + "south": {"uv": [0, 0, 6, 11], "texture": "#2"}, "west": {"uv": [6, 0, 12, 11], "texture": "#2"} } }, diff --git a/src/main/resources/assets/create/textures/block/gantry_shaft.png b/src/main/resources/assets/create/textures/block/gantry_shaft.png index b11a4a8d6ade7ea9c2155a90e07c2754b400bf52..0aaab6b3ff9bc5c689946e4f5ebe50f13c325d04 100644 GIT binary patch delta 306 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 JF6*2UngA%?Le2mH diff --git a/src/main/resources/assets/create/textures/block/gantry_shaft_powered.png b/src/main/resources/assets/create/textures/block/gantry_shaft_powered.png index b3111e74ae16faabab85e71ae5f405615fd2808b..8b1418b79fd0f65c8265e3bd86b27a7554bd9ab1 100644 GIT binary patch delta 304 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 J%Q~loCIE1rMc)7b From cf34b2e96bd6654f11338b97c256bcc03228b1f8 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 18 Feb 2021 18:05:39 +0100 Subject: [PATCH 133/147] Fix fast fluid valves - Ensure animated indicators on fluid valves still show up with experimental rendering --- .../contraptions/fluids/pipes/FluidValveTileEntity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java index 1f964928e..72e0d86bf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java @@ -78,6 +78,11 @@ public class FluidValveTileEntity extends KineticTileEntity { public void addBehaviours(List behaviours) { behaviours.add(new ValvePipeBehaviour(this)); } + + @Override + public boolean shouldRenderAsTE() { + return true; + } class ValvePipeBehaviour extends StraightPipeFluidTransportBehaviour { From 9c1ab785d76f6448b902b3575aa120ec7b918f55 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Thu, 18 Feb 2021 15:00:07 -0300 Subject: [PATCH 134/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 753df4cf4..c09994eb1 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -1530,7 +1530,7 @@ "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los mecanizadores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", "block.create.furnace_engine.tooltip": "MOTOR DEL HORNO", - "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _Momento de Fuerza/ Torque/ Fuerza Rotacional (WIP)_ que requiere un _horno en funcionamiento_ para funcionar", + "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _fuerza de rotación/torque_ que requiere un _horno en funcionamiento_ para funcionar", "block.create.furnace_engine.tooltip.condition1": "Cuando se conecta a un horno encendido", "block.create.furnace_engine.tooltip.behaviour1": "_Empieza a alimentar_ un _Horno_ colocado delante de él (a 1m de distancia). Utiliza un Alto Horno para obtener mayores velocidades", From d59fea10793c5d87c2786cc65a136fcc57123a94 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 18 Feb 2021 19:43:22 +0100 Subject: [PATCH 135/147] Bloat. - Auto-Organize inputs - runData after lang PRs - change runWhenOn to non-deprecated unsafeRunWhenOn, now that late forge version is required - Address a few warnings --- src/generated/resources/.cache/cache | 28 ++-- .../assets/create/blockstates/fluid_pipe.json | 100 ++++++------ .../create/blockstates/radial_chassis.json | 96 +++++------ .../assets/create/lang/unfinished/de_de.json | 2 +- .../assets/create/lang/unfinished/es_mx.json | 8 +- .../assets/create/lang/unfinished/fr_fr.json | 8 +- .../assets/create/lang/unfinished/it_it.json | 14 +- .../assets/create/lang/unfinished/ja_jp.json | 150 +++++++++--------- .../assets/create/lang/unfinished/ko_kr.json | 8 +- .../assets/create/lang/unfinished/nl_nl.json | 8 +- .../assets/create/lang/unfinished/pt_br.json | 8 +- .../assets/create/lang/unfinished/ru_ru.json | 8 +- .../assets/create/lang/unfinished/zh_cn.json | 8 +- .../assets/create/lang/unfinished/zh_tw.json | 8 +- .../com/simibubi/create/AllBlockPartials.java | 45 +++--- .../com/simibubi/create/AllColorHandlers.java | 7 +- .../com/simibubi/create/AllEntityTypes.java | 6 +- .../java/com/simibubi/create/AllItems.java | 1 + .../com/simibubi/create/AllTileEntities.java | 46 +++++- src/main/java/com/simibubi/create/Create.java | 2 +- .../com/simibubi/create/CreateClient.java | 4 +- .../category/animations/AnimatedKinetics.java | 1 + .../category/animations/AnimatedPress.java | 1 + .../category/animations/AnimatedSpout.java | 5 +- .../content/contraptions/KineticNetwork.java | 8 +- .../base/BackHalfShaftInstance.java | 5 +- .../contraptions/base/HalfShaftInstance.java | 5 +- .../base/HorizontalHalfShaftInstance.java | 5 +- .../contraptions/base/KineticData.java | 5 +- .../base/KineticRenderMaterials.java | 2 +- .../contraptions/base/KineticTileEntity.java | 10 +- .../base/KineticTileEntityRenderer.java | 4 +- .../base/KineticTileInstance.java | 10 +- .../base/RotatedPillarKineticBlock.java | 1 + .../contraptions/base/RotatingData.java | 5 +- .../base/RotatingInstancedModel.java | 1 + .../base/ShaftlessCogInstance.java | 5 +- .../base/SingleRotatingInstance.java | 9 +- .../actors/ContraptionActorData.java | 5 +- .../components/actors/DrillInstance.java | 8 +- .../actors/DrillMovementBehaviour.java | 2 +- .../components/actors/DrillRenderer.java | 2 +- .../actors/HarvesterMovementBehaviour.java | 4 +- .../components/actors/HarvesterRenderer.java | 2 +- .../PortableStorageInterfaceRenderer.java | 5 +- .../components/actors/RotatingActorModel.java | 1 + .../components/clock/CuckooClockRenderer.java | 2 +- .../clock/CuckooClockTileEntity.java | 7 +- .../crafter/MechanicalCrafterInstance.java | 12 +- .../crafter/MechanicalCrafterRenderer.java | 9 +- .../crafter/MechanicalCrafterTileEntity.java | 18 ++- .../components/crank/HandCrankTileEntity.java | 1 + .../components/deployer/DeployerRenderer.java | 2 +- .../deployer/DeployerTileEntity.java | 18 ++- .../components/fan/EncasedFanRenderer.java | 2 +- .../components/fan/FanInstance.java | 11 +- .../components/fan/NozzleBlock.java | 5 +- .../components/flywheel/FlyWheelInstance.java | 12 +- .../components/flywheel/FlywheelRenderer.java | 2 +- .../flywheel/FlywheelTileEntity.java | 1 + .../millstone/MillStoneCogInstance.java | 7 +- .../mixer/MechanicalMixerRenderer.java | 2 +- .../components/saw/SawInstance.java | 11 +- .../components/saw/SawRenderer.java | 2 +- .../components/saw/SawTileEntity.java | 23 ++- .../AbstractContraptionEntity.java | 2 +- .../structureMovement/AssemblyException.java | 3 + .../structureMovement/Contraption.java | 52 ++++-- .../ContraptionCollider.java | 2 +- .../ContraptionDisassemblyPacket.java | 2 +- .../ContraptionEntityRenderer.java | 1 + .../structureMovement/ContraptionHandler.java | 3 - .../ContraptionStallPacket.java | 2 +- .../IDisplayAssemblyExceptions.java | 9 +- .../structureMovement/MovementBehaviour.java | 2 +- .../OrientedContraptionEntity.java | 6 +- .../bearing/BearingContraption.java | 8 +- .../bearing/BearingLighter.java | 5 +- .../bearing/BearingRenderer.java | 2 +- .../bearing/ClockworkBearingTileEntity.java | 8 +- .../bearing/ClockworkContraption.java | 28 ++-- .../bearing/MechanicalBearingTileEntity.java | 9 +- .../structureMovement/bearing/SailBlock.java | 22 ++- .../StabilizedBearingMovementBehaviour.java | 7 +- .../bearing/StabilizedContraption.java | 6 +- .../chassis/AbstractChassisBlock.java | 1 - .../chassis/ChassisTileEntity.java | 2 +- .../gantry/GantryContraption.java | 7 +- .../gantry/GantryContraptionUpdatePacket.java | 2 +- .../gantry/GantryPinionTileEntity.java | 5 +- .../glue/GlueEffectPacket.java | 2 +- .../glue/SuperGlueEntity.java | 31 +++- .../glue/SuperGlueHandler.java | 15 +- .../mounted/CartAssembleRailType.java | 8 +- .../mounted/CartAssemblerBlock.java | 29 ++-- .../mounted/CartAssemblerTileEntity.java | 5 +- .../mounted/MountedContraption.java | 9 +- .../piston/LinearActuatorTileEntity.java | 11 +- .../piston/PistonContraption.java | 29 ++-- .../piston/PistonExtensionPoleBlock.java | 13 +- .../piston/PistonLighter.java | 1 + .../pulley/AbstractPulleyRenderer.java | 2 +- .../pulley/PulleyContraption.java | 2 +- .../pulley/PulleyLighter.java | 1 + .../pulley/PulleyTileEntity.java | 1 + .../render/ContraptionKineticRenderer.java | 9 +- .../render/ContraptionModel.java | 5 +- .../render/ContraptionProgram.java | 5 +- .../render/ContraptionRenderDispatcher.java | 44 +++-- .../render/ContraptionRenderer.java | 39 ----- .../render/RenderedContraption.java | 37 +++-- .../train/CouplingRenderer.java | 11 +- .../train/MinecartCouplingItem.java | 2 +- .../MinecartControllerUpdatePacket.java | 2 +- .../turntable/TurntableHandler.java | 1 + .../contraptions/fluids/FluidPropagator.java | 2 +- .../contraptions/fluids/PipeConnection.java | 4 +- .../contraptions/fluids/PumpCogInstance.java | 7 +- .../contraptions/fluids/PumpRenderer.java | 2 +- .../contraptions/fluids/PumpTileEntity.java | 25 ++- .../fluids/actors/FluidSplashPacket.java | 2 +- .../fluids/actors/HosePulleyTileEntity.java | 5 +- .../fluids/pipes/BracketBlock.java | 2 +- .../fluids/pipes/FluidValveRenderer.java | 2 +- .../fluids/pipes/GlassFluidPipeBlock.java | 4 +- .../goggles/GoggleOverlayRenderer.java | 13 +- .../particle/RotationIndicatorParticle.java | 1 + .../processing/BasinOperatingTileEntity.java | 9 +- .../processing/BasinTileEntity.java | 21 ++- .../burner/BlazeBurnerRenderer.java | 2 +- .../relays/advanced/GantryShaftBlock.java | 9 +- .../relays/advanced/SpeedControllerBlock.java | 5 +- .../advanced/SpeedControllerRenderer.java | 2 +- .../sequencer/SequencedGearshiftBlock.java | 2 +- .../contraptions/relays/belt/BeltData.java | 9 +- .../relays/belt/BeltInstance.java | 15 +- .../relays/belt/BeltInstancedModel.java | 1 + .../relays/belt/BeltRenderer.java | 2 +- .../contraptions/relays/belt/BeltSlope.java | 1 + .../relays/belt/BeltTileEntity.java | 5 +- .../relays/belt/transport/BeltInventory.java | 2 - .../relays/elementary/CogwheelBlockItem.java | 11 +- .../relays/elementary/ShaftBlock.java | 5 +- .../relays/encased/ShaftInstance.java | 5 +- .../relays/encased/SplitShaftInstance.java | 11 +- .../relays/encased/SplitShaftRenderer.java | 2 +- .../relays/gauge/GaugeRenderer.java | 2 +- .../relays/gauge/GaugeTileEntity.java | 5 +- .../relays/gearbox/GearboxInstance.java | 13 +- .../relays/gearbox/GearboxRenderer.java | 2 +- .../curiosities/ChromaticCompoundColor.java | 1 + .../symmetry/SymmetryEffectPacket.java | 2 +- .../symmetry/SymmetryWandItem.java | 4 +- .../curiosities/tools/ExtendoGripItem.java | 5 +- .../tools/ExtendoGripItemRenderer.java | 1 + .../tools/ExtendoGripRenderHandler.java | 1 + .../tools/SandPaperItemRenderer.java | 1 + .../curiosities/zapper/ZapperBeamPacket.java | 2 +- .../curiosities/zapper/ZapperItem.java | 4 +- .../zapper/ZapperRenderHandler.java | 11 +- .../blockzapper/BlockzapperItemRenderer.java | 13 +- .../WorldshaperItemRenderer.java | 7 +- .../belts/tunnel/BeltTunnelRenderer.java | 2 +- .../diodes/AdjustableRepeaterRenderer.java | 2 +- .../block/funnel/FunnelRenderer.java | 2 +- .../block/mechanicalArm/ArmInstance.java | 7 +- .../block/mechanicalArm/ArmItem.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 1 + .../block/mechanicalArm/ArmTileEntity.java | 10 +- .../block/redstone/AnalogLeverRenderer.java | 2 +- .../block/redstone/RedstoneContactBlock.java | 10 +- .../block/redstone/RedstoneLinkBlock.java | 1 + .../block/redstone/StockpileSwitchBlock.java | 2 +- .../AstralSorceryAmuletAttribute.java | 1 - .../content/palettes/PaletteBlockPartial.java | 3 +- .../schematics/SchematicProcessor.java | 7 +- .../block/SchematicannonRenderer.java | 2 +- .../client/SchematicAndQuillHandler.java | 38 +++-- .../schematics/client/SchematicHandler.java | 7 +- .../schematics/client/SchematicRenderer.java | 4 +- .../client/SchematicTransformation.java | 5 +- .../schematics/client/tools/DeployTool.java | 1 + .../client/tools/SchematicToolBase.java | 7 +- .../schematics/item/SchematicItem.java | 2 +- .../simibubi/create/events/ClientEvents.java | 9 +- .../block/ProperDirectionalBlock.java | 1 + .../foundation/command/AllCommands.java | 7 +- .../command/ClearBufferCacheCommand.java | 2 +- .../command/ConfigureConfigPacket.java | 4 +- .../foundation/command/HighlightCommand.java | 11 +- .../foundation/command/HighlightPacket.java | 7 +- .../command/OverlayConfigCommand.java | 8 +- .../command/ToggleDebugCommand.java | 7 +- .../ToggleExperimentalRenderingCommand.java | 7 +- .../create/foundation/config/CClient.java | 2 - .../foundation/data/CreateRegistrate.java | 2 +- .../data/recipe/WashingRecipeGen.java | 2 +- .../create/foundation/gui/AllGuiTextures.java | 1 + .../create/foundation/gui/ScreenOpener.java | 4 +- .../mixin/CancelTileEntityRenderMixin.java | 16 +- .../mixin/FogColorTrackerMixin.java | 5 +- .../foundation/mixin/LightUpdateMixin.java | 14 +- .../foundation/mixin/OnRemoveTileMixin.java | 14 +- .../foundation/mixin/RenderHooksMixin.java | 29 ++-- .../foundation/mixin/ShaderCloseMixin.java | 12 +- .../foundation/networking/AllPackets.java | 27 ++-- .../foundation/render/AllProgramSpecs.java | 7 +- .../create/foundation/render/Compartment.java | 4 +- .../foundation/render/KineticRenderer.java | 9 +- .../foundation/render/SuperByteBuffer.java | 23 ++- .../render/SuperByteBufferCache.java | 5 +- .../foundation/render/TemplateBuffer.java | 7 +- .../render/TileEntityRenderHelper.java | 9 +- .../foundation/render/backend/Backend.java | 44 ++--- .../render/backend/BufferedModel.java | 14 +- .../render/backend/FastRenderDispatcher.java | 12 +- .../render/backend/OptifineHandler.java | 9 +- .../render/backend/gl/BasicProgram.java | 4 +- .../render/backend/gl/GlBuffer.java | 7 +- .../foundation/render/backend/gl/GlFog.java | 2 - .../render/backend/gl/GlVertexArray.java | 4 +- .../backend/gl/attrib/VertexAttribSpec.java | 3 +- .../render/backend/gl/shader/GlProgram.java | 6 +- .../render/backend/gl/shader/GlShader.java | 8 +- .../render/backend/gl/shader/ProgramSpec.java | 9 +- .../backend/gl/shader/ShaderUniforms.java | 12 -- .../backend/gl/versioned/MapBuffer.java | 7 +- .../backend/instancing/InstancedModel.java | 24 +-- .../InstancedTileRenderRegistry.java | 10 +- .../instancing/InstancedTileRenderer.java | 16 +- .../backend/instancing/RenderMaterial.java | 46 +++--- .../render/backend/light/GridAlignedBB.java | 5 +- .../render/backend/light/LightVolume.java | 14 +- .../backend/light/LightVolumeDebugger.java | 4 +- .../behaviour/linked/LinkBehaviour.java | 1 + .../renderer/SafeTileEntityRenderer.java | 1 - .../create/foundation/utility/Iterate.java | 8 +- .../create/foundation/utility/VecHelper.java | 7 +- .../utility/ghost/GhostBlockParams.java | 4 +- .../utility/ghost/GhostBlockRenderer.java | 27 ++-- .../foundation/utility/ghost/GhostBlocks.java | 11 +- .../utility/outliner/ChasingAABBOutline.java | 1 + .../utility/outliner/LineOutline.java | 1 + .../foundation/utility/outliner/Outliner.java | 11 +- .../utility/placement/IPlacementHelper.java | 13 +- .../utility/placement/PlacementHelpers.java | 12 +- .../utility/placement/PlacementOffset.java | 4 +- .../utility/placement/util/PoleHelper.java | 9 +- .../worldWrappers/WrappedChunkProvider.java | 15 +- .../worldWrappers/chunk/WrappedChunk.java | 15 +- 250 files changed, 1378 insertions(+), 990 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderUniforms.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 7546069c8..e9a21c11e 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -140,7 +140,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json +48086bf71a824faf14841b698050cc8544b09a9b assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json +6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -401,18 +401,18 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -acc852d80378b426d7ee6cb59c169e06b6d63b25 assets/create/lang/en_us.json -30ce93c56557cea2f384a47b549fb893700523a5 assets/create/lang/unfinished/de_de.json -77b8310f3cbed36fa0d2ee29e65ac6aee0c2adc2 assets/create/lang/unfinished/es_mx.json -8db9f9147dcef8c8182c548a524f96f578c116ec assets/create/lang/unfinished/fr_fr.json -89f7029d73733938ee9f900fc36d52ab7fc97563 assets/create/lang/unfinished/it_it.json -b1935e7f8d79d1112e1685adb42daedb976ac6d7 assets/create/lang/unfinished/ja_jp.json -23aaf879d07a24775aeba3b98c355c992b24f28b assets/create/lang/unfinished/ko_kr.json -7372533759001f094dbcad787f01f3de7422d8c0 assets/create/lang/unfinished/nl_nl.json -0d1e5d79ef196a06b273962d5ac8f2013f91209c assets/create/lang/unfinished/pt_br.json -54da7badbd4fb043f73f6e9a4dfc52bd9e7f515c assets/create/lang/unfinished/ru_ru.json -45ca54406acac857752c67a45729da953d11f94a assets/create/lang/unfinished/zh_cn.json -4093ea8612465858aa57581b36f8f60aa23ac203 assets/create/lang/unfinished/zh_tw.json +04b4c59db79887cdddd128cd4cb59320c715a76a assets/create/lang/en_us.json +92840d43a7a5056ba1ddf043fe2a4b2b54533192 assets/create/lang/unfinished/de_de.json +fcded5cc7ba38ce1f13bbcf481c52da384d4335e assets/create/lang/unfinished/es_mx.json +d926a35cff961a017a174e5bad8976b8bfa246f0 assets/create/lang/unfinished/fr_fr.json +bcf5cf92717d5d8b5b4b56dc759cc5dcd3b05ae7 assets/create/lang/unfinished/it_it.json +dddcd6a8d3842035b07172dae1b61064b210dd3b assets/create/lang/unfinished/ja_jp.json +6fc6f612108b1c4498ea90e83f1ed0a7bce198d5 assets/create/lang/unfinished/ko_kr.json +f6d7256dca3a9979ce85333a72ad787657c954ff assets/create/lang/unfinished/nl_nl.json +48adee636f2a0ff06c97b738c9552dcdd48dd72c assets/create/lang/unfinished/pt_br.json +a82ef75492ff34c22f5e480fefe826aceefa956e assets/create/lang/unfinished/ru_ru.json +25b9387af4a75d4264ff001562cc4b14fccd49e6 assets/create/lang/unfinished/zh_cn.json +21e291e10cc5194b61d82c8a271cff2682ec0aee assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 581373307..80a25280c 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,9 +60,9 @@ }, { "when": { - "south": "false", - "up": "true", "down": "false", + "up": "true", + "south": "false", "north": "true" }, "apply": { @@ -71,9 +71,9 @@ }, { "when": { - "south": "true", - "up": "true", "down": "false", + "up": "true", + "south": "true", "north": "false" }, "apply": { @@ -82,9 +82,9 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", + "up": "false", + "south": "false", "north": "true" }, "apply": { @@ -93,9 +93,9 @@ }, { "when": { - "south": "true", - "up": "false", "down": "true", + "up": "false", + "south": "true", "north": "false" }, "apply": { @@ -104,9 +104,9 @@ }, { "when": { - "south": "false", - "up": "true", "down": "true", + "up": "true", + "south": "false", "north": "false" }, "apply": { @@ -115,20 +115,9 @@ }, { "when": { - "south": "false", - "up": "true", "down": "false", - "north": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { + "up": "true", "south": "false", - "up": "false", - "down": "true", "north": "false" }, "apply": { @@ -137,9 +126,20 @@ }, { "when": { + "down": "true", + "up": "false", + "south": "false", + "north": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "down": "false", + "up": "false", "south": "true", - "up": "false", - "down": "false", "north": "true" }, "apply": { @@ -148,9 +148,9 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", + "up": "false", + "south": "false", "north": "true" }, "apply": { @@ -159,9 +159,9 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", + "up": "false", + "south": "true", "north": "false" }, "apply": { @@ -170,9 +170,9 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", + "up": "false", + "south": "false", "north": "false" }, "apply": { @@ -302,8 +302,8 @@ }, { "when": { - "up": "true", "down": "false", + "up": "true", "west": "false", "east": "true" }, @@ -313,8 +313,8 @@ }, { "when": { - "up": "true", "down": "false", + "up": "true", "west": "true", "east": "false" }, @@ -324,8 +324,8 @@ }, { "when": { - "up": "false", "down": "true", + "up": "false", "west": "false", "east": "true" }, @@ -335,8 +335,8 @@ }, { "when": { - "up": "false", "down": "true", + "up": "false", "west": "true", "east": "false" }, @@ -346,19 +346,8 @@ }, { "when": { - "up": "true", "down": "true", - "west": "false", - "east": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_z" - } - }, - { - "when": { "up": "true", - "down": "false", "west": "false", "east": "false" }, @@ -368,8 +357,19 @@ }, { "when": { - "up": "false", + "down": "false", + "up": "true", + "west": "false", + "east": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_z" + } + }, + { + "when": { "down": "true", + "up": "false", "west": "false", "east": "false" }, @@ -379,8 +379,8 @@ }, { "when": { - "up": "false", "down": "false", + "up": "false", "west": "true", "east": "true" }, @@ -390,8 +390,8 @@ }, { "when": { - "up": "false", "down": "false", + "up": "false", "west": "false", "east": "true" }, @@ -401,8 +401,8 @@ }, { "when": { - "up": "false", "down": "false", + "up": "false", "west": "true", "east": "false" }, @@ -412,8 +412,8 @@ }, { "when": { - "up": "false", "down": "false", + "up": "false", "west": "false", "east": "false" }, diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 1aa3d3728..f97d8c8bc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -29,8 +29,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "x" + "axis": "x", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -39,8 +39,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "y" + "axis": "y", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky" @@ -48,8 +48,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "z" + "axis": "z", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -59,8 +59,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "x" + "axis": "x", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -69,8 +69,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "y" + "axis": "y", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_y" @@ -78,8 +78,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "z" + "axis": "z", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -89,8 +89,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "true" + "sticky_west": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "true" + "sticky_west": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "true" + "sticky_west": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "false" + "sticky_west": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "false" + "sticky_west": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "false" + "sticky_west": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "true" + "sticky_east": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "true" + "sticky_east": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "true" + "sticky_east": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "false" + "sticky_east": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "false" + "sticky_east": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "false" + "sticky_east": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index e43663915..2970a187a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1095", + "_": "Missing Localizations: 1101", "_": "->------------------------] Game Elements [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 5982b8d60..09e681eb2 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 886", + "_": "Missing Localizations: 892", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index f9524d01b..e422d3ee7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 666", + "_": "Missing Localizations: 672", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "Statistiques cinétiques:", "create.gui.goggles.at_current_speed": "À la vitesse actuelle", "create.gui.goggles.pole_length": "Longueur de la barre", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "Informations sur la jauge:", "create.gui.speedometer.title": "Vitesse de rotation", "create.gui.stressometer.title": "Stress du réseau", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index d8b4ba2dd..e80fd7fa6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 3", + "_": "Missing Localizations: 7", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,8 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "Scalini di pietrisco di gabbro", "block.create.gabbro_cobblestone_wall": "Muretto di pietrisco di gabbro", "block.create.gabbro_pillar": "Pilastro di gabbro", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", - "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", + "block.create.gantry_pinion": "Pignone a portale", + "block.create.gantry_shaft": "Albero a portale", "block.create.gearbox": "Riduttore", "block.create.gearshift": "Cambio", "block.create.glass_fluid_pipe": "Tubo per fluidi con vetrata", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "Statistiche cinetiche:", "create.gui.goggles.at_current_speed": "Alla velocità attuale", "create.gui.goggles.pole_length": "Lunghezza palo:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "Informazioni sul calibro:", "create.gui.speedometer.title": "Velocità di rotazione", "create.gui.stressometer.title": "Stress della rete", @@ -1367,7 +1373,7 @@ "item.create.schematic_and_quill.tooltip.condition1": "Passo 1", "item.create.schematic_and_quill.tooltip.behaviour1": "Seleziona due punti d'angolo usando il clic destro.", "item.create.schematic_and_quill.tooltip.condition2": "Passo 2", - "item.create.schematic_and_quill.tooltip.behaviour2": "Premi _Ctrl_ e _scorri_ sui volti per regolare le dimensioni. Clic destro di nuovo per salvare.", + "item.create.schematic_and_quill.tooltip.behaviour2": "Premi _Ctrl_ e _scorri_ sulle facciate per regolare le dimensioni. Clic destro di nuovo per salvare.", "item.create.schematic_and_quill.tooltip.control1": "Clic-Destro", "item.create.schematic_and_quill.tooltip.action1": "Seleziona un punto d'angolo / conferma il salvataggio.", "item.create.schematic_and_quill.tooltip.control2": "Ctrl premuto", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 51e3ebb30..5416539af 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 12", + "_": "Missing Localizations: 14", "_": "->------------------------] Game Elements [------------------------<-", @@ -149,8 +149,8 @@ "block.create.fluid_tank": "液体タンク", "block.create.fluid_valve": "液体バルブ", "block.create.flywheel": "勢車", - "block.create.framed_glass": "大きなガラス窓", - "block.create.framed_glass_pane": "大きなガラス窓板", + "block.create.framed_glass": "ガラス窓", + "block.create.framed_glass_pane": "ガラス窓板", "block.create.furnace_engine": "かまどエンジン", "block.create.gabbro": "斑れい岩", "block.create.gabbro_bricks": "斑れい岩レンガ", @@ -162,8 +162,8 @@ "block.create.gabbro_cobblestone_stairs": "斑れい岩の丸石の階段", "block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の壁", "block.create.gabbro_pillar": "斑れい岩の柱", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", - "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", + "block.create.gantry_pinion": "ガントリーピニオン", + "block.create.gantry_shaft": "ガントリーシャフト", "block.create.gearbox": "ギアボックス", "block.create.gearshift": "ギアシフト", "block.create.glass_fluid_pipe": "ガラスの液体パイプ", @@ -372,13 +372,13 @@ "block.create.shaft": "シャフト", "block.create.smart_chute": "スマートシュート", "block.create.smart_fluid_pipe": "スマート液体パイプ", - "block.create.speedometer": "スピードメーター", + "block.create.speedometer": "速度メーター", "block.create.spout": "アイテム注液口", "block.create.spruce_window": "マツの窓", "block.create.spruce_window_pane": "マツの窓パネル", "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", "block.create.stockpile_switch": "在庫スイッチ", - "block.create.stressometer": "ストレスメーター", + "block.create.stressometer": "応力メーター", "block.create.tiled_glass": "タイルガラス", "block.create.tiled_glass_pane": "タイルガラス板", "block.create.turntable": "ターンテーブル", @@ -407,7 +407,7 @@ "block.create.zinc_ore": "亜鉛鉱石", "entity.create.contraption": "からくり", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.gantry_contraption": "ガントリーからくり", "entity.create.seat": "シート", "entity.create.stationary_contraption": "付設からくり", "entity.create.super_glue": "接着剤", @@ -527,9 +527,9 @@ "advancement.create.goggles": "応力をこの目で", "advancement.create.goggles.desc": "機械からより多くの情報を手に入れるために、エンジニアのゴーグルを作る", "advancement.create.speedometer": "正確な速度は?", - "advancement.create.speedometer.desc": "動作中のスピードメーターをゴーグルで見て、正確な値を読み取る", + "advancement.create.speedometer.desc": "動作中の速度メーターをゴーグルで見て、正確な値を読み取る", "advancement.create.stressometer": "正確な応力は?", - "advancement.create.stressometer.desc": "動作中のストレスメーターをゴーグルを通して見て、正確な値を読み取る", + "advancement.create.stressometer.desc": "動作中の応力メーターをゴーグルを通して見て、正確な値を読み取る", "advancement.create.aesthetics": "装飾ブーム!", "advancement.create.aesthetics.desc": "シャフト、パイプ、歯車に腕木や腕金を取り付ける", "advancement.create.reinforced": "補強ブーム!", @@ -591,7 +591,7 @@ "advancement.create.pipe_spill": "漏れてる!", "advancement.create.pipe_spill.desc": "パイプの端を露出させて液体が吹き出しているところを見る", "advancement.create.hose_pulley": "工業排水", - "advancement.create.hose_pulley.desc": "ホースプーリーを下げて、液体の排出や吸引を見る", + "advancement.create.hose_pulley.desc": "ホースプーリーを下げて、液体の放出や吸引を見る", "advancement.create.infinite_water": "海の水ぜんぶ抜く大作戦", "advancement.create.infinite_water.desc": "無限と言えるほどの大量の水を吸引する", "advancement.create.infinite_lava": "星の核ぜんぶ抜く大作戦", @@ -602,7 +602,7 @@ "advancement.create.crafter.desc": "メカニカルクラフターを設置して、回転力を与える", "advancement.create.clockwork_bearing": "時計仕掛け", "advancement.create.clockwork_bearing.desc": "時計仕掛けのベアリングの上に構造物を組み立てる", - "advancement.create.nixie_tube": "派手な看板", + "advancement.create.nixie_tube": "イカした看板", "advancement.create.nixie_tube.desc": "ニキシー管を手に入れて、設置する", "advancement.create.deployer": "突く、置く、殴る!", "advancement.create.deployer.desc": "自分の手と全く同じ動きをするデプロイヤーを設置して、稼働させる", @@ -610,7 +610,7 @@ "advancement.create.speed_controller.desc": "究極の伝動機、回転速度コントローラーを設置する", "advancement.create.flywheel": "工場の心臓部", "advancement.create.flywheel.desc": "かまどエンジンを勢車に繋ぐ", - "advancement.create.overstress_flywheel": "高レベル応力", + "advancement.create.overstress_flywheel": "ハイレベル応力", "advancement.create.overstress_flywheel.desc": "かまどエンジンに超過応力をかける", "advancement.create.integrated_circuit": "複素数の計算", "advancement.create.integrated_circuit.desc": "集積回路を組み立てる", @@ -680,7 +680,7 @@ "create.recipe.automatic_shapeless": "自動不定形クラフト", "create.recipe.automatic_brewing": "自動醸造", "create.recipe.packing": "圧縮", - "create.recipe.automatic_packing": "自動包装", + "create.recipe.automatic_packing": "自動圧縮クラフト", "create.recipe.sawing": "製材", "create.recipe.mechanical_crafting": "メカニカルクラフト", "create.recipe.automatic_shaped": "自動定形クラフト", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "動力の統計:", "create.gui.goggles.at_current_speed": "現在の速度", "create.gui.goggles.pole_length": "ポールの長さ:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "計器の情報:", "create.gui.speedometer.title": "回転速度", "create.gui.stressometer.title": "ネットワークの応力", @@ -830,7 +836,7 @@ "create.gui.stressometer.overstressed": "超過応力", "create.gui.stressometer.no_rotation": "回転なし", "create.gui.contraptions.not_fast_enough": "この %1$s は_十分な_回転を_していない_ようです。", - "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらに原動機を追加するか、_応力_の影響が大きい機械のスピードを_下げて_ください。", + "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらに原動機を追加するか、_応力_の影響が大きい機械の速度を_下げて_ください。", "create.gui.adjustable_crate.title": "可変クレート", "create.gui.adjustable_crate.storageSpace": "収納スペース", "create.gui.stockpile_switch.title": "在庫スイッチ", @@ -961,9 +967,9 @@ "create.materialChecklist.blocksNotLoaded": "*免責事項*\n\n素材チェックリストは関連するチャンクがロードされていないため、不正確な場合があります。", "create.gui.filter.deny_list": "ブラックリスト", - "create.gui.filter.deny_list.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。 空のブラックリストはすべてを受け入れます。", + "create.gui.filter.deny_list.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。空のブラックリストはすべてを受け入れます。", "create.gui.filter.allow_list": "ホワイトリスト", - "create.gui.filter.allow_list.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。 空のホワイトリストはすべてを拒否します。", + "create.gui.filter.allow_list.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。空のホワイトリストはすべてを拒否します。", "create.gui.filter.respect_data": "データを重視", "create.gui.filter.respect_data.description": "アイテムは、耐久性、エンチャント、その他の属性も一致する場合にのみ一致します。", "create.gui.filter.ignore_data": "データを無視", @@ -1030,7 +1036,7 @@ "create.gui.attribute_filter.selected_attributes": "選択された属性:", "create.gui.attribute_filter.add_attribute": "属性をリストに追加する", "create.gui.attribute_filter.add_inverted_attribute": "反属性をリストに追加する", - "create.gui.attribute_filter.allow_list_disjunctive": "ホワイトリスト(どれか)", + "create.gui.attribute_filter.allow_list_disjunctive": "ホワイトリスト(いずれか)", "create.gui.attribute_filter.allow_list_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", "create.gui.attribute_filter.allow_list_conjunctive": "ホワイトリスト(全て)", "create.gui.attribute_filter.allow_list_conjunctive.description": "選択した属性をすべてを持っている場合、アイテムは通り抜けます。", @@ -1046,12 +1052,12 @@ "create.tooltip.speedRequirement.none": "無し", "create.tooltip.speedRequirement.medium": "中速", "create.tooltip.speedRequirement.high": "高速", - "create.tooltip.stressImpact": "応力への影響: %1$s", + "create.tooltip.stressImpact": "応力の影響: %1$s", "create.tooltip.stressImpact.low": "低", "create.tooltip.stressImpact.medium": "中", "create.tooltip.stressImpact.high": "高", "create.tooltip.stressImpact.overstressed": "超過応力", - "create.tooltip.capacityProvided": "応力許容量: %1$s", + "create.tooltip.capacityProvided": "応力の容量: %1$s", "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", "create.tooltip.capacityProvided.high": "大", @@ -1119,7 +1125,7 @@ "create.command.killTPSCommand.argument.tickTime": "tickTime", "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", - "create.subtitle.schematicannon_finish": "概略図砲が完了する", + "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", "create.subtitle.mechanical_press_item_break": "金属がガチャンと鳴る", @@ -1180,11 +1186,11 @@ "block.create.brass_funnel.tooltip.behaviour3": "下向きホッパーのように、_アイテム_を_下方向_に_移動_させます。", "block.create.brass_tunnel.tooltip": "真鍮トンネル", - "block.create.brass_tunnel.tooltip.summary": "派手な_メカニカルベルト_の保護カバー!_真鍮トンネル_にはアイテムの_フィルター機能_や、_分割機能_の設定項目も多数用意されています。", + "block.create.brass_tunnel.tooltip.summary": "オシャレな_メカニカルベルト_の保護カバー!_真鍮トンネル_にはアイテムの_フィルター機能_や、_分割機能_の設定項目も多数用意されています。", "block.create.brass_tunnel.tooltip.condition1": "並べて設置したとき", "block.create.brass_tunnel.tooltip.behaviour1": "_真鍮トンネル_は相互に接続し、ある_メカニカルベルト_のアイテムを別の_メカニカルベルト_に送ったりできるようにします。", "block.create.brass_tunnel.tooltip.condition2": "フィルター機能", - "block.create.brass_tunnel.tooltip.behaviour2": "_真鍮トンネル_は_搬入_と_搬出_、両方のフィルターを搭載しています。 _トンネル_のフィルター付き出力から_アイテム_が出てくることが許可されていない場合、並べて設置された_トンネル_の出力に送られます。", + "block.create.brass_tunnel.tooltip.behaviour2": "_真鍮トンネル_は_搬入_と_搬出_、両方のフィルターを搭載しています。_トンネル_のフィルター付き出力から_アイテム_が出てくることが許可されていない場合、並べて設置された_トンネル_の出力に送られます。", "block.create.brass_tunnel.tooltip.condition3": "分割機能", "block.create.brass_tunnel.tooltip.behaviour3": "_真鍮トンネル_は、_アイテム_が接続された_メカニカルベルト_に分類して並べる方法を変更するように設定できます。", "block.create.brass_tunnel.tooltip.control1": "側面をレンチで右クリックしたとき。", @@ -1238,14 +1244,14 @@ "block.create.hose_pulley.tooltip": "ホースプーリー", "block.create.hose_pulley.tooltip.summary": "ワールドの大量の_液体_を_吸引_したり、_放出_したりするのに使います。", "block.create.hose_pulley.tooltip.condition1": "回転したとき", - "block.create.hose_pulley.tooltip.behaviour1": "ホースを_上げ下げ_して、どの程度の_高さ_まで_吸引_や_排出_を行うか決めます。", + "block.create.hose_pulley.tooltip.behaviour1": "ホースを_上げ下げ_して、どの程度の_高さ_まで_吸引_や_放出_を行うか決めます。", "block.create.hose_pulley.tooltip.condition2": "プーリーから液体が吸い込まれたとき", "block.create.hose_pulley.tooltip.behaviour2": "ホースの端がおろされた本体から_液体_ブロックを_吸引_し始めます。非常に_大量_の液体は_無限_と_みなされます_。", "block.create.hose_pulley.tooltip.condition3": "液体がプーリーに押しこまれたとき", "block.create.hose_pulley.tooltip.behaviour3": "ホースの端の_高さ_まで、_液体_の_放出_を始めます。", "block.create.fluid_tank.tooltip": "液体タンク", - "block.create.fluid_tank.tooltip.summary": "あなたのお気に入りの_液体_をすべて_貯蔵_します。縦横に並べて大きさを調整できます。", + "block.create.fluid_tank.tooltip.summary": "あなたのお気に入りのあらゆる_液体_を_貯蔵_できます。縦横に並べて大きさを調整できます。", "block.create.fluid_tank.tooltip.condition1": "レンチで右クリックしたとき", "block.create.fluid_tank.tooltip.behaviour1": "窓の設定を変更します。", @@ -1284,7 +1290,7 @@ "block.create.item_drain.tooltip": "アイテム排液口", "block.create.item_drain.tooltip.summary": "_液体アイテム_を空にする格子付きデポ。", - "block.create.item_drain.tooltip.condition1": "液体排液 ", + "block.create.item_drain.tooltip.condition1": "液体排液", "block.create.item_drain.tooltip.behaviour1": "_バケツ_や_ボトル_などの_液体入り容器_を横から搬入すると、アイテム排液口はその_液体入り容器_に空にしようとします。その後、アイテムは反対側に排出されます。", "block.create.mechanical_arm.tooltip": "メカニカルアーム", @@ -1310,7 +1316,7 @@ "item.create.handheld_blockzapper.tooltip": "携帯ブロックザッパー", "item.create.handheld_blockzapper.tooltip.summary": "離れた場所にブロックを設置または交換する新しいガジェット。", "item.create.handheld_blockzapper.tooltip.control1": "ブロックを左クリックしたとき", - "item.create.handheld_blockzapper.tooltip.action1": "UNLOCALIZED: Sets blocks placed by the tool to the targeted block.", + "item.create.handheld_blockzapper.tooltip.action1": "ターゲットのブロックをこのツールに設定します。", "item.create.handheld_blockzapper.tooltip.control2": "ブロックを右クリックしたとき", "item.create.handheld_blockzapper.tooltip.action2": "ターゲットブロックを_配置_または_置換_します。", "item.create.handheld_blockzapper.tooltip.control3": "スニークしながら右クリックしたとき。", @@ -1356,7 +1362,7 @@ "item.create.empty_schematic.tooltip.summary": "レシピの材料、および_概略図テーブル_での書き込みに使用されます。", "item.create.schematic.tooltip": "概略図", - "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保持します。 ホログラムを必要に応じて配置し、_概略図砲_を使用して建築します。", + "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保持します。ホログラムを必要に応じて配置し、_概略図砲_を使用して建築します。", "item.create.schematic.tooltip.condition1": "持ったとき", "item.create.schematic.tooltip.behaviour1": "画面上のツールを使用して配置できます。", "item.create.schematic.tooltip.control1": "スニークしながら右クリックしたとき", @@ -1367,11 +1373,11 @@ "item.create.schematic_and_quill.tooltip.condition1": "ステップ1", "item.create.schematic_and_quill.tooltip.behaviour1": "右クリックして2つのコーナーポイントを選択します。", "item.create.schematic_and_quill.tooltip.condition2": "ステップ2", - "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrlキーを押しながらスクロール_して、サイズを調整します。 もう一度右クリックして保存します。", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrlキーを押しながらスクロール_して、サイズを調整します。もう一度右クリックして保存します。", "item.create.schematic_and_quill.tooltip.control1": "右クリックしたとき", "item.create.schematic_and_quill.tooltip.action1": "コーナーポイントを選択/保存を確認します。", "item.create.schematic_and_quill.tooltip.control2": "Ctrlを長押してるとき", - "item.create.schematic_and_quill.tooltip.action2": "_空中_でポイントを選択します。 _スクロール_して距離を調整します。", + "item.create.schematic_and_quill.tooltip.action2": "_空中_でポイントを選択します。_スクロール_して距離を調整します。", "item.create.schematic_and_quill.tooltip.control3": "スニークしながら右クリックしたとき", "item.create.schematic_and_quill.tooltip.action3": "選択を_リセット_して削除します。", @@ -1391,11 +1397,11 @@ "block.create.cogwheel.tooltip": "歯車", "block.create.cogwheel.tooltip.summary": "_回転_を直線で、または隣接する_歯車_に_伝達_します。", - "block.create.large_cogwheel.tooltip": "大型歯車", + "block.create.large_cogwheel.tooltip": "大きな歯車", "block.create.large_cogwheel.tooltip.summary": "小さな歯車に接続したときに_回転速度_を_変更_できる歯車の大型バージョン。", "block.create.encased_shaft.tooltip": "ケース入りシャフト", - "block.create.encased_shaft.tooltip.summary": "_回転_を直線で_伝達_します。 壁を通過する回転の伝達に適しています。", + "block.create.encased_shaft.tooltip.summary": "_回転_を直線で_伝達_します。壁を通過する回転の伝達に適しています。", "block.create.gearbox.tooltip": "ギアボックス", "block.create.gearbox.tooltip.summary": "接続された_4方向_の_回転_方向を逆にして_伝達_します。", @@ -1421,9 +1427,9 @@ "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "レッドストーン信号を受けて_いない_ときは、隣接するチェーンドライブと_同じ速度_で回転を伝達します。_レッドストーン信号強度が最大_のときは隣接するチェーンドライブは_その2倍_の速度で伝達します。その間にあるものは1-2倍の速度で伝達されます。", "item.create.belt_connector.tooltip": "メカニカルベルト", - "item.create.belt_connector.tooltip.summary": "2本以上の_シャフト_を_メカニカルベルト_で接続します。接続されたシャフトは全く同じ速度と方向で回転します。 メカニカルベルトは_アイテム_と_エンティティ_を_運搬_するベルトコンベアとして使えます。", + "item.create.belt_connector.tooltip.summary": "2本以上の_シャフト_を_メカニカルベルト_で接続します。接続されたシャフトは全く同じ速度と方向で回転します。メカニカルベルトは_アイテム_と_エンティティ_を_運搬_するベルトコンベアとして使えます。", "item.create.belt_connector.tooltip.control1": "シャフトを右クリックしたとき", - "item.create.belt_connector.tooltip.action1": "ベルトの片端のシャフトを選択します。 選択する2つのシャフトは_ベルトの方向_に向かって_縦_、_横_、または_斜め_に_並べる_必要があります。", + "item.create.belt_connector.tooltip.action1": "ベルトの片端のシャフトを選択します。選択する2つのシャフトは_ベルトの方向_に向かって_縦_、_横_、または_斜め_に_並べる_必要があります。", "item.create.belt_connector.tooltip.control2": "スニークしながら右クリックしたとき", "item.create.belt_connector.tooltip.action2": "ベルトの最初に選択した位置を_リセット_します。", @@ -1435,7 +1441,7 @@ "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの_速度_または_応力_に関する詳細情報を表示します。", "item.create.wrench.tooltip": "レンチ", - "item.create.wrench.tooltip.summary": "動的からくりに取り組むための便利なツール。 コンポーネントの_回転_、_解体_、_設定_に使用できます。", + "item.create.wrench.tooltip.summary": "動的からくりに取り組むための便利なツール。コンポーネントの_回転_、_解体_、_設定_に使用できます。", "item.create.wrench.tooltip.control1": "機械を右クリックしたとき", "item.create.wrench.tooltip.action1": "操作した面に向かって、または面から離れるように機械を_回転_させます。", "item.create.wrench.tooltip.control2": "スニークしながら右クリックしたとき", @@ -1450,7 +1456,7 @@ "block.create.encased_fan.tooltip": "ケース入りファン", "block.create.encased_fan.tooltip.summary": "_回転力_を_気流_に変換し往復させます。色んな使い方があります。", "block.create.encased_fan.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.encased_fan.tooltip.behaviour1": "真下の_熱源_から_回転力_を供給します。 ファンは下向きにする必要があります。", + "block.create.encased_fan.tooltip.behaviour1": "真下の_熱源_から_回転力_を供給します。ファンは下向きにする必要があります。", "block.create.encased_fan.tooltip.condition2": "回転したとき", "block.create.encased_fan.tooltip.behaviour2": "回転速度に応じてエンティティを_押し_たり、_吸い戻し_たりします。", "block.create.encased_fan.tooltip.condition3": "特別なブロックを吹き抜けるとき", @@ -1462,18 +1468,18 @@ "block.create.hand_crank.tooltip": "ハンドクランク", "block.create.hand_crank.tooltip.summary": "プレイヤーの相互作用を必要とする_シンプル_な_原動機_。", "block.create.hand_crank.tooltip.condition1": "使っているとき", - "block.create.hand_crank.tooltip.behaviour1": "接続したに_回転力_を供給します。 _スニークで回転を逆_にできます。", + "block.create.hand_crank.tooltip.behaviour1": "接続したに_回転力_を供給します。_スニークで回転を逆_にできます。", "block.create.cuckoo_clock.tooltip": "鳩時計", "block.create.cuckoo_clock.tooltip.summary": "空間を_彩り_、_時間を刻む_素晴らしい細工。", "block.create.cuckoo_clock.tooltip.condition1": "回転したとき", - "block.create.cuckoo_clock.tooltip.behaviour1": "_現在の時刻_を表示し、1日に2回曲を再生します。 、_正午_と夕暮れにプレイヤーが_眠れるようになるとすぐ_に_アクティブ_になります。", + "block.create.cuckoo_clock.tooltip.behaviour1": "_現在の時刻_を表示し、1日に2回曲を再生します。、_正午_と夕暮れにプレイヤーが_眠れるようになるとすぐ_に_アクティブ_になります。", "block.create.turntable.tooltip": "ターンテーブル", "block.create.turntable.tooltip.summary": "_回転力_を洗練された乗り物酔いに変えます。", "block.create.millstone.tooltip": "石臼", - "block.create.millstone.tooltip.summary": "搬入された_材料_の_研削_に適した機械。 隣接する歯車によって、または下部のシャフトに接続することによって、回転力を供給できます。 完成品は機械から搬出する必要があります。", + "block.create.millstone.tooltip.summary": "搬入された_材料_の_研削_に適した機械。隣接する歯車によって、または下部のシャフトに接続することによって、回転力を供給できます。完成品は機械から搬出する必要があります。", "block.create.millstone.tooltip.condition1": "回転したとき", "block.create.millstone.tooltip.behaviour1": "ブロックの側面または上面から搬入されたアイテムを_粉砕_を開始します。", "block.create.millstone.tooltip.condition2": "右クリックしたとき", @@ -1482,10 +1488,10 @@ "block.create.crushing_wheel.tooltip": "破砕ホイール", "block.create.crushing_wheel.tooltip.summary": "何かを_破砕_する大きな回転させられるホイール。", "block.create.crushing_wheel.tooltip.condition1": "他の破砕ホイールに取り付けたとき", - "block.create.crushing_wheel.tooltip.behaviour1": "様々な物を処理する破砕機を形成します。 ホイールの歯は、_同じ速度_で_反対方向_に回る必要があります。", + "block.create.crushing_wheel.tooltip.behaviour1": "様々な物を処理する破砕機を形成します。ホイールの歯は、_同じ速度_で_反対方向_に回る必要があります。", "block.create.mechanical_press.tooltip": "メカニカルプレス", - "block.create.mechanical_press.tooltip.summary": "その下のアイテムを圧縮する強力なピストン。 一定の_回転力_が必要です。", + "block.create.mechanical_press.tooltip.summary": "その下のアイテムを圧縮する強力なピストン。一定の_回転力_が必要です。", "block.create.mechanical_press.tooltip.condition1": "レッドストーン信号を受けたとき", "block.create.mechanical_press.tooltip.behaviour1": "その下にドロップされたアイテムの圧縮を_開始_します。", "block.create.mechanical_press.tooltip.condition2": "メカニカルベルトの上にあるとき", @@ -1520,9 +1526,9 @@ "block.create.mechanical_crafter.tooltip.condition2": "レッドストーンパルスがオンの時", "block.create.mechanical_crafter.tooltip.behaviour2": "現在与えられているすべての_アイテム_を使って、_強制的_に_クラフト_を開始します。", "block.create.mechanical_crafter.tooltip.control1": "正面をレンチで使ったとき", - "block.create.mechanical_crafter.tooltip.action1": "_個々のクラフターが_アイテムを移動_させる_方向_を循環させます。 クラフトグリッドを形成するには、すべてのアイテムを最後のクラフターに向かって_移動させる流れ_を作るように_ベルト_を設置する必要があります。最後のクラフターはグリッドから_離れる_方向を指す必要があります。", + "block.create.mechanical_crafter.tooltip.action1": "_個々のクラフターが_アイテムを移動_させる_方向_を循環させます。クラフトグリッドを形成するには、すべてのアイテムを最後のクラフターに向かって_移動させる流れ_を作るように_ベルト_を設置する必要があります。最後のクラフターはグリッドから_離れる_方向を指す必要があります。", "block.create.mechanical_crafter.tooltip.control2": "背面をレンチで使ったとき", - "block.create.mechanical_crafter.tooltip.action2": "隣接するクラフターの_搬入インベントリ_を_接続_します。 これを使用してクラフトグリッドの_スロットを_結合_し、_搬入作業_を_簡略化_できます。", + "block.create.mechanical_crafter.tooltip.action2": "隣接するクラフターの_搬入インベントリ_を_接続_します。これを使用してクラフトグリッドの_スロットを_結合_し、_搬入作業_を_簡略化_できます。", "block.create.furnace_engine.tooltip": "かまどエンジン", "block.create.furnace_engine.tooltip.summary": "_稼動しているかまど_で動く強力な_原動機_。", @@ -1549,14 +1555,14 @@ "block.create.portable_fluid_interface.tooltip.behaviour2": "アクティブな接続を即座に_切断_します。", "block.create.rotation_speed_controller.tooltip": "回転速度コントローラー", - "block.create.rotation_speed_controller.tooltip.summary": "回転を任意の速度にスピードアップまたはスローダウンさせることができる_設定_可能な_伝達機_。", + "block.create.rotation_speed_controller.tooltip.summary": "回転を任意の速度に上げたり下げたりさせることができる_設定_可能な_伝達機_。", "block.create.rotation_speed_controller.tooltip.condition1": "大きな歯車を取り付けたとき", "block.create.rotation_speed_controller.tooltip.behaviour1": "入ってくる回転力を歯車に伝達して、目標とする_速度_に_合わせ_ようとします。_歯車_はコントローラの_上_に_取り付ける_必要があります。", "block.create.mechanical_piston.tooltip": "メカニカルピストン", "block.create.mechanical_piston.tooltip.summary": "ピストンのさらに進化したバージョン。回転力を利用して前にある構造物を正確に移動させます。後部にあるピストン延長ポールは、このの稼働範囲を決めます。延長ポールがないと、ピストンは動きません。_シャーシ_や_スライムボール_、_接着剤_を使用して、1列以上のブロックを移動させることができます。", "block.create.mechanical_piston.tooltip.condition1": "回転したとき", - "block.create.mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。 速度と方向は、入力される回転速度と相関します。", + "block.create.mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。速度と方向は、入力される回転速度と相関します。", "block.create.piston_extension_pole.tooltip": "ピストン延長ポール", "block.create.piston_extension_pole.tooltip.summary": "メカニカルピストンの範囲を拡張します。", @@ -1584,7 +1590,7 @@ "block.create.clockwork_bearing.tooltip": "時計仕掛けのベアリング", "block.create.clockwork_bearing.tooltip.summary": "現在の_ゲーム内時間_に応じて最大2つの_時計の針_を回転させる、_メカニカルベアリング_の進化版。", "block.create.clockwork_bearing.tooltip.condition1": "回転したとき", - "block.create.clockwork_bearing.tooltip.behaviour1": "現在の時間に向かって取り付けた構造物の回転を開始します。 2番目の構造物が存在する場合、それは分針として機能します。", + "block.create.clockwork_bearing.tooltip.behaviour1": "現在の時間に向かって取り付けた構造物の回転を開始します。2番目の構造物が存在する場合、それは分針として機能します。", "block.create.sequenced_gearshift.tooltip": "シーケンスギアシフト", "block.create.sequenced_gearshift.tooltip.summary": "_プログラミング_できる_便利_な伝達機械。最大_5つ_の_連続_した_命令_に従って_回転処理_を変更することができます。高速になると精度が悪くなる可能性があります。", @@ -1611,7 +1617,7 @@ "block.create.rope_pulley.tooltip": "ローププーリー", "block.create.rope_pulley.tooltip.summary": "_取り付けられたブロック_や_構造物_を_垂直_方向に移動させます。_シャーシ_、_スライムボール_、_接着剤_を使用して、1つ以上のブロックを移動させることもできます。", "block.create.rope_pulley.tooltip.condition1": "回転したとき", - "block.create.rope_pulley.tooltip.behaviour1": "取り付けた構造物の移動を開始します。 速度と方向は、回転速度に相関します。", + "block.create.rope_pulley.tooltip.behaviour1": "取り付けた構造物の移動を開始します。速度と方向は、回転速度に相関します。", "block.create.linear_chassis.tooltip": "線形シャーシ", "block.create.linear_chassis.tooltip.summary": "移動用の構造物を接続する設定可能な土台ブロック。", @@ -1630,19 +1636,19 @@ "block.create.radial_chassis.tooltip.condition1": "動かしたとき", "block.create.radial_chassis.tooltip.behaviour1": "柱状に_接続_したすべての_シャーシ_と、周囲のブロックを_移動_させます。周囲のブロックは、範囲内にあり、かつ粘着面に面している場合にのみ_引っ張られ_ます([Ctrl]を参照)。", "block.create.radial_chassis.tooltip.condition2": "レンチを持ったとき", - "block.create.radial_chassis.tooltip.behaviour2": "このシャーシブロックの有効_範囲_を設定します。 Ctrlキーを押したままにすると、接続されているすべてのシャーシブロックの範囲も同時に変更できます。", + "block.create.radial_chassis.tooltip.behaviour2": "このシャーシブロックの有効_範囲_を設定します。Ctrlキーを押したままにすると、接続されているすべてのシャーシブロックの範囲も同時に変更できます。", "block.create.radial_chassis.tooltip.control1": "スライムボールで右クリックしたとき", - "block.create.radial_chassis.tooltip.action1": "クリックした面を_粘着面_にします。 シャーシが移動すると、粘着面に接続されているすべての指定のブロックも一緒に移動します。", + "block.create.radial_chassis.tooltip.action1": "クリックした面を_粘着面_にします。シャーシが移動すると、粘着面に接続されているすべての指定のブロックも一緒に移動します。", "block.create.mechanical_drill.tooltip": "メカニカルドリル", - "block.create.mechanical_drill.tooltip.summary": "_ブロックを壊す_のに適した作業機。 _メカニカルピストン_や_ベアリング_等で移動できます。", + "block.create.mechanical_drill.tooltip.summary": "_ブロックを壊す_のに適した作業機。_メカニカルピストン_や_ベアリング_等で移動できます。", "block.create.mechanical_drill.tooltip.condition1": "回転したとき", - "block.create.mechanical_drill.tooltip.behaviour1": "_固定式_のブロック破壊機として機能します。 また、有効範囲の_エンティティを傷つけます_。", + "block.create.mechanical_drill.tooltip.behaviour1": "_固定式_のブロック破壊機として機能します。また、有効範囲の_エンティティを傷つけます_。", "block.create.mechanical_drill.tooltip.condition2": "動かしたとき", "block.create.mechanical_drill.tooltip.behaviour2": "ドリルが衝突するブロックを壊します。", "block.create.mechanical_harvester.tooltip": "メカニカルハーベスター", - "block.create.mechanical_harvester.tooltip.summary": "中規模の作物の自動化に適した機械式植物カッター。 _メカニカルピストン_や_ベアリング_等で移動できます。", + "block.create.mechanical_harvester.tooltip.summary": "中規模の作物の自動化に適した機械式植物カッター。_メカニカルピストン_や_ベアリング_等で移動できます。", "block.create.mechanical_harvester.tooltip.condition1": "動かしたとき", "block.create.mechanical_harvester.tooltip.behaviour1": "ブレードが衝突する_すべての成熟した作物を収穫_し、それらを初期の成長状態にリセットします。", @@ -1652,9 +1658,9 @@ "block.create.mechanical_plough.tooltip.behaviour1": "松明や雪など、当たり判定がないブロックを壊します。エンティティを傷付けることはありません。また、クワを使うように土を耕します。", "block.create.mechanical_saw.tooltip": "メカニカルノコギリ", - "block.create.mechanical_saw.tooltip.summary": "_木_を効率的に_切り倒したり_、_ブロック_を_加工_したりするのに適しています。 _メカニカルピストン_や_ベアリング_等で移動できます。", + "block.create.mechanical_saw.tooltip.summary": "_木_を効率的に_切り倒したり_、_ブロック_を_加工_したりするのに適しています。_メカニカルピストン_や_ベアリング_等で移動できます。", "block.create.mechanical_saw.tooltip.condition1": "上向きのとき", - "block.create.mechanical_saw.tooltip.behaviour1": "そこにドロップまたは搬入されたアイテムに_製材_および石工レシピを適用します。 複数の出力が可能な場合、フィルターが割り当てられていない限り、出力が循環します。", + "block.create.mechanical_saw.tooltip.behaviour1": "そこにドロップまたは搬入されたアイテムに_製材_および石工レシピを適用します。複数の出力が可能な場合、フィルターが割り当てられていない限り、出力が循環します。", "block.create.mechanical_saw.tooltip.condition2": "横向きの場合", "block.create.mechanical_saw.tooltip.behaviour2": "その前の_原木_を_切り倒す_。その原木が木を支えていた場合、_木_は_崩壊_します。", "block.create.mechanical_saw.tooltip.condition3": "動かしたとき", @@ -1669,30 +1675,30 @@ "block.create.content_observer.tooltip.summary": "設定された_フィルター_に一致する_コンテナ_や_メカニカルベルト_内の_アイテム_を検出します。観察している_インベントリ_、_ベルト_、または_シュート_に一致するアイテムが含まれている場合、このは_レッドストーン信号_を発します。観察された_ファンネル_が一致するアイテムを_輸送_すると、このコンポーネントは_レッドストーンパルス_を発します。", "block.create.redstone_link.tooltip": "レッドストーンリンク", - "block.create.redstone_link.tooltip.summary": "_ワイヤレスレッドストーン_接続の終点。 任意のアイテムを使用して_周波数_を割り当てることができます。 通信距離は限られていますが、かなり離れても通信することができます。", + "block.create.redstone_link.tooltip.summary": "_ワイヤレスレッドストーン_接続の終点。任意のアイテムを使用して_周波数_を割り当てることができます。通信距離は限られていますが、かなり離れても通信することができます。", "block.create.redstone_link.tooltip.condition1": "信号を受信したとき", "block.create.redstone_link.tooltip.behaviour1": "同じ周波数のリンクから信号を受信すると、レッドストーン信号を出力します。", "block.create.redstone_link.tooltip.control1": "アイテムで右クリックしたとき", - "block.create.redstone_link.tooltip.action1": "_周波数_をそのアイテムに設定します。 周波数を定義するために、_合計2つの異なるアイテム_を組み合わせて使えます。", + "block.create.redstone_link.tooltip.action1": "_周波数_をそのアイテムに設定します。周波数を定義するために、_合計2つの異なるアイテム_を組み合わせて使えます。", "block.create.redstone_link.tooltip.control2": "スニークしながら右クリックしたとき", "block.create.redstone_link.tooltip.action2": "_受信_モードと_送信_モードを切り替えます。", "block.create.nixie_tube.tooltip": "ニキシー管", - "block.create.nixie_tube.tooltip.summary": "派手にレッドストーン強度と文字を表示します。", + "block.create.nixie_tube.tooltip.summary": "オシャレにレッドストーン強度と文字を表示します。", "block.create.nixie_tube.tooltip.condition1": "レッドストーン信号を受けたとき", "block.create.nixie_tube.tooltip.behaviour1": "現在のレッドストーンの_信号強度_を表示します。", "block.create.nixie_tube.tooltip.condition2": "名札を使ったとき", "block.create.nixie_tube.tooltip.behaviour2": "_名札_の_内容_を複数のニキシー管を並べて表示します。", "block.create.redstone_contact.tooltip": "レッドストーンコンタクト", - "block.create.redstone_contact.tooltip.summary": "レッドストーン信号をペアで出力します。 _メカニカルピストン_や_ベアリング_等で移動できます。", + "block.create.redstone_contact.tooltip.summary": "レッドストーン信号をペアで出力します。_メカニカルピストン_や_ベアリング_等で移動できます。", "block.create.redstone_contact.tooltip.condition1": "他のコンタクトと向かい合ったとき", "block.create.redstone_contact.tooltip.behaviour1": "レッドストーン信号を出力します。", "block.create.redstone_contact.tooltip.condition2": "動かしたとき", "block.create.redstone_contact.tooltip.behaviour2": "通過するすべての固定したレッドストーンコンタクトに反応します。", "block.create.adjustable_crate.tooltip": "可変クレート", - "block.create.adjustable_crate.tooltip.summary": "この_収納ブロック_は、容量を手動で制御できます。任意のアイテムを_16スタック_まで収納できます。 _レッドストーンコンパレーター_に対応しています。", + "block.create.adjustable_crate.tooltip.summary": "この_収納ブロック_は、容量を手動で制御できます。任意のアイテムを_16スタック_まで収納できます。_レッドストーンコンパレーター_に対応しています。", "block.create.adjustable_crate.tooltip.control1": "右クリックしたとき", "block.create.adjustable_crate.tooltip.action1": "_インターフェース_を開きます。", @@ -1702,7 +1708,7 @@ "block.create.creative_crate.tooltip.behaviour1": "このクレートから何かを_搬出_すると、指定されたアイテムが_無限_に_搬出_されます。このクレートに_搬入_されたアイテムは_消滅_します。", "block.create.deployer.tooltip": "デプロイヤー", - "block.create.deployer.tooltip.summary": "_殴る_、_使う_、_起動する_。この機械は、_プレイヤー_をできるだけ_真似_しようとします。_アイテムを自分のインベントリに入れたり_、_預けたり_できます。 持っているアイテムはブロックから直接搬入・搬出する必要があります。", + "block.create.deployer.tooltip.summary": "_殴る_、_使う_、_起動する_。この機械は、_プレイヤー_をできるだけ_真似_しようとします。_アイテムを自分のインベントリに入れたり_、_預けたり_できます。持っているアイテムはブロックから直接搬入・搬出する必要があります。", "block.create.deployer.tooltip.condition1": "回転したとき", "block.create.deployer.tooltip.behaviour1": "腕を機械の2m先まで伸ばし、アイテムを_発動_する。", "block.create.deployer.tooltip.condition2": "レンチで右クリックしたとき", @@ -1711,7 +1717,7 @@ "block.create.deployer.tooltip.behaviour3": "合わないアイテムは搬入できません。逆に合うアイテムは搬出できません。", "block.create.brass_casing.tooltip": "真ちゅうのケーシング", - "block.create.brass_casing.tooltip.summary": "さまざまな用途に使用できる頑丈な機械ケーシング。 装飾にも安心してお使いいただけます。", + "block.create.brass_casing.tooltip.summary": "さまざまな用途に使用できる頑丈な機械ケーシング。装飾にも安心してお使いいただけます。", "block.create.pulse_repeater.tooltip": "パルスリピーター", "block.create.pulse_repeater.tooltip.summary": "通過するレッドストーン信号を_1ティック_の長さにカットする簡単な回路。", @@ -1729,22 +1735,22 @@ "block.create.powered_toggle_latch.tooltip.summary": "レッドストーンパルスによって切替できるレバー。", "block.create.powered_latch.tooltip": "パワードラッチ", - "block.create.powered_latch.tooltip.summary": "_レッドストーン信号_で制御できるレバー。 _背面のレッドストーン信号_でオンになり、_側面からのレッドストーン信号_でリセットされます。", + "block.create.powered_latch.tooltip.summary": "_レッドストーン信号_で制御できるレバー。_背面のレッドストーン信号_でオンになり、_側面からのレッドストーン信号_でリセットされます。", "block.create.controller_rail.tooltip": "コントローラーレール", "block.create.controller_rail.tooltip.summary": "トロッコの_移動速度_を_細かく制御_できる一方通行の_パワード_レール", "block.create.controller_rail.tooltip.condition1": "レッドストーン信号を受けたとき", "block.create.controller_rail.tooltip.behaviour1": "通過する_トロッコ_を_信号の強度_に対応した速度に_加速_または_減速_します。また、隣接するコントローラレールにレッドストーン信号を伝達します。強度の異なる2つのコントローラレールにレッドストーン信号を供給すると、それらの間のレールはその信号の変化を補間します。", - "block.create.speedometer.tooltip": "スピードメーター", - "block.create.speedometer.tooltip.summary": "接続された機械の_回転速度_を測定して表示します。 _レッドストーンコンパレーター_に対応しています。", + "block.create.speedometer.tooltip": "速度メーター", + "block.create.speedometer.tooltip.summary": "接続された機械の_回転速度_を測定して表示します。_レッドストーンコンパレーター_に対応しています。", "block.create.speedometer.tooltip.condition1": "回転したとき", - "block.create.speedometer.tooltip.behaviour1": "速度レベルに対応する色を表示します。 _緑_は低速、_青_は中速、_紫_は高速を示します。 一部の機械は、稼働に十分なレベルの速度を必要とします。", + "block.create.speedometer.tooltip.behaviour1": "速度レベルに対応する色を表示します。_緑_は低速、_青_は中速、_紫_は高速を示します。一部の機械は、稼働に十分なレベルの速度を必要とします。", - "block.create.stressometer.tooltip": "ストレスメーター", - "block.create.stressometer.tooltip.summary": "接続された動力ネットワーク全体の応力を測定して表示します。 _レッドストーンコンパレーター_に対応しています。", + "block.create.stressometer.tooltip": "速度メーター", + "block.create.stressometer.tooltip.summary": "接続された動力ネットワーク全体の応力を測定して表示します。_レッドストーンコンパレーター_に対応しています。", "block.create.stressometer.tooltip.condition1": "回転したとき", - "block.create.stressometer.tooltip.behaviour1": "応力レベルに対応する色を表示します。 _過度に応力がかかった(超過応力)ネットワーク_の機械は全て停止します。応力は動力ネットワークに_原動機_を追加することで緩和することができます。", + "block.create.stressometer.tooltip.behaviour1": "応力レベルに対応する色を表示します。_過度に応力がかかった(超過応力)ネットワーク_の機械は全て停止します。応力は動力ネットワークに_原動機_を追加することで緩和することができます。", "item.create.sand_paper.tooltip": "紙やすり", "item.create.sand_paper.tooltip.summary": "_素材_を_磨く_のに使える荒い紙。デプロイヤーに自動的で磨かせることもできます。", @@ -1762,7 +1768,7 @@ "item.create.builders_tea.tooltip.summary": "_やる気_がみなぎる、一日の始まりに最適な飲み物。", "item.create.refined_radiance.tooltip": "洗練された輝き", - "item.create.refined_radiance.tooltip.summary": "_吸収した光_から鍛造した色彩素材。", + "item.create.refined_radiance.tooltip.summary": "_吸収した輝き_から鍛造した色彩素材。", "item.create.shadow_steel.tooltip": "シャドウスチール", "item.create.shadow_steel.tooltip.summary": "_奈落の虚無_から鍛造した色彩素材。", @@ -1773,7 +1779,7 @@ "item.create.minecart_coupling.tooltip.behaviour1": "2台のトロッコを連結します。それらは移動中に一定の距離を保とうします。", "item.create.crafter_slot_cover.tooltip": "スロットカバー", - "item.create.crafter_slot_cover.tooltip.summary": "取り付けた_メカニカルクラフター_をレシピの空のスロットとして示します。 クラフターは必ずしも正方形である必要はありません。 これは、_同じアイテムが離れた場所にある_レシピに便利です。", + "item.create.crafter_slot_cover.tooltip.summary": "取り付けた_メカニカルクラフター_をレシピの空のスロットとして示します。クラフターは必ずしも正方形である必要はありません。これは、_同じアイテムが離れた場所にある_レシピに便利です。", "create.tooltip.wip": "WIP", "create.tooltip.workInProgress": "作業中です!", @@ -1781,10 +1787,10 @@ "create.tooltip.randomWipDescription1": "赤ちゃんパンダは、このアイテムを使用するたびに死にます。そう、いつでもね。", "create.tooltip.randomWipDescription2": "自己責任。", "create.tooltip.randomWipDescription3": "これはあなたが探しているアイテムではありません。*人差し指を振って*ちっちっちっ、解散!", - "create.tooltip.randomWipDescription4": "このアイテムは10秒で自爆します。 10、9、8 ...", + "create.tooltip.randomWipDescription4": "このアイテムは10秒で自爆します。10、9、8 ...", "create.tooltip.randomWipDescription5": "私を信じて、それは無駄だ。", "create.tooltip.randomWipDescription6": "このアイテムを使用することにより、お客様はここに免責事項に同意し、その条件に同意するものとします。", - "create.tooltip.randomWipDescription7": "これは君に向いていないかもしれない。 あれはどう??", + "create.tooltip.randomWipDescription7": "これは君に向いていないかもしれない。あれはどう??", "create.tooltip.randomWipDescription8": "それを使ったことをすぐ後悔する。", "_": "Thank you for translating Create!" diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index f9779a768..3738a1056 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 55", + "_": "Missing Localizations: 61", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "가동 상태:", "create.gui.goggles.at_current_speed": "현재 에너지량", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "게이지 정보:", "create.gui.speedometer.title": "회전 속도", "create.gui.stressometer.title": "네트워크 부하", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index cbd42c8a8..f2d5bc807 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1155", + "_": "Missing Localizations: 1161", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index a967dbbe6..4a686f966 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1221", + "_": "Missing Localizations: 1227", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 01743b81b..4ccc0e1ab 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 5", + "_": "Missing Localizations: 11", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", "create.gui.goggles.at_current_speed": "На текущей скорости", "create.gui.goggles.pole_length": "Длина поршня", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "Калибровочная информация:", "create.gui.speedometer.title": "Скорость вращения", "create.gui.stressometer.title": "Сетевой момент", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 625bf7385..873427b8f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 3", + "_": "Missing Localizations: 9", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "动力学状态:", "create.gui.goggles.at_current_speed": "当前速度应力值", "create.gui.goggles.pole_length": "活塞杆长度:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "仪表信息:", "create.gui.speedometer.title": "旋转速度", "create.gui.stressometer.title": "网络应力", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 8fa416308..4a9a17215 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 8", + "_": "Missing Localizations: 14", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "機械學狀態:", "create.gui.goggles.at_current_speed": "現在速度動能值", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "儀表訊息:", "create.gui.speedometer.title": "旋轉速度", "create.gui.stressometer.title": "網路動能", diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index fb029ea0d..52641d2a9 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -1,25 +1,7 @@ package com.simibubi.create; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; -import com.simibubi.create.content.contraptions.base.RotatingData; -import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; -import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; -import com.simibubi.create.content.contraptions.relays.belt.BeltData; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.backend.instancing.*; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.MatrixStacker; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.model.ModelLoader; +import static net.minecraft.state.properties.BlockStateProperties.FACING; +import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; import java.util.ArrayList; import java.util.HashMap; @@ -27,8 +9,27 @@ import java.util.List; import java.util.Map; import java.util.function.Supplier; -import static net.minecraft.state.properties.BlockStateProperties.FACING; -import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; +import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.content.contraptions.relays.belt.BeltData; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.model.ModelLoader; public class AllBlockPartials { diff --git a/src/main/java/com/simibubi/create/AllColorHandlers.java b/src/main/java/com/simibubi/create/AllColorHandlers.java index f6c0fe245..9aa7ce8cc 100644 --- a/src/main/java/com/simibubi/create/AllColorHandlers.java +++ b/src/main/java/com/simibubi/create/AllColorHandlers.java @@ -1,7 +1,11 @@ package com.simibubi.create; +import java.util.HashMap; +import java.util.Map; + import com.simibubi.create.foundation.block.IBlockVertexColor; import com.simibubi.create.foundation.block.render.ColoredVertexModel; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.RedstoneWireBlock; @@ -18,9 +22,6 @@ import net.minecraft.world.GrassColors; import net.minecraft.world.ILightReader; import net.minecraft.world.biome.BiomeColors; -import java.util.HashMap; -import java.util.Map; - public class AllColorHandlers { private final Map coloredVertexBlocks = new HashMap<>(); diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index ba2097ff8..d811fba0e 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -1,7 +1,11 @@ package com.simibubi.create; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.*; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntityRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueRenderer; diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 85d8cd1f9..292e50d91 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -284,6 +284,7 @@ public class AllItems { .register(); } + @SuppressWarnings("unused") private static ItemEntry hiddenIngredient(String name) { return REGISTRATE.item(name, HiddenIngredientItem::new) .register(); diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 231836c8e..1abb73271 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -1,7 +1,19 @@ package com.simibubi.create; -import com.simibubi.create.content.contraptions.base.*; -import com.simibubi.create.content.contraptions.components.actors.*; +import com.simibubi.create.content.contraptions.base.BackHalfShaftInstance; +import com.simibubi.create.content.contraptions.base.HalfShaftInstance; +import com.simibubi.create.content.contraptions.base.HorizontalHalfShaftInstance; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.content.contraptions.components.actors.DrillInstance; +import com.simibubi.create.content.contraptions.components.actors.DrillRenderer; +import com.simibubi.create.content.contraptions.components.actors.DrillTileEntity; +import com.simibubi.create.content.contraptions.components.actors.HarvesterRenderer; +import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; +import com.simibubi.create.content.contraptions.components.actors.PortableFluidInterfaceTileEntity; +import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; +import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterInstance; @@ -51,8 +63,18 @@ import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheel import com.simibubi.create.content.contraptions.fluids.PumpCogInstance; import com.simibubi.create.content.contraptions.fluids.PumpRenderer; import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; -import com.simibubi.create.content.contraptions.fluids.actors.*; -import com.simibubi.create.content.contraptions.fluids.pipes.*; +import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyRenderer; +import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity; +import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainRenderer; +import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainTileEntity; +import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer; +import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveRenderer; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity; +import com.simibubi.create.content.contraptions.fluids.pipes.TransparentStraightPipeRenderer; import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; @@ -68,7 +90,13 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltInstance; import com.simibubi.create.content.contraptions.relays.belt.BeltRenderer; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.SimpleKineticTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.*; +import com.simibubi.create.content.contraptions.relays.encased.AdjustablePulleyTileEntity; +import com.simibubi.create.content.contraptions.relays.encased.ClutchTileEntity; +import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftRenderer; +import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftTileEntity; +import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; +import com.simibubi.create.content.contraptions.relays.encased.SplitShaftInstance; +import com.simibubi.create.content.contraptions.relays.encased.SplitShaftRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeRenderer; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEntity; @@ -95,7 +123,13 @@ import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTile import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInstance; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity; -import com.simibubi.create.content.logistics.block.redstone.*; +import com.simibubi.create.content.logistics.block.redstone.AnalogLeverRenderer; +import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; +import com.simibubi.create.content.logistics.block.redstone.ContentObserverTileEntity; +import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer; +import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; +import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; +import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity; import com.simibubi.create.content.schematics.block.SchematicTableTileEntity; import com.simibubi.create.content.schematics.block.SchematicannonRenderer; import com.simibubi.create.content.schematics.block.SchematicannonTileEntity; diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index af28f62f3..4a13fc88d 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -95,7 +95,7 @@ public class Create { AllConfigs.register(); random = new Random(); - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.addClientListeners(modEventBus)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.addClientListeners(modEventBus)); } public static void init(final FMLCommonSetupEvent event) { diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 5ddaa41fd..e698cfe85 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.function.Function; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; import com.simibubi.create.content.schematics.ClientSchematicLoader; import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; @@ -16,10 +17,9 @@ import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; import com.simibubi.create.foundation.render.KineticRenderer; -import com.simibubi.create.foundation.render.backend.OptifineHandler; import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.OptifineHandler; import com.simibubi.create.foundation.utility.ghost.GhostBlocks; import com.simibubi.create.foundation.utility.outliner.Outliner; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index 003cf9333..2ff8f46ad 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -3,6 +3,7 @@ package com.simibubi.create.compat.jei.category.animations; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import mezz.jei.api.gui.drawable.IDrawable; import net.minecraft.block.BlockState; import net.minecraft.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java index 7b2d99c6e..849e95121 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.util.Direction.Axis; public class AnimatedPress extends AnimatedKinetics { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index 52eed284e..d39255552 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -1,5 +1,7 @@ package com.simibubi.create.compat.jei.category.animations; +import java.util.List; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; @@ -7,14 +9,13 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer.Impl; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fluids.FluidStack; -import java.util.List; - public class AnimatedSpout extends AnimatedKinetics { private List fluids; diff --git a/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java b/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java index 60ca8abb3..bbbe8e585 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java +++ b/src/main/java/com/simibubi/create/content/contraptions/KineticNetwork.java @@ -1,13 +1,13 @@ package com.simibubi.create.content.contraptions; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; -import com.simibubi.create.foundation.advancement.AllTriggers; - import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; +import com.simibubi.create.foundation.advancement.AllTriggers; + public class KineticNetwork { public Long id; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java index 4a1875d28..0d566b45f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java @@ -1,7 +1,8 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; @@ -10,7 +11,7 @@ import net.minecraftforge.fml.DistExecutor; public class BackHalfShaftInstance extends HalfShaftInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, BackHalfShaftInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java index 0547b25fc..6e70b9780 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -1,9 +1,10 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; @@ -12,7 +13,7 @@ import net.minecraftforge.fml.DistExecutor; public class HalfShaftInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, HalfShaftInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java index a42524118..958305113 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java @@ -1,7 +1,8 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; @@ -10,7 +11,7 @@ import net.minecraftforge.fml.DistExecutor; public class HorizontalHalfShaftInstance extends HalfShaftInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, HorizontalHalfShaftInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java index a5f2889ba..84d8a878a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java @@ -1,13 +1,14 @@ package com.simibubi.create.content.contraptions.base; +import java.nio.ByteBuffer; + import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.utility.ColorHelper; + import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; -import java.nio.ByteBuffer; - public class KineticData> extends InstanceData { private float x; private float y; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java index 77a14eabb..49223a3cb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.contraptions.base; +import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.content.contraptions.relays.belt.BeltData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.MaterialType; -import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; public class KineticRenderMaterials { public static final MaterialType> ROTATING = new MaterialType<>(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index afc9304f8..f99113046 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -43,12 +43,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; -import javax.annotation.Nullable; -import java.util.List; - -import static net.minecraft.util.text.TextFormatting.GOLD; -import static net.minecraft.util.text.TextFormatting.GRAY; - public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation, IInstanceRendered { @@ -548,13 +542,13 @@ public abstract class KineticTileEntity extends SmartTileEntity public void onLoad() { super.onLoad(); if (world != null && world.isRemote) - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); } @Override public void onChunkUnloaded() { if (world != null && world.isRemote) - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.remove(this)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.remove(this)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 836d63c66..cc27ee7f8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -6,12 +6,12 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; +import com.simibubi.create.foundation.render.Compartment; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.Compartment; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index f94f5b959..69f53613c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -1,16 +1,20 @@ package com.simibubi.create.content.contraptions.base; +import java.util.function.Consumer; + import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance; + import net.minecraft.block.BlockState; import net.minecraft.util.Direction; import net.minecraft.world.LightType; -import java.util.function.Consumer; - public abstract class KineticTileInstance extends TileEntityInstance { public KineticTileInstance(InstancedTileRenderer modelManager, T tile) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java index f76ff0319..75c45893c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatedPillarKineticBlock.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.utility.Iterate; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java index 75fca6a53..dcc5ca5f7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingData.java @@ -1,12 +1,13 @@ package com.simibubi.create.content.contraptions.base; +import java.nio.ByteBuffer; + import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; + import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.Direction; -import java.nio.ByteBuffer; - public class RotatingData extends KineticData { public static VertexFormat FORMAT = VertexFormat.builder() .addAttributes(KineticVertexAttributes.class) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java index 0b9a2e998..6f439ca42 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingInstancedModel.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.client.renderer.BufferBuilder; public class RotatingInstancedModel extends InstancedModel { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java index a64b049bd..ff96d5856 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java @@ -1,16 +1,17 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class ShaftlessCogInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, ShaftlessCogInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index 3a717e5a7..9008e2f44 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -1,20 +1,21 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.KINETIC_TILE; + import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.KINETIC_TILE; - public class SingleRotatingInstance extends KineticTileInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, SingleRotatingInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java index d7eb78b24..56853e9d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java @@ -1,13 +1,14 @@ package com.simibubi.create.content.contraptions.components.actors; +import java.nio.ByteBuffer; + import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; + import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; -import java.nio.ByteBuffer; - public class ContraptionActorData extends InstanceData { public static VertexFormat FORMAT = VertexFormat.builder() .addAttributes(ActorVertexAttributes.class) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index 16fd9b7d4..6ff6d7832 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -6,8 +6,12 @@ import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; -import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.utility.AngleHelper; + import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; @@ -17,7 +21,7 @@ import net.minecraftforge.fml.DistExecutor; public class DrillInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, DrillInstance::new)); } public DrillInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index a600cf9da..965d6c3c0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 57e858cde..8a73c8ec7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -7,10 +7,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index c2d2b7880..ea53b2b2c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -2,13 +2,13 @@ package com.simibubi.create.content.contraptions.components.actors; import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; -import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import org.apache.commons.lang3.mutable.MutableBoolean; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.VecHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 7456140d0..f271549d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -7,12 +7,12 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java index 4f3ac91e8..a67d0da54 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.components.actors; +import java.util.function.Consumer; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -11,6 +13,7 @@ import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; + import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -20,8 +23,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import java.util.function.Consumer; - public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer { public PortableStorageInterfaceRenderer(TileEntityRendererDispatcher dispatcher) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java index 0efe011b0..8715c6f99 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RotatingActorModel.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.client.renderer.BufferBuilder; public class RotatingActorModel extends InstancedModel { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index 6f7c8c427..cdbd0e92e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; -import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java index bc2d77826..791d82e8e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java @@ -1,5 +1,9 @@ package com.simibubi.create.content.contraptions.components.clock; +import static com.simibubi.create.foundation.utility.AngleHelper.deg; +import static com.simibubi.create.foundation.utility.AngleHelper.getShortestAngleDiff; +import static com.simibubi.create.foundation.utility.AngleHelper.rad; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; @@ -7,6 +11,7 @@ import com.simibubi.create.foundation.gui.widgets.InterpolatedValue; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; @@ -17,8 +22,6 @@ import net.minecraft.util.SoundEvents; import net.minecraft.util.math.Vec3d; import net.minecraft.world.Explosion; -import static com.simibubi.create.foundation.utility.AngleHelper.*; - public class CuckooClockTileEntity extends KineticTileEntity { public static DamageSource CUCKOO_SURPRISE = new DamageSource("create.cuckoo_clock_explosion").setExplosion(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java index 74c889e01..5313cdbef 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java @@ -1,25 +1,25 @@ package com.simibubi.create.content.contraptions.components.crafter; +import java.util.function.Supplier; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.content.contraptions.base.RotatingData; -import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.utility.MatrixStacker; + import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import java.util.function.Supplier; - public class MechanicalCrafterInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, MechanicalCrafterInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java index d94e5c35c..a40e7d3aa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java @@ -1,17 +1,21 @@ package com.simibubi.create.content.contraptions.components.crafter; +import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; +import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.standardKineticRotationTransform; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity.Phase; import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHandler.GroupedItems; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -26,9 +30,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; -import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.standardKineticRotationTransform; - public class MechanicalCrafterRenderer extends SafeTileEntityRenderer { public MechanicalCrafterRenderer(TileEntityRendererDispatcher dispatcher) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java index 67dee0db5..64dc60b2d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java @@ -1,5 +1,14 @@ package com.simibubi.create.content.contraptions.components.crafter; +import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; + +import org.apache.commons.lang3.tuple.Pair; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -13,6 +22,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipula import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Pointing; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; @@ -29,14 +39,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map.Entry; - -import static com.simibubi.create.content.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; public class MechanicalCrafterTileEntity extends KineticTileEntity { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java index 2a7b0a1d1..c4acc3aa6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.crank; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; + import net.minecraft.block.Block; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 6f94068af..ee30d715c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -12,13 +12,13 @@ import com.simibubi.create.content.contraptions.components.deployer.DeployerTile import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index b31a3a607..4af470f72 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -1,5 +1,10 @@ package com.simibubi.create.content.contraptions.components.deployer; +import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; + +import java.util.ArrayList; +import java.util.List; + import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -10,6 +15,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -18,20 +24,20 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; -import net.minecraft.util.math.*; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceContext; import net.minecraft.util.math.RayTraceContext.BlockMode; import net.minecraft.util.math.RayTraceContext.FluidMode; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandlerModifiable; -import java.util.ArrayList; -import java.util.List; - -import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; - public class DeployerTileEntity extends KineticTileEntity { protected State state; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 870aebca3..5bf8b87d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -7,9 +7,9 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index 88a702f56..c2fbf6d56 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -1,13 +1,16 @@ package com.simibubi.create.content.contraptions.components.fan; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -16,11 +19,9 @@ import net.minecraft.world.LightType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import static net.minecraft.state.properties.BlockStateProperties.FACING; - public class FanInstance extends KineticTileInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, FanInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleBlock.java index 2c0a842ce..8cffa1023 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleBlock.java @@ -1,8 +1,11 @@ package com.simibubi.create.content.contraptions.components.fan; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.ProperDirectionalBlock; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -18,8 +21,6 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -import javax.annotation.ParametersAreNonnullByDefault; - @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class NozzleBlock extends ProperDirectionalBlock { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index f1f9cda0d..f49c7dbef 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -1,10 +1,16 @@ package com.simibubi.create.content.contraptions.components.flywheel; +import java.util.function.Consumer; + import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.RotatingData; -import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.block.BlockState; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; @@ -13,11 +19,9 @@ import net.minecraft.util.Rotation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import java.util.function.Consumer; - public class FlyWheelInstance extends KineticTileInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, FlyWheelInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 76453c14e..be3d3e108 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; -import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index 830081dfb..67f4952b7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.flywheel; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.AxisAlignedBB; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java index bcaddb716..329cc5e7b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java @@ -2,18 +2,19 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class MillStoneCogInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, MillStoneCogInstance::new)); } public MillStoneCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 4d4477d9f..4220afa17 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -5,9 +5,9 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java index 0a04d43bb..62060db98 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java @@ -1,23 +1,24 @@ package com.simibubi.create.content.contraptions.components.saw; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Rotation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import static net.minecraft.state.properties.BlockStateProperties.FACING; - public class SawInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, SawInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index fb9d56fc3..d68105100 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -9,12 +9,12 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java index 2cf10642d..870572900 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java @@ -1,5 +1,11 @@ package com.simibubi.create.content.contraptions.components.saw; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + import com.google.common.base.Predicate; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.actors.BlockBreakingKineticTileEntity; @@ -15,7 +21,16 @@ import com.simibubi.create.foundation.utility.TreeCutter.Tree; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.recipe.RecipeConditions; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; -import net.minecraft.block.*; + +import net.minecraft.block.BambooBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CactusBlock; +import net.minecraft.block.ChorusPlantBlock; +import net.minecraft.block.KelpBlock; +import net.minecraft.block.KelpTopBlock; +import net.minecraft.block.StemGrownBlock; +import net.minecraft.block.SugarCaneBlock; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; @@ -38,12 +53,6 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; -import java.util.stream.Collectors; - public class SawTileEntity extends BlockBreakingKineticTileEntity { private static final Object cuttingRecipesKey = new Object(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index f3c3d8a99..26130afe4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -7,10 +7,10 @@ import java.util.Map; import java.util.Map.Entry; import java.util.UUID; -import com.mojang.blaze3d.matrix.MatrixStack; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.tuple.MutablePair; +import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java index 0db500c6d..d4f38a469 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.simibubi.create.foundation.config.AllConfigs; + import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; @@ -8,6 +9,8 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; public class AssemblyException extends Exception { + + private static final long serialVersionUID = 1L; public final ITextComponent component; private BlockPos position = null; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 1de138917..3e363d2d3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -1,5 +1,29 @@ package com.simibubi.create.content.contraptions.components.structureMovement; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Queue; +import java.util.Set; +import java.util.UUID; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.Pair; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.base.IRotate; @@ -29,9 +53,21 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.render.backend.light.EmptyLighter; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.NBTProcessors; +import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; -import net.minecraft.block.*; + +import net.minecraft.block.AbstractButtonBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChestBlock; +import net.minecraft.block.DoorBlock; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.block.PressurePlateBlock; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.Entity; import net.minecraft.fluid.Fluids; @@ -69,16 +105,6 @@ import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.registries.GameData; -import org.apache.commons.lang3.tuple.MutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import javax.annotation.Nullable; -import java.util.*; -import java.util.function.BiConsumer; -import java.util.stream.Collectors; - -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead; public abstract class Contraption { @@ -478,7 +504,6 @@ public abstract class Contraption { } private boolean moveMechanicalPiston(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) throws AssemblyException { - int limit = AllConfigs.SERVER.kinetics.maxPistonPoles.get(); Direction direction = state.get(MechanicalPistonBlock.FACING); PistonState pistonState = state.get(MechanicalPistonBlock.STATE); if (pistonState == PistonState.MOVING) @@ -978,7 +1003,6 @@ public abstract class Contraption { if (!shouldUpdateAfterMovement(block)) continue; BlockPos targetPos = transform.apply(block.pos); - BlockState state = world.getBlockState(targetPos); world.markAndNotifyBlock(targetPos, null, block.state, block.state, BlockFlags.IS_MOVING | BlockFlags.DEFAULT); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java index 4f8e5f812..f9922623a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java @@ -311,7 +311,7 @@ public class ContraptionCollider { if (!entity.world.isRemote) return PlayerType.SERVER; MutableBoolean isClient = new MutableBoolean(false); - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> isClient.setValue(isClientPlayerEntity(entity))); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> isClient.setValue(isClientPlayerEntity(entity))); return isClient.booleanValue() ? PlayerType.CLIENT : PlayerType.REMOTE; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionDisassemblyPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionDisassemblyPacket.java index 20baaaa45..50b27b6ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionDisassemblyPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionDisassemblyPacket.java @@ -33,7 +33,7 @@ public class ContraptionDisassemblyPacket extends SimplePacketBase { @Override public void handle(Supplier context) { context.get() - .enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, + .enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> AbstractContraptionEntity.handleDisassemblyPacket(this))); context.get() .setPacketHandled(true); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java index 850d92446..b66008c4e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.culling.ClippingHelperImpl; import net.minecraft.client.renderer.entity.EntityRenderer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java index 30f6a6a9d..21664ce2e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java @@ -7,7 +7,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.WorldAttached; @@ -18,9 +17,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.util.Constants.NBT; -import net.minecraftforge.fml.DistExecutor; public class ContraptionHandler { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionStallPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionStallPacket.java index 1909dd3ca..9c9aac76f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionStallPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionStallPacket.java @@ -42,7 +42,7 @@ public class ContraptionStallPacket extends SimplePacketBase { @Override public void handle(Supplier context) { context.get().enqueueWork( - () -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> AbstractContraptionEntity.handleStallPacket(this))); + () -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> AbstractContraptionEntity.handleStallPacket(this))); context.get().setPacketHandled(true); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java index 33abfc9fb..1a34952ef 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java @@ -1,12 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement; -import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; -import com.simibubi.create.foundation.utility.Lang; -import net.minecraft.util.text.TextFormatting; - import java.util.Arrays; import java.util.List; +import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.util.text.TextFormatting; + public interface IDisplayAssemblyExceptions { default boolean addExceptionToTooltip(List tooltip) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index 72ede2acb..062a1601a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; - import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; + import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java index 8b6df8b9b..6d241061a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java @@ -15,7 +15,11 @@ import com.simibubi.create.content.contraptions.components.structureMovement.mou import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java index 82fef4ed0..7b1fc465f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java @@ -1,14 +1,12 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllTags.AllBlockTags; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; @@ -16,6 +14,8 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class BearingContraption extends Contraption { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java index 6584cb2d2..f2b3e5eec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java @@ -1,12 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import java.util.Set; + import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; + import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import java.util.Set; - public class BearingLighter extends ContraptionLighter { public BearingLighter(BearingContraption contraption) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index b1c071ea3..f94d29e89 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java index aa4693786..49cba252a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java @@ -1,5 +1,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import java.util.List; + +import org.apache.commons.lang3.tuple.Pair; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; @@ -14,6 +18,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOpt import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.ServerSpeedProvider; + import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; @@ -22,9 +27,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; public class ClockworkBearingTileEntity extends KineticTileEntity implements IBearingTileEntity, IDisplayAssemblyExceptions { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java index a105ad0d2..1dea812eb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java @@ -1,25 +1,21 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.apache.commons.lang3.tuple.Pair; - -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; -import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.utility.NBTHelper; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; - import java.util.HashSet; import java.util.Queue; import java.util.Set; +import org.apache.commons.lang3.tuple.Pair; + +import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + public class ClockworkContraption extends Contraption { protected Direction facing; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index b313cf931..42460217a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -1,5 +1,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + +import java.util.List; + import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; @@ -12,6 +16,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOpt import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.ServerSpeedProvider; + import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; @@ -20,10 +25,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import java.util.List; - -import static net.minecraft.state.properties.BlockStateProperties.FACING; - public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity implements IBearingTileEntity, IDisplayAssemblyExceptions { protected ScrollOptionBehaviour movementMode; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index 2111ebeff..7acf1e590 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -1,5 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + +import javax.annotation.Nullable; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.ProperDirectionalBlock; @@ -8,13 +16,18 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.*; +import net.minecraft.item.BlockItem; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.DyeColor; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ShearsItem; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; @@ -27,13 +40,6 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Predicate; - public class SailBlock extends ProperDirectionalBlock { public static SailBlock frame(Properties properties) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 6a8243f90..b2a517625 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -2,11 +2,16 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.content.contraptions.components.structureMovement.*; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java index 7ad42fd21..4eec742bc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedContraption.java @@ -1,13 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; +import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java index b9cae7e36..68b053ab6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java @@ -89,7 +89,6 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements return ActionResultType.SUCCESS; } - @SuppressWarnings("deprecation") @Override public BlockState rotate(BlockState state, Rotation rotation) { if (rotation == Rotation.NONE) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java index fcb4f1c1b..1f8396922 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java @@ -49,7 +49,7 @@ public class ChassisTileEntity extends SmartTileEntity { range.between(1, max); range .withClientCallback( - i -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ChassisRangeDisplay.display(this))); + i -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ChassisRangeDisplay.display(this))); range.value = max / 2; behaviours.add(range); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java index 0db060fb7..0db74075e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java @@ -1,7 +1,12 @@ package com.simibubi.create.content.contraptions.components.structureMovement.gantry; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.components.structureMovement.*; +import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; +import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionUpdatePacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionUpdatePacket.java index 1e0637497..54463c051 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionUpdatePacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionUpdatePacket.java @@ -38,7 +38,7 @@ public class GantryContraptionUpdatePacket extends SimplePacketBase { public void handle(Supplier context) { context.get() .enqueueWork( - () -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> GantryContraptionEntity.handlePacket(this))); + () -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> GantryContraptionEntity.handlePacket(this))); context.get() .setPacketHandled(true); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java index 15c4d6a86..582b7d749 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.gantry; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; @@ -7,6 +9,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.IDisplayAssemblyExceptions; import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock; import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftTileEntity; + import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; @@ -15,8 +18,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; -import static net.minecraft.state.properties.BlockStateProperties.FACING; - public class GantryPinionTileEntity extends KineticTileEntity implements IDisplayAssemblyExceptions { boolean assembleNextTick; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueEffectPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueEffectPacket.java index d2d6c6917..8d454a134 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/GlueEffectPacket.java @@ -39,7 +39,7 @@ public class GlueEffectPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) public void handle(Supplier context) { - context.get().enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + context.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { Minecraft mc = Minecraft.getInstance(); if (!mc.player.getPosition().withinDistance(pos, 100)) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index 46db36d90..547aeb02c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -1,5 +1,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement.glue; +import javax.annotation.Nullable; + +import org.apache.commons.lang3.Validate; + import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; @@ -10,11 +14,16 @@ import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.BlockFace; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.*; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntitySize; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.MoverType; +import net.minecraft.entity.Pose; import net.minecraft.entity.effect.LightningBoltEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -22,10 +31,21 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; -import net.minecraft.util.*; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.DamageSource; +import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.*; +import net.minecraft.util.Hand; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -33,9 +53,6 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.PacketDistributor; -import org.apache.commons.lang3.Validate; - -import javax.annotation.Nullable; public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnData, ISpecialEntityItemRequirement { @@ -234,7 +251,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat @Override public boolean processInitialInteract(PlayerEntity player, Hand hand) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { triggerPlaceBlock(player, hand); }); return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java index c9862ba88..425f0b567 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java @@ -1,9 +1,14 @@ package com.simibubi.create.content.contraptions.components.structureMovement.glue; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import com.simibubi.create.AllItems; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.worldWrappers.RayTraceWorld; + import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -11,8 +16,12 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; -import net.minecraft.util.math.*; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceContext; import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraftforge.event.world.BlockEvent.EntityPlaceEvent; @@ -20,10 +29,6 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.network.PacketDistributor; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - @EventBusSubscriber public class SuperGlueHandler { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java index e256f03ac..c82c00e85 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java @@ -1,19 +1,19 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mounted; +import java.util.function.Predicate; +import java.util.function.Supplier; + import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.tracks.ControllerRailBlock; import com.simibubi.create.foundation.utility.Lang; - import com.tterrag.registrate.util.entry.BlockEntry; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.item.Item; import net.minecraft.util.IStringSerializable; -import java.util.function.Predicate; -import java.util.function.Supplier; - public enum CartAssembleRailType implements IStringSerializable { REGULAR(Blocks.RAIL), diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java index 8a50eb7cf..f6f67fe4f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java @@ -1,5 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mounted; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; @@ -18,6 +26,7 @@ import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.AbstractRailBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -38,9 +47,18 @@ import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.RailShape; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.*; +import net.minecraft.util.Hand; +import net.minecraft.util.Rotation; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShapes; @@ -52,13 +70,6 @@ import net.minecraft.world.storage.loot.LootContext; import net.minecraft.world.storage.loot.LootParameters; import net.minecraftforge.common.util.LazyOptional; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - public class CartAssemblerBlock extends AbstractRailBlock implements ITE, IWrenchable, ISpecialBlockItemRequirement { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java index f94f0bdc7..10964f6db 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mounted; +import java.util.List; + import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.IDisplayAssemblyExceptions; import com.simibubi.create.foundation.gui.AllIcons; @@ -11,14 +13,13 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIco import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.RailShape; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.Vec3d; -import java.util.List; - public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplayAssemblyExceptions { private static final int assemblyCooldown = 8; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java index f929c847a..a11a0b471 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java @@ -7,12 +7,12 @@ import java.util.Queue; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -35,11 +35,6 @@ import net.minecraft.world.gen.feature.template.Template.BlockInfo; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.items.wrapper.InvWrapper; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; - -import static com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.RAIL_SHAPE; public class MountedContraption extends Contraption { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java index ce3cb1470..c958b6a92 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java @@ -1,20 +1,25 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; +import java.util.List; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.*; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; +import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.IControlContraption; +import com.simibubi.create.content.contraptions.components.structureMovement.IDisplayAssemblyExceptions; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.ServerSpeedProvider; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -import java.util.List; - public abstract class LinearActuatorTileEntity extends KineticTileEntity implements IControlContraption, IDisplayAssemblyExceptions { public float offset; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java index 2af438fd7..7c1ba23b0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java @@ -1,13 +1,28 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; +import static com.simibubi.create.AllBlocks.MECHANICAL_PISTON_HEAD; +import static com.simibubi.create.AllBlocks.PISTON_EXTENSION_POLE; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPiston; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isStickyPiston; +import static net.minecraft.state.properties.BlockStateProperties.FACING; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; + +import org.apache.commons.lang3.tuple.Pair; + import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementTraits; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; -import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; +import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.block.CarpetBlock; import net.minecraft.block.material.PushReaction; @@ -23,16 +38,6 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; -import java.util.Queue; - -import static com.simibubi.create.AllBlocks.MECHANICAL_PISTON_HEAD; -import static com.simibubi.create.AllBlocks.PISTON_EXTENSION_POLE; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; -import static net.minecraft.state.properties.BlockStateProperties.FACING; public class PistonContraption extends TranslatingContraption { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java index b0cb526f2..e8519c0e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java @@ -1,13 +1,20 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPiston; +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead; + +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; -import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; +import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ProperDirectionalBlock; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.util.PoleHelper; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -34,10 +41,6 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; -import java.util.function.Predicate; - -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; - public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable, IWaterLoggable { private static final int placementHelperId = PlacementHelpers.register(PlacementHelper.get()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java index 94d4e25d1..1c8ffa5ed 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonLighter.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pi import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; + import net.minecraft.util.math.Vec3i; public class PistonLighter extends ContraptionLighter { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java index 3e1b87452..17d3ca9ce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java index 5f8487c6e..bb81e319e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyContraption.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pulley; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption; -import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java index 1541eb941..4714a30e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyLighter.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pu import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; + import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java index 1f0eef324..5fde955e9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java @@ -9,6 +9,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pis import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; + import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.IWaterLoggable; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java index d670c354f..6733cd22a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -1,12 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; -import com.simibubi.create.foundation.render.AllProgramSpecs; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; -import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel; +import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; +import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; + import net.minecraft.util.math.BlockPos; public class ContraptionKineticRenderer extends InstancedTileRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java index a332474a4..c5bb45e7b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java @@ -1,12 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; +import java.nio.ByteBuffer; + import com.simibubi.create.foundation.render.backend.BufferedModel; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; + import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.LightTexture; -import java.nio.ByteBuffer; - public class ContraptionModel extends BufferedModel { public static final VertexFormat FORMAT = VertexFormat.builder() .addAttributes(ContraptionVertexAttributes.class) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java index ce2aede88..7f0950ca0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java @@ -1,11 +1,12 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; +import org.lwjgl.opengl.GL20; + import com.simibubi.create.foundation.render.backend.gl.BasicProgram; -import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; + import net.minecraft.client.renderer.Matrix4f; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.AxisAlignedBB; -import org.lwjgl.opengl.GL20; public class ContraptionProgram extends BasicProgram { protected final int uLightBoxSize; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index 5c3d4f8af..f26e5174b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -1,27 +1,47 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; +import java.util.List; +import java.util.Random; + +import org.apache.commons.lang3.tuple.Pair; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL40; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.CreateClient; -import com.simibubi.create.content.contraptions.components.structureMovement.*; -import com.simibubi.create.foundation.render.*; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.Compartment; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.render.backend.Backend; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; + import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.BlockModelRenderer; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.world.ClientWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; @@ -30,14 +50,6 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; -import net.minecraftforge.event.TickEvent; -import org.apache.commons.lang3.tuple.Pair; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL13; -import org.lwjgl.opengl.GL40; - -import java.lang.ref.WeakReference; -import java.util.*; public class ContraptionRenderDispatcher { public static final Int2ObjectMap renderers = new Int2ObjectOpenHashMap<>(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java index 70b823e70..cf2bd4059 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java @@ -1,44 +1,5 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; -import java.util.List; -import java.util.Random; - -import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.*; -import com.simibubi.create.foundation.render.backend.Backend; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; -import org.apache.commons.lang3.tuple.Pair; -import org.lwjgl.opengl.GL11; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllMovementBehaviours; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; - -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockModelRenderer; -import net.minecraft.client.renderer.BlockRendererDispatcher; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.template.Template.BlockInfo; -import net.minecraftforge.client.ForgeHooksClient; -import net.minecraftforge.client.model.data.EmptyModelData; - public class ContraptionRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index 32fed725d..c86f70336 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -1,21 +1,39 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Random; + +import org.apache.commons.lang3.tuple.MutablePair; +import org.lwjgl.opengl.GL11; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; -import com.simibubi.create.content.contraptions.components.structureMovement.*; -import com.simibubi.create.foundation.render.backend.Backend; -import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; +import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; + import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.BlockModelRenderer; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; @@ -28,13 +46,6 @@ import net.minecraft.world.gen.feature.template.Template; import net.minecraft.world.lighting.WorldLightManager; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; -import org.apache.commons.lang3.tuple.MutablePair; -import org.lwjgl.opengl.GL11; - -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Random; public class RenderedContraption { private final HashMap renderLayers = new HashMap<>(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java index 34a52daa3..6ffbf59d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.train; +import static net.minecraft.util.math.MathHelper.lerp; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; @@ -7,7 +9,12 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; @@ -22,8 +29,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -import static net.minecraft.util.math.MathHelper.lerp; - public class CouplingRenderer { public static void renderAll(MatrixStack ms, IRenderTypeBuffer buffer) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java index 5fa47e5bc..d421c8fb1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java @@ -66,7 +66,7 @@ public class MinecartCouplingItem extends Item { return true; } if (world != null && world.isRemote) - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> cartClicked(player, minecart)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> cartClicked(player, minecart)); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartControllerUpdatePacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartControllerUpdatePacket.java index 5b399ffcc..58008e2c8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartControllerUpdatePacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartControllerUpdatePacket.java @@ -39,7 +39,7 @@ public class MinecartControllerUpdatePacket extends SimplePacketBase { @Override public void handle(Supplier context) { context.get() - .enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> this::handleCL)); + .enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::handleCL)); context.get() .setPacketHandled(true); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java index d335edaf3..a6ccc5707 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.turntable; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.client.Minecraft; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java index b193246c1..f82785446 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java @@ -182,7 +182,7 @@ public class FluidPropagator { // @Deprecated // public static OutlineParams showBlockFace(BlockFace face) { // MutableObject params = new MutableObject<>(new OutlineParams()); -// DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { +// DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { // Vec3d directionVec = new Vec3d(face.getFace() // .getDirectionVec()); // Vec3d scaleVec = directionVec.scale(-.25f * face.getFace() diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java index 7ce0b8729..efded06cf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java @@ -358,11 +358,11 @@ public class PipeConnection { public static final Random r = new Random(); public void spawnSplashOnRim(World world, BlockPos pos, FluidStack fluid) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> spawnSplashOnRimInner(world, pos, fluid)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> spawnSplashOnRimInner(world, pos, fluid)); } public void spawnParticles(World world, BlockPos pos, FluidStack fluid) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> spawnParticlesInner(world, pos, fluid)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> spawnParticlesInner(world, pos, fluid)); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index a8e7f6c61..99b4bebec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -2,18 +2,19 @@ package com.simibubi.create.content.contraptions.fluids; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class PumpCogInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, PumpCogInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index b14b30539..f091caf04 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -4,9 +4,9 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java index ff0bad252..821d5f4ca 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java @@ -1,10 +1,28 @@ package com.simibubi.create.content.contraptions.fluids; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.Pair; + import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; @@ -16,11 +34,6 @@ import net.minecraft.world.IWorld; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -import org.apache.commons.lang3.mutable.MutableBoolean; - -import javax.annotation.Nullable; -import java.util.*; -import java.util.Map.Entry; public class PumpTileEntity extends KineticTileEntity { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java index 1489e52b7..f5c397c0f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java @@ -36,7 +36,7 @@ public class FluidSplashPacket extends SimplePacketBase { public void handle(Supplier ctx) { ctx.get() - .enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + .enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { if (Minecraft.getInstance().player.getPositionVector() .distanceTo(new Vec3d(pos)) > 100) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java index 698f36e3f..5745d4c1d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java @@ -1,11 +1,14 @@ package com.simibubi.create.content.contraptions.fluids.actors; +import java.util.List; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.ServerSpeedProvider; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; @@ -17,8 +20,6 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; -import java.util.List; - public class HosePulleyTileEntity extends KineticTileEntity { LerpedFloat offset; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java index 5ced0d5f9..0192ece07 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java @@ -5,8 +5,8 @@ import java.util.Optional; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.content.contraptions.fluids.FluidPropagator; -import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.AbstractShaftBlock; +import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.block.ProperDirectionalBlock; import com.simibubi.create.foundation.utility.Lang; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java index bf16148fd..729d37d7d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -4,9 +4,9 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java index 2b1d40780..d6100573c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.fluids.pipes; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; @@ -22,8 +24,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import javax.annotation.ParametersAreNonnullByDefault; - @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java index c61452bb8..81ef886ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java @@ -1,5 +1,11 @@ package com.simibubi.create.content.contraptions.goggles; +import static com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation.spacing; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; @@ -14,6 +20,7 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.outliner.Outline; import com.simibubi.create.foundation.utility.outliner.Outliner.OutlineEntry; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; @@ -32,12 +39,6 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation.spacing; - @EventBusSubscriber(value = Dist.CLIENT) public class GoggleOverlayRenderer { diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java index f161e74bc..dd314bfe6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java @@ -5,6 +5,7 @@ import com.simibubi.create.content.contraptions.goggles.GogglesItem; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.particle.IAnimatedSprite; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java index 7c711358f..d948c5af9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinOperatingTileEntity.java @@ -1,20 +1,21 @@ package com.simibubi.create.content.contraptions.processing; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.ITriggerable; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.simple.DeferralBehaviour; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; + import net.minecraft.inventory.IInventory; import net.minecraft.item.crafting.IRecipe; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - public abstract class BasinOperatingTileEntity extends KineticTileEntity { public DeferralBehaviour basinChecker; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 1eb9dd801..60117276f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -1,5 +1,14 @@ package com.simibubi.create.content.contraptions.processing; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import java.util.Random; + +import javax.annotation.Nonnull; + import com.simibubi.create.AllParticleTypes; import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerTileEntity; @@ -16,8 +25,15 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.IntAttached; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; @@ -47,9 +63,6 @@ import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.CombinedInvWrapper; -import javax.annotation.Nonnull; -import java.util.*; - public class BasinTileEntity extends SmartTileEntity { private boolean areFluidsMoving; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index e4110a16b..a2b7abd5c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.contraptions.processing.burner; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java index dab2b86b6..db9ae172b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java @@ -1,5 +1,9 @@ package com.simibubi.create.content.contraptions.relays.advanced; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; @@ -11,6 +15,7 @@ import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; import com.simibubi.create.foundation.utility.placement.util.PoleHelper; + import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -39,10 +44,6 @@ import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Predicate; - public class GantryShaftBlock extends DirectionalKineticBlock { public static final IProperty PART = EnumProperty.create("part", Part.class); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java index caac99749..1d39ccbd5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.relays.advanced; +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; @@ -10,6 +12,7 @@ import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -28,8 +31,6 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import java.util.function.Predicate; - public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements ITE { private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index dd20003ff..f4e324071 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -5,9 +5,9 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java index 2974f2a3a..a769d0ed4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java @@ -93,7 +93,7 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen return ActionResultType.PASS; } - DistExecutor.runWhenOn(Dist.CLIENT, + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, te -> this.displayScreen(te, player))); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java index cbd2ee461..9f6db3daf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java @@ -1,13 +1,14 @@ package com.simibubi.create.content.contraptions.relays.belt; +import java.nio.ByteBuffer; + +import com.simibubi.create.content.contraptions.base.KineticData; +import com.simibubi.create.content.contraptions.base.KineticVertexAttributes; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; -import com.simibubi.create.content.contraptions.base.KineticVertexAttributes; -import com.simibubi.create.content.contraptions.base.KineticData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import java.nio.ByteBuffer; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; public class BeltData extends KineticData { public static VertexFormat FORMAT = VertexFormat.builder() diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 13c7d9f32..7b8c7997a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -1,15 +1,22 @@ package com.simibubi.create.content.contraptions.relays.belt; +import java.util.ArrayList; +import java.util.function.Consumer; +import java.util.function.Supplier; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; + import net.minecraft.item.DyeColor; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; @@ -18,13 +25,9 @@ import net.minecraft.world.LightType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import java.util.ArrayList; -import java.util.function.Consumer; -import java.util.function.Supplier; - public class BeltInstance extends KineticTileInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, BeltInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java index cb8c64082..86e7e26ef 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstancedModel.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.relays.belt; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.client.renderer.BufferBuilder; public class BeltInstancedModel extends InstancedModel { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 6717aa316..e123a5e41 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -1,6 +1,5 @@ package com.simibubi.create.content.contraptions.relays.belt; -import java.util.Optional; import java.util.Random; import com.mojang.blaze3d.matrix.MatrixStack; @@ -20,6 +19,7 @@ import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java index ab6cf32a8..56086092a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.relays.belt; import com.simibubi.create.foundation.utility.Lang; + import net.minecraft.util.IStringSerializable; public enum BeltSlope implements IStringSerializable { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 8bce6836d..a55c23825 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -15,7 +15,8 @@ import java.util.function.Function; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.transport.*; +import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory; +import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltTunnelInteractionHandler; import com.simibubi.create.content.contraptions.relays.belt.transport.ItemHandlerBeltSegment; @@ -263,7 +264,7 @@ public class BeltTileEntity extends KineticTileEntity { belt.color = Optional.ofNullable(colorIn); belt.markDirty(); belt.sendData(); - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(belt)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(belt)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 1284afba9..fed661dd6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -286,9 +286,7 @@ public class BeltInventory { } private Ending resolveEnding() { - int lastOffset = beltMovementPositive ? belt.beltLength - 1 : 0; World world = belt.getWorld(); - BlockPos lastPosition = BeltHelper.getPositionForOffset(belt, lastOffset); BlockPos nextPosition = BeltHelper.getPositionForOffset(belt, beltMovementPositive ? belt.beltLength : -1); // if (AllBlocks.BRASS_BELT_FUNNEL.has(world.getBlockState(lastPosition.up()))) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java index 968f729ab..ba6b819b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java @@ -1,5 +1,10 @@ package com.simibubi.create.content.contraptions.relays.elementary; +import static com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock.AXIS; + +import java.util.List; +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; @@ -10,6 +15,7 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; @@ -25,11 +31,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.World; -import java.util.List; -import java.util.function.Predicate; - -import static com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock.AXIS; - public class CogwheelBlockItem extends BlockItem { boolean large; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java index d68c293f0..3b0bb2e8d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.relays.elementary; +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -8,6 +10,7 @@ import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.util.PoleHelper; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; @@ -23,8 +26,6 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import java.util.function.Predicate; - public class ShaftBlock extends AbstractShaftBlock { private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java index bebfb5763..3dd04f582 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java @@ -2,8 +2,9 @@ package com.simibubi.create.content.contraptions.relays.encased; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; @@ -12,7 +13,7 @@ import net.minecraftforge.fml.DistExecutor; public class ShaftInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, ShaftInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index 860d267ba..1ac7476bb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -1,25 +1,26 @@ package com.simibubi.create.content.contraptions.relays.encased; +import java.util.ArrayList; + import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.utility.Iterate; + import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import java.util.ArrayList; - public class SplitShaftInstance extends KineticTileInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, SplitShaftInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 2620aa018..8aca8cccd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,10 +5,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.Block; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index c8d81bfe9..3085dae58 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock.Type; -import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java index ac4e4664a..1cdec6749 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java @@ -1,13 +1,14 @@ package com.simibubi.create.content.contraptions.relays.gauge; +import java.util.List; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.utility.Lang; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; -import java.util.List; - public class GaugeTileEntity extends KineticTileEntity implements IHaveGoggleInformation { public float dialTarget; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index 36e2a7b79..1d597f8ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -1,13 +1,17 @@ package com.simibubi.create.content.contraptions.relays.gearbox; +import java.util.EnumMap; +import java.util.Map; + import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.utility.Iterate; + import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; @@ -16,12 +20,9 @@ import net.minecraft.world.LightType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import java.util.EnumMap; -import java.util.Map; - public class GearboxInstance extends KineticTileInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, GearboxInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index c0f3599c9..bd74bcdf8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -4,10 +4,10 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java index 60ba0545c..9fbb2dfe3 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.curiosities; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryEffectPacket.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryEffectPacket.java index 55b3c1138..df9ed6783 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryEffectPacket.java @@ -42,7 +42,7 @@ public class SymmetryEffectPacket extends SimplePacketBase { } public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + ctx.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { if (Minecraft.getInstance().player.getPositionVector().distanceTo(new Vec3d(mirror)) > 100) return; for (BlockPos to : positions) diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java index da65a069d..6118eb8b9 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java @@ -66,7 +66,7 @@ public class SymmetryWandItem extends Item { // Shift -> open GUI if (player.isSneaking()) { if (player.world.isRemote) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { openWandGUI(wand, context.getHand()); }); player.getCooldownTracker() @@ -135,7 +135,7 @@ public class SymmetryWandItem extends Item { // Shift -> Open GUI if (playerIn.isSneaking()) { if (worldIn.isRemote) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { openWandGUI(playerIn.getHeldItem(handIn), handIn); }); playerIn.getCooldownTracker() diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java index dd9f57c99..4d01867c5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java @@ -1,11 +1,14 @@ package com.simibubi.create.content.curiosities.tools; +import java.util.UUID; + import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.Entity; @@ -33,8 +36,6 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import java.util.UUID; - @EventBusSubscriber public class ExtendoGripItem extends Item { diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java index d37daa176..b665e4ae8 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItemRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRender import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; + import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripRenderHandler.java index e671b05cb..1943ebf4d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripRenderHandler.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.AbstractClientPlayerEntity; import net.minecraft.client.entity.player.ClientPlayerEntity; diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java index 5be2fb467..303e4dc5b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/SandPaperItemRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperBeamPacket.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperBeamPacket.java index 3fc30e373..f3d63fb7d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperBeamPacket.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperBeamPacket.java @@ -48,7 +48,7 @@ public class ZapperBeamPacket extends SimplePacketBase { } public void handle(Supplier context) { - context.get().enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + context.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { if (Minecraft.getInstance().player.getPositionVector().distanceTo(start) > 100) return; ZapperRenderHandler.addBeam(new LaserBeam(start, target).followPlayer(self, hand == Hand.MAIN_HAND)); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index 44303bf94..2c01c419a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -93,7 +93,7 @@ public abstract class ZapperItem extends Item { if (context.getPlayer() != null && context.getPlayer() .isSneaking()) { if (context.getWorld().isRemote) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { openHandgunGUI(context.getItem(), context.getHand() == Hand.OFF_HAND); }); applyCooldown(context.getPlayer(), context.getItem(), false); @@ -111,7 +111,7 @@ public abstract class ZapperItem extends Item { // Shift -> Open GUI if (player.isSneaking()) { if (world.isRemote) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { openHandgunGUI(item, hand == Hand.OFF_HAND); }); applyCooldown(player, item, false); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java index 2c8d579ce..05ce12201 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java @@ -1,9 +1,15 @@ package com.simibubi.create.content.curiosities.zapper; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.function.Supplier; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.AbstractClientPlayerEntity; import net.minecraft.client.entity.player.ClientPlayerEntity; @@ -25,11 +31,6 @@ import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; -import java.util.function.Supplier; - @EventBusSubscriber(value = Dist.CLIENT) public class ZapperRenderHandler { diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java index 6d8eaf1e7..6d3c512b1 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java @@ -1,11 +1,20 @@ package com.simibubi.create.content.curiosities.zapper.blockzapper; +import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Accelerator; +import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Amplifier; +import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Body; +import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Retriever; +import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Scope; +import static java.lang.Math.max; +import static net.minecraft.util.math.MathHelper.clamp; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.curiosities.zapper.ZapperItemRenderer; import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.ComponentTier; import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components; import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -16,10 +25,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.HandSide; import net.minecraft.util.math.MathHelper; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.*; -import static java.lang.Math.max; -import static net.minecraft.util.math.MathHelper.clamp; - public class BlockzapperItemRenderer extends ZapperItemRenderer { @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java index 20735765b..9c6ffb04d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java @@ -1,9 +1,13 @@ package com.simibubi.create.content.curiosities.zapper.terrainzapper; +import static java.lang.Math.max; +import static net.minecraft.util.math.MathHelper.clamp; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.curiosities.zapper.ZapperItemRenderer; import com.simibubi.create.foundation.item.PartialItemModelRenderer; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -13,9 +17,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.HandSide; import net.minecraft.util.math.MathHelper; -import static java.lang.Math.max; -import static net.minecraft.util.math.MathHelper.clamp; - public class WorldshaperItemRenderer extends ZapperItemRenderer { @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index 3eaacfa51..8751cf110 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -3,11 +3,11 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java index 17053fed5..84e7bb3fd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/AdjustableRepeaterRenderer.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.logistics.block.diodes; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.ColoredOverlayTileEntityRenderer; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index 1ee5a257d..c8cb12583 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.logistics.block.funnel; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index 53a8853d5..c4600dcf2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -2,18 +2,19 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; + import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class ArmInstance extends SingleRotatingInstance { public static void register(TileEntityType type) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, ArmInstance::new)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java index eff83fadb..c032ed3dc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmItem.java @@ -33,7 +33,7 @@ public class ArmItem extends BlockItem { protected boolean onBlockPlaced(BlockPos pos, World world, PlayerEntity p_195943_3_, ItemStack p_195943_4_, BlockState p_195943_5_) { if (world.isRemote) - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ArmInteractionPointHandler.flushSettings(pos)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ArmInteractionPointHandler.flushSettings(pos)); return super.onBlockPlaced(pos, world, p_195943_3_, p_195943_4_, p_195943_5_); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 6d005cebc..8e9a47e8c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -11,6 +11,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index ad46d9652..f7f6fb803 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -1,5 +1,10 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nullable; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Jukebox; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Mode; @@ -16,6 +21,7 @@ import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.block.JukeboxBlock; import net.minecraft.item.ItemStack; @@ -31,10 +37,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants.NBT; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; - public class ArmTileEntity extends KineticTileEntity { // Server diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java index 72a11a15a..7ed7acc93 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.logistics.block.redstone; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java index a467c4cd4..8db988bfa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java @@ -1,7 +1,13 @@ package com.simibubi.create.content.logistics.block.redstone; +import java.util.Random; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.block.ProperDirectionalBlock; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -16,10 +22,6 @@ import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Random; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class RedstoneContactBlock extends ProperDirectionalBlock { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java index 3fb18767d..97c224c18 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkBlock.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperDirectionalBlock; import com.simibubi.create.foundation.utility.Iterate; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java index 8f8ec7db3..6055c1aac 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java @@ -100,7 +100,7 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE () -> withTileEntityDo(worldIn, pos, te -> this.displayScreen(te, player))); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java index f3f244d59..85b40b8d2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java @@ -52,7 +52,6 @@ public class AstralSorceryAmuletAttribute implements ItemAttribute { @Override public Object[] getTranslationParameters() { - ResourceLocation traitResource = new ResourceLocation(enchName); String something = ""; Enchantment enchant = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryCreate(enchName)); diff --git a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java index 8aa9546ca..7f2a837da 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java +++ b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java @@ -10,6 +10,7 @@ import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateBlockstateProvider; import com.tterrag.registrate.providers.RegistrateRecipeProvider; +import com.tterrag.registrate.providers.loot.RegistrateBlockLootTables; import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.nullness.NonnullType; @@ -185,7 +186,7 @@ public abstract class PaletteBlockPartial { protected BlockBuilder transformBlock( BlockBuilder builder, String variantName, PaletteBlockPatterns pattern) { - builder.loot((lt, block) -> lt.registerLootTable(block, lt.droppingSlab(block))); + builder.loot((lt, block) -> lt.registerLootTable(block, RegistrateBlockLootTables.droppingSlab(block))); return super.transformBlock(builder, variantName, pattern); } diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java b/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java index 985338d5d..e9d13b67c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicProcessor.java @@ -1,5 +1,9 @@ package com.simibubi.create.content.schematics; +import java.util.Optional; + +import javax.annotation.Nullable; + import com.mojang.datafixers.Dynamic; import com.mojang.datafixers.types.DynamicOps; import com.simibubi.create.foundation.utility.NBTProcessors; @@ -16,9 +20,6 @@ import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.StructureProcessor; import net.minecraft.world.gen.feature.template.Template; -import javax.annotation.Nullable; -import java.util.Optional; - public class SchematicProcessor extends StructureProcessor { public static final SchematicProcessor INSTANCE = new SchematicProcessor(); diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java index 0fe84ba4a..bf90d3f84 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java @@ -7,8 +7,8 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.schematics.block.LaunchedItem.ForBlockState; import com.simibubi.create.content.schematics.block.LaunchedItem.ForEntity; -import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java index 6965c9b97..d85b1a27b 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java @@ -1,13 +1,31 @@ package com.simibubi.create.content.schematics.client; -import com.simibubi.create.*; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; + +import org.apache.commons.io.IOUtils; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllKeys; +import com.simibubi.create.AllSpecialTextures; +import com.simibubi.create.Create; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.schematics.ClientSchematicLoader; import com.simibubi.create.content.schematics.packet.InstantSchematicPacket; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.FilesHelper; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; +import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.outliner.Outliner; + import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; @@ -18,17 +36,15 @@ import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.Hand; -import net.minecraft.util.math.*; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; import net.minecraft.world.gen.feature.template.Template; -import org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; public class SchematicAndQuillHandler { diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 26505e742..74c6b9eac 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -1,5 +1,8 @@ package com.simibubi.create.content.schematics.client; +import java.util.List; +import java.util.Vector; + import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlocks; @@ -16,6 +19,7 @@ import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.outliner.AABBOutline; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -32,9 +36,6 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; -import java.util.List; -import java.util.Vector; - public class SchematicHandler { private String displayedSchematic; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 2f9159897..c7c346182 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -11,10 +11,10 @@ import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.schematics.SchematicWorld; -import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.TileEntityRenderHelper; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java index 9fad2795a..9e1cb9485 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java @@ -1,11 +1,14 @@ package com.simibubi.create.content.schematics.client; +import static java.lang.Math.abs; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingAngle; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.util.Direction.Axis; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; @@ -14,8 +17,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.gen.feature.template.PlacementSettings; -import static java.lang.Math.abs; - public class SchematicTransformation { private InterpolatedChasingValue x, y, z, scaleFrontBack, scaleLeftRight; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java index 97624af02..ea5de6a18 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java @@ -7,6 +7,7 @@ import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.outliner.AABBOutline; + import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.math.AxisAlignedBB; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java index 9c795cc9c..6a7863831 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java @@ -1,5 +1,8 @@ package com.simibubi.create.content.schematics.client.tools; +import java.util.Arrays; +import java.util.List; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllKeys; import com.simibubi.create.AllSpecialTextures; @@ -12,6 +15,7 @@ import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.outliner.AABBOutline; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -22,9 +26,6 @@ import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceResult.Type; import net.minecraft.util.math.Vec3d; -import java.util.Arrays; -import java.util.List; - public abstract class SchematicToolBase implements ISchematicTool { protected SchematicHandler schematicHandler; diff --git a/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java b/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java index d689372ec..ddc676657 100644 --- a/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java @@ -165,7 +165,7 @@ public class SchematicItem extends Item { if (!player.getHeldItem(hand) .hasTag()) return false; - DistExecutor.runWhenOn(Dist.CLIENT, () -> this::displayBlueprintScreen); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::displayBlueprintScreen); return true; } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index fdc1fbd34..1407b4d1e 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -1,5 +1,8 @@ package com.simibubi.create.events; +import java.util.ArrayList; +import java.util.List; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllFluids; @@ -8,6 +11,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisRangeDisplay; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandlerClient; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingPhysics; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingRenderer; @@ -27,7 +31,6 @@ import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.RenderWork; -import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -36,6 +39,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -62,9 +66,6 @@ import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import java.util.ArrayList; -import java.util.List; - @EventBusSubscriber(value = Dist.CLIENT) public class ClientEvents { diff --git a/src/main/java/com/simibubi/create/foundation/block/ProperDirectionalBlock.java b/src/main/java/com/simibubi/create/foundation/block/ProperDirectionalBlock.java index e84a1b9e5..db0217340 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ProperDirectionalBlock.java +++ b/src/main/java/com/simibubi/create/foundation/block/ProperDirectionalBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.block; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.utility.DirectionHelper; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.DirectionalBlock; diff --git a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java index d61be2834..657535b79 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -1,15 +1,16 @@ package com.simibubi.create.foundation.command; +import java.util.Collections; +import java.util.function.Predicate; + import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; + import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.entity.player.PlayerEntity; -import java.util.Collections; -import java.util.function.Predicate; - public class AllCommands { public static Predicate sourceIsPlayer = (cs) -> cs.getEntity() instanceof PlayerEntity; diff --git a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java index 7d9a6cb74..d3c5a8962 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java @@ -14,7 +14,7 @@ public class ClearBufferCacheCommand { static ArgumentBuilder register() { return Commands.literal("clearRenderBuffers").requires(cs -> cs.hasPermissionLevel(0)).executes(ctx -> { - DistExecutor.runWhenOn(Dist.CLIENT, () -> ClearBufferCacheCommand::execute); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClearBufferCacheCommand::execute); ctx.getSource().sendFeedback(new StringTextComponent("Cleared rendering buffers."), true); return 1; }); diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java index b6fa8ca1a..a8d174725 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -3,13 +3,13 @@ package com.simibubi.create.foundation.command; import java.util.function.Consumer; import java.util.function.Supplier; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import org.apache.logging.log4j.LogManager; import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.networking.SimplePacketBase; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import net.minecraft.client.Minecraft; import net.minecraft.network.PacketBuffer; @@ -43,7 +43,7 @@ public class ConfigureConfigPacket extends SimplePacketBase { @Override public void handle(Supplier ctx) { ctx.get() - .enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + .enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { try { Actions.valueOf(option) .performAction(value); diff --git a/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java b/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java index 16a0e1528..f017c1b19 100644 --- a/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/HighlightCommand.java @@ -1,10 +1,13 @@ package com.simibubi.create.foundation.command; +import java.util.Collection; + import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.IDisplayAssemblyExceptions; import com.simibubi.create.foundation.networking.AllPackets; + import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.command.arguments.BlockPosArgument; @@ -12,13 +15,15 @@ import net.minecraft.command.arguments.EntityArgument; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.*; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.network.PacketDistributor; -import java.util.Collection; - public class HighlightCommand { public static ArgumentBuilder register() { diff --git a/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java b/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java index 7b4b10a4c..fe7cf6f0f 100644 --- a/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java @@ -1,8 +1,11 @@ package com.simibubi.create.foundation.command; +import java.util.function.Supplier; + import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.networking.SimplePacketBase; + import net.minecraft.client.Minecraft; import net.minecraft.network.PacketBuffer; import net.minecraft.util.math.BlockPos; @@ -12,8 +15,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.NetworkEvent; -import java.util.function.Supplier; - public class HighlightPacket extends SimplePacketBase { private final BlockPos pos; @@ -33,7 +34,7 @@ public class HighlightPacket extends SimplePacketBase { @Override public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + ctx.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { performHighlight(pos); })); diff --git a/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java index 9497a7de6..850b910e5 100644 --- a/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java @@ -18,9 +18,9 @@ public class OverlayConfigCommand { .requires(cs -> cs.hasPermissionLevel(0)) .then(Commands.literal("reset") .executes(ctx -> { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.overlayReset.performAction("")); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.overlayReset.performAction("")); - DistExecutor.runWhenOn(Dist.DEDICATED_SERVER, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), new ConfigureConfigPacket(ConfigureConfigPacket.Actions.overlayReset.name(), ""))); @@ -31,9 +31,9 @@ public class OverlayConfigCommand { }) ) .executes(ctx -> { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.overlayScreen.performAction("")); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.overlayScreen.performAction("")); - DistExecutor.runWhenOn(Dist.DEDICATED_SERVER, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), new ConfigureConfigPacket(ConfigureConfigPacket.Actions.overlayScreen.name(), ""))); diff --git a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java index a6adfb9f7..918d3dc7c 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java @@ -4,6 +4,7 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.foundation.networking.AllPackets; + import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.entity.player.ServerPlayerEntity; @@ -20,10 +21,10 @@ public class ToggleDebugCommand { .then(Commands.argument("value", BoolArgumentType.bool()) .executes(ctx -> { boolean value = BoolArgumentType.getBool(ctx, "value"); - //DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.rainbowDebug.performAction(String.valueOf(value))); + //DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.rainbowDebug.performAction(String.valueOf(value))); - DistExecutor.runWhenOn(Dist.DEDICATED_SERVER, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), new ConfigureConfigPacket(ConfigureConfigPacket.Actions.rainbowDebug.name(), String.valueOf(value)))); diff --git a/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java b/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java index 82f5442df..25970ac7a 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.foundation.networking.AllPackets; + import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.entity.player.ServerPlayerEntity; @@ -19,10 +20,10 @@ public class ToggleExperimentalRenderingCommand { .then(Commands.argument("value", BoolArgumentType.bool()) .executes(ctx -> { boolean value = BoolArgumentType.getBool(ctx, "value"); - //DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.experimentalRendering.performAction(String.valueOf(value))); + //DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.experimentalRendering.performAction(String.valueOf(value))); - DistExecutor.runWhenOn(Dist.DEDICATED_SERVER, () -> () -> + DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> AllPackets.channel.send( PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), new ConfigureConfigPacket(ConfigureConfigPacket.Actions.experimentalRendering.name(), String.valueOf(value)))); diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index b243f0e9f..fbd8c1d7a 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -1,7 +1,5 @@ package com.simibubi.create.foundation.config; -import com.simibubi.create.foundation.render.backend.Backend; - public class CClient extends ConfigBase { public ConfigGroup client = group(0, "client", diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index f278611be..e3e37f4f4 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -192,7 +192,7 @@ public class CreateRegistrate extends AbstractRegistrate { } protected static void onClient(Supplier toRun) { - DistExecutor.runWhenOn(Dist.CLIENT, toRun); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, toRun); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java index 562de30bc..b76d491cf 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java @@ -1,11 +1,11 @@ package com.simibubi.create.foundation.data.recipe; import static com.simibubi.create.foundation.data.recipe.Mods.IE; +import static com.simibubi.create.foundation.data.recipe.Mods.INF; import static com.simibubi.create.foundation.data.recipe.Mods.MEK; import static com.simibubi.create.foundation.data.recipe.Mods.MW; import static com.simibubi.create.foundation.data.recipe.Mods.SM; import static com.simibubi.create.foundation.data.recipe.Mods.TH; -import static com.simibubi.create.foundation.data.recipe.Mods.INF; import java.util.function.Supplier; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index c66f911bb..99fb3c017 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.gui; import com.simibubi.create.Create; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.gui.screen.Screen; diff --git a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java index 2f0a39636..bef5042de 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java @@ -12,7 +12,7 @@ public class ScreenOpener { private static Screen openedGuiNextTick; public static void tick() { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { if (openedGuiNextTick != null) { Minecraft.getInstance().displayGuiScreen(openedGuiNextTick); openedGuiNextTick = null; @@ -21,7 +21,7 @@ public class ScreenOpener { } public static void open(Screen gui) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { openedGuiNextTick = gui; }); } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java index ba76ddb6d..fe8dfd965 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/CancelTileEntityRenderMixin.java @@ -1,17 +1,19 @@ package com.simibubi.create.foundation.mixin; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; -import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import java.util.List; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.List; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; + +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) @Mixin(ChunkRenderDispatcher.CompiledChunk.class) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/FogColorTrackerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/FogColorTrackerMixin.java index 599cd50c7..2fe7e98cf 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/FogColorTrackerMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/FogColorTrackerMixin.java @@ -1,13 +1,14 @@ package com.simibubi.create.foundation.mixin; -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.foundation.render.backend.gl.GlFog; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.foundation.render.backend.gl.GlFog; + @Mixin(GlStateManager.class) public class FogColorTrackerMixin { diff --git a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java index efc086daa..e2b97b148 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java @@ -1,7 +1,15 @@ package com.simibubi.create.foundation.mixin; +import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.backend.light.ILightListener; + import net.minecraft.client.multiplayer.ClientChunkProvider; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; @@ -10,12 +18,6 @@ import net.minecraft.world.chunk.AbstractChunkProvider; import net.minecraft.world.chunk.Chunk; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Map; @OnlyIn(Dist.CLIENT) @Mixin(ClientChunkProvider.class) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java index 1e9e13139..355f9426a 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java @@ -1,11 +1,5 @@ package com.simibubi.create.foundation.mixin; -import com.simibubi.create.CreateClient; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,6 +8,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import com.simibubi.create.CreateClient; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + @OnlyIn(Dist.CLIENT) @Mixin(World.class) public class OnRemoveTileMixin { diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java index c3fecc726..27f8173ce 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java @@ -1,28 +1,25 @@ package com.simibubi.create.foundation.mixin; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.CreateClient; -import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.backend.Backend; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; -import com.simibubi.create.foundation.render.backend.OptifineHandler; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.WorldRenderer; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import org.lwjgl.opengl.GL20; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Set; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.OptifineHandler; + +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.world.ClientWorld; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) @Mixin(WorldRenderer.class) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java index c82406e20..ed2ada21e 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/ShaderCloseMixin.java @@ -1,16 +1,18 @@ package com.simibubi.create.foundation.mixin; -import com.simibubi.create.foundation.render.backend.OptifineHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.VideoSettingsScreen; +import javax.annotation.Nullable; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import javax.annotation.Nullable; +import com.simibubi.create.foundation.render.backend.OptifineHandler; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.VideoSettingsScreen; @Mixin(Minecraft.class) public class ShaderCloseMixin { diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 2cabdfb0a..0f5fca06b 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -1,11 +1,22 @@ package com.simibubi.create.foundation.networking; +import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_CLIENT; +import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_SERVER; + +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.function.Supplier; + import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionDisassemblyPacket; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionStallPacket; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionUpdatePacket; import com.simibubi.create.content.contraptions.components.structureMovement.glue.GlueEffectPacket; -import com.simibubi.create.content.contraptions.components.structureMovement.sync.*; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ClientMotionPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionFluidPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionInteractionPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionSeatMappingPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.LimbSwingUpdatePacket; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingCreationPacket; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartControllerUpdatePacket; import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket; @@ -17,12 +28,17 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmPlacementPac import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; -import com.simibubi.create.content.schematics.packet.*; +import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket; +import com.simibubi.create.content.schematics.packet.InstantSchematicPacket; +import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; +import com.simibubi.create.content.schematics.packet.SchematicSyncPacket; +import com.simibubi.create.content.schematics.packet.SchematicUploadPacket; import com.simibubi.create.foundation.command.ConfigureConfigPacket; import com.simibubi.create.foundation.command.HighlightPacket; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringCountUpdatePacket; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueUpdatePacket; import com.simibubi.create.foundation.utility.ServerSpeedProvider; + import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -34,13 +50,6 @@ import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.fml.network.PacketDistributor.TargetPoint; import net.minecraftforge.fml.network.simple.SimpleChannel; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.Supplier; - -import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_CLIENT; -import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_SERVER; - public enum AllPackets { // Client to Server diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index f447a156f..b5d5e991a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -1,19 +1,20 @@ package com.simibubi.create.foundation.render; +import static com.simibubi.create.foundation.render.backend.Backend.register; + import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticVertexAttributes; import com.simibubi.create.content.contraptions.base.RotatingVertexAttributes; import com.simibubi.create.content.contraptions.components.actors.ActorVertexAttributes; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionProgram; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionVertexAttributes; import com.simibubi.create.content.contraptions.relays.belt.BeltVertexAttributes; -import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionProgram; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.attrib.ModelVertexAttributes; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderConstants; -import net.minecraft.util.ResourceLocation; -import static com.simibubi.create.foundation.render.backend.Backend.register; +import net.minecraft.util.ResourceLocation; public class AllProgramSpecs { public static final ProgramSpec ROTATING = register(ProgramSpec.builder("rotating", BasicProgram::new) diff --git a/src/main/java/com/simibubi/create/foundation/render/Compartment.java b/src/main/java/com/simibubi/create/foundation/render/Compartment.java index 646eb7191..4d929dc3f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/Compartment.java +++ b/src/main/java/com/simibubi/create/foundation/render/Compartment.java @@ -1,9 +1,11 @@ package com.simibubi.create.foundation.render; +import org.apache.commons.lang3.tuple.Pair; + import com.simibubi.create.AllBlockPartials; + import net.minecraft.block.BlockState; import net.minecraft.util.Direction; -import org.apache.commons.lang3.tuple.Pair; public class Compartment { public static final Compartment GENERIC_TILE = new Compartment<>(); diff --git a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java index 40e9de47a..58e1746f2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java @@ -1,21 +1,22 @@ package com.simibubi.create.foundation.render; +import java.util.ArrayList; + import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; -import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; -import java.util.ArrayList; - public class KineticRenderer extends InstancedTileRenderer { public static int MAX_ORIGIN_DISTANCE = 1000; diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index 90d7b54db..62c3f935f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -1,13 +1,21 @@ package com.simibubi.create.foundation.render; +import java.nio.Buffer; +import java.nio.ByteBuffer; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; + import it.unimi.dsi.fastutil.longs.Long2DoubleMap; import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Matrix3f; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.Vector4f; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -15,9 +23,6 @@ import net.minecraft.world.LightType; import net.minecraft.world.World; import net.minecraftforge.client.model.pipeline.LightUtil; -import java.nio.Buffer; -import java.nio.ByteBuffer; - public class SuperByteBuffer extends TemplateBuffer { public interface IVertexLighter { @@ -39,7 +44,6 @@ public class SuperByteBuffer extends TemplateBuffer { // Vertex Coloring private boolean shouldColor; private int r, g, b, a; - private float sheetSize; public SuperByteBuffer(BufferBuilder buf) { super(buf); @@ -241,18 +245,9 @@ public class SuperByteBuffer extends TemplateBuffer { private static int getLight(World world, Vector4f lightPos) { BlockPos.Mutable pos = new BlockPos.Mutable(); double sky = 0, block = 0; - float offset = 1 / 8f; -// for (float zOffset = offset; zOffset >= -offset; zOffset -= 2 * offset) { -// for (float yOffset = offset; yOffset >= -offset; yOffset -= 2 * offset) { -// for (float xOffset = offset; xOffset >= -offset; xOffset -= 2 * offset) { -// pos.setPos(lightPos.getX() + xOffset, lightPos.getY() + yOffset, lightPos.getZ() + zOffset); pos.setPos(lightPos.getX() + 0, lightPos.getY() + 0, lightPos.getZ() + 0); sky += skyLightCache.computeIfAbsent(pos.toLong(), $ -> world.getLightLevel(LightType.SKY, pos)); block += blockLightCache.computeIfAbsent(pos.toLong(), $ -> world.getLightLevel(LightType.BLOCK, pos)); -// } -// } -// } - return ((int) sky) << 20 | ((int) block) << 4; } diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java index ab9e0fafa..ef25a5e2d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java @@ -1,11 +1,11 @@ package com.simibubi.create.foundation.render; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import com.simibubi.create.foundation.utility.VirtualEmptyModelData; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; @@ -13,6 +13,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.utility.VirtualEmptyModelData; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java index d16702d08..16afba34e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/TemplateBuffer.java @@ -1,12 +1,13 @@ package com.simibubi.create.foundation.render; -import com.mojang.datafixers.util.Pair; -import net.minecraft.client.renderer.BufferBuilder; - import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import com.mojang.datafixers.util.Pair; + +import net.minecraft.client.renderer.BufferBuilder; + public class TemplateBuffer { protected ByteBuffer template; protected int formatSize; diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index 45f4667d6..0af8bcff9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.render; +import java.util.Iterator; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; @@ -7,7 +9,10 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; -import net.minecraft.client.renderer.*; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.Vector4f; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -15,8 +20,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import java.util.Iterator; - public class TileEntityRenderHelper { public static void renderTileEntities(World world, Iterable customRenderTEs, MatrixStack ms, diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index 5218b3a98..6a416b187 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -1,26 +1,5 @@ package com.simibubi.create.foundation.render.backend; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; -import com.simibubi.create.foundation.render.backend.gl.shader.GlShader; -import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; -import com.simibubi.create.foundation.render.backend.gl.shader.ShaderType; -import com.simibubi.create.foundation.render.backend.gl.versioned.GlVersioned; -import com.simibubi.create.foundation.render.backend.gl.versioned.MapBuffer; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.TextureUtil; -import net.minecraft.resources.IReloadableResourceManager; -import net.minecraft.resources.IResourceManager; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.resource.IResourceType; -import net.minecraftforge.resource.ISelectiveResourceReloadListener; -import net.minecraftforge.resource.VanillaResourceType; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.lwjgl.opengl.GL; -import org.lwjgl.opengl.GLCapabilities; -import org.lwjgl.system.MemoryUtil; - import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; @@ -32,6 +11,29 @@ import java.util.Map; import java.util.function.Consumer; import java.util.function.Predicate; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.lwjgl.opengl.GL; +import org.lwjgl.opengl.GLCapabilities; +import org.lwjgl.system.MemoryUtil; + +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; +import com.simibubi.create.foundation.render.backend.gl.shader.GlShader; +import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; +import com.simibubi.create.foundation.render.backend.gl.shader.ShaderType; +import com.simibubi.create.foundation.render.backend.gl.versioned.GlVersioned; +import com.simibubi.create.foundation.render.backend.gl.versioned.MapBuffer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.resources.IReloadableResourceManager; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.resource.IResourceType; +import net.minecraftforge.resource.ISelectiveResourceReloadListener; +import net.minecraftforge.resource.VanillaResourceType; + public class Backend { public static final Logger log = LogManager.getLogger(Backend.class); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java index d209fd857..79e4e4d2f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java @@ -1,14 +1,16 @@ package com.simibubi.create.foundation.render.backend; -import com.simibubi.create.foundation.render.TemplateBuffer; -import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; -import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.backend.gl.GlBuffer; -import net.minecraft.client.renderer.BufferBuilder; +import java.nio.ByteBuffer; + import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; -import java.nio.ByteBuffer; +import com.simibubi.create.foundation.render.TemplateBuffer; +import com.simibubi.create.foundation.render.backend.gl.GlBuffer; +import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; + +import net.minecraft.client.renderer.BufferBuilder; public abstract class BufferedModel extends TemplateBuffer { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index 4e7955e85..17f504ab8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -1,5 +1,9 @@ package com.simibubi.create.foundation.render.backend; +import java.util.concurrent.ConcurrentHashMap; + +import org.lwjgl.opengl.GL11; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; @@ -7,6 +11,7 @@ import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.renderer.GameRenderer; @@ -18,13 +23,6 @@ import net.minecraft.potion.Effects; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import org.lwjgl.opengl.GL11; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Consumer; public class FastRenderDispatcher { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java b/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java index 8e35a2016..49b967e7b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java @@ -1,10 +1,13 @@ package com.simibubi.create.foundation.render.backend; -import net.minecraft.client.Minecraft; - -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; import java.util.Optional; +import net.minecraft.client.Minecraft; + public class OptifineHandler { public static final String OPTIFINE_ROOT_PACKAGE = "net.optifine"; public static final String SHADER_PACKAGE = "net.optifine.shaders"; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java index 260921c56..8d6f71711 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java @@ -1,11 +1,13 @@ package com.simibubi.create.foundation.render.backend.gl; +import org.lwjgl.opengl.GL20; + import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.client.renderer.Matrix4f; import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL20; public class BasicProgram extends GlProgram { protected final int uTime; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java index c94c38828..42a72736b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java @@ -1,11 +1,12 @@ package com.simibubi.create.foundation.render.backend.gl; -import com.simibubi.create.foundation.render.backend.Backend; -import org.lwjgl.opengl.GL20; - import java.nio.ByteBuffer; import java.util.function.Consumer; +import org.lwjgl.opengl.GL20; + +import com.simibubi.create.foundation.render.backend.Backend; + public class GlBuffer extends GlObject { protected final int bufferType; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java index 220abfd1b..de7958b8c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java @@ -1,8 +1,6 @@ package com.simibubi.create.foundation.render.backend.gl; import com.mojang.blaze3d.platform.GlStateManager; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL20; public class GlFog { public static float[] FOG_COLOR = new float[] {0, 0, 0, 0}; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java index 2d024c6d2..33ff7461b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java @@ -1,9 +1,9 @@ package com.simibubi.create.foundation.render.backend.gl; -import org.lwjgl.opengl.GL30; - import java.util.function.Consumer; +import org.lwjgl.opengl.GL30; + public class GlVertexArray extends GlObject { public GlVertexArray() { setHandle(GL30.glGenVertexArrays()); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java index 709508c90..1af7dc3a6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java @@ -1,8 +1,9 @@ package com.simibubi.create.foundation.render.backend.gl.attrib; -import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; import org.lwjgl.opengl.GL20; +import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; + public class VertexAttribSpec { private final GlPrimitiveType type; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java index 790bb4c5a..c911eea5f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java @@ -1,10 +1,12 @@ package com.simibubi.create.foundation.render.backend.gl.shader; +import org.lwjgl.opengl.GL20; + +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.gl.GlObject; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; -import com.simibubi.create.foundation.render.backend.Backend; + import net.minecraft.util.ResourceLocation; -import org.lwjgl.opengl.GL20; public abstract class GlProgram extends GlObject { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java index fa0fa48f2..8ef265920 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java @@ -1,10 +1,12 @@ package com.simibubi.create.foundation.render.backend.gl.shader; -import com.simibubi.create.foundation.render.backend.gl.GlObject; -import com.simibubi.create.foundation.render.backend.Backend; -import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL20; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.GlObject; + +import net.minecraft.util.ResourceLocation; + public class GlShader extends GlObject { public final ResourceLocation name; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java index 3e98a70df..7c2a2ca93 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java @@ -1,12 +1,13 @@ package com.simibubi.create.foundation.render.backend.gl.shader; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; -import net.minecraft.util.ResourceLocation; - import java.util.ArrayList; import java.util.Arrays; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; + +import net.minecraft.util.ResourceLocation; + public class ProgramSpec

{ public final ResourceLocation name; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderUniforms.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderUniforms.java deleted file mode 100644 index 8a85d1c24..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderUniforms.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.simibubi.create.foundation.render.backend.gl.shader; - -import java.util.HashMap; -import java.util.Map; - -public class ShaderUniforms { - private final Map uniforms; - - public ShaderUniforms() { - this.uniforms = new HashMap<>(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java index f1249223a..e5e03d4b3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java @@ -1,10 +1,13 @@ package com.simibubi.create.foundation.render.backend.gl.versioned; -import org.lwjgl.opengl.*; - import java.nio.ByteBuffer; import java.util.function.Consumer; +import org.lwjgl.opengl.ARBMapBufferRange; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GLCapabilities; + public enum MapBuffer implements GlVersioned { GL30_RANGE { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index c82c6bd38..b18cffcc4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -1,19 +1,25 @@ package com.simibubi.create.foundation.render.backend.instancing; -import com.simibubi.create.foundation.render.backend.BufferedModel; -import com.simibubi.create.foundation.render.RenderMath; -import com.simibubi.create.foundation.render.backend.gl.GlVertexArray; -import com.simibubi.create.foundation.render.backend.gl.GlBuffer; -import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; -import com.simibubi.create.foundation.render.backend.gl.attrib.ModelVertexAttributes; -import net.minecraft.client.renderer.BufferBuilder; -import org.lwjgl.opengl.*; - import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.function.Consumer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL33; + +import com.simibubi.create.foundation.render.RenderMath; +import com.simibubi.create.foundation.render.backend.BufferedModel; +import com.simibubi.create.foundation.render.backend.gl.GlBuffer; +import com.simibubi.create.foundation.render.backend.gl.GlVertexArray; +import com.simibubi.create.foundation.render.backend.gl.attrib.ModelVertexAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; + +import net.minecraft.client.renderer.BufferBuilder; + public abstract class InstancedModel extends BufferedModel { public static final VertexFormat FORMAT = VertexFormat.builder().addAttributes(ModelVertexAttributes.class).build(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java index fd731a8e2..26bdd4f96 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java @@ -1,11 +1,13 @@ package com.simibubi.create.foundation.render.backend.instancing; -import com.google.common.collect.Maps; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityType; +import java.util.Map; import javax.annotation.Nullable; -import java.util.Map; + +import com.google.common.collect.Maps; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; public class InstancedTileRenderRegistry { public static final InstancedTileRenderRegistry instance = new InstancedTileRenderRegistry(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index ab30eaa36..055e5dac7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -1,12 +1,17 @@ package com.simibubi.create.foundation.render.backend.instancing; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; -import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Nullable; + import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; @@ -14,11 +19,6 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; -import javax.annotation.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - public abstract class InstancedTileRenderer

{ public static WorldAttached> addedLastTick = new WorldAttached<>(ConcurrentHashMap::new); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java index 1234f3900..bfdd3fd4e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java @@ -1,26 +1,6 @@ package com.simibubi.create.foundation.render.backend.instancing; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.Compartment; -import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; -import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.render.backend.gl.BasicProgram; -import com.simibubi.create.foundation.render.backend.Backend; -import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; -import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockRendererDispatcher; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.util.Direction; -import org.apache.commons.lang3.tuple.Pair; +import static com.simibubi.create.foundation.render.Compartment.PARTIAL; import java.util.HashMap; import java.util.Map; @@ -29,7 +9,29 @@ import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; -import static com.simibubi.create.foundation.render.Compartment.PARTIAL; +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.Compartment; +import com.simibubi.create.foundation.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; +import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.util.Direction; public class RenderMaterial

> { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java index e9bf8b6ee..707efc0bd 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java @@ -1,13 +1,14 @@ package com.simibubi.create.foundation.render.backend.light; +import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2; + import com.simibubi.create.foundation.render.RenderMath; + import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.SectionPos; import net.minecraft.util.math.Vec3i; -import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2; - public class GridAlignedBB { public int minX; public int minY; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java index 97f12c48f..143964ba5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java @@ -1,15 +1,21 @@ package com.simibubi.create.foundation.render.backend.light; +import java.nio.ByteBuffer; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL40; +import org.lwjgl.system.MemoryUtil; + import com.simibubi.create.foundation.render.backend.RenderWork; import com.simibubi.create.foundation.render.backend.gl.GlTexture; + import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.SectionPos; import net.minecraft.world.ILightReader; import net.minecraft.world.LightType; -import org.lwjgl.opengl.*; -import org.lwjgl.system.MemoryUtil; - -import java.nio.ByteBuffer; public class LightVolume { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java index 63395a69a..811987c5d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java @@ -1,13 +1,13 @@ package com.simibubi.create.foundation.render.backend.light; +import java.util.ArrayList; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.outliner.AABBOutline; -import java.util.ArrayList; - public class LightVolumeDebugger { public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { ContraptionRenderDispatcher.renderers.values() diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java index 6246d20ea..f735c21af 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.tileEntity.behaviour.linked; import java.util.function.Function; import java.util.function.IntConsumer; import java.util.function.IntSupplier; + import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.Create; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java index bc4c0de82..6c02f67f9 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/SafeTileEntityRenderer.java @@ -7,7 +7,6 @@ import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.client.model.pipeline.LightUtil; public abstract class SafeTileEntityRenderer extends TileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java index 693231353..1be8add22 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java @@ -1,13 +1,13 @@ package com.simibubi.create.foundation.utility; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.BlockPos; - import java.util.Arrays; import java.util.EnumSet; import java.util.List; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; + public class Iterate { public static final boolean[] trueAndFalse = {true, false}; diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index 502e176a7..1e620ec07 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -1,5 +1,9 @@ package com.simibubi.create.foundation.utility; +import java.util.Random; + +import javax.annotation.Nullable; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.Quaternion; @@ -15,9 +19,6 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; -import javax.annotation.Nullable; -import java.util.Random; - public class VecHelper { public static final Vec3d CENTER_OF_ORIGIN = new Vec3d(.5, .5, .5); diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java index 5723d19b1..b83e7f13d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java @@ -1,11 +1,11 @@ package com.simibubi.create.foundation.utility.ghost; +import java.util.function.Supplier; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; -import java.util.function.Supplier; - public class GhostBlockParams { protected final BlockState state; diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java index 5f18c34d7..361f524bb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java @@ -1,12 +1,28 @@ package com.simibubi.create.foundation.utility.ghost; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.List; +import java.util.Random; + +import javax.annotation.Nullable; + +import org.lwjgl.system.MemoryStack; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.VirtualEmptyModelData; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.Vector4f; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -15,14 +31,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3i; -import org.lwjgl.system.MemoryStack; - -import javax.annotation.Nullable; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.IntBuffer; -import java.util.List; -import java.util.Random; public abstract class GhostBlockRenderer { @@ -134,7 +142,6 @@ public abstract class GhostBlockRenderer { Vector3f vector3f = new Vector3f((float) vec3i.getX(), (float) vec3i.getY(), (float) vec3i.getZ()); Matrix4f matrix4f = p_227890_1_.getModel(); vector3f.transform(p_227890_1_.getNormal()); - int i = 8; int j = aint.length / 8; try (MemoryStack memorystack = MemoryStack.stackPush()) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java index d5ae5d175..2c6cc6f4b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java @@ -1,13 +1,14 @@ package com.simibubi.create.foundation.utility.ghost; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.MathHelper; - import java.util.HashMap; import java.util.Map; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.MathHelper; + public class GhostBlocks { public static double getBreathingAlpha() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java index 931b2affb..6621b1a0e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.utility.outliner; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java index e76bbc56d..4a72da0da 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.utility.outliner; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; + import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java index 61a210cb5..3d0311265 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java @@ -1,19 +1,24 @@ package com.simibubi.create.foundation.utility.outliner; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.outliner.LineOutline.EndChasingLineOutline; import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; -import net.minecraft.client.Minecraft; + import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -import java.util.*; - public class Outliner { final Map outlines; diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java index c74301353..434d7a89f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java @@ -1,9 +1,16 @@ package com.simibubi.create.foundation.utility.placement; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -15,12 +22,6 @@ import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Collectors; - @MethodsReturnNonnullByDefault public interface IPlacementHelper { diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java index 002bc3e49..92ce7983d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java @@ -1,5 +1,11 @@ package com.simibubi.create.foundation.utility.placement; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.lwjgl.opengl.GL11; + import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -7,6 +13,7 @@ import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingAngle; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; @@ -25,11 +32,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import org.lwjgl.opengl.GL11; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; @Mod.EventBusSubscriber public class PlacementHelpers { diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java index d6251384e..f1cb89170 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.utility.placement; +import java.util.function.Function; + import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.BlockState; import net.minecraft.block.SoundType; @@ -22,8 +24,6 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.BlockSnapshot; import net.minecraftforge.event.world.BlockEvent; -import java.util.function.Function; - public class PlacementOffset { private final boolean success; diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java index fef9b0783..4dceeaf48 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java @@ -1,7 +1,12 @@ package com.simibubi.create.foundation.utility.placement.util; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementOffset; + import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.state.IProperty; @@ -10,10 +15,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.World; -import java.util.List; -import java.util.function.Function; -import java.util.function.Predicate; - @MethodsReturnNonnullByDefault public abstract class PoleHelper> implements IPlacementHelper { diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java index e34d5cb11..f6a22d102 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java @@ -1,21 +1,22 @@ package com.simibubi.create.foundation.utility.worldWrappers; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BooleanSupplier; +import java.util.stream.Stream; + +import javax.annotation.Nullable; + import com.simibubi.create.foundation.utility.worldWrappers.chunk.WrappedChunk; + import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.chunk.AbstractChunkProvider; import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.chunk.IChunk; -import net.minecraft.world.chunk.IChunkLightProvider; import net.minecraft.world.lighting.WorldLightManager; -import javax.annotation.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.function.BooleanSupplier; -import java.util.stream.Stream; - public class WrappedChunkProvider extends AbstractChunkProvider { private PlacementSimulationWorld world; diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java index e21d3d044..c6904537d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/WrappedChunk.java @@ -1,7 +1,14 @@ package com.simibubi.create.foundation.utility.worldWrappers.chunk; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; + +import javax.annotation.Nullable; + import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; + import it.unimi.dsi.fastutil.longs.LongSet; import it.unimi.dsi.fastutil.shorts.ShortList; import net.minecraft.block.Block; @@ -22,12 +29,6 @@ import net.minecraft.world.chunk.IChunk; import net.minecraft.world.gen.Heightmap; import net.minecraft.world.gen.feature.structure.StructureStart; -import javax.annotation.Nullable; -import java.util.Collection; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; - public class WrappedChunk implements IChunk { final PlacementSimulationWorld world; From 7023148e7fd7bd8849f9916d66ea222f41a6430d Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 18 Feb 2021 23:00:17 +0100 Subject: [PATCH 136/147] generic infinite fluid triggers --- src/generated/resources/.cache/cache | 34 ++-- .../assets/create/blockstates/fluid_pipe.json | 154 +++++++++--------- .../create/blockstates/radial_chassis.json | 24 +-- .../assets/create/lang/unfinished/de_de.json | 3 +- .../assets/create/lang/unfinished/es_mx.json | 3 +- .../assets/create/lang/unfinished/fr_fr.json | 3 +- .../assets/create/lang/unfinished/it_it.json | 3 +- .../assets/create/lang/unfinished/ja_jp.json | 3 +- .../assets/create/lang/unfinished/ko_kr.json | 3 +- .../assets/create/lang/unfinished/nl_nl.json | 3 +- .../assets/create/lang/unfinished/pt_br.json | 3 +- .../assets/create/lang/unfinished/ru_ru.json | 3 +- .../assets/create/lang/unfinished/zh_cn.json | 3 +- .../assets/create/lang/unfinished/zh_tw.json | 3 +- .../advancements/infinite_chocolate.json | 5 +- .../create/advancements/infinite_lava.json | 5 +- .../create/advancements/infinite_water.json | 5 +- .../fluids/actors/FluidDrainingBehaviour.java | 7 +- .../advancement/AllAdvancements.java | 15 +- .../foundation/advancement/AllTriggers.java | 1 + .../advancement/InfiniteFluidTrigger.java | 80 +++++++++ .../assets/create/textures/gui/icons.png | Bin 4765 -> 4765 bytes 22 files changed, 239 insertions(+), 124 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/advancement/InfiniteFluidTrigger.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e9a21c11e..3a4af4390 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -140,7 +140,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -48086bf71a824faf14841b698050cc8544b09a9b assets/create/blockstates/fluid_pipe.json +3d97226b5e8d8f70ed08e45e78db1faf78d5e28b assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json +8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -401,18 +401,18 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -04b4c59db79887cdddd128cd4cb59320c715a76a assets/create/lang/en_us.json -92840d43a7a5056ba1ddf043fe2a4b2b54533192 assets/create/lang/unfinished/de_de.json -fcded5cc7ba38ce1f13bbcf481c52da384d4335e assets/create/lang/unfinished/es_mx.json -d926a35cff961a017a174e5bad8976b8bfa246f0 assets/create/lang/unfinished/fr_fr.json -bcf5cf92717d5d8b5b4b56dc759cc5dcd3b05ae7 assets/create/lang/unfinished/it_it.json -dddcd6a8d3842035b07172dae1b61064b210dd3b assets/create/lang/unfinished/ja_jp.json -6fc6f612108b1c4498ea90e83f1ed0a7bce198d5 assets/create/lang/unfinished/ko_kr.json -f6d7256dca3a9979ce85333a72ad787657c954ff assets/create/lang/unfinished/nl_nl.json -48adee636f2a0ff06c97b738c9552dcdd48dd72c assets/create/lang/unfinished/pt_br.json -a82ef75492ff34c22f5e480fefe826aceefa956e assets/create/lang/unfinished/ru_ru.json -25b9387af4a75d4264ff001562cc4b14fccd49e6 assets/create/lang/unfinished/zh_cn.json -21e291e10cc5194b61d82c8a271cff2682ec0aee assets/create/lang/unfinished/zh_tw.json +1d231d2f74ca22001e30d023918849e3550896a1 assets/create/lang/en_us.json +435be9258b9412d4400e5364fb5047c2fd5a93ac assets/create/lang/unfinished/de_de.json +49688c098e2cdb27b51f528856d561a20d4e2dd8 assets/create/lang/unfinished/es_mx.json +18f09d363a6c0a503d7cdba12bbe0d082f07ac45 assets/create/lang/unfinished/fr_fr.json +eee4c4f4edf4efc5d409d77502c84f2eb93a6171 assets/create/lang/unfinished/it_it.json +d3b716160bc5703d6ac217f1cda10f5ff89c3bc1 assets/create/lang/unfinished/ja_jp.json +f7ea927235d19933b73e4a26c453d33418cff66e assets/create/lang/unfinished/ko_kr.json +f2987cd923d24da728a4fede0387de022067faec assets/create/lang/unfinished/nl_nl.json +2b1b0b450908d17e6c40f834d5050ffc68f1b733 assets/create/lang/unfinished/pt_br.json +27a08856af9c2a4436a6215ac063683475f77552 assets/create/lang/unfinished/ru_ru.json +a60d259329aa51ad151ab29e86f8d7d6e4ca209c assets/create/lang/unfinished/zh_cn.json +fa2a9b965dc91c1cf381524df8015d84f5c3cdc5 assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1625,9 +1625,9 @@ acef16596b7ae82aaf853142d69bcea7094b8173 data/create/advancements/fan_smoke.json 489c58a0508a2a41cc0849dfb933eb5ac96ef364 data/create/advancements/glass_pipe.json 62f3610188f7dbd3900ab305edc2d06282705a38 data/create/advancements/goggles.json 10c8686da9cec2ae30c10f434836ac15a1b88666 data/create/advancements/hose_pulley.json -d44f4dcc6d0c51b4f347bc0c5c0d97dbb7af6523 data/create/advancements/infinite_chocolate.json -db31e7853f9f15ad35e14bfa9925f4eb527f0f01 data/create/advancements/infinite_lava.json -eb7e3aac431fd16cf643a51e8546c53d6510c81c data/create/advancements/infinite_water.json +783149a4aaba84d2fb93e036f6f642540c1d7f78 data/create/advancements/infinite_chocolate.json +4e626cc34af70e2be6bd2e209b745515293784af data/create/advancements/infinite_lava.json +07a74e519f5244c4ce5d6c8549f6c8a668238953 data/create/advancements/infinite_water.json 9beb622c79e9f5ce2397c22222cac0faf272f388 data/create/advancements/integrated_circuit.json 316bed3d8985d0a371200967d7edd2936f1b9f94 data/create/advancements/integrated_circuit_eob.json a80eea863bfdc7777b8bade39a81655b2f99e02f data/create/advancements/item_drain.json diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 80a25280c..a4cffcde7 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -61,9 +61,9 @@ { "when": { "down": "false", + "north": "true", "up": "true", - "south": "false", - "north": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -72,9 +72,9 @@ { "when": { "down": "false", + "north": "false", "up": "true", - "south": "true", - "north": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -83,9 +83,9 @@ { "when": { "down": "true", + "north": "true", "up": "false", - "south": "false", - "north": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -94,9 +94,9 @@ { "when": { "down": "true", + "north": "false", "up": "false", - "south": "true", - "north": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -105,9 +105,9 @@ { "when": { "down": "true", + "north": "false", "up": "true", - "south": "false", - "north": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -116,9 +116,9 @@ { "when": { "down": "false", + "north": "false", "up": "true", - "south": "false", - "north": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -127,9 +127,9 @@ { "when": { "down": "true", + "north": "false", "up": "false", - "south": "false", - "north": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -138,9 +138,9 @@ { "when": { "down": "false", + "north": "true", "up": "false", - "south": "true", - "north": "true" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -149,9 +149,9 @@ { "when": { "down": "false", + "north": "true", "up": "false", - "south": "false", - "north": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -160,9 +160,9 @@ { "when": { "down": "false", + "north": "false", "up": "false", - "south": "true", - "north": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -171,9 +171,9 @@ { "when": { "down": "false", + "north": "false", "up": "false", - "south": "false", - "north": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { - "south": "true", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "true", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "down": "false", - "up": "true", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "down": "false", - "up": "true", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "down": "true", - "up": "false", "west": "false", - "east": "true" + "down": "true", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "down": "true", - "up": "false", "west": "true", - "east": "false" + "down": "true", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { + "west": "false", "down": "true", - "up": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { + "west": "false", "down": "false", - "up": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { + "west": "false", "down": "true", - "up": "false", - "west": "false", - "east": "false" + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { - "down": "false", - "up": "false", "west": "true", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { - "down": "false", - "up": "false", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { - "down": "false", - "up": "false", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "down": "false", - "up": "false", "west": "false", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index f97d8c8bc..9d00ea8b1 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -29,8 +29,8 @@ }, { "when": { - "axis": "x", - "sticky_south": "true" + "sticky_south": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -39,8 +39,8 @@ }, { "when": { - "axis": "y", - "sticky_south": "true" + "sticky_south": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky" @@ -48,8 +48,8 @@ }, { "when": { - "axis": "z", - "sticky_south": "true" + "sticky_south": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -59,8 +59,8 @@ }, { "when": { - "axis": "x", - "sticky_south": "false" + "sticky_south": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -69,8 +69,8 @@ }, { "when": { - "axis": "y", - "sticky_south": "false" + "sticky_south": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y" @@ -78,8 +78,8 @@ }, { "when": { - "axis": "z", - "sticky_south": "false" + "sticky_south": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 2970a187a..0e5af4101 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1101", + "_": "Missing Localizations: 1102", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blockpistole", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 09e681eb2..cd21e7d30 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 892", + "_": "Missing Localizations: 893", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index e422d3ee7..948230e1b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 672", + "_": "Missing Localizations: 673", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "Fabrication mécanique", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Coupe de bloc", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blockzappeur portable", "create.recipe.sandpaper_polishing": "Polissage au papier de verre", "create.recipe.mystery_conversion": "Métamorphose chromatique", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index e80fd7fa6..13d8ed291 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 7", + "_": "Missing Localizations: 8", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "Costruzione meccanica", "create.recipe.automatic_shaped": "Costruzione con forma automatizzata", "create.recipe.block_cutting": "Taglio di blocchi", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Zapper di blocchi portatile", "create.recipe.sandpaper_polishing": "Levigamento da carta vetrata", "create.recipe.mystery_conversion": "Metamorfosi cromatica", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 5416539af..28f8de6ec 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 14", + "_": "Missing Localizations: 15", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "メカニカルクラフト", "create.recipe.automatic_shaped": "自動定形クラフト", "create.recipe.block_cutting": "自動石切", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "携帯型ブロックザッパー", "create.recipe.sandpaper_polishing": "紙やすりでの研磨", "create.recipe.mystery_conversion": "色彩変態", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 3738a1056..8ca0489d9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 61", + "_": "Missing Localizations: 62", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "기계 조합", "create.recipe.automatic_shaped": "유형 자동 조합", "create.recipe.block_cutting": "블 절단", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "휴대용 블록발사기 업그레이드", "create.recipe.sandpaper_polishing": "사포질", "create.recipe.mystery_conversion": "?", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index f2d5bc807..d6a6028c0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1161", + "_": "Missing Localizations: 1162", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Blok Zagen", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blokzapper", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 4a686f966..f0dfdb74c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1227", + "_": "Missing Localizations: 1228", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blockzapper Portátil", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 4ccc0e1ab..d3f6012f0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 11", + "_": "Missing Localizations: 12", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "Механическое создание", "create.recipe.automatic_shaped": "Автоматическая форменная сборка", "create.recipe.block_cutting": "Резка блока", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", "create.recipe.mystery_conversion": "Хроматический метаморфоз", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 873427b8f..27d0fe7fd 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 9", + "_": "Missing Localizations: 10", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "自动合成", "create.recipe.automatic_shaped": "自动合成", "create.recipe.block_cutting": "方块切割", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "手持式方块放置器", "create.recipe.sandpaper_polishing": "砂纸打磨", "create.recipe.mystery_conversion": "神秘转化", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 4a9a17215..caa0f9444 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 14", + "_": "Missing Localizations: 15", "_": "->------------------------] Game Elements [------------------------<-", @@ -685,6 +685,7 @@ "create.recipe.mechanical_crafting": "自動合成", "create.recipe.automatic_shaped": "自動合成", "create.recipe.block_cutting": "方塊切割", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "方塊放置器", "create.recipe.sandpaper_polishing": "砂紙打磨", "create.recipe.mystery_conversion": "神秘轉化", diff --git a/src/generated/resources/data/create/advancements/infinite_chocolate.json b/src/generated/resources/data/create/advancements/infinite_chocolate.json index de6e78ad2..d119ec219 100644 --- a/src/generated/resources/data/create/advancements/infinite_chocolate.json +++ b/src/generated/resources/data/create/advancements/infinite_chocolate.json @@ -17,7 +17,10 @@ }, "criteria": { "0": { - "trigger": "create:infinite_chocolate" + "trigger": "create:infinite_fluid", + "conditions": { + "fluid": "create:chocolate" + } } }, "requirements": [ diff --git a/src/generated/resources/data/create/advancements/infinite_lava.json b/src/generated/resources/data/create/advancements/infinite_lava.json index 732fbfd39..95db7901d 100644 --- a/src/generated/resources/data/create/advancements/infinite_lava.json +++ b/src/generated/resources/data/create/advancements/infinite_lava.json @@ -17,7 +17,10 @@ }, "criteria": { "0": { - "trigger": "create:infinite_lava" + "trigger": "create:infinite_fluid", + "conditions": { + "fluid": "minecraft:lava" + } } }, "requirements": [ diff --git a/src/generated/resources/data/create/advancements/infinite_water.json b/src/generated/resources/data/create/advancements/infinite_water.json index 1fc7be3c0..5af5a31fa 100644 --- a/src/generated/resources/data/create/advancements/infinite_water.json +++ b/src/generated/resources/data/create/advancements/infinite_water.json @@ -17,7 +17,10 @@ }, "criteria": { "0": { - "trigger": "create:infinite_water" + "trigger": "create:infinite_fluid", + "conditions": { + "fluid": "minecraft:water" + } } }, "requirements": [ diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index 3ee683b49..3423c9704 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -9,6 +9,7 @@ import java.util.Set; import javax.annotation.Nullable; import com.simibubi.create.AllFluids; +import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -133,12 +134,16 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { AllTriggers.triggerForNearbyPlayers(AllTriggers.HOSE_PULLEY, world, tileEntity.getPos(), 8); if (infinite) { + Fluid stillFluid = FluidHelper.convertToStill(fluid); + AllTriggers.getPlayersInRange(world, tileEntity.getPos(), 8) + .forEach(p -> AllTriggers.INFINITE_FLUID.trigger(p, FluidHelper.convertToStill(stillFluid))); + /* if (FluidHelper.isLava(fluid)) AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_LAVA, world, tileEntity.getPos(), 8); if (FluidHelper.isWater(fluid)) AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_WATER, world, tileEntity.getPos(), 8); if (fluid.isEquivalentTo(AllFluids.CHOCOLATE.get())) - AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_CHOCOLATE, world, tileEntity.getPos(), 8); + AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_CHOCOLATE, world, tileEntity.getPos(), 8);*/ return true; } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index 0690927b8..dbcc383a0 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -6,6 +6,8 @@ import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -293,17 +295,20 @@ public class AllAdvancements implements IDataProvider { Advancement infinite_water = advancement("infinite_water", Items.WATER_BUCKET, TaskType.NORMAL).withParent(hose_pulley) - .withCriterion("0", AllTriggers.INFINITE_WATER.instance()) + // .withCriterion("0", AllTriggers.INFINITE_WATER.instance()) + .withCriterion("0", isInfinite(Fluids.WATER.getFluid())) .register(t, id + ":infinite_water"); Advancement infinite_lava = advancement("infinite_lava", Items.LAVA_BUCKET, TaskType.GOAL).withParent(hose_pulley) - .withCriterion("0", AllTriggers.INFINITE_LAVA.instance()) + // .withCriterion("0", AllTriggers.INFINITE_LAVA.instance()) + .withCriterion("0", isInfinite(Fluids.LAVA.getFluid())) .register(t, id + ":infinite_lava"); Advancement infinite_chocolate = advancement("infinite_chocolate", AllFluids.CHOCOLATE.get() .getFilledBucket(), TaskType.CHALLENGE).withParent(hose_pulley) - .withCriterion("0", AllTriggers.INFINITE_CHOCOLATE.instance()) + // .withCriterion("0", AllTriggers.INFINITE_CHOCOLATE.instance()) + .withCriterion("0", isInfinite(AllFluids.CHOCOLATE.get().getFluid())) .register(t, id + ":infinite_chocolate"); } @@ -497,6 +502,10 @@ public class AllAdvancements implements IDataProvider { return AllTriggers.KINETIC_BLOCK.forBlock(block); } + public CriterionTriggerBase.Instance isInfinite(Fluid fluid) { + return AllTriggers.INFINITE_FLUID.forFluid(fluid); + } + public InventoryChangeTrigger.Instance itemGathered(IItemProvider itemprovider) { return InventoryChangeTrigger.Instance.forItems(itemprovider); } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 01a05f238..9189414fe 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -16,6 +16,7 @@ public class AllTriggers { private static List> triggers = new LinkedList<>(); public static KineticBlockTrigger KINETIC_BLOCK = add(new KineticBlockTrigger("kinetic_block")); + public static InfiniteFluidTrigger INFINITE_FLUID = add(new InfiniteFluidTrigger("infinite_fluid")); public static SimpleTrigger ROTATION = simple("rotation"), diff --git a/src/main/java/com/simibubi/create/foundation/advancement/InfiniteFluidTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/InfiniteFluidTrigger.java new file mode 100644 index 000000000..4f295a424 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/advancement/InfiniteFluidTrigger.java @@ -0,0 +1,80 @@ +package com.simibubi.create.foundation.advancement; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.fluid.FluidHelper; +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.fluid.Fluid; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Collections; +import java.util.List; +import java.util.function.Supplier; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class InfiniteFluidTrigger extends CriterionTriggerBase { + private static final ResourceLocation ID = new ResourceLocation(Create.ID, "infinite_fluid"); + + public InfiniteFluidTrigger(String id) { + super(id); + } + + public Instance forFluid(Fluid fluid) { + return new Instance(fluid); + } + + @Override + public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) { + Fluid fluid = null; + if (json.has("fluid")) { + ResourceLocation resourcelocation = new ResourceLocation(JSONUtils.getString(json, "fluid")); + fluid = ForgeRegistries.FLUIDS.getValue(resourcelocation); + + if (fluid == null) + throw new JsonSyntaxException("Unknown fluid type '" + resourcelocation + "'"); + } + + return new Instance(fluid); + } + + public void trigger(ServerPlayerEntity player, Fluid fluid) { + trigger(player, Collections.singletonList(() -> fluid)); + } + + + public static class Instance extends CriterionTriggerBase.Instance { + + private final Fluid fluid; + + public Instance(@Nullable Fluid fluid) { + super(InfiniteFluidTrigger.ID); + this.fluid = FluidHelper.convertToStill(fluid); + } + + @Override + protected boolean test(List> suppliers) { + if (fluid == null || suppliers.isEmpty()) + return false; + return fluid.equals(suppliers.get(0).get()); + } + + @Override + public JsonElement serialize() { + JsonObject jsonobject = new JsonObject(); + ResourceLocation key = ForgeRegistries.FLUIDS.getKey(this.fluid); + if (key != null) + jsonobject.addProperty("fluid", key.toString()); + return jsonobject; + } + } + +} diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index e305d5bf327f3e51a08b67913d965c706f64bbdc..499eccc3826ff754420db87460668b49e8a36fdf 100644 GIT binary patch delta 21 dcmbQMI#+dqC)XMV2EH|ncUB}dZw&Sl0svA<2bcf= delta 21 dcmbQMI#+dqC)ZjA2EMh7eD535HwJqN0RT=52NeJS From 3e63afa5f589dcafdb59b5a73d73d2e5fc992fc1 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 18 Feb 2021 14:00:17 -0800 Subject: [PATCH 137/147] fix concurrent modification --- .../render/backend/instancing/InstancedTileRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 055e5dac7..4f22c016f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -136,7 +136,7 @@ public abstract class InstancedTileRenderer

{ } public void clean() { - instances.keySet().stream().filter(TileEntity::isRemoved).forEach(instances::remove); + instances.keySet().removeIf(TileEntity::isRemoved); } public void invalidate() { From 3c48ece02192c5c44b6fe7500f292ce5ed096179 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Thu, 18 Feb 2021 22:57:25 +0000 Subject: [PATCH 138/147] It's the Funnel Countdown d-do-do dooo, do-de-do-do-doooo --- .../textures/block/andesite_funnel_slope.png | Bin 0 -> 6326 bytes .../create/textures/block/brass_funnel_slope.png | Bin 0 -> 6290 bytes .../create/textures/block/funnel_closed.png | Bin 0 -> 6290 bytes .../assets/create/textures/block/funnel_open.png | Bin 0 -> 5910 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/create/textures/block/andesite_funnel_slope.png create mode 100644 src/main/resources/assets/create/textures/block/brass_funnel_slope.png create mode 100644 src/main/resources/assets/create/textures/block/funnel_closed.png create mode 100644 src/main/resources/assets/create/textures/block/funnel_open.png diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_slope.png b/src/main/resources/assets/create/textures/block/andesite_funnel_slope.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4441c47c8f325ddf1b38620f3176d935ca1218 GIT binary patch literal 6326 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 OH`~>lb#UI|lz#!Ro@?{~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_slope.png b/src/main/resources/assets/create/textures/block/brass_funnel_slope.png new file mode 100644 index 0000000000000000000000000000000000000000..2c79bb0dc223abd8da4f0c902cd88c1131ef6eae GIT binary patch literal 6290 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 bUs0Kc{T;R}$6!;K$_LI4Zmc8r!K?oToPt=p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/funnel_open.png b/src/main/resources/assets/create/textures/block/funnel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..83b39cd70535d2a504864858410ee7d16dbea71f GIT binary patch literal 5910 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 Date: Fri, 19 Feb 2021 00:53:29 -0300 Subject: [PATCH 139/147] Update es_es.json --- .../resources/assets/create/lang/es_es.json | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index c09994eb1..31a3a049d 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -226,7 +226,7 @@ "block.create.magenta_valve_handle": "Asa de válvula magenta", "block.create.mechanical_arm": "Brazo mecánico", "block.create.mechanical_bearing": "Rodamiento mecánico", - "block.create.mechanical_crafter": "Mecanizador", + "block.create.mechanical_crafter": "Autoensamblador mecánico", "block.create.mechanical_drill": "Taladro mecánico", "block.create.mechanical_harvester": "Cosechadora mecánica", "block.create.mechanical_mixer": "Mezcladora mecánica", @@ -433,7 +433,7 @@ "item.create.copper_ingot": "Lingote de cobre", "item.create.copper_nugget": "Pepita de cobre", "item.create.copper_sheet": "Lámina de cobre", - "item.create.crafter_slot_cover": "Tapa de ranura del Mecanizador", + "item.create.crafter_slot_cover": "Tapa de ranura del Autoensamblador mecánico", "item.create.crushed_aluminum_ore": "Mineral de aluminio molido", "item.create.crushed_brass": "Latón molido", "item.create.crushed_copper_ore": "Mineral de cobre molido", @@ -598,7 +598,7 @@ "advancement.create.infinite_chocolate": "Ahogándose en la imaginación", "advancement.create.infinite_chocolate.desc": "Bombea desde una masa de chocolate fundido lo suficientemente grande como para ser considerado infinito.", "advancement.create.crafter": "Montaje automatizado", - "advancement.create.crafter.desc": "Coloca y alimenta algunos mecanizadores.", + "advancement.create.crafter.desc": "Coloca y alimenta algunos autoensambladores.", "advancement.create.clockwork_bearing": "Artilugio a la hora", "advancement.create.clockwork_bearing.desc": "Ensamblar una estructura montada sobre un rodamiento de relojería.", "advancement.create.nixie_tube": "Signos de estilo", @@ -1295,7 +1295,7 @@ "block.create.mechanical_arm.tooltip": "BRAZO MECÁNICO", "block.create.mechanical_arm.tooltip.summary": "Artilugio avanzado para reubicar _elementos_", "block.create.mechanical_arm.tooltip.condition1": "Transferencia de elementos", - "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Correas_, _Depósitos_, _Embudos_ y _Mecanizadores_", + "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Correas_, _Depósitos_, _Embudos_ y _Autoensambladores_", "block.create.mechanical_arm.tooltip.control1": "Mientras está en la mano", "block.create.mechanical_arm.tooltip.action1": "Haz clic con el botón derecho en un _objeto accesible del inventario_ para establecerlo como _fuente_ para el _brazo mecánico_. Haz clic con el botón derecho del ratón dos veces para establecerlo como _destino_", "block.create.mechanical_arm.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa", @@ -1518,16 +1518,16 @@ "block.create.mechanical_mixer.tooltip.condition1": "Cuando está por encima de la Cuenca", "block.create.mechanical_mixer.tooltip.behaviour1": "Comienza a mezclar los elementos en la cuenca siempre que estén presentes todos los ingredientes necesarios. Para evitar recetas no deseadas, utilice la ranura del filtro de la cuenca o reduzca la fuerza de rotación hasta que se hayan añadido todos los ingredientes deseados", - "block.create.mechanical_crafter.tooltip": "MECANIZADOR", - "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus correas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Mecanizadores", + "block.create.mechanical_crafter.tooltip": "AUTOENSAMBLADOR MECÁNICO", + "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus correas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Autoensambladores", "block.create.mechanical_crafter.tooltip.condition1": "Cuando es impulsado por la cinética", "block.create.mechanical_crafter.tooltip.behaviour1": "_Empieza el proceso de creación_ en cuanto _todos los crafters_ de la parrilla hayan recibido un objeto_", "block.create.mechanical_crafter.tooltip.condition2": "Con pulso de Redstone", "block.create.mechanical_crafter.tooltip.behaviour2": "_Fuerza_ el inicio del proceso de _creación_ con todos los _artículos_ dados actualmente en la parrilla", "block.create.mechanical_crafter.tooltip.control1": "Cuando se arranca por delante", - "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un mecanizador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las correas en un flujo_ que mueva todos los objetos hacia un mecanizador final. El mecanizador final debe _apuntar hacia fuera_ de la rejilla", + "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un autoensamblador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las correas en un flujo_ que mueva todos los objetos hacia un autoensamblador final. El autoensamblador final debe _apuntar hacia fuera_ de la rejilla", "block.create.mechanical_crafter.tooltip.control2": "Cuando se arranca hacia atrás", - "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los mecanizadores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", + "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los autoensambladores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", "block.create.furnace_engine.tooltip": "MOTOR DEL HORNO", "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _fuerza de rotación/torque_ que requiere un _horno en funcionamiento_ para funcionar", @@ -1777,8 +1777,8 @@ "item.create.minecart_coupling.tooltip.condition1": "Cuando se utiliza en Vagonetas", "item.create.minecart_coupling.tooltip.behaviour1": "_Acopla_ dos Vagonetas, intentando mantenerlas a una _distancia constante_ mientras se mueven", - "item.create.crafter_slot_cover.tooltip": "TAPA DE RANURA DEL MECANIZADOR", - "item.create.crafter_slot_cover.tooltip.summary": "Se utiliza para marcar a un _Mecanizador_ una ranura vacía en una receta. Los mecanizadores no tienen que formar necesariamente una cuadrícula completa. Esto es útil cuando hay recetas en las que los _ingredientes están en diagonal_ entre sí", + "item.create.crafter_slot_cover.tooltip": "TAPA DE RANURA DEL AUTOENSAMBLADOR", + "item.create.crafter_slot_cover.tooltip.summary": "Se utiliza para marcar a un _Autoensamblador_ una ranura vacía en una receta. Los autoensambladores no tienen que formar necesariamente una cuadrícula completa. Esto es útil cuando hay recetas en las que los _ingredientes están en diagonal_ entre sí", "create.tooltip.wip": "WIP", "create.tooltip.workInProgress": "¡Trabajo en curso!", @@ -1795,3 +1795,4 @@ "_": "Gracias por traducir Create!" } + From 7c0d0b64392a541cf6697a61e4fbe862568034f4 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Fri, 19 Feb 2021 00:53:47 -0300 Subject: [PATCH 140/147] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 31a3a049d..787422bb8 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -1795,4 +1795,3 @@ "_": "Gracias por traducir Create!" } - From d9aa9127963c5d1414268632389b461c20b763e4 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Fri, 19 Feb 2021 09:09:29 +0100 Subject: [PATCH 141/147] generic registry based triggers (replaced kinetic block trigger and infinite fluid trigger) --- src/generated/resources/.cache/cache | 10 +-- .../create/blockstates/radial_chassis.json | 72 ++++++++-------- .../advancements/infinite_chocolate.json | 2 +- .../create/advancements/infinite_lava.json | 2 +- .../create/advancements/infinite_water.json | 2 +- .../data/create/advancements/mixer.json | 2 +- .../contraptions/base/KineticTileEntity.java | 2 +- .../advancement/AllAdvancements.java | 18 ++-- .../foundation/advancement/AllTriggers.java | 11 ++- .../advancement/CriterionTriggerBase.java | 12 ++- .../advancement/InfiniteFluidTrigger.java | 80 ------------------ .../advancement/KineticBlockTrigger.java | 76 ----------------- .../advancement/RegistryTrigger.java | 83 +++++++++++++++++++ .../foundation/advancement/SimpleTrigger.java | 8 +- 14 files changed, 158 insertions(+), 222 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/advancement/InfiniteFluidTrigger.java delete mode 100644 src/main/java/com/simibubi/create/foundation/advancement/KineticBlockTrigger.java create mode 100644 src/main/java/com/simibubi/create/foundation/advancement/RegistryTrigger.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 3a4af4390..74d15e740 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json +5d1b30c2bab556f57c78e7780fd445b08f541a50 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -1625,9 +1625,9 @@ acef16596b7ae82aaf853142d69bcea7094b8173 data/create/advancements/fan_smoke.json 489c58a0508a2a41cc0849dfb933eb5ac96ef364 data/create/advancements/glass_pipe.json 62f3610188f7dbd3900ab305edc2d06282705a38 data/create/advancements/goggles.json 10c8686da9cec2ae30c10f434836ac15a1b88666 data/create/advancements/hose_pulley.json -783149a4aaba84d2fb93e036f6f642540c1d7f78 data/create/advancements/infinite_chocolate.json -4e626cc34af70e2be6bd2e209b745515293784af data/create/advancements/infinite_lava.json -07a74e519f5244c4ce5d6c8549f6c8a668238953 data/create/advancements/infinite_water.json +a8595e5fdf6517e5c9c790afccc99fe9d3dd95aa data/create/advancements/infinite_chocolate.json +50460d4470e9630b2d3ae1ec4f24d00d8d7c7e6b data/create/advancements/infinite_lava.json +19d9794ac08cee962c7c718085d3e3ba5e89a328 data/create/advancements/infinite_water.json 9beb622c79e9f5ce2397c22222cac0faf272f388 data/create/advancements/integrated_circuit.json 316bed3d8985d0a371200967d7edd2936f1b9f94 data/create/advancements/integrated_circuit_eob.json a80eea863bfdc7777b8bade39a81655b2f99e02f data/create/advancements/item_drain.json @@ -1638,7 +1638,7 @@ a80eea863bfdc7777b8bade39a81655b2f99e02f data/create/advancements/item_drain.jso 218568a4e416c5fa559c55a5c92aa4e93f88b837 data/create/advancements/mechanical_drill.json 6dc84ad2f0512495fe3f01f99d3c547849351e33 data/create/advancements/mechanical_saw.json 3bc549c06dc6d9568f92e1abc9654c9b4c33f035 data/create/advancements/millstone.json -704c7fc0ed357b1a116ffdc0b6c64fe64e337a5a data/create/advancements/mixer.json +6f872e1e8be9d8e5fa378db1384b1de72fadac23 data/create/advancements/mixer.json 325d4cef263ce301b143ee0498fb15afdb2c125b data/create/advancements/musical_arm.json c9c4060ed207226b69fada2d61e01a97d7077eae data/create/advancements/nixie_tube.json 9329cb210a954c0de1dcf517e7dff1ece77c19c0 data/create/advancements/overstress_flywheel.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 9d00ea8b1..04e5c08ae 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -29,8 +29,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "x" + "axis": "x", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -39,8 +39,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "y" + "axis": "y", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky" @@ -48,8 +48,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "z" + "axis": "z", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -59,8 +59,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "x" + "axis": "x", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -69,8 +69,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "y" + "axis": "y", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_y" @@ -78,8 +78,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "z" + "axis": "z", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -89,8 +89,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "x" + "axis": "x", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "y" + "axis": "y", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "z" + "axis": "z", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "x" + "axis": "x", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "y" + "axis": "y", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "z" + "axis": "z", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "x" + "axis": "x", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "y" + "axis": "y", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "z" + "axis": "z", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "x" + "axis": "x", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "y" + "axis": "y", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "z" + "axis": "z", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/data/create/advancements/infinite_chocolate.json b/src/generated/resources/data/create/advancements/infinite_chocolate.json index d119ec219..d192ca113 100644 --- a/src/generated/resources/data/create/advancements/infinite_chocolate.json +++ b/src/generated/resources/data/create/advancements/infinite_chocolate.json @@ -19,7 +19,7 @@ "0": { "trigger": "create:infinite_fluid", "conditions": { - "fluid": "create:chocolate" + "registry_entry": "create:chocolate" } } }, diff --git a/src/generated/resources/data/create/advancements/infinite_lava.json b/src/generated/resources/data/create/advancements/infinite_lava.json index 95db7901d..40b98a1fd 100644 --- a/src/generated/resources/data/create/advancements/infinite_lava.json +++ b/src/generated/resources/data/create/advancements/infinite_lava.json @@ -19,7 +19,7 @@ "0": { "trigger": "create:infinite_fluid", "conditions": { - "fluid": "minecraft:lava" + "registry_entry": "minecraft:lava" } } }, diff --git a/src/generated/resources/data/create/advancements/infinite_water.json b/src/generated/resources/data/create/advancements/infinite_water.json index 5af5a31fa..0f4771011 100644 --- a/src/generated/resources/data/create/advancements/infinite_water.json +++ b/src/generated/resources/data/create/advancements/infinite_water.json @@ -19,7 +19,7 @@ "0": { "trigger": "create:infinite_fluid", "conditions": { - "fluid": "minecraft:water" + "registry_entry": "minecraft:water" } } }, diff --git a/src/generated/resources/data/create/advancements/mixer.json b/src/generated/resources/data/create/advancements/mixer.json index 5988c6b10..ab35b7f7d 100644 --- a/src/generated/resources/data/create/advancements/mixer.json +++ b/src/generated/resources/data/create/advancements/mixer.json @@ -25,7 +25,7 @@ "1": { "trigger": "create:kinetic_block", "conditions": { - "block": "create:mechanical_mixer" + "registry_entry": "create:mechanical_mixer" } }, "2": { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index f99113046..cf1815817 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -176,7 +176,7 @@ public abstract class KineticTileEntity extends SmartTileEntity if (fromOrToZero && previousSpeed == 0 && !world.isRemote) AllTriggers.getPlayersInRange(world, pos, 4) - .forEach(p -> AllTriggers.KINETIC_BLOCK.trigger(p, getBlockState())); + .forEach(p -> AllTriggers.KINETIC_BLOCK.trigger(p, getBlockState().getBlock())); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index dbcc383a0..e73c1cfc8 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -6,6 +6,7 @@ import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; +import net.minecraft.fluid.FlowingFluid; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import org.apache.logging.log4j.LogManager; @@ -295,20 +296,17 @@ public class AllAdvancements implements IDataProvider { Advancement infinite_water = advancement("infinite_water", Items.WATER_BUCKET, TaskType.NORMAL).withParent(hose_pulley) - // .withCriterion("0", AllTriggers.INFINITE_WATER.instance()) - .withCriterion("0", isInfinite(Fluids.WATER.getFluid())) + .withCriterion("0", isInfinite(Fluids.WATER)) .register(t, id + ":infinite_water"); Advancement infinite_lava = advancement("infinite_lava", Items.LAVA_BUCKET, TaskType.GOAL).withParent(hose_pulley) - // .withCriterion("0", AllTriggers.INFINITE_LAVA.instance()) - .withCriterion("0", isInfinite(Fluids.LAVA.getFluid())) + .withCriterion("0", isInfinite(Fluids.LAVA)) .register(t, id + ":infinite_lava"); Advancement infinite_chocolate = advancement("infinite_chocolate", AllFluids.CHOCOLATE.get() .getFilledBucket(), TaskType.CHALLENGE).withParent(hose_pulley) - // .withCriterion("0", AllTriggers.INFINITE_CHOCOLATE.instance()) - .withCriterion("0", isInfinite(AllFluids.CHOCOLATE.get().getFluid())) + .withCriterion("0", isInfinite(AllFluids.CHOCOLATE.get())) .register(t, id + ":infinite_chocolate"); } @@ -498,12 +496,12 @@ public class AllAdvancements implements IDataProvider { return PlacedBlockTrigger.Instance.placedBlock(block); } - public KineticBlockTrigger.Instance isPowered(Block block) { - return AllTriggers.KINETIC_BLOCK.forBlock(block); + public RegistryTrigger.Instance isPowered(Block block) { + return AllTriggers.KINETIC_BLOCK.forEntry(block); } - public CriterionTriggerBase.Instance isInfinite(Fluid fluid) { - return AllTriggers.INFINITE_FLUID.forFluid(fluid); + public RegistryTrigger.Instance isInfinite(FlowingFluid fluid) { + return AllTriggers.INFINITE_FLUID.forEntry(fluid.getStillFluid()); } public InventoryChangeTrigger.Instance itemGathered(IItemProvider itemprovider) { diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 9189414fe..67b5f2332 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -5,18 +5,20 @@ import java.util.List; import java.util.function.Predicate; import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.block.Block; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.fluid.Fluid; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class AllTriggers { - private static List> triggers = new LinkedList<>(); + private static final List> triggers = new LinkedList<>(); - public static KineticBlockTrigger KINETIC_BLOCK = add(new KineticBlockTrigger("kinetic_block")); - public static InfiniteFluidTrigger INFINITE_FLUID = add(new InfiniteFluidTrigger("infinite_fluid")); + public static RegistryTrigger KINETIC_BLOCK = add(new RegistryTrigger<>("kinetic_block", Block.class)); + public static RegistryTrigger INFINITE_FLUID = add(new RegistryTrigger<>("infinite_fluid", Fluid.class)); public static SimpleTrigger ROTATION = simple("rotation"), @@ -68,9 +70,6 @@ public class AllTriggers { PIPE_COLLISION = simple("pipe_collision"), PIPE_SPILL = simple("pipe_spill"), HOSE_PULLEY = simple("hose_pulley"), - INFINITE_WATER = simple("infinite_water"), - INFINITE_LAVA = simple("infinite_lava"), - INFINITE_CHOCOLATE = simple("infinite_chocolate"), MIXER_MIX = simple("mixer"); private static SimpleTrigger simple(String id) { diff --git a/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java b/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java index 61fc561f6..14006415b 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java @@ -10,19 +10,25 @@ import java.util.function.Supplier; import com.google.common.collect.Maps; import com.simibubi.create.Create; +import mcp.MethodsReturnNonnullByDefault; import net.minecraft.advancements.ICriterionTrigger; import net.minecraft.advancements.PlayerAdvancements; import net.minecraft.advancements.criterion.CriterionInstance; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.ResourceLocation; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public abstract class CriterionTriggerBase implements ICriterionTrigger { public CriterionTriggerBase(String id) { this.ID = new ResourceLocation(Create.ID, id); } - private ResourceLocation ID; + private final ResourceLocation ID; protected final Map>> listeners = Maps.newHashMap(); @Override @@ -53,7 +59,7 @@ public abstract class CriterionTriggerBase> suppliers){ + protected void trigger(ServerPlayerEntity player, @Nullable List> suppliers){ PlayerAdvancements playerAdvancements = player.getAdvancements(); Set> playerListeners = this.listeners.get(playerAdvancements); if (playerListeners != null){ @@ -77,7 +83,7 @@ public abstract class CriterionTriggerBase> suppliers); + protected abstract boolean test(@Nullable List> suppliers); } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/InfiniteFluidTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/InfiniteFluidTrigger.java deleted file mode 100644 index 4f295a424..000000000 --- a/src/main/java/com/simibubi/create/foundation/advancement/InfiniteFluidTrigger.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.simibubi.create.foundation.advancement; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.fluid.FluidHelper; -import mcp.MethodsReturnNonnullByDefault; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.util.JSONUtils; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.registries.ForgeRegistries; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Collections; -import java.util.List; -import java.util.function.Supplier; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class InfiniteFluidTrigger extends CriterionTriggerBase { - private static final ResourceLocation ID = new ResourceLocation(Create.ID, "infinite_fluid"); - - public InfiniteFluidTrigger(String id) { - super(id); - } - - public Instance forFluid(Fluid fluid) { - return new Instance(fluid); - } - - @Override - public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) { - Fluid fluid = null; - if (json.has("fluid")) { - ResourceLocation resourcelocation = new ResourceLocation(JSONUtils.getString(json, "fluid")); - fluid = ForgeRegistries.FLUIDS.getValue(resourcelocation); - - if (fluid == null) - throw new JsonSyntaxException("Unknown fluid type '" + resourcelocation + "'"); - } - - return new Instance(fluid); - } - - public void trigger(ServerPlayerEntity player, Fluid fluid) { - trigger(player, Collections.singletonList(() -> fluid)); - } - - - public static class Instance extends CriterionTriggerBase.Instance { - - private final Fluid fluid; - - public Instance(@Nullable Fluid fluid) { - super(InfiniteFluidTrigger.ID); - this.fluid = FluidHelper.convertToStill(fluid); - } - - @Override - protected boolean test(List> suppliers) { - if (fluid == null || suppliers.isEmpty()) - return false; - return fluid.equals(suppliers.get(0).get()); - } - - @Override - public JsonElement serialize() { - JsonObject jsonobject = new JsonObject(); - ResourceLocation key = ForgeRegistries.FLUIDS.getKey(this.fluid); - if (key != null) - jsonobject.addProperty("fluid", key.toString()); - return jsonobject; - } - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/advancement/KineticBlockTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/KineticBlockTrigger.java deleted file mode 100644 index a72bc6f78..000000000 --- a/src/main/java/com/simibubi/create/foundation/advancement/KineticBlockTrigger.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.simibubi.create.foundation.advancement; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Supplier; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; -import com.simibubi.create.Create; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.util.JSONUtils; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.registry.Registry; - -public class KineticBlockTrigger extends CriterionTriggerBase { - - private static final ResourceLocation ID = new ResourceLocation(Create.ID, "kinetic_block"); - - public KineticBlockTrigger(String id) { - super(id); - } - - public Instance forBlock(Block block) { - return new Instance(block); - } - - @Override - @SuppressWarnings("deprecation") - public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) { - Block block = null; - if (json.has("block")) { - ResourceLocation resourcelocation = new ResourceLocation(JSONUtils.getString(json, "block")); - block = Registry.BLOCK.getValue(resourcelocation).orElseThrow(() -> { - return new JsonSyntaxException("Unknown block type '" + resourcelocation + "'"); - }); - } - - return new Instance(block); - } - - public void trigger(ServerPlayerEntity player, BlockState state) { - trigger(player, Arrays.asList(() -> state.getBlock())); - } - - public static class Instance extends CriterionTriggerBase.Instance { - private final Block block; - - public Instance(Block block) { - super(KineticBlockTrigger.ID); - this.block = block; - } - - @Override - protected boolean test(List> suppliers) { - if (suppliers.isEmpty()) - return false; - return block == suppliers.get(0).get(); - } - - @Override - @SuppressWarnings("deprecation") - public JsonElement serialize() { - JsonObject jsonobject = new JsonObject(); - if (this.block != null) - jsonobject.addProperty("block", Registry.BLOCK.getKey(this.block).toString()); - return jsonobject; - } - } - - -} diff --git a/src/main/java/com/simibubi/create/foundation/advancement/RegistryTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/RegistryTrigger.java new file mode 100644 index 000000000..3851bdf2d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/advancement/RegistryTrigger.java @@ -0,0 +1,83 @@ +package com.simibubi.create.foundation.advancement; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.IForgeRegistryEntry; +import net.minecraftforge.registries.RegistryManager; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Collections; +import java.util.List; +import java.util.function.Supplier; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class RegistryTrigger> extends CriterionTriggerBase> { + private final Class registryType; + + public RegistryTrigger(String id, Class registryType) { + super(id); + this.registryType = registryType; + } + + public Instance forEntry(@Nullable T registryEntry) { + return new Instance<>(getId(), registryEntry); + } + + public void trigger(ServerPlayerEntity player, T registryEntry) { + trigger(player, Collections.singletonList(() -> registryEntry)); + } + + @Override + public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) { + T entry = null; + if (json.has("registry_entry")) { + ResourceLocation entryLocation = new ResourceLocation(JSONUtils.getString(json, "registry_entry")); + entry = RegistryManager.ACTIVE.getRegistry(registryType).getValue(entryLocation); + + if (entry == null) + throw new JsonSyntaxException("Unknown registry entry '" + entryLocation + "'"); + } + + return forEntry(entry); + } + + + public static class Instance> extends CriterionTriggerBase.Instance { + + @Nullable + private final T entry; + + public Instance(ResourceLocation id, @Nullable T registryEntry) { + super(id); + entry = registryEntry; + } + + @Override + protected boolean test(@Nullable List> suppliers) { + if (entry == null || suppliers == null || suppliers.isEmpty()) + return false; + return entry.equals(suppliers.get(0).get()); + } + + @Override + public JsonElement serialize() { + JsonObject jsonobject = new JsonObject(); + if (entry == null) + return jsonobject; + + ResourceLocation key = RegistryManager.ACTIVE.getRegistry(entry.getRegistryType()).getKey(entry); + if (key != null) { + jsonobject.addProperty("registry_entry", key.toString()); + } + return jsonobject; + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/advancement/SimpleTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/SimpleTrigger.java index 375bdb3a2..4d78b956e 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/SimpleTrigger.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/SimpleTrigger.java @@ -6,9 +6,15 @@ import java.util.function.Supplier; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; +import mcp.MethodsReturnNonnullByDefault; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.ResourceLocation; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault public class SimpleTrigger extends CriterionTriggerBase implements ITriggerable { public SimpleTrigger(String id) { @@ -35,7 +41,7 @@ public class SimpleTrigger extends CriterionTriggerBase } @Override - protected boolean test(List> suppliers) { + protected boolean test(@Nullable List> suppliers) { return true; } } From 3f9ee09953116232406e72c98d7df7e8c52e0f09 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Fri, 19 Feb 2021 14:12:26 +0100 Subject: [PATCH 142/147] Rework Bracket trigger to now be a registry trigger based on base block --- src/generated/resources/.cache/cache | 12 +-- .../create/blockstates/radial_chassis.json | 24 +++--- .../data/create/advancements/aesthetics.json | 22 +++++- .../advancements/infinite_chocolate.json | 4 +- .../create/advancements/infinite_lava.json | 4 +- .../create/advancements/infinite_water.json | 4 +- .../data/create/advancements/mixer.json | 4 +- .../fluids/pipes/FluidPipeTileEntity.java | 2 +- .../BracketedTileEntityBehaviour.java | 18 ++--- .../elementary/SimpleKineticTileEntity.java | 2 +- .../advancement/AllAdvancements.java | 10 +-- .../foundation/advancement/AllTriggers.java | 4 +- .../advancement/CriterionTriggerBase.java | 2 +- .../advancement/RegistryTrigger.java | 79 ++++++++++++------- 14 files changed, 116 insertions(+), 75 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 74d15e740..b529b1fdb 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -5d1b30c2bab556f57c78e7780fd445b08f541a50 assets/create/blockstates/radial_chassis.json +4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -1586,7 +1586,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -cb9641eaf33211af46daf57241c76733cf371ed2 data/create/advancements/aesthetics.json +0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json @@ -1625,9 +1625,9 @@ acef16596b7ae82aaf853142d69bcea7094b8173 data/create/advancements/fan_smoke.json 489c58a0508a2a41cc0849dfb933eb5ac96ef364 data/create/advancements/glass_pipe.json 62f3610188f7dbd3900ab305edc2d06282705a38 data/create/advancements/goggles.json 10c8686da9cec2ae30c10f434836ac15a1b88666 data/create/advancements/hose_pulley.json -a8595e5fdf6517e5c9c790afccc99fe9d3dd95aa data/create/advancements/infinite_chocolate.json -50460d4470e9630b2d3ae1ec4f24d00d8d7c7e6b data/create/advancements/infinite_lava.json -19d9794ac08cee962c7c718085d3e3ba5e89a328 data/create/advancements/infinite_water.json +9f642faf92b75a28c564e90be8448b9a4328af5e data/create/advancements/infinite_chocolate.json +a933fa5e7217e2ffe123ae035cfbc9210ba69fd5 data/create/advancements/infinite_lava.json +a8ab0e4ffba358d23f9efaa9f51245b6d490a8be data/create/advancements/infinite_water.json 9beb622c79e9f5ce2397c22222cac0faf272f388 data/create/advancements/integrated_circuit.json 316bed3d8985d0a371200967d7edd2936f1b9f94 data/create/advancements/integrated_circuit_eob.json a80eea863bfdc7777b8bade39a81655b2f99e02f data/create/advancements/item_drain.json @@ -1638,7 +1638,7 @@ a80eea863bfdc7777b8bade39a81655b2f99e02f data/create/advancements/item_drain.jso 218568a4e416c5fa559c55a5c92aa4e93f88b837 data/create/advancements/mechanical_drill.json 6dc84ad2f0512495fe3f01f99d3c547849351e33 data/create/advancements/mechanical_saw.json 3bc549c06dc6d9568f92e1abc9654c9b4c33f035 data/create/advancements/millstone.json -6f872e1e8be9d8e5fa378db1384b1de72fadac23 data/create/advancements/mixer.json +f41d548c21a8540428ea043451e5fbb641fc2e58 data/create/advancements/mixer.json 325d4cef263ce301b143ee0498fb15afdb2c125b data/create/advancements/musical_arm.json c9c4060ed207226b69fada2d61e01a97d7077eae data/create/advancements/nixie_tube.json 9329cb210a954c0de1dcf517e7dff1ece77c19c0 data/create/advancements/overstress_flywheel.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 04e5c08ae..8bd829ffc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -207,8 +207,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "x" + "axis": "x", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "y" + "axis": "y", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "z" + "axis": "z", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "x" + "axis": "x", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "y" + "axis": "y", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "z" + "axis": "z", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 722bd2ec7..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -17,13 +17,29 @@ }, "criteria": { "0": { - "trigger": "create:bracket_shaft" + "trigger": "create:bracket_apply", + "conditions": { + "accepted_entries": [ + "create:shaft" + ] + } }, "1": { - "trigger": "create:bracket_cog" + "trigger": "create:bracket_apply", + "conditions": { + "accepted_entries": [ + "create:cogwheel", + "create:large_cogwheel" + ] + } }, "2": { - "trigger": "create:bracket_pipe" + "trigger": "create:bracket_apply", + "conditions": { + "accepted_entries": [ + "create:fluid_pipe" + ] + } } }, "requirements": [ diff --git a/src/generated/resources/data/create/advancements/infinite_chocolate.json b/src/generated/resources/data/create/advancements/infinite_chocolate.json index d192ca113..5715963c3 100644 --- a/src/generated/resources/data/create/advancements/infinite_chocolate.json +++ b/src/generated/resources/data/create/advancements/infinite_chocolate.json @@ -19,7 +19,9 @@ "0": { "trigger": "create:infinite_fluid", "conditions": { - "registry_entry": "create:chocolate" + "accepted_entries": [ + "create:chocolate" + ] } } }, diff --git a/src/generated/resources/data/create/advancements/infinite_lava.json b/src/generated/resources/data/create/advancements/infinite_lava.json index 40b98a1fd..5d634ef94 100644 --- a/src/generated/resources/data/create/advancements/infinite_lava.json +++ b/src/generated/resources/data/create/advancements/infinite_lava.json @@ -19,7 +19,9 @@ "0": { "trigger": "create:infinite_fluid", "conditions": { - "registry_entry": "minecraft:lava" + "accepted_entries": [ + "minecraft:lava" + ] } } }, diff --git a/src/generated/resources/data/create/advancements/infinite_water.json b/src/generated/resources/data/create/advancements/infinite_water.json index 0f4771011..27b8c7a64 100644 --- a/src/generated/resources/data/create/advancements/infinite_water.json +++ b/src/generated/resources/data/create/advancements/infinite_water.json @@ -19,7 +19,9 @@ "0": { "trigger": "create:infinite_fluid", "conditions": { - "registry_entry": "minecraft:water" + "accepted_entries": [ + "minecraft:water" + ] } } }, diff --git a/src/generated/resources/data/create/advancements/mixer.json b/src/generated/resources/data/create/advancements/mixer.json index ab35b7f7d..145bea240 100644 --- a/src/generated/resources/data/create/advancements/mixer.json +++ b/src/generated/resources/data/create/advancements/mixer.json @@ -25,7 +25,9 @@ "1": { "trigger": "create:kinetic_block", "conditions": { - "registry_entry": "create:mechanical_mixer" + "accepted_entries": [ + "create:mechanical_mixer" + ] } }, "2": { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java index 0763e60d9..ede978f67 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeTileEntity.java @@ -25,7 +25,7 @@ public class FluidPipeTileEntity extends SmartTileEntity { public void addBehaviours(List behaviours) { behaviours.add(new StandardPipeFluidTransportBehaviour(this)); behaviours.add(new BracketedTileEntityBehaviour(this, this::canHaveBracket) - .withTrigger(state -> AllTriggers.BRACKET_PIPE)); + .withTrigger(state -> AllTriggers.BRACKET_APPLY_TRIGGER.constructTriggerFor(state.getBlock()))); } private boolean canHaveBracket(BlockState state) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java index ef69047a0..8bc847faf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java @@ -1,17 +1,11 @@ package com.simibubi.create.content.contraptions.relays.elementary; -import java.util.Optional; -import java.util.function.Function; -import java.util.function.Predicate; - -import com.google.common.base.Predicates; import com.simibubi.create.foundation.advancement.AllTriggers; -import com.simibubi.create.foundation.advancement.SimpleTrigger; +import com.simibubi.create.foundation.advancement.ITriggerable; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.utility.NBTHelper; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -20,6 +14,10 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.world.World; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Predicate; + public class BracketedTileEntityBehaviour extends TileEntityBehaviour { public static BehaviourType TYPE = new BehaviourType<>(); @@ -28,10 +26,10 @@ public class BracketedTileEntityBehaviour extends TileEntityBehaviour { private boolean reRender; private Predicate pred; - private Function trigger; + private Function trigger; public BracketedTileEntityBehaviour(SmartTileEntity te) { - this(te, Predicates.alwaysTrue()); + this(te, state -> true); } public BracketedTileEntityBehaviour(SmartTileEntity te, Predicate pred) { @@ -40,7 +38,7 @@ public class BracketedTileEntityBehaviour extends TileEntityBehaviour { bracket = Optional.empty(); } - public BracketedTileEntityBehaviour withTrigger(Function trigger) { + public BracketedTileEntityBehaviour withTrigger(Function trigger) { this.trigger = trigger; return this; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java index df6b20f6f..ddf55f972 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java @@ -23,7 +23,7 @@ public class SimpleKineticTileEntity extends KineticTileEntity { public void addBehaviours(List behaviours) { behaviours.add( new BracketedTileEntityBehaviour(this, state -> state.getBlock() instanceof AbstractShaftBlock).withTrigger( - state -> state.getBlock() instanceof ShaftBlock ? AllTriggers.BRACKET_SHAFT : AllTriggers.BRACKET_COG)); + state -> AllTriggers.BRACKET_APPLY_TRIGGER.constructTriggerFor(state.getBlock()))); super.addBehaviours(behaviours); } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index e73c1cfc8..043b36303 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -64,9 +64,9 @@ public class AllAdvancements implements IDataProvider { Advancement aesthetics = advancement("aesthetics", AllBlocks.WOODEN_BRACKET.get(), TaskType.NORMAL).withParent(andesite_alloy) - .withCriterion("0", AllTriggers.BRACKET_SHAFT.instance()) - .withCriterion("1", AllTriggers.BRACKET_COG.instance()) - .withCriterion("2", AllTriggers.BRACKET_PIPE.instance()) + .withCriterion("0", AllTriggers.BRACKET_APPLY_TRIGGER.forEntries(AllBlocks.SHAFT.get())) + .withCriterion("1", AllTriggers.BRACKET_APPLY_TRIGGER.forEntries(AllBlocks.COGWHEEL.get(), AllBlocks.LARGE_COGWHEEL.get())) + .withCriterion("2", AllTriggers.BRACKET_APPLY_TRIGGER.forEntries(AllBlocks.FLUID_PIPE.get())) .register(t, id + ":aesthetics"); Advancement reinforced = @@ -497,11 +497,11 @@ public class AllAdvancements implements IDataProvider { } public RegistryTrigger.Instance isPowered(Block block) { - return AllTriggers.KINETIC_BLOCK.forEntry(block); + return AllTriggers.KINETIC_BLOCK.forEntries(block); } public RegistryTrigger.Instance isInfinite(FlowingFluid fluid) { - return AllTriggers.INFINITE_FLUID.forEntry(fluid.getStillFluid()); + return AllTriggers.INFINITE_FLUID.forEntries(fluid.getStillFluid()); } public InventoryChangeTrigger.Instance itemGathered(IItemProvider itemprovider) { diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 67b5f2332..c98942bc1 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -19,6 +19,7 @@ public class AllTriggers { public static RegistryTrigger KINETIC_BLOCK = add(new RegistryTrigger<>("kinetic_block", Block.class)); public static RegistryTrigger INFINITE_FLUID = add(new RegistryTrigger<>("infinite_fluid", Fluid.class)); + public static RegistryTrigger BRACKET_APPLY_TRIGGER = add(new RegistryTrigger<>("bracket_apply", Block.class)); public static SimpleTrigger ROTATION = simple("rotation"), @@ -40,9 +41,6 @@ public class AllTriggers { MECHANICAL_ARM = simple("mechanical_arm"), MUSICAL_ARM = simple("musical_arm"), CUCKOO = simple("cuckoo"), - BRACKET_SHAFT = simple("bracket_shaft"), - BRACKET_COG = simple("bracket_cog"), - BRACKET_PIPE = simple("bracket_pipe"), CASING_SHAFT = simple("casing_shaft"), CASING_BELT = simple("casing_belt"), CASING_PIPE = simple("casing_pipe"), diff --git a/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java b/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java index 14006415b..368c3bc3c 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/CriterionTriggerBase.java @@ -77,7 +77,7 @@ public abstract class CriterionTriggerBase> extends Criterion this.registryType = registryType; } - public Instance forEntry(@Nullable T registryEntry) { - return new Instance<>(getId(), registryEntry); + @SafeVarargs + public final Instance forEntries(@Nullable T... entries) { + return new Instance<>(getId(), entries == null ? null : Sets.newHashSet(entries)); } public void trigger(ServerPlayerEntity player, T registryEntry) { trigger(player, Collections.singletonList(() -> registryEntry)); } - @Override - public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) { - T entry = null; - if (json.has("registry_entry")) { - ResourceLocation entryLocation = new ResourceLocation(JSONUtils.getString(json, "registry_entry")); - entry = RegistryManager.ACTIVE.getRegistry(registryType).getValue(entryLocation); - - if (entry == null) - throw new JsonSyntaxException("Unknown registry entry '" + entryLocation + "'"); - } - - return forEntry(entry); + public ITriggerable constructTriggerFor(T entry) { + BiConsumer trigger = this::trigger; + return player -> trigger.accept(player, entry); } + @Override + public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) { + if (json.has("accepted_entries")) { + JsonArray elements = json.getAsJsonArray("accepted_entries"); + IForgeRegistry registry = RegistryManager.ACTIVE.getRegistry(registryType); + + return new Instance<>(getId(), + StreamSupport.stream(elements.spliterator(), false).map(JsonElement::getAsString).map(ResourceLocation::new) + .map(rl -> { + T entry = registry.getValue(rl); + if (entry == null) + throw new JsonSyntaxException("Unknown registry entry '" + rl + "'"); + return entry; + }).collect(Collectors.toSet())); + } + + return forEntries((T) null); + } public static class Instance> extends CriterionTriggerBase.Instance { @Nullable - private final T entry; + private final Set entries; - public Instance(ResourceLocation id, @Nullable T registryEntry) { + public Instance(ResourceLocation id, @Nullable Set registryEntries) { super(id); - entry = registryEntry; + entries = registryEntries; } @Override protected boolean test(@Nullable List> suppliers) { - if (entry == null || suppliers == null || suppliers.isEmpty()) + if (entries == null || suppliers == null || suppliers.isEmpty()) return false; - return entry.equals(suppliers.get(0).get()); + return entries.contains(suppliers.get(0).get()); } @Override public JsonElement serialize() { JsonObject jsonobject = new JsonObject(); - if (entry == null) - return jsonobject; + JsonArray elements = new JsonArray(); - ResourceLocation key = RegistryManager.ACTIVE.getRegistry(entry.getRegistryType()).getKey(entry); - if (key != null) { - jsonobject.addProperty("registry_entry", key.toString()); + if (entries == null) { + jsonobject.add("accepted_entries", elements); + return jsonobject; } + + for (T entry : entries) { + if (entry == null) + continue; + ResourceLocation key = RegistryManager.ACTIVE.getRegistry(entry.getRegistryType()).getKey(entry); + if (key != null) + elements.add(key.toString()); + } + + jsonobject.add("accepted_entries", elements); return jsonobject; } } From 667c2135068bcb8aded2d4a24934fdd630f4c277 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Fri, 19 Feb 2021 14:13:18 +0100 Subject: [PATCH 143/147] remove unused light absorb trigger --- .../create/content/curiosities/ChromaticCompoundItem.java | 8 -------- .../create/foundation/advancement/AllTriggers.java | 1 - 2 files changed, 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java index 5d85d663f..4b853139a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java @@ -1,10 +1,8 @@ package com.simibubi.create.content.curiosities; -import java.util.List; import java.util.Random; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CRecipes; import com.simibubi.create.foundation.utility.ColorHelper; @@ -13,7 +11,6 @@ import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -21,7 +18,6 @@ import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.BeaconTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceContext; @@ -152,10 +148,6 @@ public class ChromaticCompoundItem extends Item { data.putBoolean("FromLight", true); entity.setItem(newStack); - List players = - world.getEntitiesWithinAABB(ServerPlayerEntity.class, new AxisAlignedBB(entity.getPosition()).grow(8)); - players.forEach(AllTriggers.ABSORBED_LIGHT::trigger); - return false; } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index c98942bc1..1578db80b 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -31,7 +31,6 @@ public class AllTriggers { LAVA_WHEEL = simple("lava_wheel"), CHOCOLATE_WHEEL = simple("chocolate_wheel"), DEPLOYER_BOOP = simple("deployer"), - ABSORBED_LIGHT = simple("light_absorbed"), SPEED_READ = simple("speed_read"), BASIN_THROW = simple("basin"), PRESS_COMPACT = simple("compact"), From 589572df6ce29c447e320cbcdd0cd5ce225c1908 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Fri, 19 Feb 2021 14:21:02 +0100 Subject: [PATCH 144/147] kill kinetic block trigger, clean up unused stuff --- src/generated/resources/.cache/cache | 6 +- .../create/blockstates/radial_chassis.json | 96 +++++++++---------- .../data/create/advancements/aesthetics.json | 4 +- .../data/create/advancements/mixer.json | 11 --- .../contraptions/base/KineticTileEntity.java | 4 - .../fluids/actors/FluidDrainingBehaviour.java | 13 +-- .../advancement/AllAdvancements.java | 7 +- .../foundation/advancement/AllTriggers.java | 1 - 8 files changed, 55 insertions(+), 87 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index b529b1fdb..ecde36955 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json +8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -1586,7 +1586,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json +5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json @@ -1638,7 +1638,7 @@ a80eea863bfdc7777b8bade39a81655b2f99e02f data/create/advancements/item_drain.jso 218568a4e416c5fa559c55a5c92aa4e93f88b837 data/create/advancements/mechanical_drill.json 6dc84ad2f0512495fe3f01f99d3c547849351e33 data/create/advancements/mechanical_saw.json 3bc549c06dc6d9568f92e1abc9654c9b4c33f035 data/create/advancements/millstone.json -f41d548c21a8540428ea043451e5fbb641fc2e58 data/create/advancements/mixer.json +238ac410eb4de16a82ae05cc16fef80e55a4b61b data/create/advancements/mixer.json 325d4cef263ce301b143ee0498fb15afdb2c125b data/create/advancements/musical_arm.json c9c4060ed207226b69fada2d61e01a97d7077eae data/create/advancements/nixie_tube.json 9329cb210a954c0de1dcf517e7dff1ece77c19c0 data/create/advancements/overstress_flywheel.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 8bd829ffc..9d00ea8b1 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -29,8 +29,8 @@ }, { "when": { - "axis": "x", - "sticky_south": "true" + "sticky_south": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -39,8 +39,8 @@ }, { "when": { - "axis": "y", - "sticky_south": "true" + "sticky_south": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky" @@ -48,8 +48,8 @@ }, { "when": { - "axis": "z", - "sticky_south": "true" + "sticky_south": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -59,8 +59,8 @@ }, { "when": { - "axis": "x", - "sticky_south": "false" + "sticky_south": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -69,8 +69,8 @@ }, { "when": { - "axis": "y", - "sticky_south": "false" + "sticky_south": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y" @@ -78,8 +78,8 @@ }, { "when": { - "axis": "z", - "sticky_south": "false" + "sticky_south": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -89,8 +89,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "true" + "sticky_west": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "true" + "sticky_west": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "true" + "sticky_west": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "false" + "sticky_west": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "false" + "sticky_west": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "false" + "sticky_west": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "true" + "sticky_east": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "true" + "sticky_east": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "true" + "sticky_east": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "false" + "sticky_east": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "false" + "sticky_east": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "false" + "sticky_east": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index d723cbe38..59a86f429 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:cogwheel", - "create:large_cogwheel" + "create:large_cogwheel", + "create:cogwheel" ] } }, diff --git a/src/generated/resources/data/create/advancements/mixer.json b/src/generated/resources/data/create/advancements/mixer.json index 145bea240..b67d6b70d 100644 --- a/src/generated/resources/data/create/advancements/mixer.json +++ b/src/generated/resources/data/create/advancements/mixer.json @@ -23,14 +23,6 @@ } }, "1": { - "trigger": "create:kinetic_block", - "conditions": { - "accepted_entries": [ - "create:mechanical_mixer" - ] - } - }, - "2": { "trigger": "create:mixer" } }, @@ -40,9 +32,6 @@ ], [ "1" - ], - [ - "2" ] ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index cf1815817..088ce8618 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -173,10 +173,6 @@ public abstract class KineticTileEntity extends SmartTileEntity boolean directionSwap = !fromOrToZero && Math.signum(previousSpeed) != Math.signum(getSpeed()); if (fromOrToZero || directionSwap) flickerTally = getFlickerScore() + 5; - - if (fromOrToZero && previousSpeed == 0 && !world.isRemote) - AllTriggers.getPlayersInRange(world, pos, 4) - .forEach(p -> AllTriggers.KINETIC_BLOCK.trigger(p, getBlockState().getBlock())); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index 3423c9704..8cc65f55a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -8,8 +8,6 @@ import java.util.Set; import javax.annotation.Nullable; -import com.simibubi.create.AllFluids; -import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -134,16 +132,7 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { AllTriggers.triggerForNearbyPlayers(AllTriggers.HOSE_PULLEY, world, tileEntity.getPos(), 8); if (infinite) { - Fluid stillFluid = FluidHelper.convertToStill(fluid); - AllTriggers.getPlayersInRange(world, tileEntity.getPos(), 8) - .forEach(p -> AllTriggers.INFINITE_FLUID.trigger(p, FluidHelper.convertToStill(stillFluid))); - /* - if (FluidHelper.isLava(fluid)) - AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_LAVA, world, tileEntity.getPos(), 8); - if (FluidHelper.isWater(fluid)) - AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_WATER, world, tileEntity.getPos(), 8); - if (fluid.isEquivalentTo(AllFluids.CHOCOLATE.get())) - AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_CHOCOLATE, world, tileEntity.getPos(), 8);*/ + AllTriggers.triggerForNearbyPlayers(AllTriggers.INFINITE_FLUID.constructTriggerFor(FluidHelper.convertToStill(fluid)), world, tileEntity.getPos(), 8); return true; } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index 043b36303..5355f9bb5 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -160,8 +160,7 @@ public class AllAdvancements implements IDataProvider { Advancement mixer = advancement("mixer", AllBlocks.MECHANICAL_MIXER.get(), TaskType.MILESTONE) .withCriterion("0", placeBlock(AllBlocks.MECHANICAL_MIXER.get())) - .withCriterion("1", isPowered(AllBlocks.MECHANICAL_MIXER.get())) - .withCriterion("2", AllTriggers.MIXER_MIX.instance()) + .withCriterion("1", AllTriggers.MIXER_MIX.instance()) .withParent(basin) .register(t, id + ":mixer"); @@ -496,10 +495,6 @@ public class AllAdvancements implements IDataProvider { return PlacedBlockTrigger.Instance.placedBlock(block); } - public RegistryTrigger.Instance isPowered(Block block) { - return AllTriggers.KINETIC_BLOCK.forEntries(block); - } - public RegistryTrigger.Instance isInfinite(FlowingFluid fluid) { return AllTriggers.INFINITE_FLUID.forEntries(fluid.getStillFluid()); } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 1578db80b..e021575f8 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -17,7 +17,6 @@ public class AllTriggers { private static final List> triggers = new LinkedList<>(); - public static RegistryTrigger KINETIC_BLOCK = add(new RegistryTrigger<>("kinetic_block", Block.class)); public static RegistryTrigger INFINITE_FLUID = add(new RegistryTrigger<>("infinite_fluid", Fluid.class)); public static RegistryTrigger BRACKET_APPLY_TRIGGER = add(new RegistryTrigger<>("bracket_apply", Block.class)); From d0357df8631e35f3f8ca35db53f6d857bd1e8340 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Fri, 19 Feb 2021 15:08:50 +0100 Subject: [PATCH 145/147] Move stuff of RegistryTrigger over to StringSerializableTrigger to make future expansion possible --- src/generated/resources/.cache/cache | 2 +- .../data/create/advancements/aesthetics.json | 4 +- .../advancement/RegistryTrigger.java | 91 ++-------------- .../StringSerializableTrigger.java | 103 ++++++++++++++++++ 4 files changed, 117 insertions(+), 83 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index ecde36955..e1d242c23 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1586,7 +1586,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json +0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 59a86f429..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:large_cogwheel", - "create:cogwheel" + "create:cogwheel", + "create:large_cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/foundation/advancement/RegistryTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/RegistryTrigger.java index 468820b3c..0a70e87b0 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/RegistryTrigger.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/RegistryTrigger.java @@ -1,9 +1,6 @@ package com.simibubi.create.foundation.advancement; -import com.google.common.collect.Sets; -import com.google.gson.*; import mcp.MethodsReturnNonnullByDefault; -import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistryEntry; @@ -11,94 +8,28 @@ import net.minecraftforge.registries.RegistryManager; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class RegistryTrigger> extends CriterionTriggerBase> { - private final Class registryType; +public class RegistryTrigger> extends StringSerializableTrigger { + private final IForgeRegistry registry; public RegistryTrigger(String id, Class registryType) { super(id); - this.registryType = registryType; - } - - @SafeVarargs - public final Instance forEntries(@Nullable T... entries) { - return new Instance<>(getId(), entries == null ? null : Sets.newHashSet(entries)); - } - - public void trigger(ServerPlayerEntity player, T registryEntry) { - trigger(player, Collections.singletonList(() -> registryEntry)); - } - - public ITriggerable constructTriggerFor(T entry) { - BiConsumer trigger = this::trigger; - return player -> trigger.accept(player, entry); + this.registry = RegistryManager.ACTIVE.getRegistry(registryType); } + @Nullable @Override - public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) { - if (json.has("accepted_entries")) { - JsonArray elements = json.getAsJsonArray("accepted_entries"); - IForgeRegistry registry = RegistryManager.ACTIVE.getRegistry(registryType); + protected T getValue(String key) { - return new Instance<>(getId(), - StreamSupport.stream(elements.spliterator(), false).map(JsonElement::getAsString).map(ResourceLocation::new) - .map(rl -> { - T entry = registry.getValue(rl); - if (entry == null) - throw new JsonSyntaxException("Unknown registry entry '" + rl + "'"); - return entry; - }).collect(Collectors.toSet())); - } - - return forEntries((T) null); + return registry.getValue(new ResourceLocation(key)); } - public static class Instance> extends CriterionTriggerBase.Instance { - - @Nullable - private final Set entries; - - public Instance(ResourceLocation id, @Nullable Set registryEntries) { - super(id); - entries = registryEntries; - } - - @Override - protected boolean test(@Nullable List> suppliers) { - if (entries == null || suppliers == null || suppliers.isEmpty()) - return false; - return entries.contains(suppliers.get(0).get()); - } - - @Override - public JsonElement serialize() { - JsonObject jsonobject = new JsonObject(); - JsonArray elements = new JsonArray(); - - if (entries == null) { - jsonobject.add("accepted_entries", elements); - return jsonobject; - } - - for (T entry : entries) { - if (entry == null) - continue; - ResourceLocation key = RegistryManager.ACTIVE.getRegistry(entry.getRegistryType()).getKey(entry); - if (key != null) - elements.add(key.toString()); - } - - jsonobject.add("accepted_entries", elements); - return jsonobject; - } + @Nullable + @Override + protected String getKey(T value) { + ResourceLocation key = registry.getKey(value); + return key == null ? null : key.toString(); } } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java new file mode 100644 index 000000000..21e823a63 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java @@ -0,0 +1,103 @@ +package com.simibubi.create.foundation.advancement; + +import com.google.common.collect.Sets; +import com.google.gson.*; +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.entity.player.ServerPlayerEntity; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public abstract class StringSerializableTrigger extends CriterionTriggerBase> { + public StringSerializableTrigger(String id) { + super(id); + } + + @SafeVarargs + public final Instance forEntries(@Nullable T... entries) { + return new Instance<>(this, entries == null ? null : Sets.newHashSet(entries)); + } + + public void trigger(ServerPlayerEntity player, T registryEntry) { + trigger(player, Collections.singletonList(() -> registryEntry)); + } + + public ITriggerable constructTriggerFor(T entry) { + BiConsumer trigger = this::trigger; + return player -> trigger.accept(player, entry); + } + + @Override + public Instance deserializeInstance(JsonObject json, JsonDeserializationContext context) { + if (json.has("accepted_entries")) { + JsonArray elements = json.getAsJsonArray("accepted_entries"); + return new Instance<>(this, + StreamSupport.stream(elements.spliterator(), false).map(JsonElement::getAsString) + .map(rl -> { + T entry = getValue(rl); + if (entry == null) + throw new JsonSyntaxException("Unknown entry '" + rl + "'"); + return entry; + }).collect(Collectors.toSet())); + } + + return forEntries((T) null); + } + + @Nullable + abstract protected T getValue(String key); + + @Nullable + abstract protected String getKey(T value); + + public static class Instance extends CriterionTriggerBase.Instance { + + @Nullable + private final Set entries; + private final StringSerializableTrigger trigger; + + public Instance(StringSerializableTrigger trigger, @Nullable Set entries) { + super(trigger.getId()); + this.trigger = trigger; + this.entries = entries; + } + + @Override + protected boolean test(@Nullable List> suppliers) { + if (entries == null || suppliers == null || suppliers.isEmpty()) + return false; + return entries.contains(suppliers.get(0).get()); + } + + @Override + public JsonElement serialize() { + JsonObject jsonobject = new JsonObject(); + JsonArray elements = new JsonArray(); + + if (entries == null) { + jsonobject.add("accepted_entries", elements); + return jsonobject; + } + + for (T entry : entries) { + if (entry == null) + continue; + String key = trigger.getKey(entry); + if (key != null) + elements.add(key); + } + + jsonobject.add("accepted_entries", elements); + return jsonobject; + } + } +} From 5b65a5d78b5bf18bab0ebb00607c0357bc193fdb Mon Sep 17 00:00:00 2001 From: grimmauld Date: Fri, 19 Feb 2021 16:39:01 +0100 Subject: [PATCH 146/147] better fan stream advancement trigger --- src/generated/resources/.cache/cache | 10 ++-- .../create/blockstates/radial_chassis.json | 48 +++++++++---------- .../data/create/advancements/fan.json | 7 ++- .../data/create/advancements/fan_lava.json | 7 ++- .../data/create/advancements/fan_smoke.json | 7 ++- .../data/create/advancements/fan_water.json | 7 ++- .../components/fan/AirCurrent.java | 19 +++----- .../content/logistics/InWorldProcessing.java | 4 +- .../advancement/AllAdvancements.java | 9 ++-- .../foundation/advancement/AllTriggers.java | 6 +-- .../foundation/advancement/EnumTrigger.java | 35 ++++++++++++++ .../StringSerializableTrigger.java | 4 +- 12 files changed, 106 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/advancement/EnumTrigger.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e1d242c23..3a320bbb2 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json +143d66a7262ccd29f36784d6b064d4a13ba374b6 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -1616,10 +1616,10 @@ d1fbc14303c7327e9fc02e505e7e434591b7f785 data/create/advancements/crushing_wheel 77edd30e3d60b4d492662c673387910f66b5a276 data/create/advancements/dual_extendo_grip.json 04eaf829696d735244c0e4798dd3bdeb26e13a32 data/create/advancements/electron_tube.json b78fe4e539fef1b3419f2eb4d1db47cb4a201992 data/create/advancements/extendo_grip.json -4dbbf5f39441fdfe0561022ea7bbaa8e1f9733b7 data/create/advancements/fan.json -9e2369129a52ffb4c67907ca5e81e342766f7867 data/create/advancements/fan_lava.json -acef16596b7ae82aaf853142d69bcea7094b8173 data/create/advancements/fan_smoke.json -36f72396d1b4ac9a89f4a9139fa10ed659f5954a data/create/advancements/fan_water.json +b1699baaadaac7ebce642c09428519d156e21594 data/create/advancements/fan.json +5aa76cba3b40a1c234ffa84a89ecca630990fc0f data/create/advancements/fan_lava.json +716a9816558300a3652ed8d8d568517017813f5c data/create/advancements/fan_smoke.json +a61eb63d02604e88836519f89f74b252a640d485 data/create/advancements/fan_water.json 69e96e926a4d72e59cc6390c25f064166ddb62d2 data/create/advancements/fist_bump.json 99ee1bf5390b9a4f2a2419c78f259ff5d2ab9ae9 data/create/advancements/flywheel.json 489c58a0508a2a41cc0849dfb933eb5ac96ef364 data/create/advancements/glass_pipe.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 9d00ea8b1..83d44d583 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -29,8 +29,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "x" + "axis": "x", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -39,8 +39,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "y" + "axis": "y", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky" @@ -48,8 +48,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "z" + "axis": "z", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -59,8 +59,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "x" + "axis": "x", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -69,8 +69,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "y" + "axis": "y", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_y" @@ -78,8 +78,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "z" + "axis": "z", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -89,8 +89,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "x" + "axis": "x", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "y" + "axis": "y", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "z" + "axis": "z", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "x" + "axis": "x", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "y" + "axis": "y", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "z" + "axis": "z", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_z", diff --git a/src/generated/resources/data/create/advancements/fan.json b/src/generated/resources/data/create/advancements/fan.json index fd00498a5..bafda450d 100644 --- a/src/generated/resources/data/create/advancements/fan.json +++ b/src/generated/resources/data/create/advancements/fan.json @@ -17,7 +17,12 @@ }, "criteria": { "0": { - "trigger": "create:fan" + "trigger": "create:fan_processing", + "conditions": { + "accepted_entries": [ + "NONE" + ] + } } }, "requirements": [ diff --git a/src/generated/resources/data/create/advancements/fan_lava.json b/src/generated/resources/data/create/advancements/fan_lava.json index 1b15d56b6..6e6362c0a 100644 --- a/src/generated/resources/data/create/advancements/fan_lava.json +++ b/src/generated/resources/data/create/advancements/fan_lava.json @@ -17,7 +17,12 @@ }, "criteria": { "0": { - "trigger": "create:fan_lava" + "trigger": "create:fan_processing", + "conditions": { + "accepted_entries": [ + "BLASTING" + ] + } } }, "requirements": [ diff --git a/src/generated/resources/data/create/advancements/fan_smoke.json b/src/generated/resources/data/create/advancements/fan_smoke.json index 51cd3cdc1..017a1b6f7 100644 --- a/src/generated/resources/data/create/advancements/fan_smoke.json +++ b/src/generated/resources/data/create/advancements/fan_smoke.json @@ -17,7 +17,12 @@ }, "criteria": { "0": { - "trigger": "create:fan_smoke" + "trigger": "create:fan_processing", + "conditions": { + "accepted_entries": [ + "SMOKING" + ] + } } }, "requirements": [ diff --git a/src/generated/resources/data/create/advancements/fan_water.json b/src/generated/resources/data/create/advancements/fan_water.json index a70ae1092..3e7368f4b 100644 --- a/src/generated/resources/data/create/advancements/fan_water.json +++ b/src/generated/resources/data/create/advancements/fan_water.json @@ -17,7 +17,12 @@ }, "criteria": { "0": { - "trigger": "create:fan_water" + "trigger": "create:fan_processing", + "conditions": { + "accepted_entries": [ + "SPLASHING" + ] + } } }, "requirements": [ diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index 8f499bce8..53c2eac1d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -114,9 +114,10 @@ public class AirCurrent { entityDistance -= .5f; InWorldProcessing.Type processingType = getSegmentAt((float) entityDistance); - if (processingType == null) { - if (entity instanceof ServerPlayerEntity) - AllTriggers.triggerFor(AllTriggers.FAN, (PlayerEntity) entity); + if (entity instanceof ServerPlayerEntity) + AllTriggers.triggerFor(AllTriggers.FAN_PROCESSING.constructTriggerFor(processingType), (PlayerEntity) entity); + + if (processingType == null || processingType == Type.NONE) { continue; } @@ -139,24 +140,18 @@ public class AirCurrent { entity.setFire(10); entity.attackEntityFrom(damageSourceLava, 4); } - if (entity instanceof ServerPlayerEntity) - AllTriggers.triggerFor(AllTriggers.FAN_LAVA, (PlayerEntity) entity); break; case SMOKING: if (!entity.isImmuneToFire()) { entity.setFire(2); entity.attackEntityFrom(damageSourceFire, 2); } - if (entity instanceof ServerPlayerEntity) - AllTriggers.triggerFor(AllTriggers.FAN_SMOKE, (PlayerEntity) entity); break; case SPLASHING: if (entity instanceof EndermanEntity || entity.getType() == EntityType.SNOW_GOLEM || entity.getType() == EntityType.BLAZE) { entity.attackEntityFrom(DamageSource.DROWN, 2); } - if (entity instanceof ServerPlayerEntity) - AllTriggers.triggerFor(AllTriggers.FAN_WATER, (PlayerEntity) entity); if (!entity.isBurning()) break; entity.extinguish(); @@ -193,7 +188,7 @@ public class AirCurrent { AirCurrentSegment currentSegment = new AirCurrentSegment(); segments.clear(); currentSegment.startOffset = 0; - InWorldProcessing.Type type = null; + InWorldProcessing.Type type = Type.NONE; int limit = (int) (maxDistance + .5f); int searchStart = pushing ? 0 : limit; @@ -203,7 +198,7 @@ public class AirCurrent { for (int i = searchStart; i * searchStep <= searchEnd * searchStep; i += searchStep) { BlockPos currentPos = start.offset(direction, i); InWorldProcessing.Type newType = InWorldProcessing.Type.byBlock(world, currentPos); - if (newType != null) + if (newType != Type.NONE) type = newType; if (currentSegment.type != type || currentSegment.startOffset == 0) { currentSegment.endOffset = i; @@ -341,7 +336,7 @@ public class AirCurrent { continue; return airCurrentSegment.type; } - return null; + return InWorldProcessing.Type.NONE; } public static class AirCurrentSegment { diff --git a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java b/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java index 88a5fe2fb..8ce46bffa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java @@ -58,7 +58,7 @@ public class InWorldProcessing { public static SplashingInv splashingInv = new SplashingInv(); public enum Type { - SMOKING, BLASTING, SPLASHING + SMOKING, BLASTING, SPLASHING, NONE ; @@ -74,7 +74,7 @@ public class InWorldProcessing { return Type.SMOKING; if (block == Blocks.LAVA || getHeatLevelOf(blockState).isAtLeast(BlazeBurnerBlock.HeatLevel.FADING)) return Type.BLASTING; - return null; + return Type.NONE; } } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index 5355f9bb5..013a6282e 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -6,6 +6,7 @@ import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; +import com.simibubi.create.content.logistics.InWorldProcessing; import net.minecraft.fluid.FlowingFluid; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; @@ -125,19 +126,19 @@ public class AllAdvancements implements IDataProvider { .register(t, id + ":press"); Advancement fan = advancement("fan", AllBlocks.ENCASED_FAN.get(), TaskType.NORMAL).withParent(press) - .withCriterion("0", AllTriggers.FAN.instance()) + .withCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.NONE)) .register(t, id + ":fan"); Advancement fan_lava = advancement("fan_lava", Items.LAVA_BUCKET, TaskType.NORMAL).withParent(fan) - .withCriterion("0", AllTriggers.FAN_LAVA.instance()) + .withCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.BLASTING)) .register(t, id + ":fan_lava"); Advancement fan_smoke = advancement("fan_smoke", Items.CAMPFIRE, TaskType.NORMAL).withParent(fan) - .withCriterion("0", AllTriggers.FAN_SMOKE.instance()) + .withCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.SMOKING)) .register(t, id + ":fan_smoke"); Advancement fan_water = advancement("fan_water", Items.WATER_BUCKET, TaskType.NORMAL).withParent(fan) - .withCriterion("0", AllTriggers.FAN_WATER.instance()) + .withCriterion("0", AllTriggers.FAN_PROCESSING.forEntries(InWorldProcessing.Type.SPLASHING)) .register(t, id + ":fan_water"); Advancement rose_quartz = diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index e021575f8..51ae96434 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -4,6 +4,7 @@ import java.util.LinkedList; import java.util.List; import java.util.function.Predicate; +import com.simibubi.create.content.logistics.InWorldProcessing; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.Block; import net.minecraft.entity.player.PlayerEntity; @@ -19,6 +20,7 @@ public class AllTriggers { public static RegistryTrigger INFINITE_FLUID = add(new RegistryTrigger<>("infinite_fluid", Fluid.class)); public static RegistryTrigger BRACKET_APPLY_TRIGGER = add(new RegistryTrigger<>("bracket_apply", Block.class)); + public static EnumTrigger FAN_PROCESSING = add(new EnumTrigger<>("fan_processing", InWorldProcessing.Type.class)); public static SimpleTrigger ROTATION = simple("rotation"), @@ -47,10 +49,6 @@ public class AllTriggers { PLACE_TUNNEL = simple("place_tunnel"), CONNECT_TUNNEL = simple("connect_tunnel"), UPWARD_CHUTE = simple("upward_chute"), - FAN = simple("fan"), - FAN_LAVA = simple("fan_lava"), - FAN_SMOKE = simple("fan_smoke"), - FAN_WATER = simple("fan_water"), BELT_FUNNEL = simple("belt_funnel"), BELT_FUNNEL_KISS = simple("belt_funnel_kiss"), CLOCKWORK_BEARING = simple("clockwork_bearing"), diff --git a/src/main/java/com/simibubi/create/foundation/advancement/EnumTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/EnumTrigger.java new file mode 100644 index 000000000..ed3952658 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/advancement/EnumTrigger.java @@ -0,0 +1,35 @@ +package com.simibubi.create.foundation.advancement; + +import mcp.MethodsReturnNonnullByDefault; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class EnumTrigger> extends StringSerializableTrigger { + private final Class reference; + + public EnumTrigger(String id, Class reference) { + super(id); + this.reference = reference; + } + + @Nullable + @Override + protected T getValue(String key) { + try { + return Enum.valueOf(reference, key); + } catch (IllegalArgumentException | NullPointerException e) { + return null; + } + } + + @Nullable + @Override + protected String getKey(@Nullable T value) { + if (value == null) + return null; + return value.name(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java b/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java index 21e823a63..ae6f4d83d 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/StringSerializableTrigger.java @@ -27,11 +27,11 @@ public abstract class StringSerializableTrigger extends CriterionTriggerBase< return new Instance<>(this, entries == null ? null : Sets.newHashSet(entries)); } - public void trigger(ServerPlayerEntity player, T registryEntry) { + public void trigger(ServerPlayerEntity player, @Nullable T registryEntry) { trigger(player, Collections.singletonList(() -> registryEntry)); } - public ITriggerable constructTriggerFor(T entry) { + public ITriggerable constructTriggerFor(@Nullable T entry) { BiConsumer trigger = this::trigger; return player -> trigger.accept(player, entry); } From bfd666bb9cf35d7ecc2503773a5894f27ec4f62a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 19 Feb 2021 16:55:45 +0100 Subject: [PATCH 147/147] Sequenced Adjustments - Added more descriptive names for sequencer instructions - 'Await' instruction now requires a rising flank to trigger - Fixed invalid json of german localization - Ingored crushing wheel controllers facing in blockstate datagen --- src/generated/resources/.cache/cache | 29 +- .../assets/create/blockstates/fluid_pipe.json | 154 +- .../create/blockstates/radial_chassis.json | 24 +- .../resources/assets/create/lang/en_us.json | 11 +- .../assets/create/lang/unfinished/de_de.json | 300 +-- .../assets/create/lang/unfinished/es_es.json | 1805 +++++++++++++++++ .../assets/create/lang/unfinished/es_mx.json | 12 +- .../assets/create/lang/unfinished/fr_fr.json | 12 +- .../assets/create/lang/unfinished/it_it.json | 12 +- .../assets/create/lang/unfinished/ja_jp.json | 12 +- .../assets/create/lang/unfinished/ko_kr.json | 12 +- .../assets/create/lang/unfinished/nl_nl.json | 12 +- .../assets/create/lang/unfinished/pt_br.json | 12 +- .../assets/create/lang/unfinished/ru_ru.json | 12 +- .../assets/create/lang/unfinished/zh_cn.json | 12 +- .../assets/create/lang/unfinished/zh_tw.json | 12 +- .../java/com/simibubi/create/AllBlocks.java | 4 +- .../jei/category/BlockCuttingCategory.java | 1 - .../CrushingWheelControllerTileEntity.java | 1 - .../fluids/actors/FluidDrainingBehaviour.java | 2 - .../advanced/sequencer/Instruction.java | 20 +- .../sequencer/SequencedGearshiftBlock.java | 14 +- .../sequencer/SequencedGearshiftScreen.java | 2 +- .../SequencedGearshiftTileEntity.java | 34 +- .../sequencer/SequencerInstructions.java | 10 +- .../create/foundation/gui/AllGuiTextures.java | 4 +- .../resources/assets/create/lang/de_de.json | 2 +- .../assets/create/lang/default/messages.json | 10 +- .../assets/create/textures/gui/sequencer.png | Bin 17289 -> 4856 bytes 29 files changed, 2217 insertions(+), 330 deletions(-) create mode 100644 src/generated/resources/assets/create/lang/unfinished/es_es.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 74d15e740..08ece2aab 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -140,7 +140,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -3d97226b5e8d8f70ed08e45e78db1faf78d5e28b assets/create/blockstates/fluid_pipe.json +48086bf71a824faf14841b698050cc8544b09a9b assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -5d1b30c2bab556f57c78e7780fd445b08f541a50 assets/create/blockstates/radial_chassis.json +4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -401,18 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -1d231d2f74ca22001e30d023918849e3550896a1 assets/create/lang/en_us.json -435be9258b9412d4400e5364fb5047c2fd5a93ac assets/create/lang/unfinished/de_de.json -49688c098e2cdb27b51f528856d561a20d4e2dd8 assets/create/lang/unfinished/es_mx.json -18f09d363a6c0a503d7cdba12bbe0d082f07ac45 assets/create/lang/unfinished/fr_fr.json -eee4c4f4edf4efc5d409d77502c84f2eb93a6171 assets/create/lang/unfinished/it_it.json -d3b716160bc5703d6ac217f1cda10f5ff89c3bc1 assets/create/lang/unfinished/ja_jp.json -f7ea927235d19933b73e4a26c453d33418cff66e assets/create/lang/unfinished/ko_kr.json -f2987cd923d24da728a4fede0387de022067faec assets/create/lang/unfinished/nl_nl.json -2b1b0b450908d17e6c40f834d5050ffc68f1b733 assets/create/lang/unfinished/pt_br.json -27a08856af9c2a4436a6215ac063683475f77552 assets/create/lang/unfinished/ru_ru.json -a60d259329aa51ad151ab29e86f8d7d6e4ca209c assets/create/lang/unfinished/zh_cn.json -fa2a9b965dc91c1cf381524df8015d84f5c3cdc5 assets/create/lang/unfinished/zh_tw.json +d4de8202db6564f9721a2e474887c68f7c5068da assets/create/lang/en_us.json +754261b27332b6b86beb7dd74d198135258d2df5 assets/create/lang/unfinished/de_de.json +7ba1c8441fe5a7e3f7fb0d65e11cd3110240de63 assets/create/lang/unfinished/es_es.json +7df992f108dc7d8edb9441b34f345ae9efe43034 assets/create/lang/unfinished/es_mx.json +fbd9288a92b89426756125efce282574df429e62 assets/create/lang/unfinished/fr_fr.json +b22f28b5870c04ff9f88734f5b7a4011dc0e7ece assets/create/lang/unfinished/it_it.json +da01154bb27017c21e996aecb262802fd2c8e0b8 assets/create/lang/unfinished/ja_jp.json +ddaf68fe2fdfd6036760c6fa27d84ede6873394e assets/create/lang/unfinished/ko_kr.json +a1b57248fe1704b9814d1913396c27de33c369c5 assets/create/lang/unfinished/nl_nl.json +9c7d6adae21bb1ba8151c6715acf9e041873d5e4 assets/create/lang/unfinished/pt_br.json +a8f552e8b0fd2742182d478fc72351aa631d5dfd assets/create/lang/unfinished/ru_ru.json +795111b16a8ebb3833c91c984480338bd8cfc9c5 assets/create/lang/unfinished/zh_cn.json +e7ecf88ea70d47bac0739710a728cb7cc210c8bd assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index a4cffcde7..80a25280c 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -61,9 +61,9 @@ { "when": { "down": "false", - "north": "true", "up": "true", - "south": "false" + "south": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -72,9 +72,9 @@ { "when": { "down": "false", - "north": "false", "up": "true", - "south": "true" + "south": "true", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -83,9 +83,9 @@ { "when": { "down": "true", - "north": "true", "up": "false", - "south": "false" + "south": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -94,9 +94,9 @@ { "when": { "down": "true", - "north": "false", "up": "false", - "south": "true" + "south": "true", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -105,9 +105,9 @@ { "when": { "down": "true", - "north": "false", "up": "true", - "south": "false" + "south": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -116,9 +116,9 @@ { "when": { "down": "false", - "north": "false", "up": "true", - "south": "false" + "south": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -127,9 +127,9 @@ { "when": { "down": "true", - "north": "false", "up": "false", - "south": "false" + "south": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -138,9 +138,9 @@ { "when": { "down": "false", - "north": "true", "up": "false", - "south": "true" + "south": "true", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -149,9 +149,9 @@ { "when": { "down": "false", - "north": "true", "up": "false", - "south": "false" + "south": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -160,9 +160,9 @@ { "when": { "down": "false", - "north": "false", "up": "false", - "south": "true" + "south": "true", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -171,9 +171,9 @@ { "when": { "down": "false", - "north": "false", "up": "false", - "south": "false" + "south": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { + "south": "true", "west": "true", - "east": "false", "north": "false", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "true", "north": "false", - "south": "true" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "false", "north": "true", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "true", "north": "true", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "false", "north": "true", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "false", "north": "false", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "false", "north": "true", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "true", "north": "false", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "false", "north": "false", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "true", "north": "false", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "false", "north": "false", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "west": "false", "down": "false", - "east": "true", - "up": "true" + "up": "true", + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "west": "true", "down": "false", - "east": "false", - "up": "true" + "up": "true", + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "west": "false", "down": "true", - "east": "true", - "up": "false" + "up": "false", + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "west": "true", "down": "true", - "east": "false", - "up": "false" + "up": "false", + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "west": "false", "down": "true", - "east": "false", - "up": "true" + "up": "true", + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "west": "false", "down": "false", - "east": "false", - "up": "true" + "up": "true", + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "west": "false", "down": "true", - "east": "false", - "up": "false" + "up": "false", + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { + "down": "false", + "up": "false", "west": "true", - "down": "false", - "east": "true", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { + "down": "false", + "up": "false", "west": "false", - "down": "false", - "east": "true", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { + "down": "false", + "up": "false", "west": "true", - "down": "false", - "east": "false", - "up": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "west": "false", "down": "false", - "east": "false", - "up": "false" + "up": "false", + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 04e5c08ae..8bd829ffc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -207,8 +207,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "x" + "axis": "x", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "y" + "axis": "y", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "z" + "axis": "z", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "x" + "axis": "x", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "y" + "axis": "y", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "z" + "axis": "z", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index d6b9de4ec..b3003acb5 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -845,14 +845,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "Turn", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "Piston", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distance", - "create.gui.sequenced_gearshift.instruction.wait": "Wait", - "create.gui.sequenced_gearshift.instruction.wait.duration": "Duration", - "create.gui.sequenced_gearshift.instruction.paused": "Paused", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "End", "create.gui.sequenced_gearshift.instruction.end": "End", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "Await", "create.gui.sequenced_gearshift.speed": "Speed, Direction", "create.gui.sequenced_gearshift.speed.forward": "Input speed, Forwards", "create.gui.sequenced_gearshift.speed.forward_fast": "Double speed, Forwards", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 0e5af4101..7f34e79e5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,10 +1,10 @@ { - "_": "Missing Localizations: 1102", + "_": "Missing Localizations: 969", "_": "->------------------------] Game Elements [------------------------<-", - "block.create.acacia_window": "Akazienfenster", - "block.create.acacia_window_pane": "Akazienfensterscheibe", + "block.create.acacia_window": "Akazienholzfenster", + "block.create.acacia_window_pane": "Akazienholzfensterscheibe", "block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe", "block.create.adjustable_crate": "Verstellbare Kiste", "block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker", @@ -26,8 +26,8 @@ "block.create.andesite_tunnel": "Andesittunnel", "block.create.basin": "Behälter", "block.create.belt": "Mechanischer Riemen", - "block.create.birch_window": "UNLOCALIZED: Birch Window", - "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.birch_window": "Birkenholzfenster", + "block.create.birch_window_pane": "Birkenholzfensterscheibe", "block.create.black_sail": "Schwarzes Segel", "block.create.black_seat": "Schwarzer Sitz", "block.create.black_valve_handle": "Schwarzer Ventilgriff", @@ -56,7 +56,7 @@ "block.create.clockwork_bearing": "Uhrwerk-Lager", "block.create.clutch": "Kupplung", "block.create.cogwheel": "Zahnrad", - "block.create.content_observer": "Inhalts Beobachter", + "block.create.content_observer": "Inhaltsbeobachter", "block.create.controller_rail": "Steureungsschiene", "block.create.copper_block": "Kupfer Block", "block.create.copper_casing": "Kupferrahmen", @@ -117,128 +117,128 @@ "block.create.fancy_dark_scoria_bricks_slab": "Schicke dunkle Schlackenziegelstufe", "block.create.fancy_dark_scoria_bricks_stairs": "Schicke dunkle Schlackenziegeltreppe", "block.create.fancy_dark_scoria_bricks_wall": "Schicke dunkle Schlackenziegelmauer", - "block.create.fancy_diorite_bricks": "UNLOCALIZED: Fancy Diorite Bricks", - "block.create.fancy_diorite_bricks_slab": "UNLOCALIZED: Fancy Diorite Bricks Slab", - "block.create.fancy_diorite_bricks_stairs": "UNLOCALIZED: Fancy Diorite Bricks Stairs", - "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", - "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", - "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", - "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", - "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", - "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", - "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", - "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", - "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", - "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", - "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", - "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", - "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", - "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", - "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", - "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", - "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", - "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", - "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", - "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", - "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", - "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", - "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", - "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", - "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", - "block.create.fluid_pipe": "Wasserrohr", - "block.create.fluid_tank": "Wassertank", + "block.create.fancy_diorite_bricks": "Schöne Dioritziegel", + "block.create.fancy_diorite_bricks_slab": "Schöne Dioritziegelstufe", + "block.create.fancy_diorite_bricks_stairs": "Schöne Dioritziegeltreppe", + "block.create.fancy_diorite_bricks_wall": "Schöne Dioritziegelmauer", + "block.create.fancy_dolomite_bricks": "Schöne Dolomitziegel", + "block.create.fancy_dolomite_bricks_slab": "Schöne Dolomitziegelstufe", + "block.create.fancy_dolomite_bricks_stairs": "Schöne Dolomitziegeltreppe", + "block.create.fancy_dolomite_bricks_wall": "Schöne Dolomitziegelmauer", + "block.create.fancy_gabbro_bricks": "Schöne Gabelsteinziegel", + "block.create.fancy_gabbro_bricks_slab": "Schöne Gabelsteinziegelstufe", + "block.create.fancy_gabbro_bricks_stairs": "Schöne Gabelsteinziegeltreppe", + "block.create.fancy_gabbro_bricks_wall": "Schöne Gabelsteinziegelmauer", + "block.create.fancy_granite_bricks": "Schöne Granitziegel", + "block.create.fancy_granite_bricks_slab": "Schöne Granitziegelstufe", + "block.create.fancy_granite_bricks_stairs": "Schöne Granitziegeltreppe", + "block.create.fancy_granite_bricks_wall": "Schöne Granitziegelmauer", + "block.create.fancy_limestone_bricks": "Schöne Kalksteinziegel", + "block.create.fancy_limestone_bricks_slab": "Schöne Kalksteinziegelstufe", + "block.create.fancy_limestone_bricks_stairs": "Schöne Kalksteinziegeltreppe", + "block.create.fancy_limestone_bricks_wall": "Schöne Kalksteinziegelmauer", + "block.create.fancy_scoria_bricks": "Schöne Schlackenziegel", + "block.create.fancy_scoria_bricks_slab": "Schöne Schlackenziegelstufe", + "block.create.fancy_scoria_bricks_stairs": "Schöne Schlackenziegeltreppe", + "block.create.fancy_scoria_bricks_wall": "Schöne Schlackenziegelmauer", + "block.create.fancy_weathered_limestone_bricks": "Schöne Verwitterte Kalksteinziegel", + "block.create.fancy_weathered_limestone_bricks_slab": "Schöne Verwitterte Kalksteinziegelstufe", + "block.create.fancy_weathered_limestone_bricks_stairs": "Schöne Verwitterte Kalksteinziegeltreppe", + "block.create.fancy_weathered_limestone_bricks_wall": "Schöne Verwitterte Kalksteinziegelmauer", + "block.create.fluid_pipe": "Flüssigkeitsrohr", + "block.create.fluid_tank": "Flüssigkeitstank", "block.create.fluid_valve": "Flüssigkeitsventil", "block.create.flywheel": "Schwungrad", "block.create.framed_glass": "Gerahmtes Glas", "block.create.framed_glass_pane": "Gerahmte Glasscheibe", - "block.create.furnace_engine": "UNLOCALIZED: Furnace Engine", - "block.create.gabbro": "Gabbro", - "block.create.gabbro_bricks": "Gabbroziegel", - "block.create.gabbro_bricks_slab": "Gabbroziegelstufe", - "block.create.gabbro_bricks_stairs": "Gabbroziegeltreppe", - "block.create.gabbro_bricks_wall": "Gabbroziegelmauer", - "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", - "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", - "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", - "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", - "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", + "block.create.furnace_engine": "Ofenmotor", + "block.create.gabbro": "Gabelstein", + "block.create.gabbro_bricks": "Gabelsteinziegel", + "block.create.gabbro_bricks_slab": "Gabelsteinziegelstufe", + "block.create.gabbro_bricks_stairs": "Gabelsteinziegeltreppe", + "block.create.gabbro_bricks_wall": "Gabelsteinziegelmauer", + "block.create.gabbro_cobblestone": "Gabelsteinbruchstein", + "block.create.gabbro_cobblestone_slab": "Gabelsteinbruchstein", + "block.create.gabbro_cobblestone_stairs": "Gabelsteinbruchstein", + "block.create.gabbro_cobblestone_wall": "Gabelsteinbruchstein", + "block.create.gabbro_pillar": "Gabelsteinsäule", "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Getriebe", "block.create.gearshift": "Gangschaltung", "block.create.glass_fluid_pipe": "Glaswasserrohr", "block.create.granite_bricks": "Granitziegel", - "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", - "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", - "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", - "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", - "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", - "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", - "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", - "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", - "block.create.gray_sail": "UNLOCALIZED: Gray Sail", - "block.create.gray_seat": "UNLOCALIZED: Gray Seat", - "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", - "block.create.green_sail": "UNLOCALIZED: Green Sail", - "block.create.green_seat": "UNLOCALIZED: Green Seat", - "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", - "block.create.hand_crank": "UNLOCALIZED: Hand Crank", - "block.create.honey": "UNLOCALIZED: Honey", - "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", - "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", - "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", - "block.create.item_drain": "UNLOCALIZED: Item Drain", - "block.create.jungle_window": "UNLOCALIZED: Jungle Window", - "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.granite_bricks_slab": "Granitziegelstufe", + "block.create.granite_bricks_stairs": "Granitziegeltreppe", + "block.create.granite_bricks_wall": "Granitziegelmauer", + "block.create.granite_cobblestone": "Granitbruchstein", + "block.create.granite_cobblestone_slab": "Granitbruchsteinstufe", + "block.create.granite_cobblestone_stairs": "Granitbruchtreppe", + "block.create.granite_cobblestone_wall": "Granitbruchsteinmauer", + "block.create.granite_pillar": "Granitsäule", + "block.create.gray_sail": "Graues Segel", + "block.create.gray_seat": "Grauer Sitz", + "block.create.gray_valve_handle": "Grauer Ventilgriff", + "block.create.green_sail": "Grünes Segel", + "block.create.green_seat": "Grüner Sitz", + "block.create.green_valve_handle": "Grüner Ventilgriff", + "block.create.hand_crank": "Handkurbel", + "block.create.honey": "Honig", + "block.create.horizontal_framed_glass": "Horizontal Gerahmes Glas", + "block.create.horizontal_framed_glass_pane": "Horizontal Gerahmte Glasscheibe", + "block.create.hose_pulley": "Umlenkrolle", + "block.create.item_drain": "Abfluss", + "block.create.jungle_window": "Tropenholzfenster", + "block.create.jungle_window_pane": "Tropenholzfensterscheib", "block.create.large_cogwheel": "Großes Zahnrad", - "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", - "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", - "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", - "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", - "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", - "block.create.layered_granite": "UNLOCALIZED: Layered Granite", - "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", - "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", - "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", - "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", - "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", - "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", - "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", - "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", - "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", - "block.create.lime_sail": "UNLOCALIZED: Lime Sail", - "block.create.lime_seat": "UNLOCALIZED: Lime Seat", - "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", + "block.create.layered_andesite": "Geschichteter Andesit", + "block.create.layered_dark_scoria": "Geschichtete Dunkle Schlacke", + "block.create.layered_diorite": "Geschichteter Diorit", + "block.create.layered_dolomite": "Geschichteter Dolomit", + "block.create.layered_gabbro": "Geschichteter Gabelstein", + "block.create.layered_granite": "Geschichteter Granit", + "block.create.layered_limestone": "Geschichteter Kalkstein", + "block.create.layered_scoria": "Geschichtete Schlacke", + "block.create.layered_weathered_limestone": "Geschichteter Verwitterter Kalkstein", + "block.create.light_blue_sail": "Hellblaues Segel", + "block.create.light_blue_seat": "Hellblauer Sitz", + "block.create.light_blue_valve_handle": "Hellblauer Ventilgriff", + "block.create.light_gray_sail": "Hellgraues Segel", + "block.create.light_gray_seat": "Hellgrauer Sitz", + "block.create.light_gray_valve_handle": "Hellgrauer Ventilgriff", + "block.create.lime_sail": "Hellgrünes Segel", + "block.create.lime_seat": "Hellgrüner Sitz", + "block.create.lime_valve_handle": "Hellgrüner Ventilgriff", "block.create.limesand": "Kalksand", "block.create.limestone": "Kalkstein", "block.create.limestone_bricks": "Kalksteinziegel", "block.create.limestone_bricks_slab": "Kalksteinziegelstufe", "block.create.limestone_bricks_stairs": "Kalksteinziegeltreppe", "block.create.limestone_bricks_wall": "Kalksteinziegelmauer", - "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", - "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", - "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", - "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", + "block.create.limestone_cobblestone": "Kalkbruchstein", + "block.create.limestone_cobblestone_slab": "Kalkbruchsteinstufe", + "block.create.limestone_cobblestone_stairs": "Kalkbruchsteintreppe", + "block.create.limestone_cobblestone_wall": "Kalkbruchsteinmauer", "block.create.limestone_pillar": "Kalksteinsäule", "block.create.linear_chassis": "Schubgerüst", - "block.create.lit_blaze_burner": "UNLOCALIZED: Lit Blaze Burner", - "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", - "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", - "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", - "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", + "block.create.lit_blaze_burner": "Aktiver Lohenbrenner", + "block.create.magenta_sail": "Magenta Segel", + "block.create.magenta_seat": "Magenta Sitz", + "block.create.magenta_valve_handle": "Magenta Ventilgriff", + "block.create.mechanical_arm": "Mechanischer Arm", "block.create.mechanical_bearing": "Mechanisches Lager", - "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", + "block.create.mechanical_crafter": "Mechanische Handwerkseinheit", "block.create.mechanical_drill": "Mechanischer Bohrer", "block.create.mechanical_harvester": "Mechanische Erntemaschine", - "block.create.mechanical_mixer": "UNLOCALIZED: Mechanical Mixer", + "block.create.mechanical_mixer": "Mechanischer Mixer", "block.create.mechanical_piston": "Mechanischer Kolben", "block.create.mechanical_piston_head": "Mechanisches Kolbenende", - "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_plough": "Mechanischer Pflug", "block.create.mechanical_press": "Mechanische Presse", - "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", - "block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw", - "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", - "block.create.millstone": "UNLOCALIZED: Millstone", + "block.create.mechanical_pump": "Mechanische Pumpe", + "block.create.mechanical_saw": "Mechanische Säge", + "block.create.metal_bracket": "Metallhalterung", + "block.create.millstone": "Mahlstein", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", @@ -305,9 +305,9 @@ "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", - "block.create.pink_sail": "UNLOCALIZED: Pink Sail", - "block.create.pink_seat": "UNLOCALIZED: Pink Seat", - "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", + "block.create.pink_sail": "Rosa Segel", + "block.create.pink_seat": "Rosa Sitz", + "block.create.pink_valve_handle": "Rosa Ventilgriff", "block.create.piston_extension_pole": "Kolben-Pleuelverlängerung", "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", @@ -317,7 +317,7 @@ "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", - "block.create.polished_gabbro": "Polierter Gabbro", + "block.create.polished_gabbro": "Polierter Gabelstein", "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", @@ -325,7 +325,7 @@ "block.create.polished_limestone_slab": "Polierte Kalksteinstufe", "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", - "block.create.polished_scoria": "UNLOCALIZED: Polished Scoria", + "block.create.polished_scoria": "Polierte Schlacke", "block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab", "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", @@ -412,13 +412,13 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", - "fluid.create.milk": "UNLOCALIZED: Milk", - "fluid.create.potion": "UNLOCALIZED: Potion", - "fluid.create.tea": "UNLOCALIZED: Builder's Tea", + "fluid.create.milk": "Milch", + "fluid.create.potion": "Trank", + "fluid.create.tea": "Bauherrentee", "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", - "item.create.bar_of_chocolate": "UNLOCALIZED: Bar of Chocolate", + "item.create.bar_of_chocolate": "Schokoladetafel", "item.create.belt_connector": "Mechanischer Riemen", "item.create.blaze_cake": "UNLOCALIZED: Blaze Cake", "item.create.blaze_cake_base": "UNLOCALIZED: Blaze Cake Base", @@ -449,7 +449,7 @@ "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", - "item.create.deforester": "UNLOCALIZED: Deforester", + "item.create.deforester": "Entforster", "item.create.dough": "Teig", "item.create.electron_tube": "UNLOCALIZED: Electron Tube", "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", @@ -460,8 +460,8 @@ "item.create.goggles": "UNLOCALIZED: Engineer's Goggles", "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", "item.create.handheld_blockzapper": "Blockpistole", - "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", - "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", + "item.create.handheld_worldshaper": "Geländeformer", + "item.create.honey_bucket": "Honigeimer", "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", "item.create.iron_sheet": "Eisenblech", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", @@ -470,18 +470,18 @@ "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Propeller", - "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", + "item.create.red_sand_paper": "Rotes Schmirgelpapier", "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", "item.create.rose_quartz": "Rosenquarz", - "item.create.sand_paper": "UNLOCALIZED: Sand Paper", + "item.create.sand_paper": "Schmirgelpapier", "item.create.schematic": "Bauplan", "item.create.schematic_and_quill": "Bauplan und Feder", "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", - "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.super_glue": "Superkleber", "item.create.tree_fertilizer": "Baumdünger", "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", "item.create.wand_of_symmetry": "Symmetriestab", - "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", + "item.create.wheat_flour": "Weizenmehl", "item.create.whisk": "UNLOCALIZED: Whisk", "item.create.wrench": "Schraubenschlüssel", "item.create.zinc_ingot": "Zinkbarren", @@ -654,21 +654,21 @@ "_": "->------------------------] UI & Messages [------------------------<-", - "itemGroup.create.base": "UNLOCALIZED: Create", - "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + "itemGroup.create.base": "Create", + "itemGroup.create.palettes": "Create Paletten", "death.attack.create.crush": "%1$s stolperte in ein Mahlwerk", "death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet", "death.attack.create.fan_lava": "%1$s wurde von Lava verweht", "death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert", - "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", - "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + "death.attack.create.mechanical_saw": "%1$s wurde zersägt", + "death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt", - "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", + "create.block.deployer.damage_source_name": "einem Finger", "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", - "create.recipe.crushing": "Mahlen", - "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.crushing": "Mahlen (Mahlwerk)", + "create.recipe.milling": "Mahlen (Mahlstein)", "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", @@ -676,25 +676,25 @@ "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "Mechanische Presse", - "create.recipe.mixing": "UNLOCALIZED: Mixing", + "create.recipe.mixing": "Mixen", "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "UNLOCALIZED: Compacting", "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", - "create.recipe.sawing": "UNLOCALIZED: Sawing", + "create.recipe.sawing": "Sägen", "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", "create.recipe.blockzapper_upgrade": "Blockpistole", - "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", + "create.recipe.sandpaper_polishing": "Schleifen", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout", "create.recipe.draining": "UNLOCALIZED: Item Draining", "create.recipe.processing.chance": "Chance: %1$s%%", - "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", - "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", - "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", + "create.recipe.heat_requirement.none": "Keine Hitze benötigt", + "create.recipe.heat_requirement.heated": "Wenig Hitze benötigt", + "create.recipe.heat_requirement.superheated": "Viel Hitze benötigt", "create.generic.range": "Reichweite", "create.generic.radius": "Radius", @@ -706,12 +706,12 @@ "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Sekunden", "create.generic.unit.minutes": "Minuten", - "create.generic.unit.rpm": "UNLOCALIZED: RPM", - "create.generic.unit.stress": "UNLOCALIZED: su", - "create.generic.unit.degrees": "UNLOCALIZED: °", - "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", - "create.generic.clockwise": "UNLOCALIZED: Clockwise", - "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "Uhrzeigersinn", + "create.generic.counter_clockwise": "Gegen-Uhrzeigersinn", "create.action.scroll": "Wechseln", "create.action.confirm": "Bestätigen", @@ -783,7 +783,7 @@ "create.blockzapper.component.retriever": "Empfänger", "create.blockzapper.component.scope": "Fernrohr", "create.blockzapper.componentTier.none": "Nichts", - "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", + "create.blockzapper.componentTier.brass": "Messing", "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", "create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen", "create.blockzapper.empty": "Keine Blöcke übrig!", @@ -812,8 +812,8 @@ "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "Filter", - "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", - "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", + "create.logistics.recipe_filter": "Rezeptfilter", + "create.logistics.fluid_filter": "Flüssigkeitsfilter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", @@ -838,7 +838,7 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.adjustable_crate.title": "adjustable_crate", + "create.gui.adjustable_crate.title": "UNLOCALIZED: Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "Lagerraum", "create.gui.stockpile_switch.title": "Vorratssensor", "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", - "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", - "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", @@ -864,7 +870,7 @@ "create.schematicAndQuill.secondPos": "Zweite Position festgelegt.", "create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.", "create.schematicAndQuill.abort": "Auswahl zurückgesetzt.", - "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", + "create.schematicAndQuill.title": "Bauplanname:", "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Mein Bauplan", "create.schematicAndQuill.saved": "Gespeichert als %1$s", @@ -1782,8 +1788,8 @@ "item.create.crafter_slot_cover.tooltip": "UNLOCALIZED: SLOT COVER", "item.create.crafter_slot_cover.tooltip.summary": "UNLOCALIZED: Used to mark a _Mechanical Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients are diagonal_ to each other.", - "create.tooltip.wip": "UNLOCALIZED: WIP", - "create.tooltip.workInProgress": "UNLOCALIZED: Work in progress!", + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Work in progress!", "create.tooltip.randomWipDescription0": "UNLOCALIZED: Please keep this item away from children.", "create.tooltip.randomWipDescription1": "UNLOCALIZED: A baby panda dies every time you use this item. Every. Time.", "create.tooltip.randomWipDescription2": "UNLOCALIZED: Use at your own risk.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json new file mode 100644 index 000000000..86d845459 --- /dev/null +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -0,0 +1,1805 @@ +{ + "_": "Missing Localizations: 11", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "Ventana de acacia", + "block.create.acacia_window_pane": "Panel de ventana de acacia", + "block.create.adjustable_chain_gearshift": "Cadena de transmisión ajustable", + "block.create.adjustable_crate": "Caja ajustable", + "block.create.adjustable_pulse_repeater": "Repetidor de pulso ajustable", + "block.create.adjustable_repeater": "Repetidor ajustable", + "block.create.analog_lever": "Palanca analógica", + "block.create.andesite_belt_funnel": "Embudo de cinta de andesita", + "block.create.andesite_bricks": "Ladrillos de andesita", + "block.create.andesite_bricks_slab": "Losa de ladrillos de andesita", + "block.create.andesite_bricks_stairs": "Escaleras de ladrillos de andesita", + "block.create.andesite_bricks_wall": "Pared de ladrillos de andesita", + "block.create.andesite_casing": "Revestidor de andesita", + "block.create.andesite_cobblestone": "Adoquín de andesita", + "block.create.andesite_cobblestone_slab": "Losa de adoquín de andesita", + "block.create.andesite_cobblestone_stairs": "Escaleras de adoquines de andesita", + "block.create.andesite_cobblestone_wall": "Muro de adoquines de andesita", + "block.create.andesite_encased_shaft": "Eje revestido de andesita", + "block.create.andesite_funnel": "Embudo de andesita", + "block.create.andesite_pillar": "Poste de andesita", + "block.create.andesite_tunnel": "Túnel de Andesita", + "block.create.basin": "Cuenca", + "block.create.belt": "Cinta", + "block.create.birch_window": "Ventana de abedul", + "block.create.birch_window_pane": "Panel de ventana de abedul", + "block.create.black_sail": "Vela negra", + "block.create.black_seat": "Asiento negro", + "block.create.black_valve_handle": "Asa de válvula negra", + "block.create.blaze_burner": "Quemador de Blaze", + "block.create.blue_sail": "Vela azul", + "block.create.blue_seat": "Asiento azul", + "block.create.blue_valve_handle": "Asa de válvula azul", + "block.create.brass_belt_funnel": "Embudo de cinta de latón", + "block.create.brass_block": "Bloque de latón", + "block.create.brass_casing": "Revestidor de latón", + "block.create.brass_encased_shaft": "Eje revestido de latón", + "block.create.brass_funnel": "Embudo de latón", + "block.create.brass_tunnel": "Túnel de latón", + "block.create.brown_sail": "Vela marrón", + "block.create.brown_seat": "Asiento marrón", + "block.create.brown_valve_handle": "Asa de válvula marrón", + "block.create.cart_assembler": "Ensamblador de vagonetas", + "block.create.chiseled_dark_scoria": "Escoria oscura cincelada", + "block.create.chiseled_dolomite": "Dolomita cincelada", + "block.create.chiseled_gabbro": "Gabro cincelado", + "block.create.chiseled_limestone": "Caliza cincelada", + "block.create.chiseled_scoria": "Escoria cincelada", + "block.create.chiseled_weathered_limestone": "Piedra caliza erosionada cincelada", + "block.create.chocolate": "Chocolate", + "block.create.chute": "Ducto", + "block.create.clockwork_bearing": "Rodamiento de reloj", + "block.create.clutch": "Embrague", + "block.create.cogwheel": "Rueda dentada", + "block.create.content_observer": "Observador de contenidos", + "block.create.controller_rail": "Raíl de control", + "block.create.copper_block": "Bloque de cobre", + "block.create.copper_casing": "Revestidor de caliza", + "block.create.copper_ore": "Mineral de cobre", + "block.create.copper_shingles": "Bloque de tejas de cobre", + "block.create.copper_tiles": "Bloque de baldosas de cobre", + "block.create.copper_valve_handle": "Asa de válvula de cobre", + "block.create.creative_crate": "Caja creativa", + "block.create.creative_fluid_tank": "Tanque de fluidos creativo", + "block.create.creative_motor": "Motor creativo", + "block.create.crushing_wheel": "Rueda trituradora", + "block.create.crushing_wheel_controller": "Controlador de Rueda trituradora", + "block.create.cuckoo_clock": "Reloj Cucú", + "block.create.cyan_sail": "Vela cian", + "block.create.cyan_seat": "Asiento cian", + "block.create.cyan_valve_handle": "Asa de válvula cian", + "block.create.dark_oak_window": "Ventana de roble oscuro", + "block.create.dark_oak_window_pane": "Panel de ventana de roble oscuro", + "block.create.dark_scoria": "Escoria oscura", + "block.create.dark_scoria_bricks": "Ladrillos de escoria oscura", + "block.create.dark_scoria_bricks_slab": "Losa de ladrillos de escoria oscura", + "block.create.dark_scoria_bricks_stairs": "Escaleras de ladrillos de escoria oscura", + "block.create.dark_scoria_bricks_wall": "Pared de ladrillos de escoria oscura", + "block.create.dark_scoria_cobblestone": "Adoquines de escoria oscura", + "block.create.dark_scoria_cobblestone_slab": "Losa de adoquines de escoria oscura", + "block.create.dark_scoria_cobblestone_stairs": "Escaleras de adoquines de escoria oscura", + "block.create.dark_scoria_cobblestone_wall": "Pared de adoquines de escoria oscura", + "block.create.dark_scoria_pillar": "Pilar de escoria oscura", + "block.create.deployer": "Desplegador", + "block.create.depot": "Depósito", + "block.create.diorite_bricks": "Ladrillos de diorita", + "block.create.diorite_bricks_slab": "Losa de ladrillos de diorita", + "block.create.diorite_bricks_stairs": "Escaleras de ladrillos de diorita", + "block.create.diorite_bricks_wall": "Pared de ladrillos de diorita", + "block.create.diorite_cobblestone": "Adoquín de diorita", + "block.create.diorite_cobblestone_slab": "Losa de adoquínes de diorita", + "block.create.diorite_cobblestone_stairs": "Escaleras de adoquines de diorita", + "block.create.diorite_cobblestone_wall": "Pared de adoquines de diorita", + "block.create.diorite_pillar": "Pilar de diorita", + "block.create.dolomite": "Dolomita", + "block.create.dolomite_bricks": "Ladrillos de dolomita", + "block.create.dolomite_bricks_slab": "Losa de ladrillos de dolomita", + "block.create.dolomite_bricks_stairs": "Escaleras de ladrillos de dolomita", + "block.create.dolomite_bricks_wall": "Pared de ladrillos de dolomita", + "block.create.dolomite_cobblestone": "Adoquín de dolomita", + "block.create.dolomite_cobblestone_slab": "Losa de adoquín de dolomita", + "block.create.dolomite_cobblestone_stairs": "Escaleras de adoquines de dolomita", + "block.create.dolomite_cobblestone_wall": "Pared de adoquines de dolomita", + "block.create.dolomite_pillar": "Pilar de dolomita", + "block.create.encased_chain_drive": "Cadena de transmisión revestida", + "block.create.encased_fan": "Ventilador revestido", + "block.create.encased_fluid_pipe": "Tubería de fluidos de cobre revestida", + "block.create.fancy_andesite_bricks": "Ladrillos de andesita elegantes", + "block.create.fancy_andesite_bricks_slab": "Ladrillos de andesita elegantes", + "block.create.fancy_andesite_bricks_stairs": "Escaleras de ladrillos de andesita elegantes", + "block.create.fancy_andesite_bricks_wall": "Pared de ladrillos de andesita elegantes", + "block.create.fancy_dark_scoria_bricks": "Ladrillos de escoria oscura elegantes", + "block.create.fancy_dark_scoria_bricks_slab": "Losa de ladrillos de escoria oscura elegantes", + "block.create.fancy_dark_scoria_bricks_stairs": "Escalera de ladrillos de escoria oscura elegantes", + "block.create.fancy_dark_scoria_bricks_wall": "Pared de ladrillos de escoria oscura elegantes", + "block.create.fancy_diorite_bricks": "Ladrillos de diorita elegantes", + "block.create.fancy_diorite_bricks_slab": "Losa de ladrillos de diorita elegantes", + "block.create.fancy_diorite_bricks_stairs": "Escaleras de ladrillos de diorita elegantes", + "block.create.fancy_diorite_bricks_wall": "Pared de ladrillos de diorita elegantes", + "block.create.fancy_dolomite_bricks": "Ladrillos de dolomita elegantes", + "block.create.fancy_dolomite_bricks_slab": "Losa de ladrillos de dolomita elegantes", + "block.create.fancy_dolomite_bricks_stairs": "Escaleras de ladrillos de dolomita elegantes", + "block.create.fancy_dolomite_bricks_wall": "Pared de ladrillos de dolomita elegantes", + "block.create.fancy_gabbro_bricks": "Ladrillos de gabro elegantes", + "block.create.fancy_gabbro_bricks_slab": "Losa de ladrillos de gabro elegantes", + "block.create.fancy_gabbro_bricks_stairs": "Escaleras de ladrillos de gabro elegantes", + "block.create.fancy_gabbro_bricks_wall": "Pared de ladrillos de gabro elegantes", + "block.create.fancy_granite_bricks": "Ladrillos de granito elegantes", + "block.create.fancy_granite_bricks_slab": "Losa de ladrillos de granito elegantes", + "block.create.fancy_granite_bricks_stairs": "Escaleras de ladrillos de granito elegantes", + "block.create.fancy_granite_bricks_wall": "Pared de ladrillos de granito elegantes", + "block.create.fancy_limestone_bricks": "Ladrillos de piedra caliza elegantes", + "block.create.fancy_limestone_bricks_slab": "Losa de ladrillos de piedra caliza elegantes", + "block.create.fancy_limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza elegantes", + "block.create.fancy_limestone_bricks_wall": "Pared de ladrillos de piedra caliza elegantes", + "block.create.fancy_scoria_bricks": "Ladrillos de escoria elegantes", + "block.create.fancy_scoria_bricks_slab": "Losa de ladrillos de escoria elegantes", + "block.create.fancy_scoria_bricks_stairs": "Escaleras de ladrillos de escoria elegantes", + "block.create.fancy_scoria_bricks_wall": "Pared de ladrillos de escoria elegantes", + "block.create.fancy_weathered_limestone_bricks": "Ladrillos de piedra de caliza erosionada elegantes", + "block.create.fancy_weathered_limestone_bricks_slab": "Losa de ladrillos de caliza erosionada elegantes", + "block.create.fancy_weathered_limestone_bricks_stairs": "Escaleras de ladrillos de caliza erosionada elegantes", + "block.create.fancy_weathered_limestone_bricks_wall": "Pared de ladrillos de caliza erosionada elegantes", + "block.create.fluid_pipe": "Tubería de fluidos de cobre", + "block.create.fluid_tank": "Depósito de fluidos", + "block.create.fluid_valve": "Válvula de fluidos", + "block.create.flywheel": "Rueda de inercia", + "block.create.framed_glass": "Cristal enmarcado", + "block.create.framed_glass_pane": "Panel de cristal enmarcado", + "block.create.furnace_engine": "Motor de horno", + "block.create.gabbro": "Gabro", + "block.create.gabbro_bricks": "Ladrillos de gabro", + "block.create.gabbro_bricks_slab": "Losa de ladrillos de gabro", + "block.create.gabbro_bricks_stairs": "Escaleras de ladrillos de gabro", + "block.create.gabbro_bricks_wall": "Pared de ladrillos de gabro", + "block.create.gabbro_cobblestone": "Adoquín de gabro", + "block.create.gabbro_cobblestone_slab": "Losa de adoquínes de gabro", + "block.create.gabbro_cobblestone_stairs": "Escaleras de adoquínes de gabro", + "block.create.gabbro_cobblestone_wall": "Pared de adoquínes de gabro", + "block.create.gabbro_pillar": "Pilar de gabro", + "block.create.gantry_pinion": "Piñón de grúa", + "block.create.gantry_shaft": "Eje de grúa", + "block.create.gearbox": "Caja de transmisión", + "block.create.gearshift": "Caja de cambios", + "block.create.glass_fluid_pipe": "Tubo de cristal para fluidos", + "block.create.granite_bricks": "Ladrillos de granito", + "block.create.granite_bricks_slab": "Losa de ladrillos de granito", + "block.create.granite_bricks_stairs": "Escaleras de ladrillos de granito", + "block.create.granite_bricks_wall": "Pared de ladrillos de granito", + "block.create.granite_cobblestone": "Adoquín de granito", + "block.create.granite_cobblestone_slab": "Losa de adoquínes de granito", + "block.create.granite_cobblestone_stairs": "Escaleras de adoquínes de granito", + "block.create.granite_cobblestone_wall": "Pared de adoquínes de granito", + "block.create.granite_pillar": "Pilar de granito", + "block.create.gray_sail": "Vela gris", + "block.create.gray_seat": "Asiento gris", + "block.create.gray_valve_handle": "Asa de válvula gris", + "block.create.green_sail": "Vela verde", + "block.create.green_seat": "Asiento verde", + "block.create.green_valve_handle": "Asa de válvula verde", + "block.create.hand_crank": "Manivela", + "block.create.honey": "Miel", + "block.create.horizontal_framed_glass": "Cristal con marco horizontal", + "block.create.horizontal_framed_glass_pane": "Panel de cristal con marco horizontal", + "block.create.hose_pulley": "Polea de manguera", + "block.create.item_drain": "Drenador de elementos", + "block.create.jungle_window": "Ventana de jungla", + "block.create.jungle_window_pane": "Panel de ventana de jungla", + "block.create.large_cogwheel": "Rueda dentada grande", + "block.create.layered_andesite": "Andesita estratificada", + "block.create.layered_dark_scoria": "Escoria oscura estratificada", + "block.create.layered_diorite": "Diorita estratificada", + "block.create.layered_dolomite": "Dolomita estratificada", + "block.create.layered_gabbro": "Gabro estratificado", + "block.create.layered_granite": "Granito estratificado", + "block.create.layered_limestone": "Piedra caliza estratificada", + "block.create.layered_scoria": "Escoria estratificada", + "block.create.layered_weathered_limestone": "Caliza erosionada estratificada", + "block.create.light_blue_sail": "Vela azul claro", + "block.create.light_blue_seat": "Asiento azul claro", + "block.create.light_blue_valve_handle": "Asa de válvula azul claro", + "block.create.light_gray_sail": "Vela gris claro", + "block.create.light_gray_seat": "Asiento gris claro", + "block.create.light_gray_valve_handle": "Asa de válvula gris claro", + "block.create.lime_sail": "Vela lima", + "block.create.lime_seat": "Asiento lima", + "block.create.lime_valve_handle": "Asa de válvula lima", + "block.create.limesand": "Arena caliza", + "block.create.limestone": "Piedra caliza", + "block.create.limestone_bricks": "Ladrillos de piedra caliza", + "block.create.limestone_bricks_slab": "Losa de ladrillos de piedra caliza", + "block.create.limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza", + "block.create.limestone_bricks_wall": "Pared de ladrillos de piedra caliza", + "block.create.limestone_cobblestone": "Adoquínes de piedra caliza", + "block.create.limestone_cobblestone_slab": "Losa de adoquines de piedra caliza", + "block.create.limestone_cobblestone_stairs": "Escaleras de adoquines de piedra caliza", + "block.create.limestone_cobblestone_wall": "Pared de adoquines de piedra caliza", + "block.create.limestone_pillar": "Pilar de piedra caliza", + "block.create.linear_chassis": "Chasis lineal", + "block.create.lit_blaze_burner": "Quemador de Blaze encendido", + "block.create.magenta_sail": "Vela magenta", + "block.create.magenta_seat": "Asiento magenta", + "block.create.magenta_valve_handle": "Asa de válvula magenta", + "block.create.mechanical_arm": "Brazo mecánico", + "block.create.mechanical_bearing": "Rodamiento mecánico", + "block.create.mechanical_crafter": "Autoensamblador mecánico", + "block.create.mechanical_drill": "Taladro mecánico", + "block.create.mechanical_harvester": "Cosechadora mecánica", + "block.create.mechanical_mixer": "Mezcladora mecánica", + "block.create.mechanical_piston": "Pistón mecánico", + "block.create.mechanical_piston_head": "Cabezal de pistón mecánico", + "block.create.mechanical_plough": "Arado mecánico", + "block.create.mechanical_press": "Prensa mecánica", + "block.create.mechanical_pump": "Bomba mecánica", + "block.create.mechanical_saw": "Sierra mecánica", + "block.create.metal_bracket": "Soporte de metal para ejes", + "block.create.millstone": "Piedra de molino", + "block.create.minecart_anchor": "Ancla de vagonetas", + "block.create.mossy_andesite": "Andesita musgosa", + "block.create.mossy_dark_scoria": "Escoria oscura musgosa", + "block.create.mossy_diorite": "Diorita musgosa", + "block.create.mossy_dolomite": "Dolomita musgosa", + "block.create.mossy_gabbro": "Gabro musgoso", + "block.create.mossy_granite": "Granito musgoso", + "block.create.mossy_limestone": "Caliza musgosa", + "block.create.mossy_scoria": "Escoria musgosa", + "block.create.mossy_weathered_limestone": "Caliza erosionada musgosa", + "block.create.mysterious_cuckoo_clock": "Reloj cucú", + "block.create.natural_scoria": "Escoria natural", + "block.create.nixie_tube": "Tubo Nixie", + "block.create.nozzle": "Boquilla", + "block.create.oak_window": "Ventana de roble", + "block.create.oak_window_pane": "Panel de ventana de roble", + "block.create.orange_sail": "Vela naranja", + "block.create.orange_seat": "Asiento naranja", + "block.create.orange_valve_handle": "Asa de válvula naranja", + "block.create.ornate_iron_window": "Ventana de hierro ornamentada", + "block.create.ornate_iron_window_pane": "Panel de ventana de hierro ornamentada", + "block.create.overgrown_andesite": "Andesita sobredimensionada", + "block.create.overgrown_dark_scoria": "Escoria oscura sobredimensionada", + "block.create.overgrown_diorite": "Diorita sobredimensionada", + "block.create.overgrown_dolomite": "Dolomita sobredimensionada", + "block.create.overgrown_gabbro": "Gabro sobredimensionado", + "block.create.overgrown_granite": "Granito sobredimensionado", + "block.create.overgrown_limestone": "Caliza sobredimensionada", + "block.create.overgrown_scoria": "Escoria sobredimensionada", + "block.create.overgrown_weathered_limestone": "Caliza erosionada sobredimensionada", + "block.create.paved_andesite": "Andesita pavimentada", + "block.create.paved_andesite_slab": "Losa de andesita pavimentada", + "block.create.paved_andesite_stairs": "Escaleras de andesita pavimentada", + "block.create.paved_andesite_wall": "Pared de andesita pavimentada", + "block.create.paved_dark_scoria": "Escoria oscura pavimentada", + "block.create.paved_dark_scoria_slab": "Losa de escoria oscura pavimentada", + "block.create.paved_dark_scoria_stairs": "Escaleras de escoria oscura pavimentada", + "block.create.paved_dark_scoria_wall": "Pared de escoria oscura pavimentad", + "block.create.paved_diorite": "Diorita pavimentada", + "block.create.paved_diorite_slab": "Losa de diorita pavimentada", + "block.create.paved_diorite_stairs": "Escaleras de diorita pavimentada", + "block.create.paved_diorite_wall": "Pared de diorita pavimentad", + "block.create.paved_dolomite": "Dolomita pavimentada", + "block.create.paved_dolomite_slab": "Losa de dolomita pavimentada", + "block.create.paved_dolomite_stairs": "Escaleras de dolomita pavimentada", + "block.create.paved_dolomite_wall": "Pared de dolomita pavimentada", + "block.create.paved_gabbro": "Gabro pavimentado", + "block.create.paved_gabbro_slab": "Losa de gabro pavimentado", + "block.create.paved_gabbro_stairs": "Escaleras de gabro pavimentado", + "block.create.paved_gabbro_wall": "Pared de gabro pavimentado", + "block.create.paved_granite": "Granito pavimentado", + "block.create.paved_granite_slab": "Losa de granito pavimentado", + "block.create.paved_granite_stairs": "Escaleras de granito pavimentado", + "block.create.paved_granite_wall": "Pared de granito pavimentado", + "block.create.paved_limestone": "Piedra caliza pavimentada", + "block.create.paved_limestone_slab": "Losa de piedra caliza pavimentada", + "block.create.paved_limestone_stairs": "Escaleras de piedra caliza pavimentada", + "block.create.paved_limestone_wall": "Pared de piedra caliza pavimentada", + "block.create.paved_scoria": "Escoria pavimentada", + "block.create.paved_scoria_slab": "Losa de escoria pavimentada", + "block.create.paved_scoria_stairs": "Escaleras de escoria pavimentada", + "block.create.paved_scoria_wall": "Pared de escoria pavimentada", + "block.create.paved_weathered_limestone": "Piedra caliza erosionada pavimentada", + "block.create.paved_weathered_limestone_slab": "Losa de piedra caliza erosionada pavimentada", + "block.create.paved_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pavimentada", + "block.create.paved_weathered_limestone_wall": "Pared de piedra caliza erosionada pavimentada", + "block.create.pink_sail": "Vela rosa", + "block.create.pink_seat": "Asiento rosa", + "block.create.pink_valve_handle": "Asa de válvula rosa", + "block.create.piston_extension_pole": "Pértiga de extensión de pistón", + "block.create.polished_dark_scoria": "Escoria oscura pulida", + "block.create.polished_dark_scoria_slab": "Losa de escoria oscura pulida", + "block.create.polished_dark_scoria_stairs": "Escaleras de escoria oscura pulida", + "block.create.polished_dark_scoria_wall": "Pared de escoria oscura pulida", + "block.create.polished_dolomite": "Dolomita pulida", + "block.create.polished_dolomite_slab": "Losa de dolomita pulida", + "block.create.polished_dolomite_stairs": "Escaleras de dolomita pulidas", + "block.create.polished_dolomite_wall": "Pared de dolomita pulida", + "block.create.polished_gabbro": "Gabro pulido", + "block.create.polished_gabbro_slab": "Losa de gabro pulido", + "block.create.polished_gabbro_stairs": "Escaleras de gabro pulido", + "block.create.polished_gabbro_wall": "Pared de gabro pulido", + "block.create.polished_limestone": "Piedra caliza pulida", + "block.create.polished_limestone_slab": "Losa de piedra caliza pulida", + "block.create.polished_limestone_stairs": "Escaleras de piedra caliza pulidas", + "block.create.polished_limestone_wall": "Pared de piedra caliza pulida", + "block.create.polished_scoria": "Escoria pulida", + "block.create.polished_scoria_slab": "Losa de escoria pulida", + "block.create.polished_scoria_stairs": "Escaleras de losa pulida", + "block.create.polished_scoria_wall": "Pared de escoria pulida", + "block.create.polished_weathered_limestone": "Piedra caliza erosionada pulida", + "block.create.polished_weathered_limestone_slab": "Losa de piedra caliza erosionada pulida", + "block.create.polished_weathered_limestone_stairs": "Escaleras de piedra caliza erosionada pulida", + "block.create.polished_weathered_limestone_wall": "Pared de piedra caliza erosionada pulida", + "block.create.portable_fluid_interface": "Interfaz de fluidos portátil", + "block.create.portable_storage_interface": "Interfaz de almacenamiento portátil", + "block.create.powered_latch": "Palanca motorizada", + "block.create.powered_toggle_latch": "Palanca de cierre motorizada", + "block.create.pulley_magnet": "Imán de la polea", + "block.create.pulse_repeater": "Repetidor de pulsos de Redstone", + "block.create.purple_sail": "Vela morada", + "block.create.purple_seat": "Asiento morado", + "block.create.purple_valve_handle": "Asa de válvula morada", + "block.create.radial_chassis": "Chasis radial", + "block.create.red_sail": "Vela roja", + "block.create.red_seat": "Asiento rojo", + "block.create.red_valve_handle": "Asa de válvula roja", + "block.create.redstone_contact": "Contacto de Redstone", + "block.create.redstone_link": "Enlace de Redstone", + "block.create.refined_radiance_casing": "Revestidor de radiante", + "block.create.reinforced_rail": "Raíl reforzado", + "block.create.rope": "Soga", + "block.create.rope_pulley": "Polea de cuerda", + "block.create.rotation_speed_controller": "Controlador de velocidad de rotación", + "block.create.sail_frame": "Marco de vela", + "block.create.schematic_table": "Tabla de esquemas", + "block.create.schematicannon": "Schematicannon", + "block.create.scoria": "Escoria", + "block.create.scoria_bricks": "Ladrillos de escoria", + "block.create.scoria_bricks_slab": "Losa de ladrillos de escoria", + "block.create.scoria_bricks_stairs": "Escaleras de ladrillos de escoria", + "block.create.scoria_bricks_wall": "Pared de ladrillos de escoria", + "block.create.scoria_cobblestone": "Adoquín de escoria", + "block.create.scoria_cobblestone_slab": "Losa de adoquínes de escoria", + "block.create.scoria_cobblestone_stairs": "Escaleras de adoquines de escoria", + "block.create.scoria_cobblestone_wall": "Pared de adoquines de escoria", + "block.create.scoria_pillar": "Pilar de escoria", + "block.create.secondary_linear_chassis": "Chasis lineal secundario", + "block.create.sequenced_gearshift": "Palanca de cambios secuencial", + "block.create.shadow_steel_casing": "Revestidor sombrío", + "block.create.shaft": "Eje", + "block.create.smart_chute": "Ducto inteligente", + "block.create.smart_fluid_pipe": "Tubería de fluidos inteligente", + "block.create.speedometer": "Velocímetro", + "block.create.spout": "Surtidor", + "block.create.spruce_window": "Ventana de abeto", + "block.create.spruce_window_pane": "Panel de ventana de abeto", + "block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso", + "block.create.stockpile_switch": "Interruptor de acopio", + "block.create.stressometer": "Estresómetro", + "block.create.tiled_glass": "Vidrio esmaltado", + "block.create.tiled_glass_pane": "Panel de vidrio esmaltado", + "block.create.turntable": "Plataforma giratoria mecánica", + "block.create.vertical_framed_glass": "Vidrio esmaltado vertical", + "block.create.vertical_framed_glass_pane": "Panel de vidrio esmaltado vertical", + "block.create.water_wheel": "Rueda hidráulica mecánica", + "block.create.weathered_limestone": "Piedra caliza erosionada", + "block.create.weathered_limestone_bricks": "Ladrillos de piedra caliza erosionada", + "block.create.weathered_limestone_bricks_slab": "Losa de piedra caliza erosionada", + "block.create.weathered_limestone_bricks_stairs": "Escaleras de ladrillos de piedra caliza erosionada", + "block.create.weathered_limestone_bricks_wall": "Pared de ladrillos de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone": "Adoquín de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone_slab": "Losa de adoquín de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone_stairs": "Escaleras de adoquín de piedra caliza erosionada", + "block.create.weathered_limestone_cobblestone_wall": "Pared de adoquínes de piedra caliza erosionada", + "block.create.weathered_limestone_pillar": "Pilar de piedra caliza erosionada", + "block.create.white_sail": "Vela blanca", + "block.create.white_seat": "Asiento blanco", + "block.create.white_valve_handle": "Asa de válvula blanco", + "block.create.windmill_bearing": "Rodamiento del molino de viento", + "block.create.wooden_bracket": "Soporte de madera para ejes", + "block.create.yellow_sail": "Vela amarilla", + "block.create.yellow_seat": "Asiento amarillo", + "block.create.yellow_valve_handle": "Asa de válvula amarillo", + "block.create.zinc_block": "Bloque de zinc", + "block.create.zinc_ore": "Mineral de zinc", + + "entity.create.contraption": "Artilugio", + "entity.create.gantry_contraption": "Artilugio de grúa", + "entity.create.seat": "Asiento", + "entity.create.stationary_contraption": "Artilugio estacionario", + "entity.create.super_glue": "Super Pegamento", + + "fluid.create.milk": "Leche", + "fluid.create.potion": "Poción", + "fluid.create.tea": "Té del Constructor", + + "item.create.andesite_alloy": "Aleación de andesita", + "item.create.attribute_filter": "Filtro de atributos", + "item.create.bar_of_chocolate": "Barra de chocolate", + "item.create.belt_connector": "Correa", + "item.create.blaze_cake": "Pastel de Blaze", + "item.create.blaze_cake_base": "Base de Pastel de Blaze", + "item.create.brass_hand": "Mano de latón", + "item.create.brass_ingot": "Lingote de latón", + "item.create.brass_nugget": "Pepita de latón", + "item.create.brass_sheet": "Lámina de latón", + "item.create.builders_tea": "Té del Constructor", + "item.create.chest_minecart_contraption": "Artilugio de vagoneta con cofre", + "item.create.chocolate_bucket": "Cubo de chocolate", + "item.create.chromatic_compound": "Compuesto cromático", + "item.create.cinder_flour": "Harina de ceniza", + "item.create.copper_ingot": "Lingote de cobre", + "item.create.copper_nugget": "Pepita de cobre", + "item.create.copper_sheet": "Lámina de cobre", + "item.create.crafter_slot_cover": "Tapa de ranura del Autoensamblador mecánico", + "item.create.crushed_aluminum_ore": "Mineral de aluminio molido", + "item.create.crushed_brass": "Latón molido", + "item.create.crushed_copper_ore": "Mineral de cobre molido", + "item.create.crushed_gold_ore": "Mineral de oro molido", + "item.create.crushed_iron_ore": "Mineral de hierro molido", + "item.create.crushed_lead_ore": "Mineral de plomo molido", + "item.create.crushed_nickel_ore": "Mineral de níquel molido", + "item.create.crushed_osmium_ore": "Mineral de osmio molido", + "item.create.crushed_platinum_ore": "Mineral de platino molido", + "item.create.crushed_quicksilver_ore": "Mineral de mercurio molido", + "item.create.crushed_silver_ore": "Mineral de plata molido", + "item.create.crushed_tin_ore": "Mineral de estaño molido", + "item.create.crushed_uranium_ore": "Mineral de uranio molido", + "item.create.crushed_zinc_ore": "Mineral de zinc molido", + "item.create.deforester": "Deforestador", + "item.create.dough": "Masilla", + "item.create.electron_tube": "Tubo de electrones", + "item.create.empty_blaze_burner": "Quemador de Blaze vacío", + "item.create.empty_schematic": "Esquema vacío", + "item.create.extendo_grip": "Agarre extendido", + "item.create.filter": "Filtro", + "item.create.furnace_minecart_contraption": "Artilugio de vagoneta de horno", + "item.create.goggles": "Gafas del Ingeniero", + "item.create.golden_sheet": "Lámina de oro", + "item.create.handheld_blockzapper": "Blockzapper", + "item.create.handheld_worldshaper": "Worldshaper", + "item.create.honey_bucket": "Cubo de miel", + "item.create.integrated_circuit": "Chip de circuito integrado", + "item.create.iron_sheet": "Lámina de hierro", + "item.create.lapis_sheet": "Lámina de lapislázuli", + "item.create.minecart_contraption": "Artilugio de vagoneta", + "item.create.minecart_coupling": "Acoplamiento de vagoneta", + "item.create.polished_rose_quartz": "Cuarzo rosado pulido", + "item.create.powdered_obsidian": "Obsidiana en polvo", + "item.create.propeller": "Hélice", + "item.create.red_sand_paper": "Papel de lija rojo", + "item.create.refined_radiance": "Resplandor refinado", + "item.create.rose_quartz": "Cuarzo rosado", + "item.create.sand_paper": "Papel de lija", + "item.create.schematic": "Esquema", + "item.create.schematic_and_quill": "Esquema y Pluma", + "item.create.shadow_steel": "Acero sombrío", + "item.create.super_glue": "Super Pegamento", + "item.create.tree_fertilizer": "Fertilizador de árboles", + "item.create.vertical_gearbox": "Caja de transmisión vertical", + "item.create.wand_of_symmetry": "Varita de simetría", + "item.create.wheat_flour": "Harina de trigo", + "item.create.whisk": "Batidora", + "item.create.wrench": "Llave inglesa", + "item.create.zinc_ingot": "Lingote de zinc", + "item.create.zinc_nugget": "Pepita de zinc", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "Bienvenido a Create", + "advancement.create.root.desc": "¡Es hora de empezar a construir increíbles Artilugios!", + "advancement.create.andesite_alloy": "Aliteraciones en abundancia", + "advancement.create.andesite_alloy.desc": "Los materiales de Create tienen nombres extraños, la aleación de andesita es uno de ellos.", + "advancement.create.its_alive": "Está Vivo!", + "advancement.create.its_alive.desc": "Vea cómo gira su primer componente cinético.", + "advancement.create.shifting_gears": "Cambiando de marcha", + "advancement.create.shifting_gears.desc": "Conecta una rueda dentada grande a una pequeña, lo que te permitirá cambiar la velocidad de tu artilugio.", + "advancement.create.overstressed": "Sobrecargado", + "advancement.create.overstressed.desc": "Experimenta los límites del estrés.", + "advancement.create.belt": "Paseo de algas", + "advancement.create.belt.desc": "Conectar dos ejes con una correa.", + "advancement.create.tunnel": "Cúbrete!", + "advancement.create.tunnel.desc": "Embellece tu correa con un Túnel.", + "advancement.create.splitter_tunnel": "Divide y vencerás", + "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de latón.", + "advancement.create.chute": "Caída en picado", + "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la correa.", + "advancement.create.upward_chute": "Abducción aérea", + "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela hacia un paracaídas impulsado por un ventilador.", + "advancement.create.belt_funnel": "Colgantes con forma de embudo", + "advancement.create.belt_funnel.desc": "Coloca un embudo lateral encima de una cinta o depósito para crear un tipo especial.", + "advancement.create.belt_funnel_kiss": "Los loros y las aletas", + "advancement.create.belt_funnel_kiss.desc": "Haz besar dos embudos montados con una cinta.", + "advancement.create.fan": "Maestro mecánico del aire", + "advancement.create.fan.desc": "Monta la corriente de aire proporcionada por un ventilador revestido.", + "advancement.create.fan_lava": "Calentador geotérmico", + "advancement.create.fan_lava.desc": "Quedar atrapado en una corriente de aire que funde las cosas.", + "advancement.create.fan_water": "Lavado de la ropa", + "advancement.create.fan_water.desc": "Quedar atrapado en una corriente de aire que lava las cosas.", + "advancement.create.fan_smoke": "Fuelle mecánico", + "advancement.create.fan_smoke.desc": "Quedar atrapado en una corriente de aire que humea los artículos.", + "advancement.create.wrench": "Configurar convenientemente", + "advancement.create.wrench.desc": "Crea una llave inglesa para ayudarte a construir tus artilugios.", + "advancement.create.goggles": "Stress-O-Vision", + "advancement.create.goggles.desc": "Crea unas Gafas del Ingeniero para ayudarte a obtener más información cinética de los componentes.", + "advancement.create.speedometer": "Pero, ¿con qué rapidez exactamente??", + "advancement.create.speedometer.desc": "Coloca y alimenta un Velocímetro. Míralo a través de las gafas para leer su valor exacto.", + "advancement.create.stressometer": "Pero, ¿cuán estresado exactamente??", + "advancement.create.stressometer.desc": "Coloca y alimenta un Estresómetro. Míralo a través de las gafas para leer su valor exacto.", + "advancement.create.aesthetics": "Boom, Estética!", + "advancement.create.aesthetics.desc": "Colocar los soportes en un eje, tubo y rueda dentada.", + "advancement.create.reinforced": "Boom, Reforzado!", + "advancement.create.reinforced.desc": "Utilizar bloques de revestimiento en un eje, un tubo y una correa.", + "advancement.create.water_wheel": "Aprovechar la hidráulica", + "advancement.create.water_wheel.desc": "Coloca una Rueda hidráulica e intenta hacerla girar.", + "advancement.create.chocolate_wheel": "Potencia de buen gusto", + "advancement.create.chocolate_wheel.desc": "Hacer funcionar una rueda de agua con chocolate fundido.", + "advancement.create.lava_wheel": "Rueda de Magma", + "advancement.create.lava_wheel.desc": "Esto no debió haber funcionado.", + "advancement.create.cuckoo": "¿Es el momento?", + "advancement.create.cuckoo.desc": "Presenciar cómo un Reloj de cucú anuncia la hora de acostarse.", + "advancement.create.millstone": "Triturador de bolsillo", + "advancement.create.millstone.desc": "Colocar y alimentar una Piedra de molino.", + "advancement.create.windmill": "Una suave brisa", + "advancement.create.windmill.desc": "Montar un molino de viento.", + "advancement.create.maxed_windmill": "Una fuerte brisa", + "advancement.create.maxed_windmill.desc": "Montar un molino de viento de máxima intensidad.", + "advancement.create.andesite_casing": "La edad de la andesita", + "advancement.create.andesite_casing.desc": "Utiliza un poco de aleación de andesita y madera para crear un revestimiento básico.", + "advancement.create.mechanical_drill": "Interruptores fijos", + "advancement.create.mechanical_drill.desc": "Colocar y alimentar un taladro mecánico.", + "advancement.create.press": "¡La prensa se pone en marcha!", + "advancement.create.press.desc": "Activa una prensa mecánica y utilízala para crear algunas láminas.", + "advancement.create.polished_rose_quartz": "Diamantes rosas", + "advancement.create.polished_rose_quartz.desc": "Utiliza un trozo de papel de lija para pulir el cuarzo rosa hasta que se vuelva transparente.", + "advancement.create.electron_tube": "Beep Boop", + "advancement.create.electron_tube.desc": "Haz algunos Tubos de Electrones, útiles en la fabricación de maquinaria menos primitiva.", + "advancement.create.mechanical_saw": "Picado estacionario", + "advancement.create.mechanical_saw.desc": "Colocar y alimentar una sierra mecánica.", + "advancement.create.basin": "Funcionamiento de la cuenca", + "advancement.create.basin.desc": "Coloca una Cuenca e intenta arrojar objetos en ella.", + "advancement.create.mixer": "Mezcla de colores", + "advancement.create.mixer.desc": "Coloque una batidora mecánica sobre el lavabo, enciéndala y empiece a mezclar algunos ingredientes.", + "advancement.create.blaze_burner": "Una chimenea viva", + "advancement.create.blaze_burner.desc": "Obtener un Quemador de Blaze.", + "advancement.create.compact": "Compactación automática", + "advancement.create.compact.desc": "Utiliza una prensa y una palangana para compactar algunos elementos.", + "advancement.create.brass": "Aleaciones reales", + "advancement.create.brass.desc": "Utiliza Cobre molido y Zinc molido para crear algo de latón.", + "advancement.create.brass_casing": "La Edad de Latón", + "advancement.create.brass_casing.desc": "Utiliza el latón recién obtenido y algo de madera para crear un revestimiento más avanzado.", + "advancement.create.copper_casing": "La Edad de Cobre", + "advancement.create.copper_casing.desc": "Utiliza algunas láminas de cobre y madera para crear algunos revestimientos de cobre.", + "advancement.create.spout": "Sploosh", + "advancement.create.spout.desc": "Observar el llenado de un elemento fluido usando una boquilla.", + "advancement.create.spout_potion": "Cervecera global", + "advancement.create.spout_potion.desc": "Mira cómo un pico llena una botella con líquido de poción.", + "advancement.create.chocolate": "Un mundo de imaginación", + "advancement.create.chocolate.desc": "Obtener un cubo de chocolate fundido.", + "advancement.create.item_drain": "Drenaje de la ropa", + "advancement.create.item_drain.desc": "Ver cómo se vacía un elemento fluido mediante una drenadora de elementos.", + "advancement.create.chained_item_drain": "Déjalo rodar!", + "advancement.create.chained_item_drain.desc": "Observa cómo un objeto rueda por varios drenadores de elementos encadenados.", + "advancement.create.glass_pipe": "Espía del flujo", + "advancement.create.glass_pipe.desc": "Observe cómo se propaga el fluido a través de una tubería de fluidos con ventanas. Las tuberías de fluido rectas se convierten en ventanas cuando se utiliza una llave en ellas.", + "advancement.create.pipe_collision": "No cruzar nunca los arroyos", + "advancement.create.pipe_collision.desc": "Vea cómo se unen dos fluidos en su red de tuberías.", + "advancement.create.pipe_spill": "¡Hay una fuga!", + "advancement.create.pipe_spill.desc": "Observe cómo un extremo abierto de una tubería toma o deposita fluidos en el mundo.", + "advancement.create.hose_pulley": "Vertidos industriales", + "advancement.create.hose_pulley.desc": "Bajar una polea de manguera y ver cómo se vacía o se llena un cuerpo de líquido.", + "advancement.create.infinite_water": "Drenando el océano", + "advancement.create.infinite_water.desc": "Bombea de una masa de agua lo suficientemente grande como para ser considerada infinita.", + "advancement.create.infinite_lava": "Drenaje del núcleo de los planetas", + "advancement.create.infinite_lava.desc": "Bombea de una masa de lava lo suficientemente grande como para ser considerada infinita.", + "advancement.create.infinite_chocolate": "Ahogándose en la imaginación", + "advancement.create.infinite_chocolate.desc": "Bombea desde una masa de chocolate fundido lo suficientemente grande como para ser considerado infinito.", + "advancement.create.crafter": "Montaje automatizado", + "advancement.create.crafter.desc": "Coloca y alimenta algunos autoensambladores.", + "advancement.create.clockwork_bearing": "Artilugio a la hora", + "advancement.create.clockwork_bearing.desc": "Ensamblar una estructura montada sobre un rodamiento de relojería.", + "advancement.create.nixie_tube": "Signos de estilo", + "advancement.create.nixie_tube.desc": "Obtener y colocar un par de Tubos Nixie.", + "advancement.create.deployer": "Picar, colocar y atacar", + "advancement.create.deployer.desc": "Coloca y potencia un Desplegador, el reflejo perfecto de ti mismo.", + "advancement.create.speed_controller": "Los ingenieros lo odian!", + "advancement.create.speed_controller.desc": "Coloque un regulador de velocidad de rotación, el dispositivo definitivo para cambiar de marcha.", + "advancement.create.flywheel": "El corazón de la fábrica", + "advancement.create.flywheel.desc": "Conectar con éxito un motor a la rueda de inercia.", + "advancement.create.overstress_flywheel": "Altos niveles de estrés", + "advancement.create.overstress_flywheel.desc": "Sobrecargar un Motor de Horno.", + "advancement.create.integrated_circuit": "Cálculos complejos", + "advancement.create.integrated_circuit.desc": "Ensamblar un chip de circuito integrado.", + "advancement.create.mechanical_arm": "Manos ocupadas!", + "advancement.create.mechanical_arm.desc": "Crea un brazo mecánico, selecciona las entradas y salidas, colócalo en el suelo y dale energía; luego observa cómo hace todo el trabajo por ti.", + "advancement.create.musical_arm": "Tócame la melodía!", + "advancement.create.musical_arm.desc": "Vea cómo un brazo mecánico maneja su Jukebox.", + "advancement.create.arm_many_targets": "Organize-o-Tron", + "advancement.create.arm_many_targets.desc": "Programar un brazo mecánico con diez o más posiciones de salida.", + "advancement.create.arm_blaze_burner": "Combust-o-Tron", + "advancement.create.arm_blaze_burner.desc": "Instruya un brazo mecánico para alimentar su Quemador de Blaze.", + "advancement.create.fist_bump": "¡Pégale, hermano!", + "advancement.create.fist_bump.desc": "Hacer que dos Desplegadores se den un puñetazo.", + "advancement.create.crushing_wheel": "Un par de gigantes", + "advancement.create.crushing_wheel.desc": "Crea algunas Ruedas de trituración para descomponer más materiales de forma más eficaz.", + "advancement.create.blaze_cake": "Fiebre del azúcar", + "advancement.create.blaze_cake.desc": "Hornea en tu Quemador de Blaze un pastel especial.", + "advancement.create.chromatic_compound": "Minerales bipolares", + "advancement.create.chromatic_compound.desc": "Crea una Barra de Compuesto Cromático.", + "advancement.create.shadow_steel": "Retorno del vacío", + "advancement.create.shadow_steel.desc": "Crea Acero Sombrío, una barra de metal de la nada.", + "advancement.create.refined_radiance": "Brillante e inspirador", + "advancement.create.refined_radiance.desc": "Crea un Resplandor refinado, una poderosa sustancia cromática.", + "advancement.create.chromatic_age": "La edad cromática", + "advancement.create.chromatic_age.desc": "Crear bloques de revestimiento de la luz y la oscuridad.", + "advancement.create.zapper": "Construir con estilo", + "advancement.create.zapper.desc": "Construye un Blockzapper. Una pistola láser radiante que te ayuda a construir.", + "advancement.create.upgraded_zapper": "Radiante sobrecarga", + "advancement.create.upgraded_zapper.desc": "Crear y activar un Blockzapper totalmente mejorado.", + "advancement.create.wand_of_symmetry": "Espejos radiantes", + "advancement.create.wand_of_symmetry.desc": "Crear un bastón de simetría.", + "advancement.create.deforester": "Picado radiante", + "advancement.create.deforester.desc": "Crea un Deforestador y despídete del bosque local.", + "advancement.create.extendo_grip": "Boioioing!", + "advancement.create.extendo_grip.desc": "Hazte con un Agarre extentido.", + "advancement.create.dual_extendo_grip": "La última edad del boing", + "advancement.create.dual_extendo_grip.desc": "Doble Empuñadura extendida para un alcance sobrehumano.", + "advancement.create.eob": "Fin de la beta", + "advancement.create.eob.desc": "Espere más contenido aquí en el futuro. <3", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "Create", + "itemGroup.create.palettes": "Paletas", + + "death.attack.create.crush": "%1$s se procesó por las Ruedas de trituración", + "death.attack.create.fan_fire": "%1$s murió quemado por el aire caliente", + "death.attack.create.fan_lava": "%1$s murió quemado por un abanico de lava", + "death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico", + "death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica", + "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj cucú manipulado", + + "create.block.deployer.damage_source_name": "un Desplegador rebelde", + "create.block.cart_assembler.invalid": "Coloque su Ensamblador de vagonetas en un bloque de Raíles", + + "create.recipe.crushing": "Trituración", + "create.recipe.milling": "Fresado", + "create.recipe.fan_washing": "Lavado a granel", + "create.recipe.fan_washing.fan": "Ventilador detrás del agua fluyente", + "create.recipe.fan_smoking": "Ahumador a granel", + "create.recipe.fan_smoking.fan": "Ventilador detrás del fuego", + "create.recipe.fan_blasting": "Voladuras a granel", + "create.recipe.fan_blasting.fan": "Ventilador detrás de la lava", + "create.recipe.pressing": "Prensando", + "create.recipe.mixing": "Mezclando", + "create.recipe.automatic_shapeless": "Elaboración automatizada de productos sin forma", + "create.recipe.automatic_brewing": "Elaboración de cerveza automatizada", + "create.recipe.packing": "Compactando", + "create.recipe.automatic_packing": "Embalaje automatizado", + "create.recipe.sawing": "Aserrando", + "create.recipe.mechanical_crafting": "Elaboración mecánica", + "create.recipe.automatic_shaped": "Elaboración automatizada de productos con forma", + "create.recipe.block_cutting": "Corte de bloques", + "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", + "create.recipe.blockzapper_upgrade": "Blockzapper", + "create.recipe.sandpaper_polishing": "Pulido con papel de lija", + "create.recipe.mystery_conversion": "Conversión misteriosa", + "create.recipe.spout_filling": "Llenar por el pico", + "create.recipe.draining": "Drenador de elementos", + "create.recipe.processing.chance": "%1$s%% Chance", + "create.recipe.heat_requirement.none": "No es necesario calentar", + "create.recipe.heat_requirement.heated": "Calentado", + "create.recipe.heat_requirement.superheated": "Súper-Calentado", + + "create.generic.range": "Rango", + "create.generic.radius": "Radio", + "create.generic.width": "Ancho", + "create.generic.height": "Alto", + "create.generic.length": "Largo", + "create.generic.speed": "Velocidad", + "create.generic.delay": "Retraso", + "create.generic.unit.ticks": "Ticks", + "create.generic.unit.seconds": "Segundos", + "create.generic.unit.minutes": "Minutos", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "En el sentido de las agujas del reloj", + "create.generic.counter_clockwise": "En sentido contrario a las agujas del reloj", + + "create.action.scroll": "Desplazar", + "create.action.confirm": "Confirmar", + "create.action.abort": "Abortar", + "create.action.saveToFile": "Guardar", + "create.action.discard": "Descartar", + + "create.keyinfo.toolmenu": "Menú de la Herramienta de Enfoque", + "create.keyinfo.scrollup": "Simular usar la rueda del ratón hacia arriba (en el mundo)", + "create.keyinfo.scrolldown": "Simular usar la rueda del ratón hacia abajo (en el mundo)", + + "create.gui.scrollInput.defaultTitle": "Seleccione una opción:", + "create.gui.scrollInput.scrollToModify": "Usa la rueda del ratón para Modificar", + "create.gui.scrollInput.scrollToAdjustAmount": "Usa la rueda del ratón para ajustar la cantidad", + "create.gui.scrollInput.scrollToSelect": "Usa la rueda del ratón para Seleccionar", + "create.gui.scrollInput.shiftScrollsFaster": "Shift para usar la rueda del ratón más rápido", + "create.gui.toolmenu.focusKey": "Mantenga [%1$s] para enfocar", + "create.gui.toolmenu.cycle": "[RUEDA DEL RATÓN] para el ciclo", + "create.gui.symmetryWand.mirrorType": "Espejado", + "create.gui.symmetryWand.orientation": "Orientación", + + "create.symmetry.mirror.plane": "Plano de espejo", + "create.symmetry.mirror.doublePlane": "Rectangular", + "create.symmetry.mirror.triplePlane": "Octogonal", + + "create.orientation.orthogonal": "Ortogonal", + "create.orientation.diagonal": "Diagonal", + "create.orientation.horizontal": "Horizontal", + "create.orientation.alongZ": "A lo largo de Z", + "create.orientation.alongX": "A lo largo de X", + + "create.gui.blockzapper.title": "Blockzapper", + "create.gui.blockzapper.replaceMode": "Modo de sustitución", + "create.gui.blockzapper.searchDiagonal": "Seguir las diagonales", + "create.gui.blockzapper.searchFuzzy": "Ignorar los bordes del material", + "create.gui.blockzapper.range": "Alcance del margen de maniobra", + "create.gui.blockzapper.needsUpgradedAmplifier": "Requiere un amplificador mejorado", + "create.gui.blockzapper.patternSection": "Patrón", + "create.gui.blockzapper.pattern.solid": "Sólido", + "create.gui.blockzapper.pattern.checkered": "Tablero de ajedrez", + "create.gui.blockzapper.pattern.inversecheckered": "Tablero de ajedrez invertido", + "create.gui.blockzapper.pattern.chance25": "25% Roll", + "create.gui.blockzapper.pattern.chance50": "50% Roll", + "create.gui.blockzapper.pattern.chance75": "75% Roll", + "create.gui.terrainzapper.title": "Worldshaper", + "create.gui.terrainzapper.placement": "Colocación", + "create.gui.terrainzapper.placement.merged": "Fusionado", + "create.gui.terrainzapper.placement.attached": "Adjuntado", + "create.gui.terrainzapper.placement.inserted": "Insertado", + "create.gui.terrainzapper.brush": "Pincel", + "create.gui.terrainzapper.brush.cuboid": "Cuboide", + "create.gui.terrainzapper.brush.sphere": "Esfera", + "create.gui.terrainzapper.brush.cylinder": "Cilindro", + "create.gui.terrainzapper.tool": "Herramienta", + "create.gui.terrainzapper.tool.fill": "Llenar", + "create.gui.terrainzapper.tool.place": "Sitio", + "create.gui.terrainzapper.tool.replace": "Sustituir", + "create.gui.terrainzapper.tool.clear": "Borrar", + "create.gui.terrainzapper.tool.overlay": "Superposición", + "create.gui.terrainzapper.tool.flatten": "Aplanar", + + "create.terrainzapper.shiftRightClickToSet": "Shift+Clic con el botón derecho para seleccionar una forma", + + "create.blockzapper.usingBlock": "Utilizando: %1$s", + "create.blockzapper.componentUpgrades": "Mejoras de componentes:", + "create.blockzapper.component.body": "Cuerpo", + "create.blockzapper.component.amplifier": "Amplificador", + "create.blockzapper.component.accelerator": "Acelerador", + "create.blockzapper.component.retriever": "Recuperador", + "create.blockzapper.component.scope": "Mira telescópica", + "create.blockzapper.componentTier.none": "Ninguno", + "create.blockzapper.componentTier.brass": "Latón", + "create.blockzapper.componentTier.chromatic": "Cromático", + "create.blockzapper.leftClickToSet": "Clic izquierdo en un bloque para establecer el material", + "create.blockzapper.empty": "Sin bloques!", + + "create.minecart_coupling.two_couplings_max": "Las vagonetas no pueden tener más de dos enganches cada una", + "create.minecart_coupling.unloaded": "Algunas partes de su tren parecen estar en chunks no cargados", + "create.minecart_coupling.no_loops": "Los acoplamientos no pueden formar un bucle", + "create.minecart_coupling.removed": "Se han retirado todos los acoplamientos de la vagoneta", + "create.minecart_coupling.too_far": "Las vagonetas están demasiado separadas", + + "create.contraptions.movement_mode": "Modo de movimiento", + "create.contraptions.movement_mode.move_place": "Colocar siempre al detenerse", + "create.contraptions.movement_mode.move_place_returned": "Colocar sólo en la posición inicial", + "create.contraptions.movement_mode.move_never_place": "Colocar sólo cuando se destruye el ancla", + "create.contraptions.movement_mode.rotate_place": "Colocar siempre al detenerse", + "create.contraptions.movement_mode.rotate_place_returned": "Colocar sólo cerca del ángulo inicial", + "create.contraptions.movement_mode.rotate_never_place": "Colocar sólo cuando se destruye el ancla", + "create.contraptions.cart_movement_mode": "Modo de movimiento de la vagoneta", + "create.contraptions.cart_movement_mode.rotate": "Siempre de cara al movimiento", + "create.contraptions.cart_movement_mode.rotate_paused": "Pausar a los actores mientras giran", + "create.contraptions.cart_movement_mode.rotation_locked": "Bloquear rotación", + "create.contraptions.windmill.rotation_direction": "Dirección de rotación", + "create.contraptions.clockwork.clock_hands": "Manecillas de reloj", + "create.contraptions.clockwork.hour_first": "La manecilla de las horas primero", + "create.contraptions.clockwork.minute_first": "La manecilla de los minutos primero", + "create.contraptions.clockwork.hour_first_24": "La manecilla del día primero", + + "create.logistics.filter": "Filtro", + "create.logistics.recipe_filter": "Filtro de recetas", + "create.logistics.fluid_filter": "Filtro de fluidos", + "create.logistics.firstFrequency": "Freq. #1", + "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "Filtro aplicado a %1$s.", + "create.logistics.filter.apply_click_again": "Filtro aplicado a %1$s, haga clic de nuevo para copiar la cantidad.", + "create.logistics.filter.apply_count": "Aplicado recuento de extracciones al filtro.", + + "create.gui.goggles.generator_stats": "Estadísticas del generador:", + "create.gui.goggles.kinetic_stats": "Estadísticas cinéticas:", + "create.gui.goggles.at_current_speed": "con la velocidad actual", + "create.gui.goggles.pole_length": "Longitud del poste:", + "create.gui.assembly.exception": "Este artilugio no se pudo montar:", + "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s %2$s %3$s] no estaba en un chunk cargado", + "create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s", + "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón", + "create.gui.gauge.info_header": "Información sobre el medidor:", + "create.gui.speedometer.title": "Velocidad de rotación", + "create.gui.stressometer.title": "Estrés de la red", + "create.gui.stressometer.capacity": "Capacidad restante", + "create.gui.stressometer.overstressed": "Sobrecargado", + "create.gui.stressometer.no_rotation": "Sin rotación", + "create.gui.contraptions.not_fast_enough": "Parece que este %1$s no está girando con _suficiente_ velocidad_.", + "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto_ de alto estrés.", + "create.gui.adjustable_crate.title": "Caja ajustable", + "create.gui.adjustable_crate.storageSpace": "Espacio de almacenamiento", + "create.gui.stockpile_switch.title": "Interruptor de acopio", + "create.gui.stockpile_switch.invert_signal": "Invertir señal", + "create.gui.stockpile_switch.move_to_lower_at": "Pasar al carril inferior en %1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "Pasar al carril superior en %1$s%%", + "create.gui.sequenced_gearshift.title": "Cambio de marchas secuenciado", + "create.gui.sequenced_gearshift.instruction": "Instrucción", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", + "create.gui.sequenced_gearshift.instruction.turn_angle": "Giro", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Ángulo", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", + "create.gui.sequenced_gearshift.instruction.turn_distance": "Pistón", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distancia", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.instruction.end": "Fin", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", + "create.gui.sequenced_gearshift.speed": "Velocidad, Dirección", + "create.gui.sequenced_gearshift.speed.forward": "Velocidad de entrada, hacia adelante", + "create.gui.sequenced_gearshift.speed.forward_fast": "Doble velocidad, hacia adelante", + "create.gui.sequenced_gearshift.speed.back": "Velocidad de entrada, Invertida", + "create.gui.sequenced_gearshift.speed.back_fast": "Doble velocidad, Invertida", + + "create.schematicAndQuill.dimensions": "Tamaño del esquema: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "Primera posición fijada.", + "create.schematicAndQuill.secondPos": "Segunda posición fijada.", + "create.schematicAndQuill.noTarget": "Mantenga [Ctrl] para seleccionar los bloques del aire.", + "create.schematicAndQuill.abort": "Selección eliminada.", + "create.schematicAndQuill.title": "Nombre del esquema:", + "create.schematicAndQuill.convert": "Guardar y desplegar inmediatamente", + "create.schematicAndQuill.fallbackName": "Mi esquema", + "create.schematicAndQuill.saved": "Guardado como %1$s", + + "create.schematic.invalid": "[!] Elemento no válido - Utilice la tabla de esquemas en su lugar", + "create.schematic.position": "Posición", + "create.schematic.rotation": "Rotación", + "create.schematic.rotation.none": "Ninguno", + "create.schematic.rotation.cw90": "En el sentido de las agujas del reloj 90", + "create.schematic.rotation.cw180": "En el sentido de las agujas del reloj 180", + "create.schematic.rotation.cw270": "En el sentido de las agujas del reloj 270", + "create.schematic.mirror": "Espejado", + "create.schematic.mirror.none": "Ninguno", + "create.schematic.mirror.frontBack": "Delante-detrás", + "create.schematic.mirror.leftRight": "Izquierda-Derecha", + "create.schematic.tool.deploy": "Despliegue", + "create.schematic.tool.move": "Mover XZ", + "create.schematic.tool.movey": "Mover Y", + "create.schematic.tool.rotate": "Rotar", + "create.schematic.tool.print": "Imprimir", + "create.schematic.tool.flip": "Voltear", + "create.schematic.tool.deploy.description.0": "Mueve la estructura a un lugar.", + "create.schematic.tool.deploy.description.1": "Haga clic con el botón derecho del ratón en el suelo para colocar.", + "create.schematic.tool.deploy.description.2": "Mantenga [Ctrl] para seleccionar a una distancia fija.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-Rueda del ratón para cambiar la distancia.", + "create.schematic.tool.move.description.0": "Desplaza el esquema horizontalmente.", + "create.schematic.tool.move.description.1": "Apunta al Esquema y [CTRL]-Rueda del ratón para ponerlo.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "Desplaza el esquema verticalmente..", + "create.schematic.tool.movey.description.1": "[CTRL]-Rueda del ratón para moverlo hacia arriba/abajo.", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "Gira el esquema alrededor de su centro.", + "create.schematic.tool.rotate.description.1": "[CTRL]-Rueda del ratón para girar 90 grados.", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "Sitúa instantáneamente la estructura en el mundo.", + "create.schematic.tool.print.description.1": "[Clic derecho] para confirmar la colocación en el lugar actual.", + "create.schematic.tool.print.description.2": "Esta herramienta es sólo para el Modo Creativo.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "Voltea el Esquema a lo largo de la cara que seleccione.", + "create.schematic.tool.flip.description.1": "Apunta al esquema y [CTRL]-Rueda del ratón para voltearlo.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "Sincronizando...", + "create.schematics.uploadTooLarge": "Tu esquema excede las limitaciones especificadas por el servidor.", + "create.schematics.maxAllowedSize": "El tamaño máximo permitido del archivo del esquema es:", + + "create.gui.schematicTable.refresh": "Refrescar archivos", + "create.gui.schematicTable.open_folder": "Abrir carpeta", + "create.gui.schematicTable.title": "Tabla de esquemas", + "create.gui.schematicTable.availableSchematics": "Esquemas disponibles", + "create.gui.schematicTable.noSchematics": "No hay esquemas guardados", + "create.gui.schematicTable.uploading": "Subiendo...", + "create.gui.schematicTable.finished": "Subida finalizada!", + "create.gui.schematicannon.title": "Schematicannon", + "create.gui.schematicannon.listPrinter": "Lista de control de la impresora", + "create.gui.schematicannon.gunpowderLevel": "Pólvora %1$s%%", + "create.gui.schematicannon.shotsRemaining": "Disparos restantes: %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "Con respaldo: %1$s", + "create.gui.schematicannon.optionEnabled": "Actualmente habilitado", + "create.gui.schematicannon.optionDisabled": "Actualmente deshabilitado", + "create.gui.schematicannon.showOptions": "Mostrar la configuración de la impresora", + "create.gui.schematicannon.option.dontReplaceSolid": "No sustituír los bloques sólidos", + "create.gui.schematicannon.option.replaceWithSolid": "Sustituir sólido por sólido", + "create.gui.schematicannon.option.replaceWithAny": "Sustituir sólido por cualquiera", + "create.gui.schematicannon.option.replaceWithEmpty": "Sustituir sólido por vacío", + "create.gui.schematicannon.option.skipMissing": "Omitir los bloques que faltan", + "create.gui.schematicannon.option.skipTileEntities": "Proteger a las entidades", + "create.gui.schematicannon.slot.gunpowder": "Añade pólvora para alimentar el cañón", + "create.gui.schematicannon.slot.listPrinter": "Coloque los libros aquí para imprimir una lista de comprobación para su esquema", + "create.gui.schematicannon.slot.schematic": "Añada su esquema aquí. Asegúrese de que se despliega en un lugar específico.", + "create.gui.schematicannon.option.skipMissing.description": "Si el cañón no encuentra un bloque necesario para su colocación, continuará en la siguiente ubicación.", + "create.gui.schematicannon.option.skipTileEntities.description": "El cañón evitará reemplazar los bloques que contienen datos, como los Cofres.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "El cañón nunca sustituirá ningún bloque sólido en su zona de trabajo, sólo los no sólidos y el aire.", + "create.gui.schematicannon.option.replaceWithSolid.description": "El cañón sólo reemplazará los bloques sólidos en su área de trabajo si el esquema contiene un bloque sólido en la ubicación.", + "create.gui.schematicannon.option.replaceWithAny.description": "El cañón reemplazará los bloques sólidos en su área de trabajo si el esquema contiene algún bloque en la ubicación.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "El cañón eliminará todos los bloques de su zona de trabajo, incluidos los sustituidos por Aire.", + + "create.schematicannon.status.idle": "Inactivo", + "create.schematicannon.status.ready": "Listo", + "create.schematicannon.status.running": "Funcionando", + "create.schematicannon.status.finished": "Finished", + "create.schematicannon.status.paused": "Pausado", + "create.schematicannon.status.stopped": "Detenido", + "create.schematicannon.status.noGunpowder": "Sin pólvora", + "create.schematicannon.status.targetNotLoaded": "El objetivo no está cargado", + "create.schematicannon.status.targetOutsideRange": "Objetivo demasiado lejano", + "create.schematicannon.status.searching": "Buscando", + "create.schematicannon.status.skipping": "Omitiendo", + "create.schematicannon.status.missingBlock": "Elementos perdidos:", + "create.schematicannon.status.placing": "Colocando", + "create.schematicannon.status.clearing": "Limpiando bloques", + "create.schematicannon.status.schematicInvalid": "Esquema inválido", + "create.schematicannon.status.schematicNotPlaced": "Esquema no desplegado", + "create.schematicannon.status.schematicExpired": "Archivo de esquemas caducado", + + "create.materialChecklist": "Lista de control del material", + "create.materialChecklist.blocksNotLoaded": "* Descargo de Responsabilidad *\n\nLa lista de materiales puede ser inexacta debido a que no se han cargado los chunks pertinentes.", + + "create.gui.filter.deny_list": "Lista de denegados", + "create.gui.filter.deny_list.description": "Los elementos pasan si NO coinciden con ninguno de los anteriores. Una lista de denegación vacía acepta todo.", + "create.gui.filter.allow_list": "Lista de permitidos", + "create.gui.filter.allow_list.description": "Los elementos pasan si coinciden con alguno de los anteriores. Una lista de permitidos vacía rechaza todo.", + "create.gui.filter.respect_data": "Respetar datos", + "create.gui.filter.respect_data.description": "Los objetos sólo coinciden si su durabilidad, encantos y otros atributos también coinciden.", + "create.gui.filter.ignore_data": "Ignorar datos", + "create.gui.filter.ignore_data.description": "Los artículos coinciden independientemente de sus atributos.", + + "create.item_attributes.placeable": "se puede colocar", + "create.item_attributes.placeable.inverted": "no se puede colocar", + "create.item_attributes.consumable": "se puede comer", + "create.item_attributes.consumable.inverted": "no se puede comer", + "create.item_attributes.smeltable": "se puede fundir", + "create.item_attributes.smeltable.inverted": "no se puede fundir", + "create.item_attributes.washable": "se puede lavar", + "create.item_attributes.washable.inverted": "no se puede lavar", + "create.item_attributes.smokable": "puede ser ahumado", + "create.item_attributes.smokable.inverted": "no puede ser ahumado", + "create.item_attributes.crushable": "puede ser molido", + "create.item_attributes.crushable.inverted": "no puede ser molido", + "create.item_attributes.blastable": "es fundible en el alto horno", + "create.item_attributes.blastable.inverted": "no es fundible en el alto horno", + "create.item_attributes.enchanted": "está encantado", + "create.item_attributes.enchanted.inverted": "no está encantado", + "create.item_attributes.damaged": "está dañado", + "create.item_attributes.damaged.inverted": "no está dañado", + "create.item_attributes.badly_damaged": "está muy dañado", + "create.item_attributes.badly_damaged.inverted": "no está muy dañado", + "create.item_attributes.not_stackable": "no se puede apilar", + "create.item_attributes.not_stackable.inverted": "se puede apilar", + "create.item_attributes.equipable": "se puede equipar", + "create.item_attributes.equipable.inverted": "no se puede equipar", + "create.item_attributes.furnace_fuel": "es combustible para hornos", + "create.item_attributes.furnace_fuel.inverted": "no es combustible para hornos", + "create.item_attributes.in_tag": "está etiquetado %1$s", + "create.item_attributes.in_tag.inverted": "no está etiquetado %1$s", + "create.item_attributes.in_item_group": "está en el grupo '%1$s'", + "create.item_attributes.in_item_group.inverted": "no está en el grupo '%1$s'", + "create.item_attributes.added_by": "fue añadido por %1$s", + "create.item_attributes.added_by.inverted": "no fue añadida por %1$s", + "create.item_attributes.has_enchant": "está encantado con %1$s", + "create.item_attributes.has_enchant.inverted": "no está encantado con %1$s", + "create.item_attributes.has_fluid": "contiene %1$s", + "create.item_attributes.has_fluid.inverted": "no contiene %1$s", + "create.item_attributes.has_name": "tiene el nombre personalizado %1$s", + "create.item_attributes.has_name.inverted": "no tiene el nombre personalizado %1$s", + "create.item_attributes.book_author": "es obra de %1$s", + "create.item_attributes.book_author.inverted": "no es es obra de %1$s", + "create.item_attributes.book_copy_original": "es un original", + "create.item_attributes.book_copy_original.inverted": "no es un original", + "create.item_attributes.book_copy_first": "es una copia de primera generación", + "create.item_attributes.book_copy_first.inverted": "no es una copia de primera generación", + "create.item_attributes.book_copy_second": "es una copia de segunda generación", + "create.item_attributes.book_copy_second.inverted": "no es una copia de segunda generación", + "create.item_attributes.book_copy_tattered": "es un desordenado desastre", + "create.item_attributes.book_copy_tattered.inverted": "no es un desordenado desastre", + "create.item_attributes.astralsorcery_crystal": "tiene el atributo de cristal %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "no tiene atributo de cristal %1$s", + "create.item_attributes.astralsorcery_constellation": "está en sintonía con %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "no está en sintonía con %1$s", + "create.item_attributes.astralsorcery_perk_gem": "tiene el atributo ventaja %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "no tiene el atributo ventaja %1$s", + "create.item_attributes.astralsorcery_amulet": "mejora %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "no mejora %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "No hay atributos seleccionados", + "create.gui.attribute_filter.selected_attributes": "Atributos seleccionados:", + "create.gui.attribute_filter.add_attribute": "Añadir atributo a la lista", + "create.gui.attribute_filter.add_inverted_attribute": "Añadir atributo invertido a la Lista", + "create.gui.attribute_filter.allow_list_disjunctive": "Lista de permitidos (Cualquiera)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Los elementos pasan si tienen alguno de los atributos seleccionados", + "create.gui.attribute_filter.allow_list_conjunctive": "Lista de permitidos (Todos)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Los elementos pasan sólo si tienen TODOS los atributos seleccionados", + "create.gui.attribute_filter.deny_list": "Lista de denegados", + "create.gui.attribute_filter.deny_list.description": "Los elementos pasan si NO tienen ninguno de los atributos seleccionados", + "create.gui.attribute_filter.add_reference_item": "Añadir elemento de referencia", + + "create.tooltip.holdKey": "Mantener [%1$s]", + "create.tooltip.holdKeyOrKey": "Mantener [%1$s] o [%2$s]", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + "create.tooltip.speedRequirement": "Requisitos de velocidad: %1$s", + "create.tooltip.speedRequirement.none": "Ninguno", + "create.tooltip.speedRequirement.medium": "Moderado", + "create.tooltip.speedRequirement.high": "Rápido", + "create.tooltip.stressImpact": "Impacto de estrés: %1$s", + "create.tooltip.stressImpact.low": "Bajo", + "create.tooltip.stressImpact.medium": "Moderado", + "create.tooltip.stressImpact.high": "Alto", + "create.tooltip.stressImpact.overstressed": "Sobrecargado", + "create.tooltip.capacityProvided": "Capacidad de estrés: %1$s", + "create.tooltip.capacityProvided.low": "Pequeña", + "create.tooltip.capacityProvided.medium": "Media", + "create.tooltip.capacityProvided.high": "Grande", + "create.tooltip.capacityProvided.asGenerator": "(Como generador)", + "create.tooltip.generationSpeed": "Genera en %1$s %2$s", + "create.tooltip.analogStrength": "Fuerza analógica: %1$s/15", + + "create.mechanical_arm.extract_from": "Extraer elementos de %1$s", + "create.mechanical_arm.deposit_to": "Depositar elementos en %1$s", + "create.mechanical_arm.summary": "El brazo mecánico tiene %1$s entrada(s) y %2$s salida(s)", + "create.mechanical_arm.points_outside_range": "%1$s punto(s) de interacción seleccionado(s) eliminado(s) debido a las limitaciones de rango", + + "create.logistics.when_multiple_outputs_available": "Cuando hay múltiples salidas disponibles", + + "create.mechanical_arm.selection_mode.round_robin": "Round Robin", + "create.mechanical_arm.selection_mode.forced_round_robin": "Round Robin forzado", + "create.mechanical_arm.selection_mode.prefer_first": "Preferir el primer objetivo", + + "create.tunnel.selection_mode.split": "División", + "create.tunnel.selection_mode.forced_split": "División forzada", + "create.tunnel.selection_mode.round_robin": "Round Robin", + "create.tunnel.selection_mode.forced_round_robin": "Round Robin forzado", + "create.tunnel.selection_mode.prefer_nearest": "Preferir el más cercano", + "create.tunnel.selection_mode.randomize": "Aleatorizar", + "create.tunnel.selection_mode.synchronize": "Sincronizar entradas", + + "create.tooltip.chute.header": "Información del ducto", + "create.tooltip.chute.items_move_down": "Los elementos se mueven hacia abajo", + "create.tooltip.chute.items_move_up": "Los elementos se mueven hacia arriba", + "create.tooltip.chute.no_fans_attached": "No hay ventiladores adjuntos", + "create.tooltip.chute.fans_push_up": "Los ventiladores empujan desde abajo", + "create.tooltip.chute.fans_push_down": "Los ventiladores empujan desde arriba", + "create.tooltip.chute.fans_pull_up": "Los ventiladores tiran desde arriba", + "create.tooltip.chute.fans_pull_down": "Los ventiladores tiran desde abajo", + "create.tooltip.chute.contains": "Contiene: %1$s x%2$s", + + "create.hint.hose_pulley.title": "Suministro sin fondo", + "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita", + "create.hint.mechanical_arm_no_targets.title": "No hay objetivos", + "create.hint.mechanical_arm_no_targets": "Parece que a este _brazo mecánico_ no se le ha asignado ningún _objetivo._ Selecciona correas, depósitos, embudos y otros bloques haciendo _clic derecho_ sobre ellos mientras _sostienes_ el _brazo mecánico_ en tu _mano_.", + "create.hint.horizontal_funnel.title": "Embudos horizontales", + "create.hint.horizontal_funnel": "No puede transferir entre inventarios _directamente_. Intenta pasar una _correa_ o un _depósito_ por debajo de tu embudo para extraer artículos de los inventarios", + "create.hint.upward_funnel.title": "Embudos hacia arriba", + "create.hint.upward_funnel": "sólo pueden transferir objetos insertados por _brazos_, y _ductos_ impulsados por ventilador, o elementos _lanzados_ hacia ellos. Intenta construir algunos _ductos_ si quieres mover tus objetos _verticalmente_", + "create.hint.empty_bearing.title": "Rodamiento de reloj", + "create.hint.empty_bearing": "_Haz clic con el botón derecho del ratón_ en el rodamiento con la _mano vacía_ para _adherir_ la estructura que acabas de construir delante de él", + "create.hint.full_deployer.title": "Desbordamiento de elementos del desplegador", + "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _elementos_ en exceso que necesitan ser _extraídos._ Usa un _tolva,_embudo_ u otro medio para liberarlo de su desbordamiento.", + + "create.gui.config.overlay1": "Hola :)", + "create.gui.config.overlay2": "Esta es una muestra de la superposición", + "create.gui.config.overlay3": "Haga clic o arrastre con el ratón", + "create.gui.config.overlay4": "para mover esta vista previa", + "create.gui.config.overlay5": "Pulsar ESC para salir de esta pantalla", + "create.gui.config.overlay6": "y guardar la nueva posición", + "create.gui.config.overlay7": "Ejecute /create overlay reset", + "create.gui.config.overlay8": "para restablecer la posición por defecto", + + "create.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Crear]: El tick del servidor está actualmente ralentizado en %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Crear]: El tick del servidor está ralentizado en %s ms ahora >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: El tick del servidor ha vuelto a su velocidad normal :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: usar /killtps stop para que el servidor vuelva a la velocidad normal", + "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", + "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", + "create.subtitle.slime_added": "Slime aplastado", + "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", + "create.subtitle.mechanical_press_item_break": "Clanks de metal", + "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", + "create.subtitle.blockzapper_confirm": "Ding afirmativo", + "create.subtitle.blockzapper_deny": "Boop declinante", + "create.subtitle.block_funnel_eat": "CHOMPS del embudo", + "create.subtitle.blaze_munch": "Blaze mastica felizmente", + + + "_": "->------------------------] Item Descriptions [------------------------<-", + + "item.create.example_item.tooltip": "EJEMPLO DE ITEM (sólo un marcador de que este tooltip existe)", + "item.create.example_item.tooltip.summary": "Una breve descripción del elemento. Los puntajes bajos resaltan un término", + "item.create.example_item.tooltip.condition1": "Cuando este", + "item.create.example_item.tooltip.behaviour1": "Entonces este elemento hace esto. (los comportamientos se muestran en el turno)", + "item.create.example_item.tooltip.condition2": "Y cuando esto", + "item.create.example_item.tooltip.behaviour2": "Puedes añadir tantos comportamientos como quieras", + "item.create.example_item.tooltip.control1": "Cuando se pulsa Ctrl", + "item.create.example_item.tooltip.action1": "Se muestran estos controles", + + "block.create.andesite_encased_shaft.tooltip": "EJE REVESTIDO DE ANDESITA", + "block.create.andesite_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de andesita_. Los bloques de revestimiento _no se consumirán_.", + + "block.create.brass_encased_shaft.tooltip": "EJE REVESTIDO DE LATÓN", + "block.create.brass_encased_shaft.tooltip.summary": "Elemento _sólo para el modo creativo_. Reviste los _ejes_ en el mundo usando _revestimiento de latón_. Los bloques de revestimiento _no se consumirán_.", + + "block.create.wooden_bracket.tooltip": "SOPORTE DE MADERA PARA EJES", + "block.create.wooden_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un refuerzo acogedor y de madera.", + + "block.create.metal_bracket.tooltip": "SOPORTE DE METAL PARA EJES", + "block.create.metal_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un poco de refuerzo industrial robusto.", + + "block.create.andesite_casing.tooltip": "REVESTIDOR DE ANDESITA", + "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _encastrar ejes_ y _correas._", + + "block.create.andesite_funnel.tooltip": "EMBUDO DE ANDESITA", + "block.create.andesite_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_.", + "block.create.andesite_funnel.tooltip.condition1": "Comportamiento general", + "block.create.andesite_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo", + "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en correas, depósitos y similares", + "block.create.andesite_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave.", + "block.create.andesite_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", + "block.create.andesite_funnel.tooltip.behaviour3": "Transferirá los artículos hacia abajo, como una tolva sin búfer.", + + "block.create.andesite_tunnel.tooltip": "TÚNEL DE ANDESITA", + "block.create.andesite_tunnel.tooltip.summary": "¡Una cubierta protectora para sus _correas_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otra correa o depósito al lado de la correa principal.", + "block.create.andesite_tunnel.tooltip.control1": "Click derecho con la Llave Inglesa en el lateral", + "block.create.andesite_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", + + "block.create.brass_funnel.tooltip": "EMBUDO DE LATÓN", + "block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_. Viene con un práctico _filtro_.", + "block.create.brass_funnel.tooltip.condition1": "Comportamiento General", + "block.create.brass_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo.", + "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en correas, depósitos y similares", + "block.create.brass_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave Inglesa.", + "block.create.brass_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", + "block.create.brass_funnel.tooltip.behaviour3": "Transfiere los artículos hacia abajo, como una tolva sin búfer.", + + "block.create.brass_tunnel.tooltip": "TÚNEL DE LATÓN", + "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _correas_. Los _Túneles de latón_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", + "block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro", + "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de latón se conectan entre sí y permiten redirigir el contenido de una correa a otra.", + "block.create.brass_tunnel.tooltip.condition2": "Filtrado", + "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles de latón_ vienen con filtros tanto para la _Entrada_ como para la _Salida_. Si un _Elemento_ no está permitido desde la salida filtrada de un _Túnel_ será transferido a la salida de un _Túnel_ conectado.", + "block.create.brass_tunnel.tooltip.condition3": "Dividiendo", + "block.create.brass_tunnel.tooltip.behaviour3": "Los _Túneles de latón_ pueden ser configurados para cambiar el método en el que los _Elementos_ son ordenados en los _Túneles_ conectados.", + "block.create.brass_tunnel.tooltip.control1": "Cuando haces click derecho con una Llave Inglesa", + "block.create.brass_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", + "block.create.brass_tunnel.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa en la parte superior", + "block.create.brass_tunnel.tooltip.action2": "Cambiar el método de división de los _Túneles_ conectados.", + + "block.create.copper_casing.tooltip": "REVESTIDOR DE COBRE", + "block.create.copper_casing.tooltip.summary": "Robusta máquina de revestimientos con una gran variedad de usos. Seguro para la decoración.", + "block.create.copper_casing.tooltip.condition1": "Cuando se utiliza en una tubería de fluidos", + "block.create.copper_casing.tooltip.behaviour1": "_Reviste_ la _Tubería de fluidos_ con _Revestimiento de cobre_. Las tuberías de fluidos revestidas _bloquean sus conexiones_ en su lugar, dejando de reaccionar a los cambios en las tuberías vecinas.", + + "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUIDOS REVESTIDO", + "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluidos revestido con cobre.", + + "block.create.copper_valve_handle.tooltip": "ASA DE VÁLVULA DE COBRE", + "block.create.copper_valve_handle.tooltip.summary": "Una precisa _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. ¡Ten cuidado de no agotarte!", + "block.create.copper_valve_handle.tooltip.condition1": "Cuando se utiliza", + "block.create.copper_valve_handle.tooltip.behaviour1": "Proporciona _Fuerza de rotación_ a un artilugio acoplado. _Shift_ para _invertir_ la rotación.", + + "block.create.seat.tooltip": "ASIENTO", + "block.create.seat.tooltip.summary": "¡Siéntate y disfruta del viaje! Anclará a un jugador en un _contrafuerte_ en movimiento. También es ideal para los muebles estáticos. Viene en una variedad de colores.", + "block.create.seat.tooltip.condition1": "Click derecho en el asiento", + "block.create.seat.tooltip.behaviour1": "Sienta al jugador en el _Asiento_. Pulsa shift izquierdo para dejar el _Asiento_.", + + "block.create.chute.tooltip": "DUCTO", + "block.create.chute.tooltip.summary": "_Recoge_ y _Transporta_ elementos en vertical o en diagonal. Puede tanto coger como colocar objetos en _contenedores de objetos_. También puede interactuar con los ductos desde el lateral utilizando _tolvas_ o _embudos montados_.", + "block.create.chute.tooltip.condition1": "Cuando se alimenta con un ventilador", + "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de las _correas_.", + + "block.create.depot.tooltip": "DEPÓSITO", + "block.create.depot.tooltip.summary": "Un lugar práctico para colocar sus _elementos_. Proporciona un punto de interacción para varias máquinas", + "block.create.depot.tooltip.condition1": "Click derecho en el depósito", + "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con una _Correa_ también funcionan en un _Depósito_.", + + "item.create.blaze_cake.tooltip": "PASTEL DE BLAZE", + "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _Quemadores de blaze_. Los pone en marcha!.", + + "item.create.empty_blaze_burner.tooltip": "QUEMADOR DE BLAZE VACÍO", + "item.create.empty_blaze_burner.tooltip.summary": "Un pequeño hogar de hierro para tus amigos fogosos. Estoy seguro de que podrías darles un buen uso.", + "item.create.empty_blaze_burner.tooltip.condition1": "Cuando se utiliza en un Blaze o en un generador de Blaze", + "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captura_ un Blaze en el elemento", + + "block.create.fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS DE COBRE", + "block.create.fluid_pipe.tooltip.summary": "Se utiliza para mover _fluidos_. Necesita una _bomba mecánica_ para que el _fluido_ se mueva.", + "block.create.fluid_pipe.tooltip.condition1": "Transferencia de fluidos", + "block.create.fluid_pipe.tooltip.behaviour1": "Puede conectarse a _contenedores de fluidos_ como _depósitos_ o _cuencas_. Los extremos expuestos de los _tubos_ también pueden drenar o colocar bloques de fluido. ¡Cuidado con las fugas!", + "block.create.fluid_pipe.tooltip.control1": "Cuando haces clic derecho con una Llave Inglesa", + "block.create.fluid_pipe.tooltip.action1": "Coloca una ventana en la tubería si está disponible", + + "block.create.hose_pulley.tooltip": "POLEA DE MANGUERA", + "block.create.hose_pulley.tooltip.summary": "Se utiliza para _colocar_ o _drenar_ grandes _cuerpos fluidos_ en el mundo", + "block.create.hose_pulley.tooltip.condition1": "Cuando se alimenta por cinética", + "block.create.hose_pulley.tooltip.behaviour1": "_Sube_ o _baja_ la manguera, la ubicación de la manguera determina hasta qué _altura de extracción_ o _llenado_ actuará.", + "block.create.hose_pulley.tooltip.condition2": "Cuando los fluidos se extraen de la polea", + "block.create.hose_pulley.tooltip.behaviour2": "Comienza a _tomar bloques de fluidos_ del cuerpo al que se bajó el extremo de la manguera. Los cuerpos muy _grandes_ de fluidos se _considerarán infinitos_.", + "block.create.hose_pulley.tooltip.condition3": "Cuando los fluidos son empujados a la polea", + "block.create.hose_pulley.tooltip.behaviour3": "Comienza a _llenar de fluido_ el mundo hasta la _altura_ de los extremos de la _manguera_", + + "block.create.fluid_tank.tooltip": "TANQUE DE FLUIDOS", + "block.create.fluid_tank.tooltip.summary": "Almacena todos tus _líquidos_ favoritos. Escala en anchura y altura.", + "block.create.fluid_tank.tooltip.condition1": "Cuando se hace click derecho con la Llave Inglesa", + "block.create.fluid_tank.tooltip.behaviour1": "Cambia la ventana opcional", + + "block.create.creative_fluid_tank.tooltip": "TANQUE DE FLUIDOS CREATIVO", + "block.create.creative_fluid_tank.tooltip.summary": "Este _Tanque de Fluidos_ permite la replicación infinita de cualquier Fluido. Escala en anchura y altura.", + "block.create.creative_fluid_tank.tooltip.condition1": "Cuando hay fluido en el tanque", + "block.create.creative_fluid_tank.tooltip.behaviour1": "Todo lo que se _extraiga_ de este tanque proporcionará un _suministro ilimitado_ del fluido especificado. Los fluidos _insertados_ en este tanque serán _evitados._", + "block.create.creative_fluid_tank.tooltip.condition2": "Cuando se hace clic derecho con una Llave Inglesa", + "block.create.creative_fluid_tank.tooltip.behaviour2": "Cambia la ventana opcional", + + "block.create.fluid_valve.tooltip": "VALVULA DE FLUIDOS", + "block.create.fluid_valve.tooltip.summary": "Detiene el flujo de un fluido por una tubería", + "block.create.fluid_valve.tooltip.condition1": "Flujo controlable", + "block.create.fluid_valve.tooltip.behaviour1": "La _fuerza de rotación_ aplicada obligará a la _válvula_ a cerrarse, cesando el flujo de _fluidos_. Invierta la dirección de la _fuerza de rotación_ para volver a abrir la válvula", + + "block.create.mechanical_pump.tooltip": "BOMBA MECÁNICA", + "block.create.mechanical_pump.tooltip.summary": "Toma la _fuerza de rotación_ y la utiliza para mover el _fluido_ a lo largo de un _tubo_. Tiene un rango máximo de efecto en ambas direcciones. (16 bloques por defecto)", + "block.create.mechanical_pump.tooltip.condition1": "Flujo de fluido", + "block.create.mechanical_pump.tooltip.behaviour1": "La _fuerza de rotación_ aplicada crea una presión que obliga al _fluido_ a pasar por la red de _tuberías_. Invierte la dirección de la _fuerza de rotación_ para cambiar la dirección en la que fluye el _fluido_", + "block.create.mechanical_pump.tooltip.control1": "Pulsando con el botón derecho del ratón con la Llave Inglesa", + "block.create.mechanical_pump.tooltip.action1": "Invierte la dirección de la _bomba_, cambiando la dirección por defecto del flujo", + + "block.create.smart_fluid_pipe.tooltip": "TUBERÍA DE FLUIDOS INTELIGENTE", + "block.create.smart_fluid_pipe.tooltip.summary": "Una _tubería de fluidos_ con un filtro. Puede especificar qué _fluidos_ pasan por ella", + "block.create.smart_fluid_pipe.tooltip.condition1": "Cuando se introducen fluidos en ella", + "block.create.smart_fluid_pipe.tooltip.behaviour1": "Las tuberías inteligentes que reciban fluidos que no coincidan con su filtro bloquearán el flujo", + "block.create.smart_fluid_pipe.tooltip.condition2": "Cuando es adyacente a un contenedor de fluido", + "block.create.smart_fluid_pipe.tooltip.behaviour2": "Las tuberías inteligentes que _inicien_ un _flujo_ desde cualquier contenedor sólo extraerán fluidos que _coincidan_ con su _filtro._", + + "block.create.spout.tooltip": "SURTIDOR", + "block.create.spout.tooltip.summary": "Un inyector para rellenar tus elementos de _fluidos._", + "block.create.spout.tooltip.condition1": "Transferencia de fluidos", + "block.create.spout.tooltip.behaviour1": "Cuando se coloca un _contenedor de fluidos_ como un _cubo_ o una _botella_ debajo, el caño intentará rellenarlo con su propio _fluido_ almacenado", + "block.create.spout.tooltip.condition2": "Automatización de fluidos", + "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _correa_ o _depósito_ reaccionará automáticamente con un contenedor de fluidos_ que pase por debajo", + + "block.create.item_drain.tooltip": "DRENADOR DE ELEMENTOS", + "block.create.item_drain.tooltip.summary": "Un depósito rallado para vaciar tus _artículos fluidos._", + "block.create.item_drain.tooltip.condition1": "Transferencia de fluidos", + "block.create.item_drain.tooltip.behaviour1": "Cuando un _contenedor de fluidos_, como un _cubo_ o una _botella_, se inserta desde el lateral, el desagüe intentará vaciarlo en su propio _contenedor de fluidos_. El artículo será entonces expulsado por el lado opuesto", + + "block.create.mechanical_arm.tooltip": "BRAZO MECÁNICO", + "block.create.mechanical_arm.tooltip.summary": "Artilugio avanzado para reubicar _elementos_", + "block.create.mechanical_arm.tooltip.condition1": "Transferencia de elementos", + "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Correas_, _Depósitos_, _Embudos_ y _Autoensambladores_", + "block.create.mechanical_arm.tooltip.control1": "Mientras está en la mano", + "block.create.mechanical_arm.tooltip.action1": "Haz clic con el botón derecho en un _objeto accesible del inventario_ para establecerlo como _fuente_ para el _brazo mecánico_. Haz clic con el botón derecho del ratón dos veces para establecerlo como _destino_", + "block.create.mechanical_arm.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa", + "block.create.mechanical_arm.tooltip.action2": "Establece el comportamiento de orden de los _items_ emitidos por el _brazo mecánico_", + + "item.create.wand_of_symmetry.tooltip": "VARITA DE SIMETRÍA", + "item.create.wand_of_symmetry.tooltip.summary": "Refleja perfectamente la colocación de bloques en los planos configurados", + "item.create.wand_of_symmetry.tooltip.condition1": "Mientras está en el inventario rápido", + "item.create.wand_of_symmetry.tooltip.behaviour1": "Permanece activo", + "item.create.wand_of_symmetry.tooltip.control1": "Click derecho en el suelo", + "item.create.wand_of_symmetry.tooltip.action1": "_Crea_ o _Mueve_ el Espejo", + "item.create.wand_of_symmetry.tooltip.control2": "Click derecho en el aire", + "item.create.wand_of_symmetry.tooltip.action2": "_Quita_ el Espejo activo", + "item.create.wand_of_symmetry.tooltip.control3": "Click derecho mientras se agacha", + "item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz de Configuración_", + + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", + "item.create.handheld_blockzapper.tooltip.summary": "Novedoso artefacto para colocar o intercambiar bloques a distancia", + "item.create.handheld_blockzapper.tooltip.control1": "Click izquierdo en un bloque", + "item.create.handheld_blockzapper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", + "item.create.handheld_blockzapper.tooltip.control2": "Click derecho en un bloque", + "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ o _Reemplaza_ el bloque objetivo", + "item.create.handheld_blockzapper.tooltip.control3": "Click derecho mientras se agacha", + "item.create.handheld_blockzapper.tooltip.action3": "Abre la _Interfaz de Configuración_", + + "item.create.handheld_worldshaper.tooltip": "WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "Práctica herramienta para crear _paisajes_ y _características del terreno_", + "item.create.handheld_worldshaper.tooltip.control1": "Click izquierdo en un bloque", + "item.create.handheld_worldshaper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", + "item.create.handheld_worldshaper.tooltip.control2": "Click derecho en un bloque", + "item.create.handheld_worldshaper.tooltip.action2": "Aplica el _pincel_ y la _herramienta_ actualmente seleccionadas en el lugar deseado.", + "item.create.handheld_worldshaper.tooltip.control3": "Click derecho mientras se agacha", + "item.create.handheld_worldshaper.tooltip.action3": "Abre la _Interfaz de Configuración_", + + "item.create.tree_fertilizer.tooltip": "FERTILIZANTE PARA ÁRBOLES", + "item.create.tree_fertilizer.tooltip.summary": "Una potente combinación de minerales adecuada para acelerar el crecimiento de los tipos de árboles más comunes", + "item.create.tree_fertilizer.tooltip.condition1": "Cuando se utiliza en un árbol joven", + "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles _independientemente_ de sus condiciones de _espacio_", + + "item.create.deforester.tooltip": "DEFORESTADOR", + "item.create.deforester.tooltip.summary": "Un hacha _radiante_ capaz de talar árboles en una fracción de segundo", + + "item.create.extendo_grip.tooltip": "AGARRE EXTENDIDO", + "item.create.extendo_grip.tooltip.summary": "¡Boioioing! Aumenta enormemente la _distancia de alcance_ del portador", + "item.create.extendo_grip.tooltip.condition1": "Cuando está fuera de la mano", + "item.create.extendo_grip.tooltip.behaviour1": "Aumenta la _distancia de alcance_ de los objetos usados en la _mano principal_", + + "item.create.filter.tooltip": "FILTRO", + "item.create.filter.tooltip.summary": "Controla las salidas_ y _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de elementos_ o varios _filtros anidados_", + "item.create.filter.tooltip.condition1": "Cuando está en la ranura del filtro", + "item.create.filter.tooltip.behaviour1": "Controla_ el flujo del elemento según su _configuración_", + "item.create.filter.tooltip.condition2": "Cuando se hace clic derecho", + "item.create.filter.tooltip.behaviour2": "Abre la interfaz de _configuración_", + + "item.create.attribute_filter.tooltip": "FILTRO DE ATRIBUTOS", + "item.create.attribute_filter.tooltip.summary": "Controla las salidas_ y las _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de _atributos_ y _categorías_ de artículos", + "item.create.attribute_filter.tooltip.condition1": "Cuando está en la ranura del filtro", + "item.create.attribute_filter.tooltip.behaviour1": "Controla el flujo del elemento según su _configuración_", + "item.create.attribute_filter.tooltip.condition2": "Cuando se hace clic derecho", + "item.create.attribute_filter.tooltip.behaviour2": "Abre la interfaz de _configuración_", + + "item.create.empty_schematic.tooltip": "ESQUEMA VACÍO", + "item.create.empty_schematic.tooltip.summary": "Se utiliza como ingrediente de las recetas y para escribir en la _tabla de esquemas_", + + "item.create.schematic.tooltip": "ESQUEMA", + "item.create.schematic.tooltip.summary": "Contiene una estructura para ser posicionada y colocada en el mundo. Posiciona el holograma como se desee y utiliza un _Esquematicannon_ para construirlo", + "item.create.schematic.tooltip.condition1": "Cuando se mantiene", + "item.create.schematic.tooltip.behaviour1": "Se puede posicionar utilizando las herramientas en pantalla", + "item.create.schematic.tooltip.control1": "Click derecho mientras se agacha", + "item.create.schematic.tooltip.action1": "Abre una _Interfaz_ para introducir las _Coordenadas_ exactas", + + "item.create.schematic_and_quill.tooltip": "ESQUEMA Y PLUMA", + "item.create.schematic_and_quill.tooltip.summary": "Se utiliza para guardar una estructura de tu mundo en un archivo .nbt", + "item.create.schematic_and_quill.tooltip.condition1": "Paso 1", + "item.create.schematic_and_quill.tooltip.behaviour1": "Selecciona dos puntos de esquina usando click derecho", + "item.create.schematic_and_quill.tooltip.condition2": "Paso 2", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Rueda del ratón_ en las caras para ajustar el tamaño. Click derecho de nuevo para guardar", + "item.create.schematic_and_quill.tooltip.control1": "Click derecho", + "item.create.schematic_and_quill.tooltip.action1": "Seleccionar un punto de esquina / confirmar guardar", + "item.create.schematic_and_quill.tooltip.control2": "Al mantener Ctrl", + "item.create.schematic_and_quill.tooltip.action2": "Seleccionar puntos en _medio del aire_. Rueda del ratón para ajustar la distancia", + "item.create.schematic_and_quill.tooltip.control3": "Click derecho mientras se agacha", + "item.create.schematic_and_quill.tooltip.action3": "Reinicia_ y elimina la selección", + + "block.create.schematicannon.tooltip": "ESQUEMATICAÑÓN", + "block.create.schematicannon.tooltip.summary": "Dispara bloques para recrear un _Esquema_ desplegado en el Mundo. Utiliza elementos de los inventarios adyacentes y _Pólvora_ como combustible.", + "block.create.schematicannon.tooltip.control1": "Cuando se hace clic derecho", + "block.create.schematicannon.tooltip.action1": "Abre la _Interfaz_ de configuración", + + "block.create.schematic_table.tooltip": "TABLA DE ESQUEMAS", + "block.create.schematic_table.tooltip.summary": "Escribe los esquemas guardados en un _esquema vacío_", + "block.create.schematic_table.tooltip.condition1": "Cuando se da un esquema vacío", + "block.create.schematic_table.tooltip.behaviour1": "Carga un archivo elegido de la carpeta de esquemas", + + "block.create.shaft.tooltip": "EJE", + "block.create.shaft.tooltip.summary": "_Retransmite la rotación_ en línea recta", + + "block.create.cogwheel.tooltip": "RUEDA DENTADA", + "block.create.cogwheel.tooltip.summary": "_Retransmite la rotación_ en línea recta, y a las _ruedas dentadas_ adyacentes", + + "block.create.large_cogwheel.tooltip": "RUEDA DENTADA GRANDE", + "block.create.large_cogwheel.tooltip.summary": "Una versión más grande de la _Rueda dentada_, que permite _cambiar_ la _Velocidad de Rotación_ cuando se conecta a su contraparte más pequeña", + + "block.create.encased_shaft.tooltip": "EJE REVESTIDO", + "block.create.encased_shaft.tooltip.summary": "_Retransmite la rotación_ en línea recta. Adecuado para propagar la Rotación a través de Muros", + + "block.create.gearbox.tooltip": "CAJA DE TRANSMISIÓN", + "block.create.gearbox.tooltip.summary": "_Retransmite la rotación_ en _cuatro direcciones_. Invierte las conexiones rectas", + + "block.create.gearshift.tooltip": "CAJA DE CAMBIOS", + "block.create.gearshift.tooltip.summary": "Un control para alternar la dirección de rotación de los ejes conectados", + "block.create.gearshift.tooltip.condition1": "Cuando se alimenta", + "block.create.gearshift.tooltip.behaviour1": "_Invierte_ la rotación de salida", + + "block.create.clutch.tooltip": "UNLOCALIZED: CLUTCH", + "block.create.clutch.tooltip.summary": "Un control para conectar/desconectar la rotación de los ejes conectados", + "block.create.clutch.tooltip.condition1": "Cuando se acciona", + "block.create.clutch.tooltip.behaviour1": "_Detiene_ el transporte de la rotación al otro lado", + + "block.create.encased_chain_drive.tooltip": "CADENA DE TRANSMISIÓN REVESTIDA", + "block.create.encased_chain_drive.tooltip.summary": "_Retransmite la rotación_ en línea recta y a las cadenas de transmisión adyacentes. Las cadenas de transmisión se conectan en un grupo cuando se colocan junto a otra en cualquier cara sin eje. Su orientación no tiene que coincidir", + "block.create.encased_chain_drive.tooltip.condition1": "Cuando se conecta", + "block.create.encased_chain_drive.tooltip.behaviour1": "Los bloques conectados transmitirán la _velocidad de rotación_ y la dirección de este componente", + + "block.create.adjustable_chain_gearshift.tooltip": "CADENA DE TRANSMISIÓN AJUSTABLE", + "block.create.adjustable_chain_gearshift.tooltip.summary": "_Retransmite el giro_ en línea recta y a las _cadenas adyacentes_. El Redstone analógo proporcionada a este bloque controlará qué tamaño de rueda motriz se acopla a las cadenas de transmisión adyacentes", + "block.create.adjustable_chain_gearshift.tooltip.condition1": "Control de Redstone", + "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "_Sin señal_, los accionamientos de cadena adyacentes transmitirán la _misma velocidad._ Con una señal de _fuerza completa_, los accionamientos de cadena adyacentes transmitirán exactamente _el doble de su velocidad._ Cualquier cosa entre medias dará resultados entre 1-2x su velocidad", + + "item.create.belt_connector.tooltip": "CORREA", + "item.create.belt_connector.tooltip.summary": "Conecta dos o más _ejes_ con una _Correa_. Los ejes conectados tendrán exactamente la misma velocidad y dirección de rotación. La correa puede actuar como _Transportador_ para _Estados_ y _Entidades_", + "item.create.belt_connector.tooltip.control1": "Click derecho en el eje", + "item.create.belt_connector.tooltip.action1": "Selecciona el eje como una polea de la correa. Los dos ejes seleccionados tienen que estar _alineados_ ya sea _Verticalmente_, _Horizontalmente_ o _Diagonalmente_ hacia la dirección de la correa", + "item.create.belt_connector.tooltip.control2": "Click derecho mientras te agachas", + "item.create.belt_connector.tooltip.action2": "_Reinicia_ la primera posición seleccionada para la correa", + + "item.create.goggles.tooltip": "GAFAS DEL INGENIERO", + "item.create.goggles.tooltip.summary": "Un par de gafas para aumentar tu visión con útil información _cinética_", + "item.create.goggles.tooltip.condition1": "Cuando se llevan puestas", + "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _Nivel de velocidad_ de un componente cinético colocado, así como el _Impacto de estrés_ y la _Capacidad_ de los componentes individuales.", + "item.create.goggles.tooltip.condition2": "Al mirar el medidor", + "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre _Velocidad_ o _Estrés_ de la red a la que está conectado el medidor", + + "item.create.wrench.tooltip": "LLAVE INGLESA", + "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artilugios cinéticos. Se puede utilizar para _Rotar_, _Desmantelar_ y para _Configurar_ componentes", + "item.create.wrench.tooltip.control1": "Click con el botón derecho en un bloque cinético", + "item.create.wrench.tooltip.action1": "_Rota los componentes_ hacia o desde la cara con la que ha interactuado", + "item.create.wrench.tooltip.control2": "Click derecho mientras te agachas", + "item.create.wrench.tooltip.action2": "Desmonta los componentes cinéticos_ y los devuelve a _tu inventario_", + + "block.create.creative_motor.tooltip": "MOTOR CREATIVO", + "block.create.creative_motor.tooltip.summary": "Una fuente configurable de _Fuerza Rotativa_", + + "block.create.water_wheel.tooltip": "RUEDA HIDRÁULICA MECÁNICA", + "block.create.water_wheel.tooltip.summary": "Proporciona _Fuerza de rotación_ tomada de las _Corrientes de agua_ adyacentes", + + "block.create.encased_fan.tooltip": "VENTILADOR REVESTIDO", + "block.create.encased_fan.tooltip.summary": "Convierte la _fuerza de rotación_ en _corrientes de aire_ y viceversa. Tiene una gran variedad de usos", + "block.create.encased_fan.tooltip.condition1": "Cuando es alimentado por Redstone", + "block.create.encased_fan.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a partir de cualquier _fuente de calor_ inmediatamente inferior. El ventilador debe estar orientado hacia abajo", + "block.create.encased_fan.tooltip.condition2": "Cuando es impulsado por la cinética", + "block.create.encased_fan.tooltip.behaviour2": "_Empuja_ o _Tira_ de Entidades, dependiendo de la velocidad de Rotación entrante", + "block.create.encased_fan.tooltip.condition3": "Al soplar a través de bloques especiales", + "block.create.encased_fan.tooltip.behaviour3": "Se emiten partículas de _Líquidos_ y _Fuego_ en el flujo de aire. Esto puede utilizarse para _procesar objetos_", + + "block.create.nozzle.tooltip": "BOQUILLA", + "block.create.nozzle.tooltip.summary": "Se acopla a la parte delantera de un _ventilador revestido_ para distribuir su efecto sobre las entidades en _todas las direcciones_", + + "block.create.hand_crank.tooltip": "MANIVELA", + "block.create.hand_crank.tooltip.summary": "Una sencilla _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. Ten cuidado de no agotarte!", + "block.create.hand_crank.tooltip.condition1": "Cuando se usa", + "block.create.hand_crank.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a un artilugio acoplado. _Se puede revertir_ la rotación", + + "block.create.cuckoo_clock.tooltip": "RELOJ DE CUCO", + "block.create.cuckoo_clock.tooltip.summary": "Fina artesanía para _decorar_ un espacio y _contar el tiempo_", + "block.create.cuckoo_clock.tooltip.condition1": "Cuando es alimentado por cinética", + "block.create.cuckoo_clock.tooltip.behaviour1": "Muestra la _hora actual_ y toca una melodía dos veces al día. Se activa_ una vez al _mediodía_ y al anochecer, en cuanto _los jugadores pueden dormir_", + + "block.create.turntable.tooltip": "PLATAFORMA GIRATORIA", + "block.create.turntable.tooltip.summary": "Convierte la _fuerza de rotación_ en un refinado mareo", + + "block.create.millstone.tooltip": "PIEDRA DEL MOLINO", + "block.create.millstone.tooltip.summary": "Un componente cinético adecuado para _moler_ materiales insertados. Puede ser alimentado por una rueda dentada adyacente o conectándose al eje de la parte inferior. Los resultados tienen que ser extraídos del componente", + "block.create.millstone.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.millstone.tooltip.behaviour1": "Comienza a aplicar _recetas de fresado_ a cualquier elemento insertado desde el lateral o la parte superior del bloque", + "block.create.millstone.tooltip.condition2": "Cuando se hace clic derecho", + "block.create.millstone.tooltip.behaviour2": "Recoge las salidas manualmente", + + "block.create.crushing_wheel.tooltip": "RUEDA DE TRITURACIÓN", + "block.create.crushing_wheel.tooltip.summary": "Grandes ruedas giratorias que _rompen_ cualquier cosa", + "block.create.crushing_wheel.tooltip.condition1": "Cuando se une a otra rueda trituradora", + "block.create.crushing_wheel.tooltip.behaviour1": "Forma una máquina trituradora para procesar una variedad de cosas. Los dientes de las ruedas tienen que conectarse y moverse con la _misma velocidad_ en _direcciones opuestas_", + + "block.create.mechanical_press.tooltip": "PRENSA MECÁNICA", + "block.create.mechanical_press.tooltip.summary": "Un pistón de fuerza para comprimir los objetos que tiene debajo. Requiere una _fuerza de rotación_ constante", + "block.create.mechanical_press.tooltip.condition1": "Cuando es impulsado por Redstone", + "block.create.mechanical_press.tooltip.behaviour1": "Comienza a _comprimir_ los objetos que caen debajo", + "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de una correa", + "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en la correa", + "block.create.mechanical_press.tooltip.condition3": "Cuando está por encima de la Cuenca", + "block.create.mechanical_press.tooltip.behaviour3": "Comienza a _compactar artículos_ en la cuenca siempre que estén presentes todos los ingredientes necesarios", + + "block.create.basin.tooltip": "CUENCA", + "block.create.basin.tooltip.summary": "Un práctico _contenedor de elementos_ utilizado en el procesamiento con la _Mezcladora mecánica_ y la _Prensa mecánica_. Soporta _Comparadores de Redstone_. Viene con un práctico filtro que especifica qué elementos deben crearse en esta cuenca", + "block.create.basin.tooltip.condition1": "Salida automática", + "block.create.basin.tooltip.behaviour1": "Cuando los _inventarios abiertos_ como cintas, otras cuencas, depósitos, desagües de fluidos y otros están _bajo un lado_ de una cuenca, recibirán automáticamente cualquier _salida de artículos/fluidos_ creada en la cuenca. Esto es útil para la automatización", + + "block.create.blaze_burner.tooltip": "QUEMADOR DE BLAZE", + "block.create.blaze_burner.tooltip.summary": "Un bloque donde se aloja un blaze domado para calentar una cuenca", + "block.create.blaze_burner.tooltip.condition1": "Cuando se coloca debajo de una cuenca", + "block.create.blaze_burner.tooltip.behaviour1": "Proporciona _calor_ a las recetas de la cuenca", + "block.create.blaze_burner.tooltip.condition2": "Cuando se utiliza el combustible en el Quemador de Blaze", + "block.create.blaze_burner.tooltip.behaviour2": "Aumenta el tiempo de combustión restante en el tiempo de combustión del horno del elemento utilizado. Consume el objeto. Utiliza _Torta de Blaze_ para altas temperaturas", + + "block.create.reinforced_rail.tooltip": "RAÍL REFORZADO", + "block.create.reinforced_rail.tooltip.summary": "Raíl estabilizado con madera, _no necesita soportes_", + + "block.create.mechanical_mixer.tooltip": "MEZCLADOR MECÁNICO", + "block.create.mechanical_mixer.tooltip.summary": "Un batidor cinético que proporciona recetas de elaboración automatizada de múltiples ingredientes. Requiere una _fuerza de rotación_ constante y una _cuenca_ colocada debajo (con un espacio intermedio)", + "block.create.mechanical_mixer.tooltip.condition1": "Cuando está por encima de la Cuenca", + "block.create.mechanical_mixer.tooltip.behaviour1": "Comienza a mezclar los elementos en la cuenca siempre que estén presentes todos los ingredientes necesarios. Para evitar recetas no deseadas, utilice la ranura del filtro de la cuenca o reduzca la fuerza de rotación hasta que se hayan añadido todos los ingredientes deseados", + + "block.create.mechanical_crafter.tooltip": "AUTOENSAMBLADOR MECÁNICO", + "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus correas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Autoensambladores", + "block.create.mechanical_crafter.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.mechanical_crafter.tooltip.behaviour1": "_Empieza el proceso de creación_ en cuanto _todos los crafters_ de la parrilla hayan recibido un objeto_", + "block.create.mechanical_crafter.tooltip.condition2": "Con pulso de Redstone", + "block.create.mechanical_crafter.tooltip.behaviour2": "_Fuerza_ el inicio del proceso de _creación_ con todos los _artículos_ dados actualmente en la parrilla", + "block.create.mechanical_crafter.tooltip.control1": "Cuando se arranca por delante", + "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un autoensamblador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las correas en un flujo_ que mueva todos los objetos hacia un autoensamblador final. El autoensamblador final debe _apuntar hacia fuera_ de la rejilla", + "block.create.mechanical_crafter.tooltip.control2": "Cuando se arranca hacia atrás", + "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los autoensambladores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", + + "block.create.furnace_engine.tooltip": "MOTOR DEL HORNO", + "block.create.furnace_engine.tooltip.summary": "Una poderosa fuente de _fuerza de rotación/torque_ que requiere un _horno en funcionamiento_ para funcionar", + "block.create.furnace_engine.tooltip.condition1": "Cuando se conecta a un horno encendido", + "block.create.furnace_engine.tooltip.behaviour1": "_Empieza a alimentar_ un _Horno_ colocado delante de él (a 1m de distancia). Utiliza un Alto Horno para obtener mayores velocidades", + + "block.create.flywheel.tooltip": "RUEDA DE INERCIA", + "block.create.flywheel.tooltip.summary": "Una gran rueda metálica para _conducir y estabilizar_ la fuerza generada por un _motor conectado_. Las ruedas de inercia se conectan a los motores si están a _1m de distancia_ y en un _ángulo de 90º_ entre ellos", + "block.create.flywheel.tooltip.condition1": "Cuando está unida a un motor en marcha", + "block.create.flywheel.tooltip.behaviour1": "Proporciona _fuerza de rotación_ a un artilugio conectado en función de la fuerza y la velocidad del generador", + + "block.create.portable_storage_interface.tooltip": "INTERFAZ DE ALMACENAMIENTO PORTÁTIL", + "block.create.portable_storage_interface.tooltip.summary": "Un punto de intercambio portátil para _mover elementos_ hacia y desde una _estructura_ movida por un pistón, rodamiento, vagoneta o polea. Para cumplirse dos interfaces tienen que _enfrentarse_ y estar separadas _1-2 bloques_", + "block.create.portable_storage_interface.tooltip.condition1": "Mientras se mueve", + "block.create.portable_storage_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátil_ estacionarias para transferir elementos hacia o desde el artilugio. Los componentes que se inserten o extraigan de la _interfaz estacionaria_ interactuarán con los inventarios del artilugio _directamente._ La estructura se detendrá brevemente mientras se intercambian los elementos.", + "block.create.portable_storage_interface.tooltip.condition2": "Cuando es alimentado por Redstone", + "block.create.portable_storage_interface.tooltip.behaviour2": "Desactiva_ cualquier conexión activa inmediatamente", + + "block.create.portable_fluid_interface.tooltip": "INTERFAZ DE FLUIDO PORTÁTIL", + "block.create.portable_fluid_interface.tooltip.summary": "Punto de intercambio portátil para _mover fluidos_ hacia y desde una _estructura_ movida por un pistón, rodamiento, vagoneta o polea. Para cumplirse dos interfaces tienen que _enfrentarse_ y estar separadas _1-2 bloques_", + "block.create.portable_fluid_interface.tooltip.condition1": "Mientras se mueve", + "block.create.portable_fluid_interface.tooltip.behaviour1": "Interactúa con las _interfaces de almacenamiento portátiles_ estacionarias para transferir fluidos hacia o desde el artilugio. Las tuberías que se inserten en la _interfaz estacionaria_ o se extraigan de ella interactuarán con los depósitos del artilugio _directamente._ La estructura se paralizará brevemente mientras se intercambian fluidos.", + "block.create.portable_fluid_interface.tooltip.condition2": "Cuando se alimenta con Redstone", + "block.create.portable_fluid_interface.tooltip.behaviour2": "_Desconecta_ cualquier conexión activa inmediatamente", + + "block.create.rotation_speed_controller.tooltip": "CONTROLADOR DE VELOCIDAD DE ROTACIÓN", + "block.create.rotation_speed_controller.tooltip.summary": "Un _relé_ configurable_ capaz de acelerar o ralentizar el componente de destino a cualquier velocidad deseada", + "block.create.rotation_speed_controller.tooltip.condition1": "Cuando se adjunta a una rueda dentada grande", + "block.create.rotation_speed_controller.tooltip.behaviour1": "Transmite la fuerza de rotación entrante a la rueda, intentando _igualar_ la _velocidad_ a la que está configurada. La _rueda mecánica_ tiene que estar _adherida en la parte superior_ del controlador", + + "block.create.mechanical_piston.tooltip": "PISTÓN MECÁNICO", + "block.create.mechanical_piston.tooltip.summary": "Una versión más avanzada del _Pistón_. Utiliza la _Fuerza de rotación_ para mover con precisión las estructuras que tiene delante. las pértigas de extensión del pistón_ en la parte trasera definen el _alcance_ de este dispositivo. Sin las extensiones, el pistón no se moverá. Utiliza _Chasis_ o _Bloques de Slime_ para mover más de una línea de bloques", + "block.create.mechanical_piston.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.mechanical_piston.tooltip.behaviour1": "Comienza a mover la estructura adjunta. La velocidad y la dirección se correlacionan con la velocidad de rotación entrante", + + "block.create.piston_extension_pole.tooltip": "PÉRTIGA DE EXTENSIÓN", + "block.create.piston_extension_pole.tooltip.summary": "Amplía la gama de _Pistones mecánicos_", + "block.create.piston_extension_pole.tooltip.condition1": "Cuando se acopla a un pistón mecánico", + "block.create.piston_extension_pole.tooltip.behaviour1": "Extiende el alcance de un pistón en 1 bloque", + + "block.create.mechanical_bearing.tooltip": "RODAMIENTO MECÁNICO", + "block.create.mechanical_bearing.tooltip.summary": "Se utiliza para girar _estructuras más grandes_ con fuerza de rotación", + "block.create.mechanical_bearing.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.mechanical_bearing.tooltip.behaviour1": "Inicia la rotación de los bloques adjuntos. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque", + + "block.create.windmill_bearing.tooltip": "RODAMIENTO DEL MOLINO DE VIENTO", + "block.create.windmill_bearing.tooltip.summary": "Se utiliza para aprovechar la _fuerza de rotación_ del viento. Coloca tu propio diseño y mira cómo gira!", + "block.create.windmill_bearing.tooltip.condition1": "Al hacer clic con el botón derecho", + "block.create.windmill_bearing.tooltip.behaviour1": "Comienza a proporcionar _Fuerza de rotación_ generada por la rotación de su estructura adjunta. La estructura tiene que incluir bloques de vela o lana adecuados. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque.", + + "block.create.sail_frame.tooltip": "MARCO DE VELA", + "block.create.sail_frame.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada sobre un _Rodamiento de molino_", + + "block.create.white_sail.tooltip": "VELA BLANCA", + "block.create.white_sail.tooltip.summary": "Un útil bloque de construcción y fuente de energía cinética cuando forma parte de una estructura montada en un _Rodamiento de molino_. Viene en una variedad de colores", + "block.create.white_sail.tooltip.condition1": "Cuando se hace clic con el botón derecho del ratón con tinte", + "block.create.white_sail.tooltip.behaviour1": "Cambia el color de la vela", + + "block.create.clockwork_bearing.tooltip": "RODAMIENTO DE RELOJ", + "block.create.clockwork_bearing.tooltip.summary": "Una versión avanzada del _rodamiento mecánico_ para hacer girar hasta dos _manecillas de reloj_ según la _hora actual_ en el _juego_", + "block.create.clockwork_bearing.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.clockwork_bearing.tooltip.behaviour1": "Comienza a girar la estructura adjunta hacia la _hora actual_. Si existe una segunda estructura independiente delante de la primera, servirá de _manecilla de las horas_", + + "block.create.sequenced_gearshift.tooltip": "CAMBIO DE MARCHAS SECUENCIADO", + "block.create.sequenced_gearshift.tooltip.summary": "Un _componente de utilidad programable_, que puede cambiar su _rendimiento rotacional_ según hasta _5 instrucciones consecutivas._ Utilízalo para alimentar Rodamientos Mecánicos, Pistones o Poleas con más control sobre la sincronización y la velocidad. Puede ser menos preciso a velocidades más altas", + "block.create.sequenced_gearshift.tooltip.condition1": "Cuando es impulsado por Redstone", + "block.create.sequenced_gearshift.tooltip.behaviour1": "_Ejecuta_ las instrucciones programadas en función de la velocidad de entrada", + "block.create.sequenced_gearshift.tooltip.condition2": "Cuando se hace clic derecho", + "block.create.sequenced_gearshift.tooltip.behaviour2": "Abre la _interfaz de configuración._", + + "block.create.cart_assembler.tooltip": "ENSAMBLADOR DE VAGONETAS", + "block.create.cart_assembler.tooltip.summary": "Cuando se coloca en un _Raíl_, puede _ensamblar_ y _desensamblar_ estructuras móviles en las vagonetas que pasan. Consulta [Ctrl] para conocer el comportamiento específico del tipo de raíl", + "block.create.cart_assembler.tooltip.condition1": "Artilugio de vagoneta simple", + "block.create.cart_assembler.tooltip.behaviour1": "Con un _miembro único_, las estructuras se anclarán y girarán en _una sola vagoneta_. Utilice una _Llave Inglesa_ para especificar el _comportamiento de rotación_ deseado", + "block.create.cart_assembler.tooltip.condition2": "Artilugio de vagonetas", + "block.create.cart_assembler.tooltip.behaviour2": "Dos ensambladores de vagonetas _conectadas por_ una _estructura_, una vez que ambos contengan una vagoneta, las conectará con un artilugio montado _entre los dos_. La estructura se comportará de forma similar a un _acoplador de vagonetas_", + "block.create.cart_assembler.tooltip.control1": "Cuando se coloca sobre un Rail", + "block.create.cart_assembler.tooltip.action1": "_Se monta_ en las vagonetas que pasan _cuando está alimentado_, _se desmonta_ en caso contrario", + "block.create.cart_assembler.tooltip.control2": "Cuando se coloca sobre un raíl energizado", + "block.create.cart_assembler.tooltip.action2": "Monta y _acelera_ las vagonetas _cuando está alimentado_, desmonta y _sostiene_ en caso contrario", + "block.create.cart_assembler.tooltip.control3": "Cuando se coloca sobre el raíl detector", + "block.create.cart_assembler.tooltip.action3": "_Monta vagonetas sin montar_, _desmonta vagonetas montadas_", + "block.create.cart_assembler.tooltip.control4": "Cuando se coloca sobre el raíl activador", + "block.create.cart_assembler.tooltip.action4": "Desmonta_ vagonetas cuando se activa", + + "block.create.rope_pulley.tooltip": "POLEA DE CUERDA", + "block.create.rope_pulley.tooltip.summary": "Mueve verticalmente los _bloques_ y _estructuras_ adjuntos. Utiliza _Chasis_, _Slime_ o _Súper Pegamento_ para mover más de un bloque", + "block.create.rope_pulley.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.rope_pulley.tooltip.behaviour1": "Comienza a mover la estructura adjunta. La velocidad y la dirección se correlacionan con la velocidad de rotación entrante", + + "block.create.linear_chassis.tooltip": "CHASIS LINEAL", + "block.create.linear_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", + "block.create.linear_chassis.tooltip.condition1": "Cuando se mueve", + "block.create.linear_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis adjuntos_ con la misma orientación, y una columna de Bloques dentro de su rango. Los bloques sólo serán arrastrados si la cara del chasis es _Pegajosa_ (Ver [Ctrl])", + "block.create.linear_chassis.tooltip.condition2": "Con Llave Inglesa", + "block.create.linear_chassis.tooltip.behaviour2": "Configura el _rango_ para este bloque de chasis. Mantenga pulsada la tecla CTRL para modificar también el rango de todos los bloques de chasis adjuntos", + "block.create.linear_chassis.tooltip.control1": "Cuando se hace clic derecho con slime", + "block.create.linear_chassis.tooltip.action1": "Hace que la cara sobre la que se ha hecho clic sea _pegajosa_. Cuando se mueva, el chasis _tirará_ de los bloques adjuntos, independientemente de la dirección del movimiento", + + "block.create.secondary_linear_chassis.tooltip": "CHASIS LINEAL SECUNDARIO", + "block.create.secondary_linear_chassis.tooltip.summary": "Un segundo tipo de _Chasis lineal_ que no se conecta al otro", + + "block.create.radial_chassis.tooltip": "UNLOCALIZED: ROTATION CHASSIS", + "block.create.radial_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", + "block.create.radial_chassis.tooltip.condition1": "Cuando se mueve", + "block.create.radial_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis_ adjuntos en una columna, y un cilindro de bloques a su alrededor. Los bloques que lo rodean sólo se mueven cuando están dentro del rango y están adheridos a un lado pegajoso (Ver [Ctrl]).", + "block.create.radial_chassis.tooltip.condition2": "Con Llave Inglesa", + "block.create.radial_chassis.tooltip.behaviour2": "Configura el _rango_ para este bloque de chasis. Mantenga pulsada la tecla CTRL para modificar también el rango de todos los bloques de chasis adjuntos", + "block.create.radial_chassis.tooltip.control1": "Cuando se hace clic derecho con slime", + "block.create.radial_chassis.tooltip.action1": "Hace que la cara sobre la que se ha hecho clic sea _pegajosa_. Cuando el chasis se mueve, todos los bloques designados unidos a la cara pegajosa se mueven con él", + + "block.create.mechanical_drill.tooltip": "TALADRO MECÁNICO", + "block.create.mechanical_drill.tooltip.summary": "Un dispositivo mecánico adecuado para _romper bloques_. Se puede mover con _pistones mecánicos_, _rodamientos_ u otros controladores", + "block.create.mechanical_drill.tooltip.condition1": "Cuando se mueve con cinética", + "block.create.mechanical_drill.tooltip.behaviour1": "Actúa como un rompebloques _estacionario_. También _hace daño a las entidades_ en su área efectiva", + "block.create.mechanical_drill.tooltip.condition2": "Mientras se mueve", + "block.create.mechanical_drill.tooltip.behaviour2": "Rompe los bloques con los que colisiona el taladro", + + "block.create.mechanical_harvester.tooltip": "COSECHADORA MECÁNICA", + "block.create.mechanical_harvester.tooltip.summary": "Una cosechadora mecánica adecuada para la automatización de cultivos a mediana escala. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros controladores", + "block.create.mechanical_harvester.tooltip.condition1": "Mientras se mueve", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Corta_ todos los _cultivos maduros_ con los que la cuchilla colisiona y los restablece a su estado de crecimiento inicial", + + "block.create.mechanical_plough.tooltip": "ARADO MECÁNICO", + "block.create.mechanical_plough.tooltip.summary": "Un arado mecánico tiene varios usos. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros mandos", + "block.create.mechanical_plough.tooltip.condition1": "Mientras se mueve", + "block.create.mechanical_plough.tooltip.behaviour1": "_Rompe bloques_ con los que _no se puede colisionar_, como antorchas, raíles o capas de nieve. _Aplica_ su _movimiento_ a las _entidades_ sin dañarlas. _Labra bloques de tierra_ como si se usara una azada en ellos", + + "block.create.mechanical_saw.tooltip": "SIERRA MECÁNICA", + "block.create.mechanical_saw.tooltip.summary": "Adecuada para _cortar árboles_ de forma eficaz y para _cortar bloques_ en sus homólogos carpinteros. Se puede mover mediante _pistones mecánicos_ o _rodamientos_", + "block.create.mechanical_saw.tooltip.condition1": "Cuando está orientado hacia arriba", + "block.create.mechanical_saw.tooltip.behaviour1": "Aplica las recetas _Serrar_ y _Estallar_ a los objetos que se dejan caer o se introducen en ella. Cuando hay varias salidas posibles, las recorre a menos que se asigne un _filtro_", + "block.create.mechanical_saw.tooltip.condition2": "Cuando se orienta horizontalmente", + "block.create.mechanical_saw.tooltip.behaviour2": "Rompe los troncos_ que tiene delante. Si el tronco soportaba un árbol por sí mismo, el _árbol se derrumbará_ lejos de la sierra", + "block.create.mechanical_saw.tooltip.condition3": "Mientras se mueve", + "block.create.mechanical_saw.tooltip.behaviour3": "_Corta_ todos los _Árboles_ con los que colisiona la sierra", + + "block.create.stockpile_switch.tooltip": "INTERRUPTOR DE ACOPIO", + "block.create.stockpile_switch.tooltip.summary": "Activa una señal de Redstone en función de la cantidad de _Artículos almacenados_ en el Contenedor adjunto. Viene con un práctico filtro. A diferencia de un _Comparador,_ el _Interruptor de acopio_ permite la configuración de _Umbrales,_ a partir de los cuales se invierten las señales", + "block.create.stockpile_switch.tooltip.condition1": "Cuando haces click derecho", + "block.create.stockpile_switch.tooltip.behaviour1": "Abre la _Interfaz de Configuración_", + + "block.create.content_observer.tooltip": "OBSERVADOR DE CONTENIDO", + "block.create.content_observer.tooltip.summary": "_Detecta artículos_ dentro de _contenedores_ y _transportadores_ que coinciden con un _filtro_ configurado. Mientras el _inventario_, la _cinta_ o la _canaleta_ observados contengan_ un artículo que coincida, este componente emitirá una _señal de Redstone_. Cuando un _túnel observado transfiere_ un artículo coincidente, este componente emitirá un _Pulso de Redstone_", + + "block.create.redstone_link.tooltip": "ENLACE DE REDSTONE", + "block.create.redstone_link.tooltip.summary": "Puntos finales para conexiones _Inalámbricas Redstone_. Se pueden asignar _frecuencias_ utilizando cualquier elemento. El alcance de la señal es limitado, aunque razonablemente lejano", + "block.create.redstone_link.tooltip.condition1": "Cuando se alimenta", + "block.create.redstone_link.tooltip.behaviour1": "Recibir enlaces de la misma _Frecuencia_ producirá una señal de Redstone", + "block.create.redstone_link.tooltip.control1": "Cuando se hace Clic derecho con un ítem", + "block.create.redstone_link.tooltip.action1": "Establece la _Frecuencia_ a ese elemento. Se pueden utilizar un total de _dos elementos diferentes_ en combinación para definir una Frecuencia", + "block.create.redstone_link.tooltip.control2": "Cuando se hace clic derecho mientras se agacha", + "block.create.redstone_link.tooltip.action2": "Cambia entre el modo _Receptor_ y _Transmisor_", + + "block.create.nixie_tube.tooltip": "TUBO NIXIE", + "block.create.nixie_tube.tooltip.summary": "Un elegante _visualizador_ de _números y texto_ potenciados por Redstone", + "block.create.nixie_tube.tooltip.condition1": "Cuando se alimenta", + "block.create.nixie_tube.tooltip.behaviour1": "Muestra el valor actual de la _Fuerza de la señal Redstone_", + "block.create.nixie_tube.tooltip.condition2": "Con etiqueta de nombre", + "block.create.nixie_tube.tooltip.behaviour2": "Mostrar el _contenido_ de su _etiqueta de nombre_ con varios tubos nixie _ordenados_ en una _línea_", + + "block.create.redstone_contact.tooltip": "CONTACTO DE REDSTONE", + "block.create.redstone_contact.tooltip.summary": "Solo emite energía de Redstone por parejas. Se puede mover con _Pistones mecánicos_, _Rodamientos_ u otros controladores", + "block.create.redstone_contact.tooltip.condition1": "Cuando se enfrenta a otro Contacto", + "block.create.redstone_contact.tooltip.behaviour1": "Proporciona una _señal de Redstone_", + "block.create.redstone_contact.tooltip.condition2": "Mientras se mueve", + "block.create.redstone_contact.tooltip.behaviour2": "Activa todos los contactos estacionarios que pasa", + + "block.create.adjustable_crate.tooltip": "CAJA AJUSTABLE", + "block.create.adjustable_crate.tooltip.summary": "Este _Contenedor de Artículos_ permite el control manual de su capacidad. Puede contener hasta _16 pilas_ de cualquier objeto. Soporta _Comparadores de Redstone_", + "block.create.adjustable_crate.tooltip.control1": "Cuando haces click derecho", + "block.create.adjustable_crate.tooltip.action1": "Abre la _Interfaz_", + + "block.create.creative_crate.tooltip": "CAJA CREATIVA", + "block.create.creative_crate.tooltip.summary": "Este _Contenedor de Almacenamiento_ permite la replicación infinita de cualquier elemento. Colócalo junto a un _Schematicannon_ para eliminar cualquier requisito de material", + "block.create.creative_crate.tooltip.condition1": "Cuando el artículo está en la ranura del filtro", + "block.create.creative_crate.tooltip.behaviour1": "Todo lo que se _extraiga_ de este contenedor proporcionará un _suministro ilimitado_ del elemento especificado. Los elementos _insertados_ en esta caja serán _evitados._", + + "block.create.deployer.tooltip": "DESPLEGADOR", + "block.create.deployer.tooltip.summary": "_Lanza_, _Usa_ y _Activa_. Esta máquina intentará _imitar_ a un _jugador_ en la medida de lo posible. Puede _tomar_ y _depositar objetos_ en su propio _inventario_. Los objetos guardados deben ser _insertados_ y _extraídos_ del bloque directamente", + "block.create.deployer.tooltip.condition1": "Cuando se alimenta de cinética", + "block.create.deployer.tooltip.behaviour1": "Extiende su brazo y se _activa_ en el espacio del bloque _2m por delante_ de sí mismo", + "block.create.deployer.tooltip.condition2": "Click derecho con la Llave Inglesa", + "block.create.deployer.tooltip.behaviour2": "Activa el modo puñetazo. En el _modo puñetazo_, el Desplegador intentará usar su objeto para _romper bloques_ o _herir entidades_", + "block.create.deployer.tooltip.condition3": "Cuando se asigna el filtro", + "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos.", + + "block.create.brass_casing.tooltip": "REVESTIDOR DE LATÓN", + "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _correas._", + + "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSOS DE REDSTONE", + "block.create.pulse_repeater.tooltip.summary": "Un circuito sencillo para cortar las señales de Redstone que pasan a una longitud de _1 tick_", + + "block.create.adjustable_repeater.tooltip": "REPETIDOR AJUSTABLE", + "block.create.adjustable_repeater.tooltip.summary": "Un avanzado _repetidor de Redstone_ con un _retraso configurable_ de hasta 30 minutos", + + "block.create.adjustable_pulse_repeater.tooltip": "REPETIDOR DE PULSO AJUSTABLE", + "block.create.adjustable_pulse_repeater.tooltip.summary": "Un _repetidor de pulsos_ con un _retardo configurable_ de hasta 30 minutos", + + "block.create.analog_lever.tooltip": "PALANCA ANALÓGICA", + "block.create.analog_lever.tooltip.summary": "Una palanca con un control más _preciso_ sobre su fuerza de _señal_ emitida", + + "block.create.powered_toggle_latch.tooltip": "PALANCA MECANIZADA", + "block.create.powered_toggle_latch.tooltip.summary": "Una palanca que puede ser accionada por un _Pulso de Redstone_", + + "block.create.powered_latch.tooltip": "PALANCA DE CIERRE MECANIZADA", + "block.create.powered_latch.tooltip.summary": "Una palanca que puede ser controlada por _señales de Redstone_. Una señal en la _trasera la habilita_, una señal desde el _lado la reinicia_", + + "block.create.controller_rail.tooltip": "RAÍL DE CONTROL", + "block.create.controller_rail.tooltip.summary": "Un _raíl energizado unidireccional_ capaz de _controlar con precisión_ la _velocidad de movimiento_ de una vagoneta", + "block.create.controller_rail.tooltip.condition1": "Cuando es impulsado por Redstone", + "block.create.controller_rail.tooltip.behaviour1": "_Acelera_ o _Desacelera_ pasando _vagonetas_ correspondientes a la _fuerza de la señal_. Propaga la energía de Redstone a los Raíles de control adyacentes. Al alimentar dos Raíles de control con diferentes intensidades, los carriles entre ellos interpolarán su señal", + + "block.create.speedometer.tooltip": "VELOCÍMETRO", + "block.create.speedometer.tooltip.summary": "Mide y muestra la _velocidad de rotación_ de los componentes cinéticos acoplados. Es compatible con _comparadores de Redstone_", + "block.create.speedometer.tooltip.condition1": "Cuando es impulsado por la cinética", + "block.create.speedometer.tooltip.behaviour1": "Indica un color correspondiente al nivel de velocidad. El _Verde_ indica Lento, el _Azul_ Moderado y el _Púrpura_ Rápido. Algunos componentes mecánicos requieren un nivel de velocidad suficiente para funcionar correctamente", + + "block.create.stressometer.tooltip": "ESTRESÓMETRO", + "block.create.stressometer.tooltip.summary": "Mide y muestra el _estrés global_ de la red cinética adjunta. Es compatible con _comparadores de Redstone_", + "block.create.stressometer.tooltip.condition1": "Cuando se alimenta con cinética", + "block.create.stressometer.tooltip.behaviour1": "Indica un color correspondiente al nivel de estrés. Las redes demasiado estresadas dejarán de moverse. El estrés puede aliviarse añadiendo más _fuentes de rotación_ a la red", + + "item.create.sand_paper.tooltip": "PAPEL DE LIJA", + "item.create.sand_paper.tooltip.summary": "Un papel rugoso que se puede utilizar para _pulir materiales_. Se puede aplicar automáticamente con el Desplegador", + "item.create.sand_paper.tooltip.condition1": "Cuando se usa", + "item.create.sand_paper.tooltip.behaviour1": "Aplica el pulido a los objetos sostenidos en la _mano libre_ o tirados en el _suelo_ cuando se _miran_", + + "item.create.super_glue.tooltip": "SÚPER PEGAMENTO", + "item.create.super_glue.tooltip.summary": "Pega un bloque a otro y serán inseparables para siempre", + "item.create.super_glue.tooltip.condition1": "Cuando se usa", + "item.create.super_glue.tooltip.behaviour1": "Hace que la cara _clicada_ de un bloque sea _pegajosa_. Los bloques unidos a caras pegajosas serán _arrastrados_ cuando se muevan por _pistones mecánicos_, _rodamientos_ y otros controladores", + "item.create.super_glue.tooltip.condition2": "Cuando se sostiene en la mano", + "item.create.super_glue.tooltip.behaviour2": "_Adjunta automáticamente_ los bloques colocados desde la mano principal al _lado_ contra el que fueron _colocados._", + + "item.create.builders_tea.tooltip": "TÉ DEL CONSTRUCTOR", + "item.create.builders_tea.tooltip.summary": "La bebida perfecta para empezar el día- _Motivante_ y _Saturante._", + + "item.create.refined_radiance.tooltip": "RESPLANDOR REFINADO", + "item.create.refined_radiance.tooltip.summary": "Material cromático forjado a partir de _luz absorbida_", + + "item.create.shadow_steel.tooltip": "ACERO SOMBRÍO", + "item.create.shadow_steel.tooltip.summary": "Un material cromático forjado _en el vacío_", + + "item.create.minecart_coupling.tooltip": "ENSAMBLADOR DE VAGONETAS", + "item.create.minecart_coupling.tooltip.summary": "_Encadena_ todas tus _Vagonetas_ o _Artilugios de vagoneta_ para formar un majestuoso Tren", + "item.create.minecart_coupling.tooltip.condition1": "Cuando se utiliza en Vagonetas", + "item.create.minecart_coupling.tooltip.behaviour1": "_Acopla_ dos Vagonetas, intentando mantenerlas a una _distancia constante_ mientras se mueven", + + "item.create.crafter_slot_cover.tooltip": "TAPA DE RANURA DEL AUTOENSAMBLADOR", + "item.create.crafter_slot_cover.tooltip.summary": "Se utiliza para marcar a un _Autoensamblador_ una ranura vacía en una receta. Los autoensambladores no tienen que formar necesariamente una cuadrícula completa. Esto es útil cuando hay recetas en las que los _ingredientes están en diagonal_ entre sí", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "¡Trabajo en curso!", + "create.tooltip.randomWipDescription0": "Por favor, mantenga este artículo fuera del alcance de los niños", + "create.tooltip.randomWipDescription1": "Un bebé panda muere cada vez que usas este objeto. Cada vez. Cada vez", + "create.tooltip.randomWipDescription2": "Úsalo bajo tu propio riesgo", + "create.tooltip.randomWipDescription3": "Este no es el objeto que buscas, *mueve los dedos* por favor, dispérsate", + "create.tooltip.randomWipDescription4": "Este objeto se autodestruirá en 10 segundos. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Créeme, es inútil", + "create.tooltip.randomWipDescription6": "Al utilizar este elemento, aceptas nuestra exención de responsabilidad y estás de acuerdo con sus términos", + "create.tooltip.randomWipDescription7": "Este quizás no es para ti. ¿Qué tal ese?", + "create.tooltip.randomWipDescription8": "Úsalo y arrepiéntete de tu decisión inmediatamente", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index cd21e7d30..009a7b1cf 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 893", + "_": "Missing Localizations: 899", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", - "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", - "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 948230e1b..2116543a7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 673", + "_": "Missing Localizations: 681", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "Bouger sur la ligne de haut à %1$s%%", "create.gui.sequenced_gearshift.title": "Décaleur de rotation séquencé", "create.gui.sequenced_gearshift.instruction": "Instructions", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "Tourner", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "Piston", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distance", - "create.gui.sequenced_gearshift.instruction.wait": "Attente", - "create.gui.sequenced_gearshift.instruction.wait.duration": "Durée", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "Fin", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "Vitesse, direction", "create.gui.sequenced_gearshift.speed.forward": "Vitesse d'entrée, normal", "create.gui.sequenced_gearshift.speed.forward_fast": "Vitesse double, normal", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 13d8ed291..6df82e369 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 8", + "_": "Missing Localizations: 16", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "Muovi su al %1$s%%", "create.gui.sequenced_gearshift.title": "Cambio sequenziale", "create.gui.sequenced_gearshift.instruction": "Istruzione", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "Gira", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Angolo", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "Pistone", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distanza", - "create.gui.sequenced_gearshift.instruction.wait": "Aspetta", - "create.gui.sequenced_gearshift.instruction.wait.duration": "Durata", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "Fine", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "Velocità, direzione", "create.gui.sequenced_gearshift.speed.forward": "Velocità di ingresso, avanti", "create.gui.sequenced_gearshift.speed.forward_fast": "Doppia velocità, avanti", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 28f8de6ec..6ee30f977 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 15", + "_": "Missing Localizations: 23", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "動作の上限は%1$s%%", "create.gui.sequenced_gearshift.title": "シーケンスギアシフト", "create.gui.sequenced_gearshift.instruction": "命令", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "回転", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "ピストン", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距離", - "create.gui.sequenced_gearshift.instruction.wait": "待機", - "create.gui.sequenced_gearshift.instruction.wait.duration": "期間", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "終了", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "速度, 方向", "create.gui.sequenced_gearshift.speed.forward": "入力速度, 正転", "create.gui.sequenced_gearshift.speed.forward_fast": "倍速, 正転", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 8ca0489d9..9b1cd4c97 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 62", + "_": "Missing Localizations: 70", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "최소 신호 유지 비율:%1$s%%", "create.gui.sequenced_gearshift.title": "순서 기어쉬프트", "create.gui.sequenced_gearshift.instruction": "설명", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "회전", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "각도", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "피스톤", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "거리", - "create.gui.sequenced_gearshift.instruction.wait": "정지", - "create.gui.sequenced_gearshift.instruction.wait.duration": "지속시간", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "마침", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "속도, 방향", "create.gui.sequenced_gearshift.speed.forward": "입력된 속도, 그대로 회전", "create.gui.sequenced_gearshift.speed.forward_fast": "입력된 속도의 2배, 그대로 회전", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index d6a6028c0..7a8f2be49 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1162", + "_": "Missing Localizations: 1168", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", - "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", - "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index f0dfdb74c..07b2008c1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1228", + "_": "Missing Localizations: 1234", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", - "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", - "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index d3f6012f0..8b9dca7e1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 12", + "_": "Missing Localizations: 20", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "Двигаться к верхней линии при %1$s%%", "create.gui.sequenced_gearshift.title": "Последовательное переключение передач", "create.gui.sequenced_gearshift.instruction": "Инструкция", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Угол", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "Поршень", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Расстояние", - "create.gui.sequenced_gearshift.instruction.wait": "Перерыв", - "create.gui.sequenced_gearshift.instruction.wait.duration": "Продолжительность", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "Конец", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "Скорость, Направление", "create.gui.sequenced_gearshift.speed.forward": "Скорость ввода, вперед", "create.gui.sequenced_gearshift.speed.forward_fast": "Двойная скорость, вперед", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 27d0fe7fd..f93e00348 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 10", + "_": "Missing Localizations: 18", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "移至上线%1$s%%", "create.gui.sequenced_gearshift.title": "可编程齿轮箱", "create.gui.sequenced_gearshift.instruction": "指令", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "旋转", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "驱动活塞", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距离", - "create.gui.sequenced_gearshift.instruction.wait": "等待", - "create.gui.sequenced_gearshift.instruction.wait.duration": "间隔", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "停止", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "速度,速度方向", "create.gui.sequenced_gearshift.speed.forward": "一倍速,正向", "create.gui.sequenced_gearshift.speed.forward_fast": "两倍速,正向", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index caa0f9444..c113fca25 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 15", + "_": "Missing Localizations: 23", "_": "->------------------------] Game Elements [------------------------<-", @@ -846,13 +846,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "移至上線%1$s%%", "create.gui.sequenced_gearshift.title": "可程式化齒輪箱", "create.gui.sequenced_gearshift.instruction": "指令", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "旋轉", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "驅動活塞", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距離", - "create.gui.sequenced_gearshift.instruction.wait": "等待", - "create.gui.sequenced_gearshift.instruction.wait.duration": "間隔", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", "create.gui.sequenced_gearshift.instruction.end": "停止", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", "create.gui.sequenced_gearshift.speed": "速度,速度方向", "create.gui.sequenced_gearshift.speed.forward": "一倍速,正向", "create.gui.sequenced_gearshift.speed.forward_fast": "兩倍速,正向", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 3446861fb..1c89a813d 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -408,10 +408,10 @@ public class AllBlocks { REGISTRATE.block("crushing_wheel_controller", CrushingWheelControllerBlock::new) .initialProperties(() -> Blocks.AIR) .blockstate((c, p) -> p.getVariantBuilder(c.get()) - .forAllStates(state -> ConfiguredModel.builder() + .forAllStatesExcept(state -> ConfiguredModel.builder() .modelFile(p.models() .getExistingFile(p.mcLoc("block/air"))) - .build())) + .build(), CrushingWheelControllerBlock.FACING)) .register(); public static final BlockEntry MECHANICAL_PRESS = diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java index 8f00ae553..2fd5373e6 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java @@ -16,7 +16,6 @@ import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; import mezz.jei.api.ingredients.IIngredients; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.StonecuttingRecipe; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java index 147605918..2fb13c6c0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java @@ -187,7 +187,6 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { } double xMotion = ((pos.getX() + .5f) - processingEntity.getX()) / 2f; - double yMotion = ((pos.getY() + .5f) - processingEntity.getY()) / 2f; double zMotion = ((pos.getZ() + .5f) - processingEntity.getZ()) / 2f; if (processingEntity.isSneaking()) xMotion = zMotion = 0; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index 3423c9704..a38b1bab2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -8,8 +8,6 @@ import java.util.Set; import javax.annotation.Nullable; -import com.simibubi.create.AllFluids; -import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java index fc9e53bb0..2bf09acea 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java @@ -38,10 +38,10 @@ public class Instruction { case TURN_DISTANCE: return (int) ((1 - initialProgress) * value / metersPerTick + offset); - case WAIT: + case DELAY: return (int) ((1 - initialProgress) * value + 1); - case PAUSED: + case AWAIT: return -1; case END: @@ -60,8 +60,8 @@ public class Instruction { return speedModifier.value; case END: - case WAIT: - case PAUSED: + case DELAY: + case AWAIT: default: break; @@ -69,13 +69,8 @@ public class Instruction { return 0; } - OnIsPoweredResult onIsPowered() { - switch (instruction) - { - case PAUSED: - return OnIsPoweredResult.CONTINUE; - } - return OnIsPoweredResult.NOTHING; + OnIsPoweredResult onRedstonePulse() { + return instruction == SequencerInstructions.AWAIT ? OnIsPoweredResult.CONTINUE : OnIsPoweredResult.NOTHING; } public static ListNBT serializeAll(Vector instructions) { @@ -108,8 +103,7 @@ public class Instruction { } static Instruction deserialize(CompoundNBT tag) { - Instruction instruction = - new Instruction(NBTHelper.readEnum(tag, "Type", SequencerInstructions.class)); + Instruction instruction = new Instruction(NBTHelper.readEnum(tag, "Type", SequencerInstructions.class)); instruction.speedModifier = NBTHelper.readEnum(tag, "Modifier", InstructionSpeedModifiers.class); instruction.value = tag.getInt("Value"); return instruction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java index 4ce80b4d6..e206109b2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java @@ -65,17 +65,14 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen boolean previouslyPowered = state.get(STATE) != 0; boolean isPowered = worldIn.isBlockPowered(pos); - if (previouslyPowered != isPowered) - withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onRedstoneUpdate); - else if (isPowered) - withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onIsPowered); + withTileEntityDo(worldIn, pos, sgte -> sgte.onRedstoneUpdate(isPowered, previouslyPowered)); } @Override protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) { return false; } - + @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { if (state.get(VERTICAL)) @@ -149,15 +146,16 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen public Class getTileEntityClass() { return SequencedGearshiftTileEntity.class; } - + @Override public boolean hasComparatorInputOverride(BlockState p_149740_1_) { return true; } - + @Override public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { - return state.get(STATE).intValue(); + return state.get(STATE) + .intValue(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java index fb8aa11ef..31fbcb659 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java @@ -101,7 +101,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { .withShiftStep(def.shiftStep) .setState(instruction.value) .onChanged(); - if (def == SequencerInstructions.WAIT) { + if (def == SequencerInstructions.DELAY) { value.withStepFunction(context -> { int v = context.currentValue; if (!context.forward) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java index ff73551d1..e1d8070c8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java @@ -15,6 +15,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { int currentInstruction; int currentInstructionDuration; int timer; + boolean poweredPreviously; public SequencedGearshiftTileEntity(TileEntityType type) { super(type); @@ -22,6 +23,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { currentInstruction = -1; currentInstructionDuration = -1; timer = 0; + poweredPreviously = false; } @Override @@ -65,10 +67,14 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { return currentInstruction == -1; } - public void onRedstoneUpdate() { + public void onRedstoneUpdate(boolean isPowered, boolean isRunning) { + if (!poweredPreviously && isPowered) + risingFlank(); + poweredPreviously = isPowered; if (!isIdle()) return; - + if (isPowered == isRunning) + return; if (!world.isBlockPowered(pos)) { world.setBlockState(pos, getBlockState().with(SequencedGearshiftBlock.STATE, 0), 3); return; @@ -78,16 +84,20 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { run(0); } - public void onIsPowered() { - + public void risingFlank() { Instruction instruction = getInstruction(currentInstruction); if (instruction == null) return; + if (poweredPreviously) + return; + poweredPreviously = true; - switch (instruction.onIsPowered()) - { - case CONTINUE: - run(currentInstruction + 1); + switch (instruction.onRedstonePulse()) { + case CONTINUE: + run(currentInstruction + 1); + break; + default: + break; } } @@ -115,7 +125,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { public Instruction getInstruction(int instructionIndex) { return instructionIndex >= 0 && instructionIndex < instructions.size() ? instructions.get(instructionIndex) - : null; + : null; } @Override @@ -123,6 +133,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { compound.putInt("InstructionIndex", currentInstruction); compound.putInt("InstructionDuration", currentInstructionDuration); compound.putInt("Timer", timer); + compound.putBoolean("PrevPowered", poweredPreviously); compound.put("Instructions", Instruction.serializeAll(instructions)); super.write(compound, clientPacket); } @@ -131,6 +142,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { protected void read(CompoundNBT compound, boolean clientPacket) { currentInstruction = compound.getInt("InstructionIndex"); currentInstructionDuration = compound.getInt("InstructionDuration"); + poweredPreviously = compound.getBoolean("PrevPowered"); timer = compound.getInt("Timer"); instructions = Instruction.deserializeAll(compound.getList("Instructions", NBT.TAG_COMPOUND)); super.read(compound, clientPacket); @@ -144,7 +156,9 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { public int getModifier() { if (currentInstruction >= instructions.size()) return 0; - return isIdle() ? 0 : instructions.get(currentInstruction).getSpeedModifier(); + return isIdle() ? 0 + : instructions.get(currentInstruction) + .getSpeedModifier(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java index ba3ee45d7..8545a2415 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java @@ -10,13 +10,14 @@ public enum SequencerInstructions { TURN_ANGLE("angle", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 360, 45, 90), TURN_DISTANCE("distance", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 128, 5, 5), - WAIT("duration", AllGuiTextures.SEQUENCER_WAIT, true, false, 600, 20, 10), - PAUSED("", AllGuiTextures.SEQUENCER_PAUSED), + DELAY("duration", AllGuiTextures.SEQUENCER_DELAY, true, false, 600, 20, 10), + AWAIT("", AllGuiTextures.SEQUENCER_AWAIT), END("", AllGuiTextures.SEQUENCER_END), ; String translationKey; + String descriptiveTranslationKey; String parameterKey; boolean hasValueParameter; boolean hasSpeedParameter; @@ -38,13 +39,14 @@ public enum SequencerInstructions { this.shiftStep = shiftStep; this.defaultValue = defaultValue; translationKey = "gui.sequenced_gearshift.instruction." + Lang.asId(name()); + descriptiveTranslationKey = translationKey + ".descriptive"; parameterKey = translationKey + "." + parameterName; } static List getOptions() { List options = new ArrayList<>(); for (SequencerInstructions entry : values()) - options.add(Lang.translate(entry.translationKey)); + options.add(Lang.translate(entry.descriptiveTranslationKey)); return options; } @@ -53,7 +55,7 @@ public enum SequencerInstructions { return value + Lang.translate("generic.unit.degrees"); if (this == TURN_DISTANCE) return value + "m"; - if (this == WAIT) { + if (this == DELAY) { if (value >= 20) return (value / 20) + "s"; return value + "t"; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 3863c7bd5..f74b305d4 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -51,10 +51,10 @@ public enum AllGuiTextures { SEQUENCER("sequencer.png", 173, 159), SEQUENCER_INSTRUCTION("sequencer.png", 0, 14, 162, 22), - SEQUENCER_WAIT("sequencer.png", 0, 58, 162, 22), + SEQUENCER_DELAY("sequencer.png", 0, 58, 162, 22), SEQUENCER_END("sequencer.png", 0, 80, 162, 22), SEQUENCER_EMPTY("sequencer.png", 0, 102, 162, 22), - SEQUENCER_PAUSED("sequencer.png", 0, 160, 162, 22), + SEQUENCER_AWAIT("sequencer.png", 0, 160, 162, 22), // JEI JEI_SLOT("jei/widgets.png", 18, 18), diff --git a/src/main/resources/assets/create/lang/de_de.json b/src/main/resources/assets/create/lang/de_de.json index 3e9ca27e2..9e0aab18c 100644 --- a/src/main/resources/assets/create/lang/de_de.json +++ b/src/main/resources/assets/create/lang/de_de.json @@ -515,7 +515,7 @@ "create.tooltip.holdKey": "Halte [%1$s]", "create.tooltip.holdKeyOrKey": "Halte [%1$s] oder [%2$s]", "create.tooltip.keyShift": "Shift", - "create.tooltip.keyCtrl": "Strg" + "create.tooltip.keyCtrl": "Strg", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 1308689ec..deb8aed43 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -200,13 +200,19 @@ "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "Instruction", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "Turn by angle", "create.gui.sequenced_gearshift.instruction.turn_angle": "Turn", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Angle", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "Turn to move Piston/Pulley/Gantry", "create.gui.sequenced_gearshift.instruction.turn_distance": "Piston", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distance", - "create.gui.sequenced_gearshift.instruction.wait": "Wait", - "create.gui.sequenced_gearshift.instruction.wait.duration": "Duration", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "Timed Delay", + "create.gui.sequenced_gearshift.instruction.delay": "Delay", + "create.gui.sequenced_gearshift.instruction.delay.duration": "Duration", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "End", "create.gui.sequenced_gearshift.instruction.end": "End", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "Await new Redstone Pulse", + "create.gui.sequenced_gearshift.instruction.await": "Await", "create.gui.sequenced_gearshift.speed": "Speed, Direction", "create.gui.sequenced_gearshift.speed.forward": "Input speed, Forwards", "create.gui.sequenced_gearshift.speed.forward_fast": "Double speed, Forwards", diff --git a/src/main/resources/assets/create/textures/gui/sequencer.png b/src/main/resources/assets/create/textures/gui/sequencer.png index a06270d229ee28312255b55c8410c7d88c844276..c89de3c155ef69f44384337aa1e55f8fc63bcfd5 100644 GIT binary patch delta 2332 zcmc&$dsGuw8lTA|Bm@#cK!idXk(U$!<)Nkl!c(COD348%R}jKOc_%mJvRD=f4G0D!vBl~zIts2_nSGlRDu1aTjOpcU!^ zz-Zg^Tom;9-kv_l4tp)c!k$C}D4h=y(Wqj=A%7kKP^H)akN4&&0)SFYKEn&7F`IW8!!W9^WN}kBs29A!k4ml7Z7eM7R%- zUYsemP62Yqz!zd+aDD>@A!p3f#~WhciQkJsHlB^a&;~FFk){+fef?nyViP<(7>A;H z{P?7kcAH^3otYFK!SLZGq9G)N_yM*&pQw%KDQw#?)sTLo8p2iBx9QrFD98f^+NR4S zyJ-F^8=B7?OBfUVn|x-Qv-^qbt>mLAZArh7sUc{N%?TIDTK`izHROuozm=wj+=eKW zbu}5OQQSDJ3XJTx3{L-{;0>uZd)N@=7x~P8uOEU_THl<#O6&Bo8&Iyaz7H>z);m^F zw!!*xSGEyuFm8zB%;kk8MJMp1Aam?QIBaZV4zg7Tz)9#*$Wav!%lGdbZ%U@ ztzMFzy~(W?@D&747ytQ_f&D5u%@@P_y9F0N;`Qq{zmkU}8KmQOO1&lR z;yt|8H--1gh1J%rM1Rr*|Hb<+L_w*l8QJ`ablG25w0NnBs;dLHXhEsbB5HAu_*T>H zmG5jS&(#CM=dK}uajXUdri!6Xf66$pNF}N5FpfRfGeIuyp_39$HIoC0o|hIyU)s0c zcIW{^91m6BA542Snt$x2@Ob!OQxoaH9W|2pnl@iJ8+7+&S8lCqjlWQxBYQn*^VyBT ztE!(i0soA00P46qeuiy5X#6wrbH8UK~5_!4@5VQ9=-I5qCG^9w6?jNQFF?OGAg&pFokBBAE zyNIkFGFn1geNhv+@gnhUvosU3urGFFwh9E<$4+R+>cYY8`j^6(OvgHF%3r|Ux+)4& zCi7_pN1sMb07_^N+p;kEglr8mRq8$+*k}@1G&vUVG-?uP^NjHR8ngG8K#eACexcQ5 zp}Ra#W7Yn8GQiHcX=2)dg-5;(6${Eb8m@Fb0dI_Q=G;Z`9;K51Qiaqn6#A7MU>kp5n}f8sAxJRS$=YgLI0z9 zHRQhVJOxgtL`m`nl391PpcJ7<*?1R6X408k3CqHrqy75knc`WlocbCZF`(D4v_nri z6r38<%oExXkNc^!zI;CLmO zK;-DAnzbZ{F!!HEySYLw7b$*k#xLu&8ejmt!VBuJKM_(RvWUqsVSG5<^LFEwDPPf`` zI8bLek@gn7E9TuG(bAzUHZsZ8(!tjXu}lJ(wn!J~bB22UegQPW&Z%ok{L1@;wudff zN0E>rb?gNBz;cD-J#c$r1Tu83yU5jt7;eTsV8dQ^J1vR6o-F& z?@yo*>SSwV0gr`a-|Mj=t;ZSZUq@@jg0$y9eD&t5u(egUk_@ZJ+G=u4+* zLFw<7mRycx5=d`l^YazoNVnnz>8E;pII6fP6Al};z{e2|`%0^TIqh1t;kgA5H?R^H zGoguN-f3?Bn=!{1uFKd37vOsF+m#Lq<#~XYmzN!0CaW`oz2)zMaV4@?xg#K1MsLmK z)nefILVylFbs?V6SvhnWz>&lsuj%1CtAvWU^4|E5;DD;E*}m)1m^peFAhSU9i_|pp z)1pP&fGZm|fFBtj< literal 17289 zcmeI3c~}$I7QiP!tfq^$VzEA64RJxlkc|)$!zLi0?1WVjvP>X_EG7X0h#*?`x}yRr zs8nsGpj8o95Ean6;l3h>EQ*RdE(q@?Y;nZ-?0fC^zW2TvKE9cA&pqef`#a~JJNaW4 z_U&>Mod4jKht7z3+`0ys({vm><}C?OFgB0Ewr(~Ih*aE7BL z?nz2GAjz92Oo|b*MI;A%0$0NU4y3S}Pt-_bWh#!wj->O;0ngfI3W=!eqK>g6IcWzZ zhIsiBo#jfH$h5K{3#m3NB8zQBW3pJ*tZ_s-mByq{859PUOlNScsT^xMvFjq)6TlN! zDH3!1T_$!72P8XEv|6p;P$&rr304UVE4ea?LSwVp6e^uUr;|YsvMN!g=4;3@)rd|f z-F{qPl~5^Bs3me4QR|m4kjJU*NF?n*Jy+Mdq>7$_WU4N9fFec1S5RnHR7zh)B4Lk> zB2F2ro0>>Sfn#AQEK{q19j#A0MYLQkS4GP|GGveXqXUDOczN}V-RFFz(msb)sa@j% zf-a-73Yg*#tK@M?A?z9tmNKHR)vG1q-r&6FNvrwj++mI6BW7Anr<+#B!ySueO&+`B5-MA&cTtdK>k6_GA^uSsp7_f@y)}b18i_>sjeCjpHFx zsrfP??BQY$8muG|5l6tF!8UXTlgwsYv&ljmYbKd5qO-`bwNPwLhs6T1*hUA@%S+$< z1J^EcVVriibh#F3T?^?95sNA$3x#|d*;Zt2Lly|cFqto42*fNtTTB(xx?Ss;f8g3j zDFKy^AFJ0#JNrL7L?3QG7|LCu0{NM!m$x8$b+s%2p8kGow<1=et4RvJQUz;woE@oq z%k>noo*JdK(d}FgU#P8S_CoE3fJI!&d#%0G>apxHlk^e5PomuEU(fvGVflg(h-QfO3gb(!j`k*1;Oruu56X|H9VOrqAFth$LJn)R%-Z#$hwaR7KR zhwW{cOa_xnK{g{Td?gw96#P@P!S60D>-JxX}3^v=}Y~5Ofj4h0X_|#c&~j zpoIKLI6P*Fzw z&|aa&Ih5za3O%8ix@6+J_s#_3jqXO z#BibWL1-~t2q5Sph6|k!LW|)-06`ZqT}M&_xUvIv<1< z!-W8XE@HUQ`5?3yE(8#C5yOSf2cgAqA%LKZ7%p@^2rY&S0R&w{#YO1-;1-sFuWS>* z=d>8YzTVY0q*x8D2@t2_ah;QvlfC(wMj^)djuUN5S<;s<-R;|j&$XLC4^_n$n)~;QfnVFfDm6e^Hy>8vQ z_3PJf*svidCnq;IcjLy5n>K9%!2&_~`RAXvY}vAP>(*`Cw*B(UFTei!>-O#2^Yin6 z`|Y=af`Y=r!W}zy?A*EY_uqftwQJYz-Mjbf*;7Jii*n0$`dC}oIH8*k3ar6b?VgV z)2GjzIdk^x*>mU4RaI4;KY#whg$oxiUc7Ya(&fvSLBfEvxpwW^_3PJf+_-V`=FMBT zZdF%T-@bjjrlzL0wicvTU0vPXyLapB>l+#x8XFs%nwsw2yLbQo{pRN82M-=ReE9Iu zqem?*Esq~Re)8nW)2C0LJ$v^2`STYqUc7wyvbDAK)vH&pU%!6y=FQu;Z`<11-o1O* z-rf#!SlJfgrp;8fzjpu-Q7-88ckzQD$cXOY;>6Qjf3Utvc85C1^-x~y>T)ZyYmNaS z?H!C(9M5#`&=Z1T<5m3@ScmwHcQZ+z@%dok%*+g0MrdZn>nC+rOx`tS(8_rkwC%g5 z4t=&Fb*Kl_yk^bqM7QwChObs8R2n+s#z6R7$T&9$w*|uI!?;+RxbQ34r@yFpJgVch zGQT-21XtK_>DA7HvK*tOwUgVg?GFpyvi}Qr1KaHK>P*Ds+m&5_zr?#fqkmIW?hc6N5r4>zHXrEMnv}&F4W0u96ri_7ZQ2~y1 z>*5NY3|ZEnsMTCEuF2mMziHORy^haM&fEO#G|s9r;+^TTwW(M3NS`+46Rz4^_%1iw ztRc`*n4S47XA16efaC3Z0cooC&_W-a)2Owcxh*T*7~739F5w>FSGC{|`=u2ef>fm@ zcy&tHvBDYF3(e=7&o}Ue3aA;x3}OKl`L|?HGVY~8aoH(cahWDvlMWU!u6)S%q>Y=t zF)d0E`uYv{>c)YE!+E^)qqo``gVNq+PNGi1dzzY6v55hAPp*?iux&HDl%1%%Mc~8O zR|*#gI-VR%jvCVR!h#rr7fr2A55lFym8ysMhJ3ce#J9v`heMG`@qvE^)e9PdmjiqUSh?aRZ1AxlM2`^DTexp#=2+sZ z!;Y4XZ|b*0jTX5ryDf;%jgqAVO_t?BV|;YJp=lhXUDnwwL(<_wgJ9c7Z|@N52HYWR zP9qspN0tkw)>bNqEaKA&6nTP0c5{#O(w+U=m&P0tjMYxX7b0|L3J}u5@FS)3OzH?* zhmo|5ip$324#kftsTY53M#w$ukcWHFxYYUXQcdb-Am4KhONW+w|06AYP=i6u(QW;9 zbiA@1b_se}vDtJM33C6Y(xlY38tVT|<+r7_xE&4~=JdZyh%~KOKQJ6&`I_9Y&?KigUQggY_+jgHAe>>@D5X?<<^peNL@uO?|2%adqmFl{MrJA4vIn zjo$!5Lxd4@qHQun%u1aG#YeO~{v4`bJrv9d@`F0s|EU}p3SIADCk1^!W5OJt`CuD3 zIyk)Pi+ofPaWct4VD1Z{O