From 7d43bb056a66fe0689be22fec26658e93402a9db Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 4 Jan 2021 14:37:44 -0800 Subject: [PATCH 001/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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/106] 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 697a7df59c259cc781ff78b6f1add8a4ba34f0f4 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 21 Jan 2021 12:26:55 -0800 Subject: [PATCH 041/106] 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 042/106] 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 043/106] 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 044/106] 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 045/106] 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 046/106] 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 047/106] 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 048/106] 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 049/106] 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 050/106] 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 051/106] 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 7bac93a03ccbe49456ddb56b1cfd464893915455 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 25 Jan 2021 00:24:07 -0800 Subject: [PATCH 052/106] 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 053/106] 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 054/106] 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 67d59540cf0dba6b2b8e1ef1c946c4778dba9fa6 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 26 Jan 2021 19:45:13 -0800 Subject: [PATCH 055/106] 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 056/106] 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 057/106] 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 058/106] 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 059/106] 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 060/106] 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 061/106] 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 062/106] 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 063/106] 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 064/106] 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 065/106] 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 066/106] 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 067/106] 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 068/106] 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 069/106] 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 070/106] 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 071/106] 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 3e6ef3499338daf3d1e2447f69ee7d8911dc796c Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 6 Feb 2021 14:39:58 -0800 Subject: [PATCH 072/106] 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 05e62ced51d35bc6e2d5bd161b5ac7dcb59f0ebb Mon Sep 17 00:00:00 2001 From: Chexet48 Date: Sun, 7 Feb 2021 22:51:43 +0100 Subject: [PATCH 073/106] 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 074/106] 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 075/106] 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 cfff806df48d79e10c881749654eeae08f4b0455 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 8 Feb 2021 21:17:25 -0800 Subject: [PATCH 076/106] 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 077/106] 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 078/106] 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 079/106] 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 080/106] 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 081/106] 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 082/106] 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 576165e3d697b7d7845caf0237f36e0f6f1cc014 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 11 Feb 2021 14:31:50 -0800 Subject: [PATCH 083/106] 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 084/106] 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 085/106] 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 086/106] 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 087/106] 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 088/106] 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 089/106] 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 090/106] 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 091/106] 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 0ad6db4bf75211b36bb70c0ec7d14edc62fbe411 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Feb 2021 23:06:41 -0800 Subject: [PATCH 092/106] 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 093/106] 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 094/106] 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 1e95fe4c7b5f5fec1da7b38cf78b0fc3a7a920ac Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sun, 14 Feb 2021 23:09:17 -0800 Subject: [PATCH 095/106] 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 096/106] 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 bec13b8e7db02bd18f586456e3f1fcefce860fa9 Mon Sep 17 00:00:00 2001 From: Zelophed Date: Tue, 16 Feb 2021 22:50:11 +0100 Subject: [PATCH 097/106] 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 098/106] 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 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 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 zcmZwNNsygabqDa*uO~^Z5hvJ)fMh#ZGO}F`U>m|BBxNeN7%K6AlM0Y5sjR3|mtnQaOi+eq>t9O6kmsNZ|t>dx=n|M$LrbaG4j`hIu(-*eAB z=YP-lzVc_E`O_nZP97Qz21oAs#NGG$`?30eVCeb2l}lgo=irw<@t1!$7_3}V|K|q( z`ft|_2B!!2-2KP*e{pf{W4C|r$8*+S|@yxk5o`3p@6xu0Kq-AUbdcXw}l|LKokyZYw(96Y#u*Xg55zVph^3N<$OcszdK z?BeN-r!TG*2%vXb`u-C?HqGW_=fxLZ7;Ozd^{%(Cj7CcCyMFZM+87{t-2sx3WW2t# zJ~tX|eg2lAp$;85uzux=s>d%bE-lTUIZ-Q|U9G%k&>QgK3kTH>O%2dzZ(cgR{`AWm zLkW&qKvyPLfA!*v0Db!1s~ek}`rLbZlQ?ZiMqgf9j4T)CYws_v4~Wwo7I$!Yxw`D` zKK|0uEFkTrppp5)Z3}O#PyXZl0eL&{txLz2=C>a_GuYhHWS7(pt7@{f4c<-1=iXQw zfBO{$wY-}0&re;kphug8yaMDYMN}_u%x!K?%mD{LgsLBLE-x>feMgDSYI`VpDf!$j z!?)HaBqR^eBfmbrym0liH|=h2Rm%X3_Dz64PaA5KNGbK>q3(&V- zJ!;GT;>=*QrRC17gdmQDY?=NUXfzs8xwkeZB%}cxnJE$)19ZN$9F9ogzSEmD1fU=Q zqNdrYWh*fVKn|6B4uFg!=b1Bbb*HvPF9OO$54>-O7TH)9rP|e&on2IPehMfPM}@{$ zcd5G)5=!~~H;jo>q2b_&kc=bAUs&5ccyNixO$(3`<==gE50D*GqAx(zXE2~$Z>)|U zxpa(?Ak?otJ2&2*|EqIz&VX7+EAtYN(QdwG0aOD{CKI#QxV2^L6Ivv%D9@@J))7B{ zc?Y2TZkmT~ZDXSV?e2d2WdP=)asi|~TPITzTAu(!LIK1EI2g1=uk4sva@cOZW*#6a zM~?dHa_rc#Qrh*2z2^qziIePSH0a_ow)Ffn-EI_TaIk{>x zO`JoighSAnC9U~}!+xV8DQ7_W{Zl}j<1u89o}XuS2~<^YrUOg~lW2dw{@jp?mLmfw zmN9 zETeMi*ukaU&%SSm%Bj^QL&?jWeMhO>_b$yJIdVkf((+HAyxh!IZCNiN`CdZuFqv(>tlNfYMTTXCNv^jt+nlr;|~#qzkLvjw$SQ ziQYN`Nydr;U<%0}= zx%vHP9=v&pBotEXuRb|K3)U~cb>rc!&CT)J+i#9WlPgz7t8cv_b9r@RW3^8CSDzZ! z88FsVLVJL+hFGD^t*g#}l1PZKIVN80e3Ot@I7}@4mV|i9mdx?c6PtDz4uBwl44MG) z44~K7Mh`tX(wG*Vde3zPdidCh?ZM)K154qQhYlS$dg2il=+eyWd%7z%0#m zk8K%odi}$Xe9%)~2JT3Rr%NHVwsg)v5&{Ua9uR@8u3b?@g9%dO9+2q)3fqMS&xK6p z&QpiOcHsudEIhpr8DgSxFFgNzk;{{pjbE0?emWL7a2(T9PZhb> zAsP7(4xeWSzj6M6LUUL;3H{ND*SF`E0Q&iJ7oh>=nP)F}-tpeUx6Hr7v0VGR$DILP zYKKF=*GqGL_`{#oe$CDO;0HhTWaWPT%r9gdN>9_(8E9-biZJW=j21%mgH<@4i~}Mt>moHzKW1%hZy7#YR)=zZ%%^w_4jp9lx1t_XPj83S#$D(h_S*Xaax^=kvcJ$< z5^d2;Ql5Eb7?p4#w#4j(15yi;nU#>beG&qQ+qMRPHYan~L;%gIkZBA;gQ;931Q0IN zJpCRZbJ4vB>&j#&cPW4rs$%Y_L%fv%dl<=3ISJc^P%3Bn^=HwtAwcnzy@aAmjV+Go z06>vYaUl|F7ZgL(cuhy;OF|RWqf8b+rdLv2sK{AyAtgO~jdH)VuI(UzGzj%z<#OXw z6-uV+w>^DP57HcF%ff|hS)a_LkJQ*=U5@TMU58RhlhEX`3v~vR^!E%B(w(PNUKf;Ta^7c53)mU?JxB8fPfK#N@3*gC}ehYR&vmV1Ws zhzfnxtpE+m6cnJ{I@V1>9Uw!i%4t(u1A9h8W*Y^)}T}f zAmohcKx5L!Q!R$j6A38+sIH*v6Y5JO0i-;-R1#`uAZ*bfE(Vr#;c#&w2_R4H z!-W7kcgxLINDM}!);NVFHR`b)F60^NA@la-^^OZQ>QTCwOFGj*eI;9#6-TE-&Xnv) z2sz_4X4s-ybBBXiRRL;N0#JZv$r&7>9-v%)^Yw5c)Pvd4%$3!q3A7Pt0&U0-<|E3+ z$IFBZp&kS(&{k&v;`^^3mxS7uMM3~2qc-%FQr6itT(J|K_C+e1yH!qn;R3& zpa%%a0m$@QjhqEg&xLw&rWrt{u*1ly$R8R8hCmxUl8je7jPyfHpQZBPxKhW&a;rTp$wiARhnFHBaOWM7Mqtg5JbYx$8HciOS6aQtJ!=#PtFc z3qj>5ZLFO2IFp*mgc(pdkw0dWisM0b25cECVb<-r1%d%6u~8)rP|??H8AsLuY7)X0 zX%0X}cM5|nvC#r_@-jeVhJ#SK1dDVJAm#Bh099qcK~S?FsAsDicS2PBThQ%6?Ilga@UwkQ-yi?I@83A_FD#H7p$E| zj~OWKjiSAbXEGeq>uV(;g$1ZtIevgolmbYV3<(zX5Ep8pI72CqKpF1biL+5UMui%= zELRv$UorzW!Cqr!#ab)QO!Cb!jrgOWL_HMd3R*H~Nr_t7l2CD>8d;$dndX>Ae4=~+ zC8K-Hu4X+K$`v$x#0b4(4fQaHi7Lp@JbjA`O}S7!WgMzT@o4+V8Hvua#h}bGYJVTM37z^2v~pAtE7#T^Qy<7pPK_Gt&c- zDQdVjBBA(!j(Ru)lRZywipexDW}! z+Djh59TaRP&^;!35@IF9g>0DvpsE}bw%8(P#-&1*t$fObikx}n znA92};rNS(Z_8`Q8E^>@(c4fDl2AxS|NK-xDdx$XMp{x$XR2HW(^L2A|baNk+WvDRMs~OGbK=U!^%Wl z2(q3F$pny1+ebYRjmcoX2h?*R)B`dqCtBlB!c(!)GYhBIpXTW$;UM$cd`(rR(L(3yauQwBxAp_WeremSx;Yk2{pFZ zaiIW;gnS?9B~(Ve#bbQ-%O$~U?7A*75-4ZB6RYZ|$DlrW^mpPcLv1pa6zcKt#Y6IY zT&S@{CEb>3o$v3qEFZ4Jg_PfW>IzHT2der@H$V^l%QrqW7##m({T9GbbfA;gV9*ma z_Ief^WLoBF@OY$ePQQrq2|hqJ8e%UySEF%ES$I)sh`zO$GGRUdw$Pe(0cU~`wY}|Y zRF(>AL$rvRu_SZUpO#b^FkZ9gMY;X;*HMN`oBez>y=6~^a9KQt z2W-#s2}EK08ld8NM#%&{rsfkmD$A;NAFB8AK?uy87k5tP*52dg{(`(NoTg~Y5-{}0pwY3e6{Y!@)@N7O~0l< z5FVvAJH|-?q&&<~c_QKAMP^k}h+4*gzVp^6+IBxK9^Mj*>946hqd77Wkc_K5i-%~E zX0<3cULg%Wp;QwNPvspTandG?y*Q~z@`e~u$G|m)10ZtsOq|pQJV*g5pmTH9FVh36 z!l@I~Jzqp=8k0&zyRf97TchH3EO=s(8ZR34pJ)qfd_sJChBmqckS7Uc%j7!=&CTU* zk&sL_O2>F*&740v@Yri7W&t@EIHKtSNPB?17NGSB6HJZ@brG9E=8ceV1qvlCyZzs0 zuj;Z+pb(ZD_X2%*k-Vm!`lN%`Y#E}K>@Cq7pJu30^Z>#*Jrfbz!fN%&pO}9#9xtBm|HVU@Ab3sF^+? znRxv~Kte;h2uKUb*s)o!kA2K~{T6WOA|Pl;@gmcdghaRw-sYcWq4S^m80%erq^}TZT z_LJ;pc~N~Yd-p0Z#futID?s}`aYj^l5iZHCXr{3_5|XJ8cys#!!FOkv<12FsTA4V0 zp!fO#1XD*twkk#xKn|q#j7nL_<{T^_XUt}@ifVhuDqm(4ATuRKB#MTp^}NX5^?+Cj zTc(3cY}84~jQIg8dZ zzn>e-4SI4GG^%o-gG^%shB*>ycVTbWQSJA6)|-wGu#9;6j240B_Gj2$g(4tkx2GPY zP+UkiMLjtS2z43Gvq@+aK!lnLdr7GMx+=y>uSh7rFw6%yg}T>erM`$x{EkXV9K1}B z86?-yJx||$rjT1aU4X<>%4lx=p!U?G`~Xss`!UBP*|IrTAik4!pJ-3l#Xy6pr!T*&BuRUNdr~<*G**t0NNuL$g1qiC>q-#Y;`Z$WWOoMi zx9Op;a7fybkO>k&Ft;m#r_}sFMUu6NVDeNYV-OO;_WVpOfT(=vJ6Y(GV4KF-I#Yyt z1CwaKVv``2gx9G$m&m1dy@hqtn_Gl~-K=5+}ul zI01nCh-mr|yN)lpMD{ss^>elM8&by2Agm%TRMf+-!=^u1BbOePI4SKiLIhe1(5>IH z9+2{$BLIY}=9{rI)3e2dWTH9RPXXn(L-k_-69d$TB>~b*p&22Nk?5_>G_Q?~r2T%* zlCs0fd%4&;uiekpT3E8i0SHU$wyed7a<&3UhuX3hv?3w%IWr`bD-NF`8AZ}kt=B}7 zy;6NoRV@lwVV^XxW35O1AVLFxq&k$1KH4#>WK{Y%X>S$#uw=V}c45iAIBDIO8X&{< zfMnX1H3?0BLn?YT8z+tN(K5Oe2?6B%S`Puq@yA#JT=?;)8qtm5ivOkHF z){U=y#Ky^KON}*6(ITeCf$6^)8-dv^qq0_Kz-xBQ_<-rc>|(phLoUDgr3b(K(f|DD 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 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 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 7aa175dd9cd46dcb695d9c23a7ed73c171c3ca4f Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 16 Feb 2021 15:13:48 -0800 Subject: [PATCH 099/106] 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 159e298e8b1235811eb9255f56d1bbce7a71c06c Mon Sep 17 00:00:00 2001 From: Zelophed Date: Wed, 17 Feb 2021 02:34:55 +0100 Subject: [PATCH 100/106] 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 a5d6262424a8d99096a036d76c961f4fbbf66ec7 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 17 Feb 2021 11:24:40 -0800 Subject: [PATCH 101/106] 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 02db3f5a2c0f86e8a78968b537a8b0b6cf2fc666 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 17 Feb 2021 13:58:24 -0800 Subject: [PATCH 102/106] 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 103/106] 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 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 104/106] 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 105/106] 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 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 106/106] 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;