CreateMod/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java
simibubi 2e3c906ce0 Create in the far lands
- Fixed couplings, schematics and in-world overlays not rendering correctly at coordinates far from the origin
2023-05-08 13:05:16 +02:00

111 lines
3.3 KiB
Java

package com.simibubi.create.content.schematics.client.tools;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllKeys;
import com.simibubi.create.content.schematics.client.SchematicTransformation;
import com.simibubi.create.foundation.render.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.outliner.AABBOutline;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
public class DeployTool extends PlacementToolBase {
@Override
public void init() {
super.init();
selectionRange = -1;
}
@Override
public void updateSelection() {
if (schematicHandler.isActive() && selectionRange == -1) {
selectionRange = (int) (schematicHandler.getBounds()
.getCenter()
.length() / 2);
selectionRange = Mth.clamp(selectionRange, 1, 100);
}
selectIgnoreBlocks = AllKeys.ACTIVATE_TOOL.isPressed();
super.updateSelection();
}
@Override
public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) {
super.renderTool(ms, buffer, camera);
if (selectedPos == null)
return;
ms.pushPose();
float pt = AnimationTickHolder.getPartialTicks();
double x = Mth.lerp(pt, lastChasingSelectedPos.x, chasingSelectedPos.x);
double y = Mth.lerp(pt, lastChasingSelectedPos.y, chasingSelectedPos.y);
double z = Mth.lerp(pt, lastChasingSelectedPos.z, chasingSelectedPos.z);
SchematicTransformation transformation = schematicHandler.getTransformation();
AABB bounds = schematicHandler.getBounds();
Vec3 center = bounds.getCenter();
Vec3 rotationOffset = transformation.getRotationOffset(true);
int centerX = (int) center.x;
int centerZ = (int) center.z;
double xOrigin = bounds.getXsize() / 2f;
double zOrigin = bounds.getZsize() / 2f;
Vec3 origin = new Vec3(xOrigin, 0, zOrigin);
ms.translate(x - centerX - camera.x, y - camera.y, z - centerZ - camera.z);
TransformStack.cast(ms)
.translate(origin)
.translate(rotationOffset)
.rotateY(transformation.getCurrentRotation())
.translateBack(rotationOffset)
.translateBack(origin);
AABBOutline outline = schematicHandler.getOutline();
outline.render(ms, buffer, Vec3.ZERO, pt);
outline.getParams()
.clearTextures();
ms.popPose();
}
@Override
public boolean handleMouseWheel(double delta) {
if (!selectIgnoreBlocks)
return super.handleMouseWheel(delta);
selectionRange += delta;
selectionRange = Mth.clamp(selectionRange, 1, 100);
return true;
}
@Override
public boolean handleRightClick() {
if (selectedPos == null)
return super.handleRightClick();
Vec3 center = schematicHandler.getBounds()
.getCenter();
BlockPos target = selectedPos.offset(-((int) center.x), 0, -((int) center.z));
ItemStack item = schematicHandler.getActiveSchematicItem();
if (item != null) {
item.getTag()
.putBoolean("Deployed", true);
item.getTag()
.put("Anchor", NbtUtils.writeBlockPos(target));
schematicHandler.getTransformation()
.startAt(target);
}
schematicHandler.getTransformation()
.moveTo(target);
schematicHandler.markDirty();
schematicHandler.deploy();
return true;
}
}