Create in the far lands

- Fixed couplings, schematics and in-world overlays not rendering correctly at coordinates far from the origin
This commit is contained in:
simibubi 2023-05-08 13:05:16 +02:00
parent 85a53f6966
commit 2e3c906ce0
32 changed files with 267 additions and 227 deletions

View file

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

View file

@ -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<AbstractMinecart> carts) {
public static void renderCoupling(PoseStack ms, MultiBufferSource buffer, Vec3 camera, Couple<AbstractMinecart> carts) {
ClientLevel world = Minecraft.getInstance().level;
if (carts.getFirst() == null || carts.getSecond() == null)
return;
Couple<Integer> lightValues =
carts.map(c -> LevelRenderer.getLightColor(world, new BlockPos(c.getBoundingBox()
.getCenter())));
Couple<Integer> 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<CartEndpoint> 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);
}
}

View file

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

View file

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

View file

@ -322,8 +322,6 @@ public class TrackTargetingBehaviour<T extends TrackEdgePoint> 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<T extends TrackEdgePoint> extends TileEntit
.translate(-.5, 0, -.5)
.light(LevelRenderer.getLightColor(level, pos))
.renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped()));
ms.popPose();
}

View file

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

View file

@ -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<TrackObserver
return;
ms.pushPose();
ms.translate(-pos.getX(), -pos.getY(), -pos.getZ());
TransformStack.cast(ms)
.translate(targetPosition.subtract(pos));
RenderedTrackOverlayType type = RenderedTrackOverlayType.OBSERVER;
TrackTargetingBehaviour.render(level, targetPosition, target.getTargetDirection(), target.getTargetBezier(), ms,
buffer, light, overlay, type, 1);

View file

@ -1,5 +1,6 @@
package com.simibubi.create.content.logistics.trains.management.edgePoint.signal;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.logistics.trains.ITrackBlock;
@ -52,7 +53,8 @@ public class SignalRenderer extends SafeTileEntityRenderer<SignalTileEntity> {
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,

View file

@ -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<StationTileEntity> {
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<StationTileEntity> {
if (te.isVirtual() && te.bogeyLocations == null)
te.refreshAssemblyInfo();
if (direction == null || te.assemblyLength == 0 || te.bogeyLocations == null)
return;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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<AllSpecialTextures> 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<MergeEntry, AxisDirection> visibleFaces;
private Set<MergeEntry> 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) {

View file

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

View file

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

View file

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

View file

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