diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index a38cb4f7d..8bbf6d9bb 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -38,6 +38,7 @@ import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.gui.ForgeIngameGui; import net.minecraftforge.client.gui.OverlayRegistry; import net.minecraftforge.eventbus.api.IEventBus; 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 63eead5a9..c40bf7317 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 @@ -5,7 +5,6 @@ import static net.minecraft.util.Mth.lerp; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; @@ -32,13 +31,13 @@ import net.minecraft.world.phys.Vec3; public class CouplingRenderer { - public static void renderAll(PoseStack ms, MultiBufferSource buffer) { - CouplingHandler.forEachLoadedCoupling(Minecraft.getInstance().level, - c -> { - if (c.getFirst().hasContraptionCoupling(true)) - return; - CouplingRenderer.renderCoupling(ms, buffer, c.map(MinecartController::cart)); - }); + public static void renderAll(PoseStack ms, MultiBufferSource buffer, Vec3 camera) { + CouplingHandler.forEachLoadedCoupling(Minecraft.getInstance().level, c -> { + if (c.getFirst() + .hasContraptionCoupling(true)) + return; + CouplingRenderer.renderCoupling(ms, buffer, camera, c.map(MinecartController::cart)); + }); } public static void tickDebugModeRenders() { @@ -46,21 +45,20 @@ public class CouplingRenderer { CouplingHandler.forEachLoadedCoupling(Minecraft.getInstance().level, CouplingRenderer::doDebugRender); } - public static void renderCoupling(PoseStack ms, MultiBufferSource buffer, Couple carts) { + public static void renderCoupling(PoseStack ms, MultiBufferSource buffer, Vec3 camera, Couple carts) { ClientLevel world = Minecraft.getInstance().level; if (carts.getFirst() == null || carts.getSecond() == null) return; - Couple lightValues = - carts.map(c -> LevelRenderer.getLightColor(world, new BlockPos(c.getBoundingBox() - .getCenter()))); + Couple lightValues = carts.map(c -> LevelRenderer.getLightColor(world, new BlockPos(c.getBoundingBox() + .getCenter()))); Vec3 center = carts.getFirst() - .position() - .add(carts.getSecond() - .position()) - .scale(.5f); + .position() + .add(carts.getSecond() + .position()) + .scale(.5f); Couple transforms = carts.map(c -> getSuitableCartEndpoint(c, center)); @@ -72,20 +70,20 @@ public class CouplingRenderer { Vec3 zero = Vec3.ZERO; Vec3 firstEndpoint = transforms.getFirst() - .apply(zero); + .apply(zero); Vec3 secondEndpoint = transforms.getSecond() - .apply(zero); + .apply(zero); Vec3 endPointDiff = secondEndpoint.subtract(firstEndpoint); double connectorYaw = -Math.atan2(endPointDiff.z, endPointDiff.x) * 180.0D / Math.PI; double connectorPitch = Math.atan2(endPointDiff.y, endPointDiff.multiply(1, 0, 1) - .length()) * 180 / Math.PI; + .length()) * 180 / Math.PI; TransformStack msr = TransformStack.cast(ms); carts.forEachWithContext((cart, isFirst) -> { CartEndpoint cartTransform = transforms.get(isFirst); ms.pushPose(); - cartTransform.apply(ms); + cartTransform.apply(ms, camera); attachment.light(lightValues.get(isFirst)) .renderInto(ms, builder); msr.rotateY(connectorYaw - cartTransform.yaw); @@ -100,7 +98,7 @@ public class CouplingRenderer { int meanSkyLight = (((l1 >> 20) & 0xf) + ((l2 >> 20) & 0xf)) / 2; ms.pushPose(); - msr.translate(firstEndpoint) + msr.translate(firstEndpoint.subtract(camera)) .rotateY(connectorYaw) .rotateZ(connectorPitch); ms.scale((float) endPointDiff.length(), 1, 1); @@ -113,9 +111,9 @@ public class CouplingRenderer { private static CartEndpoint getSuitableCartEndpoint(AbstractMinecart cart, Vec3 centerOfCoupling) { long i = cart.getId() * 493286711L; i = i * i * 4392167121L + i * 98761L; - float x = (((float) (i >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; - 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; + double x = (((float) (i >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + double y = (((float) (i >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F + 0.375F; + double z = (((float) (i >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; float pt = AnimationTickHolder.getPartialTicks(); @@ -164,8 +162,7 @@ public class CouplingRenderer { } final float offsetMagnitude = 13 / 16f; - boolean isBackFaceCloser = - frontVec.distanceToSqr(centerOfCoupling) > backVec.distanceToSqr(centerOfCoupling); + boolean isBackFaceCloser = frontVec.distanceToSqr(centerOfCoupling) > backVec.distanceToSqr(centerOfCoupling); flip = isBackFaceCloser; float offset = isBackFaceCloser ? -offsetMagnitude : offsetMagnitude; @@ -174,16 +171,16 @@ public class CouplingRenderer { static class CartEndpoint { - float x; - float y; - float z; + double x; + double y; + double z; float yaw; float pitch; float roll; float offset; boolean flip; - public CartEndpoint(float x, float y, float z, float yaw, float pitch, float roll, float offset, boolean flip) { + public CartEndpoint(double x, double y, double z, float yaw, float pitch, float roll, float offset, boolean flip) { this.x = x; this.y = y; this.z = z; @@ -202,14 +199,15 @@ public class CouplingRenderer { return vec.add(x, y, z); } - public void apply(PoseStack ms) { - ms.translate(x, y, z); - ms.mulPose(Vector3f.YP.rotationDegrees(yaw)); - ms.mulPose(Vector3f.ZP.rotationDegrees(pitch)); - ms.mulPose(Vector3f.XP.rotationDegrees(roll)); - ms.translate(offset, 0, 0); - if (flip) - ms.mulPose(Vector3f.YP.rotationDegrees(180)); + public void apply(PoseStack ms, Vec3 camera) { + TransformStack.cast(ms) + .translate(camera.scale(-1) + .add(x, y, z)) + .rotateY(yaw) + .rotateZ(pitch) + .rotateX(roll) + .translate(offset, 0, 0) + .rotateY(flip ? 180 : 0); } } @@ -219,24 +217,24 @@ public class CouplingRenderer { MinecartController first = c.getFirst(); AbstractMinecart mainCart = first.cart(); Vec3 mainCenter = mainCart.position() - .add(0, yOffset, 0); + .add(0, yOffset, 0); Vec3 connectedCenter = c.getSecond() - .cart() - .position() - .add(0, yOffset, 0); + .cart() + .position() + .add(0, yOffset, 0); int color = Color.mixColors(0xabf0e9, 0xee8572, (float) Mth - .clamp(Math.abs(first.getCouplingLength(true) - connectedCenter.distanceTo(mainCenter)) * 8, 0, 1)); + .clamp(Math.abs(first.getCouplingLength(true) - connectedCenter.distanceTo(mainCenter)) * 8, 0, 1)); CreateClient.OUTLINER.showLine(mainCart.getId() + "", mainCenter, connectedCenter) - .colored(color) - .lineWidth(1 / 8f); + .colored(color) + .lineWidth(1 / 8f); Vec3 point = mainCart.position() - .add(0, yOffset, 0); + .add(0, yOffset, 0); CreateClient.OUTLINER.showLine(mainCart.getId() + "_dot", point, point.add(0, 1 / 128f, 0)) - .colored(0xffffff) - .lineWidth(1 / 4f); + .colored(0xffffff) + .lineWidth(1 / 4f); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java index 03ac2b78d..281e07741 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java @@ -111,8 +111,7 @@ public class SymmetryHandler { PoseStack ms = event.getPoseStack(); ms.pushPose(); - ms.translate(-view.x(), -view.y(), -view.z()); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); + ms.translate(pos.getX() - view.x(), pos.getY() - view.y(), pos.getZ() - view.z()); ms.translate(0, yShift + .2f, 0); mirror.applyModelTransform(ms); BakedModel model = mirror.getModel() diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java index f67a86798..a77635d64 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java @@ -26,17 +26,12 @@ import net.minecraft.world.phys.Vec3; public class CarriageCouplingRenderer { - public static void renderAll(PoseStack ms, MultiBufferSource buffer) { + public static void renderAll(PoseStack ms, MultiBufferSource buffer, Vec3 camera) { Collection trains = CreateClient.RAILWAYS.trains.values(); VertexConsumer vb = buffer.getBuffer(RenderType.solid()); BlockState air = Blocks.AIR.defaultBlockState(); float partialTicks = AnimationTickHolder.getPartialTicks(); - Entity cameraEntity = Minecraft.getInstance().cameraEntity; - if (cameraEntity == null) - return; - - Vec3 camera = cameraEntity.getPosition(partialTicks); - Level level = cameraEntity.level; + Level level = Minecraft.getInstance().level; for (Train train : trains) { List carriages = train.carriages; @@ -72,42 +67,48 @@ public class CarriageCouplingRenderer { Vec3 position2 = entity2.getPosition(partialTicks); ms.pushPose(); - ms.pushPose(); - ms.translate(anchor.x, anchor.y, anchor.z); - CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) - .rotateY(-yRot) - .rotateX(xRot) - .light(lightCoords) - .renderInto(ms, vb); - float margin = 3 / 16f; - double couplingDistance = train.carriageSpacing.get(i) - 2 * margin - - bogey1.type.getConnectorAnchorOffset().z - bogey2.type.getConnectorAnchorOffset().z; - int couplingSegments = (int) Math.round(couplingDistance * 4); - double stretch = ((anchor2.distanceTo(anchor) - 2 * margin) * 4) / couplingSegments; - for (int j = 0; j < couplingSegments; j++) { - CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_CABLE, air) - .rotateY(-yRot + 180) - .rotateX(-xRot) - .translate(0, 0, margin + 2 / 16f) - .scale(1, 1, (float) stretch) - .translate(0, 0, j / 4f) + { + ms.pushPose(); + ms.translate(anchor.x - camera.x, anchor.y - camera.y, anchor.z - camera.z); + CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) + .rotateY(-yRot) + .rotateX(xRot) .light(lightCoords) .renderInto(ms, vb); + + float margin = 3 / 16f; + double couplingDistance = train.carriageSpacing.get(i) - 2 * margin + - bogey1.type.getConnectorAnchorOffset().z - bogey2.type.getConnectorAnchorOffset().z; + int couplingSegments = (int) Math.round(couplingDistance * 4); + double stretch = ((anchor2.distanceTo(anchor) - 2 * margin) * 4) / couplingSegments; + for (int j = 0; j < couplingSegments; j++) { + CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_CABLE, air) + .rotateY(-yRot + 180) + .rotateX(-xRot) + .translate(0, 0, margin + 2 / 16f) + .scale(1, 1, (float) stretch) + .translate(0, 0, j / 4f) + .light(lightCoords) + .renderInto(ms, vb); + } + ms.popPose(); } - ms.popPose(); + { + ms.pushPose(); + Vec3 translation = position2.subtract(position) + .add(anchor2) + .subtract(camera); + ms.translate(translation.x, translation.y, translation.z); + CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) + .rotateY(-yRot + 180) + .rotateX(-xRot) + .light(lightCoords2) + .renderInto(ms, vb); + ms.popPose(); + } - ms.pushPose(); - ms.translate(-position.x, -position.y, -position.z); - ms.translate(position2.x, position2.y, position2.z); - ms.translate(anchor2.x, anchor2.y, anchor2.z); - CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) - .rotateY(-yRot + 180) - .rotateX(-xRot) - .light(lightCoords2) - .renderInto(ms, vb); - ms.popPose(); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java index 6771084d8..158627c68 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java @@ -322,8 +322,6 @@ public class TrackTargetingBehaviour extends TileEntit return; ms.pushPose(); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); - ITrackBlock track = (ITrackBlock) block; PartialModel partial = track.prepareTrackOverlay(level, pos, trackState, bezier, direction, ms, type); if (partial != null) @@ -333,7 +331,6 @@ public class TrackTargetingBehaviour extends TileEntit .translate(-.5, 0, -.5) .light(LevelRenderer.getLightColor(level, pos)) .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); - ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java index 94f629068..67cbe7e2e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.trains.management.edgePoint; import com.google.common.base.Objects; +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.GraphLocation; @@ -116,7 +117,7 @@ public class TrackTargetingClient { }); } - public static void render(PoseStack ms, SuperRenderTypeBuffer buffer) { + public static void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) { if (lastLocation == null || lastResult.feedback != null) return; @@ -128,8 +129,13 @@ public class TrackTargetingClient { RenderedTrackOverlayType type = lastType == EdgePointType.SIGNAL ? RenderedTrackOverlayType.SIGNAL : lastType == EdgePointType.OBSERVER ? RenderedTrackOverlayType.OBSERVER : RenderedTrackOverlayType.STATION; + ms.pushPose(); + TransformStack.cast(ms) + .translate(Vec3.atLowerCornerOf(pos) + .subtract(camera)); TrackTargetingBehaviour.render(mc.level, pos, direction, lastHoveredBezierSegment, ms, buffer, light, OverlayTexture.NO_OVERLAY, type, 1 + 1 / 16f); + ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverRenderer.java index c9f4655f3..2727b478d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverRenderer.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.trains.management.edgePoint.observer; +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.logistics.trains.ITrackBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour; @@ -35,7 +36,8 @@ public class TrackObserverRenderer extends SmartTileEntityRenderer { return; ms.pushPose(); - ms.translate(-pos.getX(), -pos.getY(), -pos.getZ()); + TransformStack.cast(ms) + .translate(targetPosition.subtract(pos)); RenderedTrackOverlayType type = overlayState == OverlayState.DUAL ? RenderedTrackOverlayType.DUAL_SIGNAL : RenderedTrackOverlayType.SIGNAL; TrackTargetingBehaviour.render(level, targetPosition, target.getTargetDirection(), target.getTargetBezier(), ms, diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java index e71fdf1ed..27d989c39 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.trains.management.edgePoint.statio import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.Transform; +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; @@ -48,13 +49,14 @@ public class StationRenderer extends SafeTileEntityRenderer { GlobalStation station = te.getStation(); boolean isAssembling = te.getBlockState() .getValue(StationBlock.ASSEMBLING); - + if (!isAssembling || (station == null || station.getPresentTrain() != null) && !te.isVirtual()) { renderFlag( te.flag.getValue(partialTicks) > 0.75f ? AllBlockPartials.STATION_ON : AllBlockPartials.STATION_OFF, te, partialTicks, ms, buffer, light, overlay); ms.pushPose(); - ms.translate(-pos.getX(), -pos.getY(), -pos.getZ()); + TransformStack.cast(ms) + .translate(targetPosition.subtract(pos)); TrackTargetingBehaviour.render(level, targetPosition, target.getTargetDirection(), target.getTargetBezier(), ms, buffer, light, overlay, RenderedTrackOverlayType.STATION, 1); ms.popPose(); @@ -68,7 +70,7 @@ public class StationRenderer extends SafeTileEntityRenderer { if (te.isVirtual() && te.bogeyLocations == null) te.refreshAssemblyInfo(); - + if (direction == null || te.assemblyLength == 0 || te.bogeyLocations == null) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockOutline.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockOutline.java index 0417825dd..54130e673 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockOutline.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockOutline.java @@ -142,7 +142,7 @@ public class TrackBlockOutline { } } - public static void drawCurveSelection(PoseStack ms, MultiBufferSource buffer) { + public static void drawCurveSelection(PoseStack ms, MultiBufferSource buffer, Vec3 camera) { Minecraft mc = Minecraft.getInstance(); if (mc.options.hideGui || mc.gameMode.getPlayerMode() == GameType.SPECTATOR) return; @@ -152,7 +152,8 @@ public class TrackBlockOutline { return; VertexConsumer vb = buffer.getBuffer(RenderType.lines()); - Vec3 vec = result.vec(); + Vec3 vec = result.vec() + .subtract(camera); Vec3 angles = result.angles(); TransformStack.cast(ms) .pushPose() 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 85d93d52a..7851cfb85 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 @@ -45,6 +45,7 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlac import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.gui.ForgeIngameGui; import net.minecraftforge.client.gui.IIngameOverlay; @@ -193,7 +194,7 @@ public class SchematicHandler { .display(wMirroredLR); } - public void render(PoseStack ms, SuperRenderTypeBuffer buffer) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) { boolean present = activeSchematicItem != null; if (!active && !present) return; @@ -201,12 +202,12 @@ public class SchematicHandler { if (active) { ms.pushPose(); currentTool.getTool() - .renderTool(ms, buffer); + .renderTool(ms, buffer, camera); ms.popPose(); } ms.pushPose(); - transformation.applyGLTransformations(ms); + transformation.applyTransformations(ms, camera); if (!renderers.isEmpty()) { float pt = AnimationTickHolder.getPartialTicks(); 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 d9d7628aa..78d7ed7e4 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 @@ -19,15 +19,19 @@ import net.minecraft.world.phys.Vec3; public class SchematicTransformation { - private LerpedFloat x, y, z, scaleFrontBack, scaleLeftRight; + private Vec3 chasingPos; + private Vec3 prevChasingPos; + private BlockPos target; + + private LerpedFloat scaleFrontBack, scaleLeftRight; private LerpedFloat rotation; private double xOrigin; private double zOrigin; public SchematicTransformation() { - x = LerpedFloat.linear(); - y = LerpedFloat.linear(); - z = LerpedFloat.linear(); + chasingPos = Vec3.ZERO; + prevChasingPos = Vec3.ZERO; + target = BlockPos.ZERO; scaleFrontBack = LerpedFloat.linear(); scaleLeftRight = LerpedFloat.linear(); rotation = LerpedFloat.angular(); @@ -48,20 +52,18 @@ public class SchematicTransformation { rotation.chase(0, 0.45f, Chaser.EXP) .startWithValue(r); - Vec3 vec = fromAnchor(anchor); - x.chase(0, 0.45f, Chaser.EXP) - .startWithValue((float) vec.x); - y.chase(0, 0.45f, Chaser.EXP) - .startWithValue((float) vec.y); - z.chase(0, 0.45f, Chaser.EXP) - .startWithValue((float) vec.z); + target = fromAnchor(anchor); + chasingPos = Vec3.atLowerCornerOf(target); + prevChasingPos = chasingPos; } - public void applyGLTransformations(PoseStack ms) { + public void applyTransformations(PoseStack ms, Vec3 camera) { float pt = AnimationTickHolder.getPartialTicks(); // Translation - ms.translate(x.getValue(pt), y.getValue(pt), z.getValue(pt)); + TransformStack.cast(ms) + .translate(VecHelper.lerp(pt, prevChasingPos, chasingPos) + .subtract(camera)); Vec3 rotationOffset = getRotationOffset(true); // Rotation & Mirror @@ -101,7 +103,7 @@ public class SchematicTransformation { float pt = AnimationTickHolder.getPartialTicks(); Vec3 rotationOffset = getRotationOffset(true); - vec = vec.subtract(x.getValue(pt), y.getValue(pt), z.getValue(pt)); + vec = vec.subtract(VecHelper.lerp(pt, prevChasingPos, chasingPos)); vec = vec.subtract(xOrigin + rotationOffset.x, 0, zOrigin + rotationOffset.z); vec = VecHelper.rotate(vec, -rotation.getValue(pt), Axis.Y); vec = vec.add(rotationOffset.x, 0, rotationOffset.z); @@ -157,12 +159,11 @@ public class SchematicTransformation { vec = vec.multiply(getScaleFB().getChaseTarget(), 1, getScaleLR().getChaseTarget()); vec = VecHelper.rotate(vec, rotation.getChaseTarget(), Axis.Y); vec = vec.add(xOrigin, 0, zOrigin); - - vec = vec.add(x.getChaseTarget(), y.getChaseTarget(), z.getChaseTarget()); + vec = vec.add(target.getX(), target.getY(), target.getZ()); return new BlockPos(vec.x, vec.y, vec.z); } - public Vec3 fromAnchor(BlockPos pos) { + public BlockPos fromAnchor(BlockPos pos) { Vec3 vec = Vec3.ZERO.add(.5, 0, .5); Vec3 rotationOffset = getRotationOffset(false); vec = vec.subtract(xOrigin, 0, zOrigin); @@ -170,8 +171,7 @@ public class SchematicTransformation { vec = vec.multiply(getScaleFB().getChaseTarget(), 1, getScaleLR().getChaseTarget()); vec = VecHelper.rotate(vec, rotation.getChaseTarget(), Axis.Y); vec = vec.add(xOrigin, 0, zOrigin); - - return Vec3.atLowerCornerOf(pos.subtract(new BlockPos(vec.x, vec.y, vec.z))); + return pos.subtract(new BlockPos(vec.x, vec.y, vec.z)); } public int getRotationTarget() { @@ -190,9 +190,8 @@ public class SchematicTransformation { } public void tick() { - x.tickChaser(); - y.tickChaser(); - z.tickChaser(); + prevChasingPos = chasingPos; + chasingPos = VecHelper.lerp(0.45f, chasingPos, Vec3.atLowerCornerOf(target)); getScaleLR().tickChaser(); getScaleFB().tickChaser(); rotation.tickChaser(); @@ -209,25 +208,22 @@ public class SchematicTransformation { rotation.updateChaseTarget(rotation.getChaseTarget() + (clockwise ? -90 : 90)); } - public void move(float xIn, float yIn, float zIn) { - moveTo(x.getChaseTarget() + xIn, y.getChaseTarget() + yIn, z.getChaseTarget() + zIn); + public void move(int xIn, int yIn, int zIn) { + moveTo(target.offset(xIn, yIn, zIn)); } public void startAt(BlockPos pos) { - x.startWithValue(pos.getX()); - y.startWithValue(pos.getY() - 10); - z.startWithValue(pos.getZ()); + chasingPos = Vec3.atLowerCornerOf(pos); + prevChasingPos = chasingPos; moveTo(pos); } public void moveTo(BlockPos pos) { - moveTo(pos.getX(), pos.getY(), pos.getZ()); + target = pos; } - public void moveTo(float xIn, float yIn, float zIn) { - x.updateChaseTarget(xIn); - y.updateChaseTarget(yIn); - z.updateChaseTarget(zIn); + public void moveTo(int xIn, int yIn, int zIn) { + moveTo(new BlockPos(xIn, yIn, zIn)); } public LerpedFloat getScaleFB() { 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 e2abd68c1..eeb53148f 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 @@ -36,8 +36,8 @@ public class DeployTool extends PlacementToolBase { } @Override - public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer) { - super.renderTool(ms, buffer); + public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) { + super.renderTool(ms, buffer, camera); if (selectedPos == null) return; @@ -58,7 +58,7 @@ public class DeployTool extends PlacementToolBase { double zOrigin = bounds.getZsize() / 2f; Vec3 origin = new Vec3(xOrigin, 0, zOrigin); - ms.translate(x - centerX, y, z - centerZ); + ms.translate(x - centerX - camera.x, y - camera.y, z - centerZ - camera.z); TransformStack.cast(ms) .translate(origin) .translate(rotationOffset) @@ -67,7 +67,7 @@ public class DeployTool extends PlacementToolBase { .translateBack(origin); AABBOutline outline = schematicHandler.getOutline(); - outline.render(ms, buffer, pt); + outline.render(ms, buffer, Vec3.ZERO, pt); outline.getParams() .clearTextures(); ms.popPose(); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java index fa653d28c..23238c092 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java @@ -75,7 +75,7 @@ public class FlipTool extends PlacementToolBase { .disableLineNormals() .colored(0xdddddd) .withFaceTextures(tex, tex); - outline.render(ms, buffer, AnimationTickHolder.getPartialTicks()); + outline.render(ms, buffer, Vec3.ZERO, AnimationTickHolder.getPartialTicks()); super.renderOnSchematic(ms, buffer); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/ISchematicTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/ISchematicTool.java index f7a2ecdf7..5bbbc318c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/ISchematicTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/ISchematicTool.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.gui.ForgeIngameGui; public interface ISchematicTool { @@ -13,7 +14,7 @@ public interface ISchematicTool { public boolean handleRightClick(); public boolean handleMouseWheel(double delta); - public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer); + public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera); public void renderOverlay(ForgeIngameGui gui, PoseStack poseStack, float partialTicks, int width, int height); public void renderOnSchematic(PoseStack ms, SuperRenderTypeBuffer buffer); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java index 9f1bc0bba..0fe9cf930 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java @@ -28,7 +28,7 @@ public class MoveTool extends PlacementToolBase { Vec3 vec = Vec3.atLowerCornerOf(selectedFace.getNormal()).scale(-Math.signum(delta)); vec = vec.multiply(transformation.getMirrorModifier(Axis.X), 1, transformation.getMirrorModifier(Axis.Z)); vec = VecHelper.rotate(vec, transformation.getRotationTarget(), Axis.Y); - transformation.move((float) vec.x, 0, (float) vec.z); + transformation.move((int) vec.x, 0, (int) vec.z); schematicHandler.markDirty(); return true; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveVerticalTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveVerticalTool.java index a3f8a6dbe..0f7c7d854 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveVerticalTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveVerticalTool.java @@ -1,11 +1,13 @@ package com.simibubi.create.content.schematics.client.tools; +import net.minecraft.util.Mth; + public class MoveVerticalTool extends PlacementToolBase { @Override public boolean handleMouseWheel(double delta) { if (schematicHandler.isDeployed()) { - schematicHandler.getTransformation().move(0, (float) Math.signum(delta), 0); + schematicHandler.getTransformation().move(0, Mth.sign(delta), 0); schematicHandler.markDirty(); } return true; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/PlacementToolBase.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/PlacementToolBase.java index ca7b40d21..a6b78ac26 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/PlacementToolBase.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/PlacementToolBase.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.gui.ForgeIngameGui; public abstract class PlacementToolBase extends SchematicToolBase { @@ -18,8 +19,8 @@ public abstract class PlacementToolBase extends SchematicToolBase { } @Override - public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer) { - super.renderTool(ms, buffer); + public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) { + super.renderTool(ms, buffer, camera); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java index 21dcda4ad..0bd8bf218 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java @@ -36,7 +36,7 @@ public class RotateTool extends PlacementToolBase { .colored(0xdddddd) .lineWidth(1 / 16f); line.set(start, end) - .render(ms, buffer, AnimationTickHolder.getPartialTicks()); + .render(ms, buffer, Vec3.ZERO, AnimationTickHolder.getPartialTicks()); super.renderOnSchematic(ms, buffer); } 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 b3296d1d0..c5c19f01b 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 @@ -121,7 +121,7 @@ public abstract class SchematicToolBase implements ISchematicTool { } @Override - public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer) {} + public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) {} @Override public void renderOverlay(ForgeIngameGui gui, PoseStack poseStack, float partialTicks, int width, int height) {} @@ -143,7 +143,7 @@ public abstract class SchematicToolBase implements ISchematicTool { .colored(0x6886c5) .withFaceTexture(AllSpecialTextures.CHECKERED) .lineWidth(1 / 16f); - outline.render(ms, buffer, AnimationTickHolder.getPartialTicks()); + outline.render(ms, buffer, Vec3.ZERO, AnimationTickHolder.getPartialTicks()); outline.getParams() .clearTextures(); ms.popPose(); diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index e3830192a..0c4c4ffbb 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -204,26 +204,23 @@ public class ClientEvents { @SubscribeEvent public static void onRenderWorld(RenderLevelLastEvent event) { - Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera() - .getPosition(); - float pt = AnimationTickHolder.getPartialTicks(); - PoseStack ms = event.getPoseStack(); ms.pushPose(); - ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); + float partialTicks = AnimationTickHolder.getPartialTicks(); + Vec3 camera = Minecraft.getInstance().gameRenderer.getMainCamera() + .getPosition(); - TrackBlockOutline.drawCurveSelection(ms, buffer); - TrackTargetingClient.render(ms, buffer); - CouplingRenderer.renderAll(ms, buffer); - CarriageCouplingRenderer.renderAll(ms, buffer); - CreateClient.SCHEMATIC_HANDLER.render(ms, buffer); - CreateClient.GHOST_BLOCKS.renderAll(ms, buffer); + TrackBlockOutline.drawCurveSelection(ms, buffer, camera); + TrackTargetingClient.render(ms, buffer, camera); + CouplingRenderer.renderAll(ms, buffer, camera); + CarriageCouplingRenderer.renderAll(ms, buffer, camera); + CreateClient.SCHEMATIC_HANDLER.render(ms, buffer, camera); + CreateClient.GHOST_BLOCKS.renderAll(ms, buffer, camera); + CreateClient.OUTLINER.renderOutlines(ms, buffer, camera, partialTicks); - CreateClient.OUTLINER.renderOutlines(ms, buffer, pt); buffer.draw(); RenderSystem.enableCull(); - ms.popPose(); } @@ -322,14 +319,14 @@ public class ClientEvents { if (AllFluids.CHOCOLATE.get() .isSame(fluid)) { - event.scaleFarPlaneDistance(1f/32f); + event.scaleFarPlaneDistance(1f / 32f); event.setCanceled(true); return; } if (AllFluids.HONEY.get() .isSame(fluid)) { - event.scaleFarPlaneDistance(1f/8f); + event.scaleFarPlaneDistance(1f / 8f); event.setCanceled(true); return; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 731838dc7..074e9d0ff 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -249,7 +249,7 @@ public class PonderScene { camera.set(transform.xRotation.getValue(pt) + 90, transform.yRotation.getValue(pt) + 180); world.renderEntities(ms, buffer, camera, pt); world.renderParticles(ms, buffer, camera, pt); - outliner.renderOutlines(ms, buffer, pt); + outliner.renderOutlines(ms, buffer, Vec3.ZERO, pt); ms.popPose(); ForcedDiffuseState.popCalculator(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java index 0c6321006..db131f5cb 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java @@ -399,7 +399,7 @@ public class WorldSectionElement extends AnimatedSceneElement { .lineWidth(1 / 64f) .colored(0xefefef) .disableLineNormals(); - aabbOutline.render(ms, (SuperRenderTypeBuffer) buffer, pt); + aabbOutline.render(ms, (SuperRenderTypeBuffer) buffer, Vec3.ZERO, pt); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java index 9f5b064ce..7bc049063 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java @@ -76,7 +76,7 @@ public class ValueBox extends ChasingAABBOutline { } @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) { boolean hasTransform = transform != null; if (transform instanceof Sided && params.getHighlightedFace() != null) ((Sided) transform).fromSide(params.getHighlightedFace()); @@ -84,11 +84,11 @@ public class ValueBox extends ChasingAABBOutline { return; ms.pushPose(); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); + ms.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); if (hasTransform) transform.transform(blockState, ms); params.colored(isPassive ? passiveColor : highlightColor); - super.render(ms, buffer, pt); + super.render(ms, buffer, Vec3.ZERO, pt); float fontScale = hasTransform ? -transform.getFontScale() : -1 / 64f; ms.scale(fontScale, fontScale, fontScale); 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 1f7cbc500..049532232 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 @@ -24,6 +24,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.model.data.IModelData; public abstract class GhostBlockRenderer { @@ -40,12 +41,12 @@ public abstract class GhostBlockRenderer { return TRANSPARENT; } - public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params); + public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, GhostBlockParams params); private static class DefaultGhostBlockRenderer extends GhostBlockRenderer { @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, GhostBlockParams params) { ms.pushPose(); BlockRenderDispatcher dispatcher = Minecraft.getInstance() @@ -57,7 +58,7 @@ public abstract class GhostBlockRenderer { VertexConsumer vb = buffer.getEarlyBuffer(layer); BlockPos pos = params.pos; - ms.translate(pos.getX(), pos.getY(), pos.getZ()); + ms.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); dispatcher.getModelRenderer() .renderModel(ms.last(), vb, params.state, model, 1f, 1f, 1f, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, @@ -71,7 +72,7 @@ public abstract class GhostBlockRenderer { private static class TransparentGhostBlockRenderer extends GhostBlockRenderer { @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, GhostBlockParams params) { ms.pushPose(); Minecraft mc = Minecraft.getInstance(); @@ -83,7 +84,7 @@ public abstract class GhostBlockRenderer { VertexConsumer vb = buffer.getEarlyBuffer(layer); BlockPos pos = params.pos; - ms.translate(pos.getX(), pos.getY(), pos.getZ()); + ms.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); ms.translate(.5, .5, .5); ms.scale(.85f, .85f, .85f); 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 7fae395c9..732cff617 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 @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; public class GhostBlocks { @@ -54,10 +55,10 @@ public class GhostBlocks { ghosts.entrySet().removeIf(e -> !e.getValue().isAlive()); } - public void renderAll(PoseStack ms, SuperRenderTypeBuffer buffer) { + public void renderAll(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) { ghosts.forEach((slot, entry) -> { GhostBlockRenderer ghost = entry.ghost; - ghost.render(ms, buffer, entry.params); + ghost.render(ms, buffer, camera, entry.params); }); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java index 81b34939e..aa31a3f73 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java @@ -10,7 +10,6 @@ import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.foundation.render.RenderTypes; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; import net.minecraft.world.phys.AABB; @@ -44,24 +43,23 @@ public class AABBOutline extends Outline { } @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) { params.loadColor(colorTemp); Vector4f color = colorTemp; int lightmap = params.lightmap; boolean disableLineNormals = params.disableLineNormals; - - renderBox(ms, buffer, bb, color, lightmap, disableLineNormals); + renderBox(ms, buffer, camera, bb, color, lightmap, disableLineNormals); } - protected void renderBox(PoseStack ms, SuperRenderTypeBuffer buffer, AABB box, Vector4f color, int lightmap, boolean disableLineNormals) { + protected void renderBox(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, AABB box, Vector4f color, int lightmap, boolean disableLineNormals) { Vector3f minPos = minPosTemp1; Vector3f maxPos = maxPosTemp1; - Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera() - .getPosition(); - boolean cameraInside = box.contains(cameraPos); + boolean cameraInside = box.contains(camera); boolean cull = !cameraInside && !params.disableCull; float inflate = cameraInside ? -1 / 128f : 1 / 128f; + + box = box.move(camera.scale(-1)); minPos.set((float) box.minX - inflate, (float) box.minY - inflate, (float) box.minZ - inflate); maxPos.set((float) box.maxX + inflate, (float) box.maxY + inflate, (float) box.maxZ + inflate); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java index b0f646ec2..ca117a5d4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java @@ -20,6 +20,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.phys.Vec3; public class BlockClusterOutline extends Outline { @@ -38,22 +39,28 @@ public class BlockClusterOutline extends Outline { } @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) { params.loadColor(colorTemp); Vector4f color = colorTemp; int lightmap = params.lightmap; boolean disableLineNormals = params.disableLineNormals; - renderFaces(ms, buffer, pt, color, lightmap); - renderEdges(ms, buffer, pt, color, lightmap, disableLineNormals); + renderFaces(ms, buffer, camera, pt, color, lightmap); + renderEdges(ms, buffer, camera, pt, color, lightmap, disableLineNormals); } - protected void renderFaces(PoseStack ms, SuperRenderTypeBuffer buffer, float pt, Vector4f color, int lightmap) { + protected void renderFaces(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt, Vector4f color, int lightmap) { Optional optionalFaceTexture = params.faceTexture; if (!optionalFaceTexture.isPresent()) return; - AllSpecialTextures faceTexture = optionalFaceTexture.get(); + if (cluster.isEmpty()) + return; + ms.pushPose(); + ms.translate(cluster.anchor.getX() - camera.x, cluster.anchor.getY() - camera.y, + cluster.anchor.getZ() - camera.z); + + AllSpecialTextures faceTexture = optionalFaceTexture.get(); PoseStack.Pose pose = ms.last(); RenderType renderType = RenderTypes.getOutlineTranslucent(faceTexture.getLocation(), true); VertexConsumer consumer = buffer.getLateBuffer(renderType); @@ -65,12 +72,20 @@ public class BlockClusterOutline extends Outline { pos = pos.relative(direction.getOpposite()); bufferBlockFace(pose, consumer, pos, direction, color, lightmap); }); + + ms.popPose(); } - protected void renderEdges(PoseStack ms, SuperRenderTypeBuffer buffer, float pt, Vector4f color, int lightmap, boolean disableNormals) { + protected void renderEdges(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt, Vector4f color, int lightmap, boolean disableNormals) { float lineWidth = params.getLineWidth(); if (lineWidth == 0) return; + if (cluster.isEmpty()) + return; + + ms.pushPose(); + ms.translate(cluster.anchor.getX() - camera.x, cluster.anchor.getY() - camera.y, + cluster.anchor.getZ() - camera.z); PoseStack.Pose pose = ms.last(); VertexConsumer consumer = buffer.getBuffer(RenderTypes.getOutlineSolid()); @@ -82,6 +97,8 @@ public class BlockClusterOutline extends Outline { Direction direction = Direction.get(AxisDirection.POSITIVE, edge.axis); bufferCuboidLine(pose, consumer, origin, direction, 1, lineWidth, color, lightmap, disableNormals); }); + + ms.popPose(); } public static void loadFaceData(Direction face, Vector3f pos0, Vector3f pos1, Vector3f pos2, Vector3f pos3, Vector3f normal) { @@ -162,6 +179,7 @@ public class BlockClusterOutline extends Outline { private static class Cluster { + private BlockPos anchor; private Map visibleFaces; private Set visibleEdges; @@ -169,8 +187,16 @@ public class BlockClusterOutline extends Outline { visibleEdges = new HashSet<>(); visibleFaces = new HashMap<>(); } + + public boolean isEmpty() { + return anchor == null; + } public void include(BlockPos pos) { + if (anchor == null) + anchor = pos; + + pos = pos.subtract(anchor); // 6 FACES for (Axis axis : Iterate.axes) { 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 6ca4b1550..d8cfe13e7 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 @@ -6,6 +6,7 @@ import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import net.minecraft.util.Mth; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; public class ChasingAABBOutline extends AABBOutline { @@ -29,20 +30,18 @@ public class ChasingAABBOutline extends AABBOutline { } @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) { params.loadColor(colorTemp); Vector4f color = colorTemp; int lightmap = params.lightmap; boolean disableLineNormals = params.disableLineNormals; - - renderBox(ms, buffer, interpolateBBs(prevBB, bb, pt), color, lightmap, disableLineNormals); + renderBox(ms, buffer, camera, interpolateBBs(prevBB, bb, pt), color, lightmap, disableLineNormals); } private static AABB interpolateBBs(AABB current, AABB target, float pt) { - return new AABB(Mth.lerp(pt, current.minX, target.minX), - Mth.lerp(pt, current.minY, target.minY), Mth.lerp(pt, current.minZ, target.minZ), - Mth.lerp(pt, current.maxX, target.maxX), Mth.lerp(pt, current.maxY, target.maxY), - Mth.lerp(pt, current.maxZ, target.maxZ)); + return new AABB(Mth.lerp(pt, current.minX, target.minX), Mth.lerp(pt, current.minY, target.minY), + Mth.lerp(pt, current.minZ, target.minZ), Mth.lerp(pt, current.maxX, target.maxX), + Mth.lerp(pt, current.maxY, target.maxY), Mth.lerp(pt, current.maxZ, target.maxZ)); } } 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 d59aa203b..da0921bac 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,7 +2,7 @@ package com.simibubi.create.foundation.utility.outliner; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Vector3f; +import com.mojang.math.Vector3d; import com.mojang.math.Vector4f; import com.simibubi.create.foundation.render.RenderTypes; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; @@ -12,23 +12,23 @@ import net.minecraft.world.phys.Vec3; public class LineOutline extends Outline { - protected final Vector3f start = new Vector3f(); - protected final Vector3f end = new Vector3f(); + protected final Vector3d start = new Vector3d(0, 0, 0); + protected final Vector3d end = new Vector3d(0, 0, 0); - public LineOutline set(Vector3f start, Vector3f end) { - this.start.load(start); - this.start.load(end); + public LineOutline set(Vector3d start, Vector3d end) { + this.start.set(start.x, start.y, start.z); + this.end.set(end.x, end.y, end.z); return this; } public LineOutline set(Vec3 start, Vec3 end) { - this.start.set((float) start.x, (float) start.y, (float) start.z); - this.end.set((float) end.x, (float) end.y, (float) end.z); + this.start.set(start.x, start.y, start.z); + this.end.set(end.x, end.y, end.z); return this; } @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) { float width = params.getLineWidth(); if (width == 0) return; @@ -38,11 +38,12 @@ public class LineOutline extends Outline { Vector4f color = colorTemp; int lightmap = params.lightmap; boolean disableLineNormals = params.disableLineNormals; - renderInner(ms, consumer, pt, width, color, lightmap, disableLineNormals); + renderInner(ms, consumer, camera, pt, width, color, lightmap, disableLineNormals); } - protected void renderInner(PoseStack ms, VertexConsumer consumer, float pt, float width, Vector4f color, int lightmap, boolean disableNormals) { - bufferCuboidLine(ms, consumer, start, end, width, color, lightmap, disableNormals); + protected void renderInner(PoseStack ms, VertexConsumer consumer, Vec3 camera, float pt, float width, + Vector4f color, int lightmap, boolean disableNormals) { + bufferCuboidLine(ms, consumer, camera, start, end, width, color, lightmap, disableNormals); } public static class EndChasingLineOutline extends LineOutline { @@ -50,7 +51,7 @@ public class LineOutline extends Outline { private float prevProgress = 0; private boolean lockStart; - private final Vector3f startTemp = new Vector3f(); + private final Vector3d startTemp = new Vector3d(0, 0, 0); public EndChasingLineOutline(boolean lockStart) { this.lockStart = lockStart; @@ -63,9 +64,11 @@ public class LineOutline extends Outline { } @Override - protected void renderInner(PoseStack ms, VertexConsumer consumer, float pt, float width, Vector4f color, int lightmap, boolean disableNormals) { + protected void renderInner(PoseStack ms, VertexConsumer consumer, Vec3 camera, float pt, float width, + Vector4f color, int lightmap, boolean disableNormals) { float distanceToTarget = Mth.lerp(pt, prevProgress, progress); - Vector3f end; + + Vector3d end; if (lockStart) { end = this.start; } else { @@ -73,13 +76,12 @@ public class LineOutline extends Outline { distanceToTarget = 1 - distanceToTarget; } - Vector3f start = this.startTemp; - start.load(this.start); - start.sub(end); - start.mul(distanceToTarget); - start.add(end); - - bufferCuboidLine(ms, consumer, start, end, width, color, lightmap, disableNormals); + Vector3d start = this.startTemp; + double x = (this.start.x - end.x) * distanceToTarget + end.x; + double y = (this.start.y - end.y) * distanceToTarget + end.y; + double z = (this.start.z - end.z) * distanceToTarget + end.z; + start.set((float) x, (float) y, (float) z); + bufferCuboidLine(ms, consumer, camera, start, end, width, color, lightmap, disableNormals); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java index 9c9fe18f9..cd5c5e91f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java @@ -9,6 +9,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix3f; import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3d; import com.mojang.math.Vector3f; import com.mojang.math.Vector4f; import com.simibubi.create.AllSpecialTextures; @@ -20,6 +21,7 @@ import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.Direction; import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; public abstract class Outline { @@ -40,14 +42,14 @@ public abstract class Outline { return params; } - public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt); + public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt); public void tick() {} - public void bufferCuboidLine(PoseStack poseStack, VertexConsumer consumer, Vector3f start, Vector3f end, float width, Vector4f color, int lightmap, boolean disableNormals) { + public void bufferCuboidLine(PoseStack poseStack, VertexConsumer consumer, Vec3 camera, Vector3d start, Vector3d end, + float width, Vector4f color, int lightmap, boolean disableNormals) { Vector3f diff = this.diffPosTemp; - diff.load(end); - diff.sub(start); + diff.set((float) (end.x - start.x), (float) (end.y - start.y), (float) (end.z - start.z)); float length = Mth.sqrt(diff.x() * diff.x() + diff.y() * diff.y() + diff.z() * diff.z()); float hAngle = AngleHelper.deg(Mth.atan2(diff.x(), diff.z())); @@ -56,7 +58,7 @@ public abstract class Outline { poseStack.pushPose(); TransformStack.cast(poseStack) - .translate(start) + .translate(start.x - camera.x, start.y - camera.y, start.z - camera.z) .rotateY(hAngle) .rotateX(vAngle); bufferCuboidLine(poseStack.last(), consumer, Vector3f.ZERO, Direction.SOUTH, length, width, color, lightmap, @@ -64,7 +66,8 @@ public abstract class Outline { poseStack.popPose(); } - public void bufferCuboidLine(PoseStack.Pose pose, VertexConsumer consumer, Vector3f origin, Direction direction, float length, float width, Vector4f color, int lightmap, boolean disableNormals) { + public void bufferCuboidLine(PoseStack.Pose pose, VertexConsumer consumer, Vector3f origin, Direction direction, + float length, float width, Vector4f color, int lightmap, boolean disableNormals) { Vector3f minPos = minPosTemp; Vector3f maxPos = maxPosTemp; @@ -96,7 +99,8 @@ public abstract class Outline { bufferCuboid(pose, consumer, minPos, maxPos, color, lightmap, disableNormals); } - public void bufferCuboid(PoseStack.Pose pose, VertexConsumer consumer, Vector3f minPos, Vector3f maxPos, Vector4f color, int lightmap, boolean disableNormals) { + public void bufferCuboid(PoseStack.Pose pose, VertexConsumer consumer, Vector3f minPos, Vector3f maxPos, + Vector4f color, int lightmap, boolean disableNormals) { Vector4f posTransformTemp = this.posTransformTemp; Vector3f normalTransformTemp = this.normalTransformTemp; @@ -425,11 +429,13 @@ public abstract class Outline { .endVertex(); } - public void bufferQuad(PoseStack.Pose pose, VertexConsumer consumer, Vector3f pos0, Vector3f pos1, Vector3f pos2, Vector3f pos3, Vector4f color, int lightmap, Vector3f normal) { + public void bufferQuad(PoseStack.Pose pose, VertexConsumer consumer, Vector3f pos0, Vector3f pos1, Vector3f pos2, + Vector3f pos3, Vector4f color, int lightmap, Vector3f normal) { bufferQuad(pose, consumer, pos0, pos1, pos2, pos3, color, 0, 0, 1, 1, lightmap, normal); } - public void bufferQuad(PoseStack.Pose pose, VertexConsumer consumer, Vector3f pos0, Vector3f pos1, Vector3f pos2, Vector3f pos3, Vector4f color, float minU, float minV, float maxU, float maxV, int lightmap, Vector3f normal) { + public void bufferQuad(PoseStack.Pose pose, VertexConsumer consumer, Vector3f pos0, Vector3f pos1, Vector3f pos2, + Vector3f pos3, Vector4f color, float minU, float minV, float maxU, float maxV, int lightmap, Vector3f normal) { Vector4f posTransformTemp = this.posTransformTemp; Vector3f normalTransformTemp = this.normalTransformTemp; 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 0e4b472d0..dfeeb7dce 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 @@ -139,7 +139,7 @@ public class Outliner { } } - public void renderOutlines(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { + public void renderOutlines(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) { outlines.forEach((key, entry) -> { Outline outline = entry.getOutline(); OutlineParams params = outline.getParams(); @@ -155,7 +155,7 @@ public class Outliner { if (params.alpha < 1 / 8f) return; } - outline.render(ms, buffer, pt); + outline.render(ms, buffer, camera, pt); }); }