From f2a33120b9483bae4160720877bef1805c37a10b Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 2 Mar 2026 01:42:12 -0500 Subject: [PATCH 01/10] Prismatic crucible render rotates properly. --- .../blockstates/prismatic_crucible.json | 103 +++++++++++++++++- .../render/PrismaticCrucibleRender.java | 77 ++++++++++--- .../monilabs/common/machine/MoniMachines.java | 3 +- 3 files changed, 162 insertions(+), 21 deletions(-) diff --git a/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json b/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json index e38ee0a2..e477a6a7 100644 --- a/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json +++ b/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json @@ -1,17 +1,112 @@ { "variants": { - "facing=east": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "monilabs:block/machine/prismatic_crucible", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "monilabs:block/machine/prismatic_crucible", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "monilabs:block/machine/prismatic_crucible", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "monilabs:block/machine/prismatic_crucible", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "monilabs:block/machine/prismatic_crucible", + "y": 90 + }, + "facing=east,upwards_facing=north": { "model": "monilabs:block/machine/prismatic_crucible", "y": 90 }, - "facing=north": { + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "monilabs:block/machine/prismatic_crucible", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "monilabs:block/machine/prismatic_crucible", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "monilabs:block/machine/prismatic_crucible" + }, + "facing=north,upwards_facing=north": { "model": "monilabs:block/machine/prismatic_crucible" }, - "facing=south": { + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "monilabs:block/machine/prismatic_crucible" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "monilabs:block/machine/prismatic_crucible" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, "model": "monilabs:block/machine/prismatic_crucible", "y": 180 }, - "facing=west": { + "facing=south,upwards_facing=north": { + "model": "monilabs:block/machine/prismatic_crucible", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "monilabs:block/machine/prismatic_crucible", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "monilabs:block/machine/prismatic_crucible", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "monilabs:block/machine/prismatic_crucible", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "monilabs:block/machine/prismatic_crucible", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "monilabs:block/machine/prismatic_crucible", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "monilabs:block/machine/prismatic_crucible", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "monilabs:block/machine/prismatic_crucible", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "monilabs:block/machine/prismatic_crucible", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "monilabs:block/machine/prismatic_crucible", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, "model": "monilabs:block/machine/prismatic_crucible", "y": 270 } diff --git a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java index 20ac503b..eb3d15b9 100644 --- a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java +++ b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java @@ -58,29 +58,36 @@ public void render(PrismaticCrucibleMachine pcm, float partialTicks, PoseStack p var level = pcm.getLevel(); var color = pcm.getColorState(); assert level != null; + + Direction resolvedUp = RelativeDirection.UP.getRelative( + pcm.getFrontFacing(), + pcm.getUpwardsFacing(), + pcm.isFlipped()); + + Direction faceDir = resolvedUp.getAxis() == Direction.Axis.Y ? resolvedUp : resolvedUp.getOpposite(); + + Direction down = faceDir.getOpposite(); + poseStack.pushPose(); PoseStack.Pose pose = poseStack.last(); + var fluidRenderType = ItemBlockRenderTypes.getRenderLayer(GTMaterials.Iron.getFluid().defaultFluidState()); var consumer = buffer.getBuffer(RenderTypeHelper.getEntityRenderType(fluidRenderType, false)); consumer = consumer.color(color.r, color.g, color.b, 1.0F); - var up = RelativeDirection.UP.getRelative(pcm.getFrontFacing(), pcm.getUpwardsFacing(), - pcm.isFlipped()); - if (up.getAxis() != Direction.Axis.Y) up = up.getOpposite(); - drawPlane(up, pcm.getFluidBlockOffsets(), pose.pose(), consumer, GTMaterials.Iron.getFluid(), + drawPlane(faceDir, resolvedUp, pcm.getFluidBlockOffsets(), pose.pose(), consumer, GTMaterials.Iron.getFluid(), RenderUtil.FluidTextureType.STILL, combinedOverlay, pcm); + poseStack.popPose(); long gameTime = Objects.requireNonNull(Minecraft.getInstance().player).tickCount; - Direction down = up.getOpposite(); - if (pcm.isActive() && pcm.getFocusPos() != null) { Vector3f ray = new Vector3f(6.0F * (float) down.getNormal().getX(), 6.0F * (float) down.getNormal().getY(), 6.0F * (float) down.getNormal().getZ()); - float xOffset = (float) (pcm.getFocusPos().getX() - pcm.getPos().getX()) + 0.5F; + float xOffset = (float) (pcm.getFocusPos().getX() - pcm.getPos().getX()) + 12.0F; float yOffset = (float) (pcm.getFocusPos().getY() - pcm.getPos().getY()) + 0.5F; float zOffset = (float) (pcm.getFocusPos().getZ() - pcm.getPos().getZ()) + 0.5F; @@ -89,24 +96,64 @@ public void render(PrismaticCrucibleMachine pcm, float partialTicks, PoseStack p } } + private BlockPos remapOffset(BlockPos offset, Direction resolvedUp) { + if (resolvedUp.getAxis() == Direction.Axis.Y) return offset; + + int x = offset.getX(); + int y = offset.getY(); + int z = offset.getZ(); + + int sign = resolvedUp.getAxisDirection() == Direction.AxisDirection.POSITIVE ? 1 : -1; + + return switch (resolvedUp.getAxis()) { + case X -> new BlockPos(y * sign, 0, z); + case Z -> new BlockPos(x, 0, y * sign); + default -> offset; + }; + } + // Stolen and modified from FluidBlockRender - public void drawPlane(Direction face, Collection offsets, Matrix4f pose, VertexConsumer consumer, - Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, - PrismaticCrucibleMachine pcm) { + public void drawPlane(Direction face, Direction resolvedUp, Collection offsets, Matrix4f pose, + VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, + int combinedOverlay, PrismaticCrucibleMachine pcm) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); float u0 = sprite.getU0(), v0 = sprite.getV0(), u1 = sprite.getU1(), v1 = sprite.getV1(); int color = pcm.getColorState().integerColor; int r = red(color), g = green(color), b = blue(color), a = alpha(color); + var normal = getNormal(face); var vertices = transformVertices(getVertices(face), face); - BlockPos prevOffset = null; + Direction front = pcm.getFrontFacing(); + Direction upDir = resolvedUp; + + Vector3f leftVec = new Vector3f( + (float) upDir.getStepY() * front.getStepZ() - (float) upDir.getStepZ() * front.getStepY(), + (float) upDir.getStepZ() * front.getStepX() - (float) upDir.getStepX() * front.getStepZ(), + (float) upDir.getStepX() * front.getStepY() - (float) upDir.getStepY() * front.getStepX()); + + float leftShift = 0.0f; + float backShift = -8.0f; + + Matrix4f shiftedPose = new Matrix4f(pose); + shiftedPose.translate( + (leftVec.x() * leftShift) + (front.getStepX() * backShift), + (leftVec.y() * leftShift) + (front.getStepY() * backShift), + (leftVec.z() * leftShift) + (front.getStepZ() * backShift)); + for (var offset : offsets) { - BlockPos currOffset = prevOffset == null ? offset : offset.subtract(prevOffset); - pose.translate(currOffset.getX(), currOffset.getY(), currOffset.getZ()); - drawFace(pose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay); - prevOffset = offset; + float dx = (leftVec.x() * -offset.getX()) + (upDir.getStepX() * offset.getY()) + + (front.getStepX() * offset.getZ()); + float dy = (leftVec.y() * -offset.getX()) + (upDir.getStepY() * offset.getY()) + + (front.getStepY() * offset.getZ()); + float dz = (leftVec.z() * -offset.getX()) + (upDir.getStepZ() * offset.getY()) + + (front.getStepZ() * offset.getZ()); + + Matrix4f blockPose = new Matrix4f(shiftedPose); + blockPose.translate(dx, dy, dz); + + drawFace(blockPose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay); } } diff --git a/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java b/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java index c5b4052b..986c077e 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java +++ b/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java @@ -338,8 +338,7 @@ public static MachineDefinition[] registerTieredParallelMachines(String name, public static MultiblockMachineDefinition PRISMATIC_CRUCIBLE = REGISTRATE .multiblock("prismatic_crucible", PrismaticCrucibleMachine::new) - .rotationState(RotationState.NON_Y_AXIS) - .allowExtendedFacing(false) + .rotationState(RotationState.ALL) .recipeTypes(MoniRecipeTypes.CHROMATIC_PROCESSING, MoniRecipeTypes.CHROMATIC_TRANSCENDENCE) .recipeModifiers(GTRecipeModifiers.OC_NON_PERFECT) .appearanceBlock(MoniBlocks.DIMENSIONAL_STABILIZATION_NETHERITE_CASING) From f9ab7dcc1987a4b9115e07c06a0707966c82e341 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 2 Mar 2026 10:49:47 -0500 Subject: [PATCH 02/10] Helical render rotates, wooo. --- .../client/render/HelicalFusionRenderer.java | 210 ++++++++---------- 1 file changed, 97 insertions(+), 113 deletions(-) diff --git a/src/main/java/net/neganote/monilabs/client/render/HelicalFusionRenderer.java b/src/main/java/net/neganote/monilabs/client/render/HelicalFusionRenderer.java index 73fc617d..4ba61cac 100644 --- a/src/main/java/net/neganote/monilabs/client/render/HelicalFusionRenderer.java +++ b/src/main/java/net/neganote/monilabs/client/render/HelicalFusionRenderer.java @@ -1,6 +1,7 @@ package net.neganote.monilabs.client.render; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; @@ -15,7 +16,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Axis; import com.mojang.serialization.Codec; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; @@ -23,12 +23,15 @@ public class HelicalFusionRenderer extends DynamicRender { public static final HelicalFusionRenderer INSTANCE = new HelicalFusionRenderer(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + CODEC); - private static final float scale = 2.0f; - private static final Vec3 offset = new Vec3(-2.0, -1, 0); - private static final float outerRadius = 0.09f; - private static final float innerRadius = 0.12f; - private static final float twistSpeed = 10f; + private static final float SCALE = 2.0f; + private static final Vec3 OFFSET = new Vec3(-2.0, -1.0, 0.0); + private static final float OUTER_RADIUS = 0.2f; + private static final float INNER_RADIUS = 0.12f; + private static final float TWIST_SPEED = 10f; private static final float FADEOUT = 60f; private static final double LOD_NEAR = 64.0; private static final double LOD_MID = 128.0; @@ -38,10 +41,6 @@ public class HelicalFusionRenderer extends DynamicRender CODEC = Codec.unit(() -> INSTANCE); - public static final DynamicRenderType TYPE = new DynamicRenderType<>( - CODEC); - @Override public @NotNull DynamicRenderType getType() { return TYPE; @@ -65,22 +64,17 @@ public void render(FusionReactorMachine machine, float partialTick, } else return; float alpha = Mth.clamp(delta / FADEOUT, 0f, 1f); + int[] color = getProcessedColor(lastColor); + float time = (machine.getOffsetTimer() + partialTick) * 0.02f; - float rf = FastColor.ARGB32.red(lastColor) / 255f; - float gf = FastColor.ARGB32.green(lastColor) / 255f; - float bf = FastColor.ARGB32.blue(lastColor) / 255f; - float lum = 0.2126f * rf + 0.7152f * gf + 0.0722f * bf; - if (lum > 0.65f) { - float s = 0.65f / lum; - rf *= s; - gf *= s; - bf *= s; - } - int rBase = (int) (rf * 255f); - int gBase = (int) (gf * 255f); - int bBase = (int) (bf * 255f); + Direction frontDir = machine.getFrontFacing(); + Direction upDir = RelativeDirection.UP.getRelative(frontDir, machine.getUpwardsFacing(), machine.isFlipped()); + Direction leftDir = RelativeDirection.LEFT.getRelative(frontDir, machine.getUpwardsFacing(), + machine.isFlipped()); - float time = (machine.getOffsetTimer() + partialTick) * 0.02f; + Vec3 vFront = Vec3.atLowerCornerOf(frontDir.getNormal()); + Vec3 vUp = Vec3.atLowerCornerOf(upDir.getNormal()); + Vec3 vLeft = Vec3.atLowerCornerOf(leftDir.getNormal()); Vec3 cam = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); double distSq = cam.distanceToSqr(Vec3.atCenterOf(machine.getPos())); @@ -91,26 +85,23 @@ public void render(FusionReactorMachine machine, float partialTick, poseStack.translate(0.5, 0.5, 0.5); - Direction facing = machine.getFrontFacing(); - poseStack.mulPose(facing.getRotation()); - - poseStack.mulPose(Axis.XP.rotationDegrees(90)); - poseStack.mulPose(Axis.YP.rotationDegrees(90)); + Vec3 dynamicOffset = vFront.scale(-2.0) + .add(vUp.scale(3.5)) + .add(vLeft.scale(4.0)); - poseStack.translate(offset.x, offset.y, offset.z); - poseStack.scale(scale, scale, scale); + poseStack.translate(dynamicOffset.x, dynamicOffset.y, dynamicOffset.z); VertexConsumer vc = buffer.getBuffer(HelicalRenderHelpers.LIGHT_RING()); - renderHelix(poseStack, vc, time, 0f, rBase, gBase, bBase, alpha, segments, crossSections); - renderHelix(poseStack, vc, time, Mth.PI, rBase, gBase, bBase, alpha, segments, crossSections); + renderHelix(poseStack, vc, time, 0f, color, alpha, segments, crossSections, vFront, vUp, vLeft); + renderHelix(poseStack, vc, time, Mth.PI, color, alpha, segments, crossSections, vFront, vUp, vLeft); poseStack.popPose(); } private void renderHelix(PoseStack stack, VertexConsumer vc, float time, float phase, - int rBase, int gBase, int bBase, float alpha, - int segments, int crossSections) { + int[] c, float alpha, int segments, int crossSections, + Vec3 f, Vec3 u, Vec3 l) { final float OUTER_ALPHA = 0.35f; final float INNER_ALPHA = 0.15f; final float OUTER_DEPTH_NUDGE = 0.015f; @@ -119,107 +110,100 @@ private void renderHelix(PoseStack stack, VertexConsumer vc, float time, float p int ringCount = segments + 1; Vec3[] centers = new Vec3[ringCount]; Vec3[] tangents = new Vec3[ringCount]; - Vec3[] normals = new Vec3[ringCount]; - Vec3[] binorms = new Vec3[ringCount]; - - computeCurve(time, phase, segments, centers, tangents); - computeBishopFrame(segments, tangents, normals, binorms); - centers[segments] = centers[0]; + float dt = Mth.TWO_PI / segments; + for (int i = 0; i < ringCount; i++) { + float t = (i % segments) * dt + phase; + centers[i] = computeLissajous(t, time, f, u, l); + } + for (int i = 0; i < segments; i++) { + tangents[i] = centers[i + 1].subtract(centers[i]).normalize(); + } tangents[segments] = tangents[0]; - normals[segments] = normals[0]; - binorms[segments] = binorms[0]; - - Vec3[][] outer = new Vec3[ringCount][crossSections + 1]; - Vec3[][] inner = new Vec3[ringCount][crossSections + 1]; - buildRings(time, ringCount, crossSections, centers, tangents, normals, binorms, outer, inner, - innerRadius * INNER_RADIUS_SCALE); - - renderTube(stack, vc, outer, segments, crossSections, rBase, gBase, bBase, alpha * OUTER_ALPHA, - OUTER_DEPTH_NUDGE); - renderTube(stack, vc, inner, segments, crossSections, rBase, gBase, bBase, alpha * INNER_ALPHA, 0.0f); - } + Vec3[] normals = new Vec3[ringCount]; + Vec3[] binorms = new Vec3[ringCount]; + Vec3 helper = Math.abs(tangents[0].y) > 0.9 ? new Vec3(1, 0, 0) : new Vec3(0, 1, 0); + normals[0] = helper.subtract(tangents[0].scale(helper.dot(tangents[0]))).normalize(); + binorms[0] = tangents[0].cross(normals[0]).normalize(); - private void buildRings(float time, int ringCount, int crossSections, Vec3[] c, Vec3[] t, Vec3[] n, Vec3[] b, - Vec3[][] o, Vec3[][] in, float inRad) { - for (int i = 0; i < ringCount; i++) { - float twist = time * twistSpeed + i * 0.12f; - Vec3 nt = rotate(n[i], t[i], twist); - Vec3 bt = t[i].cross(nt).normalize(); - - for (int v = 0; v <= crossSections; v++) { - float angle = v * Mth.TWO_PI / crossSections; - float cos = Mth.cos(angle); - float sin = Mth.sin(angle); - - o[i][v] = c[i].add(nt.scale(cos * outerRadius)).add(bt.scale(sin * outerRadius)); - float pulse = 0.96f + 0.04f * Mth.sin(i * 0.1f + time * 3f); - in[i][v] = c[i].add(nt.scale(cos * inRad * pulse)).add(bt.scale(sin * inRad * pulse)); - } + for (int i = 1; i <= segments; i++) { + normals[i] = normals[i - 1].subtract(tangents[i].scale(normals[i - 1].dot(tangents[i]))).normalize(); + binorms[i] = tangents[i].cross(normals[i]).normalize(); } - } - private void renderTube(PoseStack stack, VertexConsumer vc, Vec3[][] rings, int segments, int crossSections, int r, - int g, int b, float a, float depthNudge) { Matrix4f pose = stack.last().pose(); for (int i = 0; i < segments; i++) { + float twist = time * TWIST_SPEED + i * 0.12f; for (int v = 0; v < crossSections; v++) { - float s = 1.0f + depthNudge; - quad(vc, pose, rings[i][v].scale(s), rings[i][v + 1].scale(s), rings[i + 1][v + 1].scale(s), - rings[i + 1][v].scale(s), r, g, b, a); + // Outer Tube + Vec3[] qOuter = getQuad(i, v, centers, tangents, normals, binorms, crossSections, OUTER_RADIUS, twist, + 0, 1.015f); + drawQuad(vc, pose, qOuter, c, alpha * OUTER_ALPHA); + + // Inner Tube + Vec3[] qInner = getQuad(i, v, centers, tangents, normals, binorms, crossSections, + INNER_RADIUS * INNER_RADIUS_SCALE, twist, time, 1.0f); + drawQuad(vc, pose, qInner, c, alpha * INNER_ALPHA); } } } - private void computeCurve(float time, float phase, int segments, Vec3[] c, Vec3[] t) { - float dt = Mth.TWO_PI / segments; - for (int i = 0; i < segments; i++) { - c[i] = lissajous(i * dt + phase, time); - } - for (int i = 0; i < segments; i++) { - int next = (i + 1) % segments; - t[i] = lissajous((next * dt) + phase, time).subtract(c[i]).normalize(); - } + private Vec3 computeLissajous(float t, float time, Vec3 f, Vec3 u, Vec3 l) { + float bx = 0.5f * Mth.cos(4 * t + time * 2.0f); + float by = 0.5f * Mth.sin(4 * t + time * 2.0f); + float bz = 6.0f * Mth.cos(t) * 0.8f; + + return l.scale(bz + OFFSET.x) + .add(u.scale(by + OFFSET.y)) + .add(f.scale(bx + OFFSET.z)) + .scale(SCALE); } - private void computeBishopFrame(int segments, Vec3[] t, Vec3[] n, Vec3[] b) { - Vec3 up = Math.abs(t[0].y) > 0.9 ? new Vec3(1, 0, 0) : new Vec3(0, 1, 0); - n[0] = up.subtract(t[0].scale(up.dot(t[0]))).normalize(); - b[0] = t[0].cross(n[0]).normalize(); - for (int i = 1; i < segments; i++) { - n[i] = n[i - 1].subtract(t[i].scale(n[i - 1].dot(t[i]))).normalize(); - b[i] = t[i].cross(n[i]).normalize(); + private Vec3[] getQuad(int i, int v, Vec3[] c, Vec3[] t, Vec3[] n, Vec3[] b, + int res, float rad, float twist, float pTime, float nudge) { + Vec3[] quad = new Vec3[4]; + for (int k = 0; k < 4; k++) { + int rIdx = i + (k == 2 || k == 3 ? 1 : 0); + int vIdx = v + (k == 1 || k == 2 ? 1 : 0); + float angle = vIdx * Mth.TWO_PI / res; + + Vec3 nt = rotate(n[rIdx], t[rIdx], twist); + Vec3 bt = t[rIdx].cross(nt).normalize(); + float pulse = pTime == 0 ? 1.0f : 0.96f + 0.04f * Mth.sin(rIdx * 0.1f + pTime * 3f); + + quad[k] = c[rIdx].add(nt.scale(Mth.cos(angle) * rad * pulse)) + .add(bt.scale(Mth.sin(angle) * rad * pulse)) + .scale(nudge); } + return quad; } - private Vec3 lissajous(float t, float time) { - float rotationSpeed = 2.0f; - - float bx = 0.5f * Mth.cos(4 * t + time * rotationSpeed); - float by = 0.5f * Mth.sin(4 * t + time * rotationSpeed); - - float bz = 6.0f * Mth.cos(t); - - return new Vec3(bx, by, bz * 0.8f); + private void drawQuad(VertexConsumer vc, Matrix4f pose, Vec3[] q, int[] c, float a) { + for (Vec3 p : q) { + vc.vertex(pose, (float) p.x, (float) p.y, (float) p.z) + .color(c[0] / 255f, c[1] / 255f, c[2] / 255f, a).endVertex(); + } } private Vec3 rotate(Vec3 v, Vec3 axis, float ang) { - double c = Math.cos(ang); - double s = Math.sin(ang); - return v.scale(c).add(axis.cross(v).scale(s)).add(axis.scale(axis.dot(v) * (1 - c))); + float co = Mth.cos(ang); + float si = Mth.sin(ang); + return v.scale(co).add(axis.cross(v).scale(si)).add(axis.scale(axis.dot(v) * (1 - co))); } - private void quad(VertexConsumer vc, Matrix4f pose, Vec3 a, Vec3 b, Vec3 c, Vec3 d, int r, int g, int bl, - float al) { - vertex(vc, pose, a, r, g, bl, al); - vertex(vc, pose, b, r, g, bl, al); - vertex(vc, pose, c, r, g, bl, al); - vertex(vc, pose, d, r, g, bl, al); - } - - private void vertex(VertexConsumer vc, Matrix4f pose, Vec3 p, int r, int g, int b, float a) { - vc.vertex(pose, (float) p.x, (float) p.y, (float) p.z).color(r / 255f, g / 255f, b / 255f, a).endVertex(); + private int[] getProcessedColor(int color) { + float r = FastColor.ARGB32.red(color) / 255f; + float g = FastColor.ARGB32.green(color) / 255f; + float b = FastColor.ARGB32.blue(color) / 255f; + float lum = 0.2126f * r + 0.7152f * g + 0.0722f * b; + if (lum > 0.65f) { + float s = 0.65f / lum; + r *= s; + g *= s; + b *= s; + } + return new int[] { (int) (r * 255), (int) (g * 255), (int) (b * 255) }; } @Override From 90bca82793fd9cc62c866a7f3758465ed4ef2d67 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 2 Mar 2026 19:14:03 -0500 Subject: [PATCH 03/10] Requested helical change. --- .../neganote/monilabs/client/render/HelicalFusionRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/neganote/monilabs/client/render/HelicalFusionRenderer.java b/src/main/java/net/neganote/monilabs/client/render/HelicalFusionRenderer.java index 4ba61cac..986835e9 100644 --- a/src/main/java/net/neganote/monilabs/client/render/HelicalFusionRenderer.java +++ b/src/main/java/net/neganote/monilabs/client/render/HelicalFusionRenderer.java @@ -28,7 +28,7 @@ public class HelicalFusionRenderer extends DynamicRender Date: Mon, 2 Mar 2026 19:23:15 -0500 Subject: [PATCH 04/10] Requested prismaC change. --- .../blockstates/prismatic_crucible.json | 38 ------------------- .../monilabs/common/machine/MoniMachines.java | 2 +- 2 files changed, 1 insertion(+), 39 deletions(-) diff --git a/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json b/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json index e477a6a7..94d97eb8 100644 --- a/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json +++ b/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json @@ -1,24 +1,5 @@ { "variants": { - "facing=down,upwards_facing=east": { - "gtceu:z": 90, - "model": "monilabs:block/machine/prismatic_crucible", - "x": 90 - }, - "facing=down,upwards_facing=north": { - "model": "monilabs:block/machine/prismatic_crucible", - "x": 90 - }, - "facing=down,upwards_facing=south": { - "gtceu:z": 180, - "model": "monilabs:block/machine/prismatic_crucible", - "x": 90 - }, - "facing=down,upwards_facing=west": { - "gtceu:z": 270, - "model": "monilabs:block/machine/prismatic_crucible", - "x": 90 - }, "facing=east,upwards_facing=east": { "gtceu:z": 270, "model": "monilabs:block/machine/prismatic_crucible", @@ -72,25 +53,6 @@ "model": "monilabs:block/machine/prismatic_crucible", "y": 180 }, - "facing=up,upwards_facing=east": { - "gtceu:z": 90, - "model": "monilabs:block/machine/prismatic_crucible", - "x": 270 - }, - "facing=up,upwards_facing=north": { - "gtceu:z": 180, - "model": "monilabs:block/machine/prismatic_crucible", - "x": 270 - }, - "facing=up,upwards_facing=south": { - "model": "monilabs:block/machine/prismatic_crucible", - "x": 270 - }, - "facing=up,upwards_facing=west": { - "gtceu:z": 270, - "model": "monilabs:block/machine/prismatic_crucible", - "x": 270 - }, "facing=west,upwards_facing=east": { "gtceu:z": 270, "model": "monilabs:block/machine/prismatic_crucible", diff --git a/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java b/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java index 986c077e..a1fd7930 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java +++ b/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java @@ -338,7 +338,7 @@ public static MachineDefinition[] registerTieredParallelMachines(String name, public static MultiblockMachineDefinition PRISMATIC_CRUCIBLE = REGISTRATE .multiblock("prismatic_crucible", PrismaticCrucibleMachine::new) - .rotationState(RotationState.ALL) + .rotationState(RotationState.NON_Y_AXIS) .recipeTypes(MoniRecipeTypes.CHROMATIC_PROCESSING, MoniRecipeTypes.CHROMATIC_TRANSCENDENCE) .recipeModifiers(GTRecipeModifiers.OC_NON_PERFECT) .appearanceBlock(MoniBlocks.DIMENSIONAL_STABILIZATION_NETHERITE_CASING) From 326e41d1a11b328e38e8c94c0b3b2f71a1b2caea Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 2 Mar 2026 19:35:29 -0500 Subject: [PATCH 05/10] Worth a shot? --- .../render/PrismaticCrucibleRender.java | 63 +++++++++++++------ 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java index eb3d15b9..02fef3bd 100644 --- a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java +++ b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java @@ -64,7 +64,9 @@ public void render(PrismaticCrucibleMachine pcm, float partialTicks, PoseStack p pcm.getUpwardsFacing(), pcm.isFlipped()); - Direction faceDir = resolvedUp.getAxis() == Direction.Axis.Y ? resolvedUp : resolvedUp.getOpposite(); + Direction faceDir = resolvedUp; + + Direction down = faceDir.getOpposite(); @@ -113,12 +115,21 @@ private BlockPos remapOffset(BlockPos offset, Direction resolvedUp) { } // Stolen and modified from FluidBlockRender - public void drawPlane(Direction face, Direction resolvedUp, Collection offsets, Matrix4f pose, - VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, - int combinedOverlay, PrismaticCrucibleMachine pcm) { + public void drawPlane(Direction face, Direction resolvedUp, + Collection offsets, + Matrix4f pose, + VertexConsumer consumer, + Fluid fluid, + RenderUtil.FluidTextureType texture, + int combinedOverlay, + PrismaticCrucibleMachine pcm) { + var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); - float u0 = sprite.getU0(), v0 = sprite.getV0(), u1 = sprite.getU1(), v1 = sprite.getV1(); + + float u0 = sprite.getU0(), v0 = sprite.getV0(); + float u1 = sprite.getU1(), v1 = sprite.getV1(); + int color = pcm.getColorState().integerColor; int r = red(color), g = green(color), b = blue(color), a = alpha(color); @@ -128,32 +139,46 @@ public void drawPlane(Direction face, Direction resolvedUp, Collection Direction front = pcm.getFrontFacing(); Direction upDir = resolvedUp; - Vector3f leftVec = new Vector3f( - (float) upDir.getStepY() * front.getStepZ() - (float) upDir.getStepZ() * front.getStepY(), - (float) upDir.getStepZ() * front.getStepX() - (float) upDir.getStepX() * front.getStepZ(), - (float) upDir.getStepX() * front.getStepY() - (float) upDir.getStepY() * front.getStepX()); + // 🔥 Correct right-handed basis + Vector3f frontVec = new Vector3f(front.getStepX(), front.getStepY(), front.getStepZ()); + Vector3f upVec = new Vector3f(upDir.getStepX(), upDir.getStepY(), upDir.getStepZ()); + + // Correct cross order + Vector3f leftVec = frontVec.cross(upVec, new Vector3f()).normalize(); float leftShift = 0.0f; float backShift = -8.0f; Matrix4f shiftedPose = new Matrix4f(pose); shiftedPose.translate( - (leftVec.x() * leftShift) + (front.getStepX() * backShift), - (leftVec.y() * leftShift) + (front.getStepY() * backShift), - (leftVec.z() * leftShift) + (front.getStepZ() * backShift)); + (leftVec.x * leftShift) + (frontVec.x * backShift), + (leftVec.y * leftShift) + (frontVec.y * backShift), + (leftVec.z * leftShift) + (frontVec.z * backShift)); for (var offset : offsets) { - float dx = (leftVec.x() * -offset.getX()) + (upDir.getStepX() * offset.getY()) + - (front.getStepX() * offset.getZ()); - float dy = (leftVec.y() * -offset.getX()) + (upDir.getStepY() * offset.getY()) + - (front.getStepY() * offset.getZ()); - float dz = (leftVec.z() * -offset.getX()) + (upDir.getStepZ() * offset.getY()) + - (front.getStepZ() * offset.getZ()); + + float dx = + (leftVec.x * -offset.getX()) + + (upVec.x * offset.getY()) + + (frontVec.x * offset.getZ()); + + float dy = + (leftVec.y * -offset.getX()) + + (upVec.y * offset.getY()) + + (frontVec.y * offset.getZ()); + + float dz = + (leftVec.z * -offset.getX()) + + (upVec.z * offset.getY()) + + (frontVec.z * offset.getZ()); Matrix4f blockPose = new Matrix4f(shiftedPose); blockPose.translate(dx, dy, dz); - drawFace(blockPose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay); + drawFace(blockPose, consumer, vertices, normal, + u0, u1, v0, v1, + r, g, b, a, + combinedOverlay); } } From 26ad1dd458b4d8f688ad235a72efffdf528ff637 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 2 Mar 2026 19:46:24 -0500 Subject: [PATCH 06/10] Reversion of the bleh. --- .../render/PrismaticCrucibleRender.java | 63 ++++++------------- 1 file changed, 19 insertions(+), 44 deletions(-) diff --git a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java index 02fef3bd..eb3d15b9 100644 --- a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java +++ b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java @@ -64,9 +64,7 @@ public void render(PrismaticCrucibleMachine pcm, float partialTicks, PoseStack p pcm.getUpwardsFacing(), pcm.isFlipped()); - Direction faceDir = resolvedUp; - - + Direction faceDir = resolvedUp.getAxis() == Direction.Axis.Y ? resolvedUp : resolvedUp.getOpposite(); Direction down = faceDir.getOpposite(); @@ -115,21 +113,12 @@ private BlockPos remapOffset(BlockPos offset, Direction resolvedUp) { } // Stolen and modified from FluidBlockRender - public void drawPlane(Direction face, Direction resolvedUp, - Collection offsets, - Matrix4f pose, - VertexConsumer consumer, - Fluid fluid, - RenderUtil.FluidTextureType texture, - int combinedOverlay, - PrismaticCrucibleMachine pcm) { - + public void drawPlane(Direction face, Direction resolvedUp, Collection offsets, Matrix4f pose, + VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, + int combinedOverlay, PrismaticCrucibleMachine pcm) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); - - float u0 = sprite.getU0(), v0 = sprite.getV0(); - float u1 = sprite.getU1(), v1 = sprite.getV1(); - + float u0 = sprite.getU0(), v0 = sprite.getV0(), u1 = sprite.getU1(), v1 = sprite.getV1(); int color = pcm.getColorState().integerColor; int r = red(color), g = green(color), b = blue(color), a = alpha(color); @@ -139,46 +128,32 @@ public void drawPlane(Direction face, Direction resolvedUp, Direction front = pcm.getFrontFacing(); Direction upDir = resolvedUp; - // 🔥 Correct right-handed basis - Vector3f frontVec = new Vector3f(front.getStepX(), front.getStepY(), front.getStepZ()); - Vector3f upVec = new Vector3f(upDir.getStepX(), upDir.getStepY(), upDir.getStepZ()); - - // Correct cross order - Vector3f leftVec = frontVec.cross(upVec, new Vector3f()).normalize(); + Vector3f leftVec = new Vector3f( + (float) upDir.getStepY() * front.getStepZ() - (float) upDir.getStepZ() * front.getStepY(), + (float) upDir.getStepZ() * front.getStepX() - (float) upDir.getStepX() * front.getStepZ(), + (float) upDir.getStepX() * front.getStepY() - (float) upDir.getStepY() * front.getStepX()); float leftShift = 0.0f; float backShift = -8.0f; Matrix4f shiftedPose = new Matrix4f(pose); shiftedPose.translate( - (leftVec.x * leftShift) + (frontVec.x * backShift), - (leftVec.y * leftShift) + (frontVec.y * backShift), - (leftVec.z * leftShift) + (frontVec.z * backShift)); + (leftVec.x() * leftShift) + (front.getStepX() * backShift), + (leftVec.y() * leftShift) + (front.getStepY() * backShift), + (leftVec.z() * leftShift) + (front.getStepZ() * backShift)); for (var offset : offsets) { - - float dx = - (leftVec.x * -offset.getX()) + - (upVec.x * offset.getY()) + - (frontVec.x * offset.getZ()); - - float dy = - (leftVec.y * -offset.getX()) + - (upVec.y * offset.getY()) + - (frontVec.y * offset.getZ()); - - float dz = - (leftVec.z * -offset.getX()) + - (upVec.z * offset.getY()) + - (frontVec.z * offset.getZ()); + float dx = (leftVec.x() * -offset.getX()) + (upDir.getStepX() * offset.getY()) + + (front.getStepX() * offset.getZ()); + float dy = (leftVec.y() * -offset.getX()) + (upDir.getStepY() * offset.getY()) + + (front.getStepY() * offset.getZ()); + float dz = (leftVec.z() * -offset.getX()) + (upDir.getStepZ() * offset.getY()) + + (front.getStepZ() * offset.getZ()); Matrix4f blockPose = new Matrix4f(shiftedPose); blockPose.translate(dx, dy, dz); - drawFace(blockPose, consumer, vertices, normal, - u0, u1, v0, v1, - r, g, b, a, - combinedOverlay); + drawFace(blockPose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay); } } From 38777c9641194070c4fac6dec7b942dc7ebf5771 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 2 Mar 2026 19:57:34 -0500 Subject: [PATCH 07/10] Heisenbug. --- .../neganote/monilabs/client/render/PrismaticCrucibleRender.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java index eb3d15b9..ad8d48e9 100644 --- a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java +++ b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java @@ -52,7 +52,6 @@ public class PrismaticCrucibleRender extends DynamicRender Date: Mon, 2 Mar 2026 20:32:11 -0500 Subject: [PATCH 08/10] Heisenbug. --- .../monilabs/client/render/PrismaticCrucibleRender.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java index ad8d48e9..d24513e3 100644 --- a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java +++ b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java @@ -15,8 +15,6 @@ import net.minecraft.world.level.material.Fluid; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.RenderTypeHelper; import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; import net.neganote.monilabs.common.machine.multiblock.PrismaticCrucibleMachine; From a778a157a40d0213af53dfedcccea4373baa3bdf Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 2 Mar 2026 20:49:46 -0500 Subject: [PATCH 09/10] Goodbye prismaC render rotation. --- .../blockstates/prismatic_crucible.json | 65 +-------------- .../render/PrismaticCrucibleRender.java | 82 +++++-------------- .../monilabs/common/machine/MoniMachines.java | 1 + 3 files changed, 24 insertions(+), 124 deletions(-) diff --git a/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json b/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json index 94d97eb8..e38ee0a2 100644 --- a/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json +++ b/src/generated/resources/assets/monilabs/blockstates/prismatic_crucible.json @@ -1,74 +1,17 @@ { "variants": { - "facing=east,upwards_facing=east": { - "gtceu:z": 270, + "facing=east": { "model": "monilabs:block/machine/prismatic_crucible", "y": 90 }, - "facing=east,upwards_facing=north": { - "model": "monilabs:block/machine/prismatic_crucible", - "y": 90 - }, - "facing=east,upwards_facing=south": { - "gtceu:z": 180, - "model": "monilabs:block/machine/prismatic_crucible", - "y": 90 - }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, - "model": "monilabs:block/machine/prismatic_crucible", - "y": 90 - }, - "facing=north,upwards_facing=east": { - "gtceu:z": 270, + "facing=north": { "model": "monilabs:block/machine/prismatic_crucible" }, - "facing=north,upwards_facing=north": { - "model": "monilabs:block/machine/prismatic_crucible" - }, - "facing=north,upwards_facing=south": { - "gtceu:z": 180, - "model": "monilabs:block/machine/prismatic_crucible" - }, - "facing=north,upwards_facing=west": { - "gtceu:z": 90, - "model": "monilabs:block/machine/prismatic_crucible" - }, - "facing=south,upwards_facing=east": { - "gtceu:z": 270, + "facing=south": { "model": "monilabs:block/machine/prismatic_crucible", "y": 180 }, - "facing=south,upwards_facing=north": { - "model": "monilabs:block/machine/prismatic_crucible", - "y": 180 - }, - "facing=south,upwards_facing=south": { - "gtceu:z": 180, - "model": "monilabs:block/machine/prismatic_crucible", - "y": 180 - }, - "facing=south,upwards_facing=west": { - "gtceu:z": 90, - "model": "monilabs:block/machine/prismatic_crucible", - "y": 180 - }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, - "model": "monilabs:block/machine/prismatic_crucible", - "y": 270 - }, - "facing=west,upwards_facing=north": { - "model": "monilabs:block/machine/prismatic_crucible", - "y": 270 - }, - "facing=west,upwards_facing=south": { - "gtceu:z": 180, - "model": "monilabs:block/machine/prismatic_crucible", - "y": 270 - }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, + "facing=west": { "model": "monilabs:block/machine/prismatic_crucible", "y": 270 } diff --git a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java index d24513e3..d1fb1034 100644 --- a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java +++ b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java @@ -15,6 +15,8 @@ import net.minecraft.world.level.material.Fluid; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.RenderTypeHelper; import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; import net.neganote.monilabs.common.machine.multiblock.PrismaticCrucibleMachine; @@ -50,41 +52,35 @@ public class PrismaticCrucibleRender extends DynamicRender new BlockPos(y * sign, 0, z); - case Z -> new BlockPos(x, 0, y * sign); - default -> offset; - }; - } - // Stolen and modified from FluidBlockRender - public void drawPlane(Direction face, Direction resolvedUp, Collection offsets, Matrix4f pose, - VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, - int combinedOverlay, PrismaticCrucibleMachine pcm) { + public void drawPlane(Direction face, Collection offsets, Matrix4f pose, VertexConsumer consumer, + Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, + PrismaticCrucibleMachine pcm) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); float u0 = sprite.getU0(), v0 = sprite.getV0(), u1 = sprite.getU1(), v1 = sprite.getV1(); int color = pcm.getColorState().integerColor; int r = red(color), g = green(color), b = blue(color), a = alpha(color); - var normal = getNormal(face); var vertices = transformVertices(getVertices(face), face); - Direction front = pcm.getFrontFacing(); - Direction upDir = resolvedUp; - - Vector3f leftVec = new Vector3f( - (float) upDir.getStepY() * front.getStepZ() - (float) upDir.getStepZ() * front.getStepY(), - (float) upDir.getStepZ() * front.getStepX() - (float) upDir.getStepX() * front.getStepZ(), - (float) upDir.getStepX() * front.getStepY() - (float) upDir.getStepY() * front.getStepX()); - - float leftShift = 0.0f; - float backShift = -8.0f; - - Matrix4f shiftedPose = new Matrix4f(pose); - shiftedPose.translate( - (leftVec.x() * leftShift) + (front.getStepX() * backShift), - (leftVec.y() * leftShift) + (front.getStepY() * backShift), - (leftVec.z() * leftShift) + (front.getStepZ() * backShift)); - + BlockPos prevOffset = null; for (var offset : offsets) { - float dx = (leftVec.x() * -offset.getX()) + (upDir.getStepX() * offset.getY()) + - (front.getStepX() * offset.getZ()); - float dy = (leftVec.y() * -offset.getX()) + (upDir.getStepY() * offset.getY()) + - (front.getStepY() * offset.getZ()); - float dz = (leftVec.z() * -offset.getX()) + (upDir.getStepZ() * offset.getY()) + - (front.getStepZ() * offset.getZ()); - - Matrix4f blockPose = new Matrix4f(shiftedPose); - blockPose.translate(dx, dy, dz); - - drawFace(blockPose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay); + BlockPos currOffset = prevOffset == null ? offset : offset.subtract(prevOffset); + pose.translate(currOffset.getX(), currOffset.getY(), currOffset.getZ()); + drawFace(pose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay); + prevOffset = offset; } } @@ -222,4 +178,4 @@ public boolean shouldRender(@NotNull PrismaticCrucibleMachine machine, @NotNull public @NotNull DynamicRenderType getType() { return TYPE; } -} +} \ No newline at end of file diff --git a/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java b/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java index a1fd7930..c5b4052b 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java +++ b/src/main/java/net/neganote/monilabs/common/machine/MoniMachines.java @@ -339,6 +339,7 @@ public static MachineDefinition[] registerTieredParallelMachines(String name, public static MultiblockMachineDefinition PRISMATIC_CRUCIBLE = REGISTRATE .multiblock("prismatic_crucible", PrismaticCrucibleMachine::new) .rotationState(RotationState.NON_Y_AXIS) + .allowExtendedFacing(false) .recipeTypes(MoniRecipeTypes.CHROMATIC_PROCESSING, MoniRecipeTypes.CHROMATIC_TRANSCENDENCE) .recipeModifiers(GTRecipeModifiers.OC_NON_PERFECT) .appearanceBlock(MoniBlocks.DIMENSIONAL_STABILIZATION_NETHERITE_CASING) From 5a18b87c9c214f3dedbad6e54ad410f82d722efc Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 2 Mar 2026 20:52:18 -0500 Subject: [PATCH 10/10] Spotless. --- .../monilabs/client/render/PrismaticCrucibleRender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java index d1fb1034..20ac503b 100644 --- a/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java +++ b/src/main/java/net/neganote/monilabs/client/render/PrismaticCrucibleRender.java @@ -178,4 +178,4 @@ public boolean shouldRender(@NotNull PrismaticCrucibleMachine machine, @NotNull public @NotNull DynamicRenderType getType() { return TYPE; } -} \ No newline at end of file +}