argon-0.2.4-Fabric+Quilt
Curse Maven Snippet
What's new
Changelog
0.2.4
Every layout change in this entry was checked against the vanilla source of JigsawPlacement, JigsawBlock, BooleanOp, and Shapes, and the octree is verified candidate-for-candidate against vanilla's own free-space algebra.
JigsawBlock.canAttachnow keeps vanilla'starget.name() == nullguard. A null child name means the connector matches anything. Vanilla templates never produce one becauseJigsawBlockInfo.parsedefaults the name, but a mod that builds aJigsawBlockInfodirectly does, and the name-first matcher used to reject those.- Removed the rigid-child skip. It skipped a child when the parent connector faced outside the structure box or into a placed piece, on the claim that vanilla would reject it. The connector is only recorded when it sits inside the parent piece, and the parent piece is already in the octree, so the guard was true for every recorded connector and it dropped rigid children that vanilla places. Those candidates run vanilla now.
- Removed the tried-element identity list. In 26.3 the wrapped
Lists.newArrayListis the candidate piece list, which is iterated but nevercontains-checked, so the identity map was written on every add and read never. Deduplicating it was rejected because dropping a repeated candidate changes which pieces are tried and therefore the random sequence. - The octree query is named for the answer it gives.
hasRoomForis the accept case, and the overlap wrap stands in for the reject side ofjoinIsNotEmpty, so both agree with vanilla's!joinIsNotEmpty(free, deflated, ONLY_SECOND). JigsawPlacement$Placer.tryPlacingChildrentakesPoolElementStructurePiece,MutableObject, depth, the rigid flag,LevelHeightAccessor,RandomState,PoolAliasLookup, andLiquidSettings. The overlap and piece-recording wraps target that descriptor and capture the candidate pieceBoundingBoxas a local.- A child attached inside its own parent piece runs against vanilla's per-piece
sourceFreeshape, which the octree does not model. Those calls are left alone, and pieces placed that way are always inside the parent box, which is in the octree, so the carrier path stays correct without them.
Layout
- Piece overlap uses a box octree. A candidate is tested against nearby pieces on the 0.25-deflated box, and the accept or reject answer matches vanilla AABB checks.
- Piece bounds are six doubles in one flat array per leaf, not
AABBobjects, so a scan walks contiguous memory and never dereferences a box. The duplicate check compares those doubles instead of boxing them throughAABB.equals. - An octant is only created once some piece reaches it. Empty octants cost no object and no boundary test per query, which is the common case when pieces are small against a large structure box.
- Inserting a piece and testing one allocate nothing. The
AABB.ofcopy and the 0.25 deflate are computed straight off the pieceBoundingBox. - Octree nodes do not split when a half-extent is under 2 blocks.
- Accepted pieces are recorded on
Shapes.joinUnoptimized(require = 1), the 26.3 accept path, and the carrier is returned so the octree keeps the same contents theVoxelShapewould have carried. JigsawBlock.canAttachuses Argon's name-first matcher. Vanilla reads the front and the top out of two properties per block; both live inORIENTATION, so one lookup per block yields both.- Layout counters are
LongAdder, notAtomicLong, because they are bumped once per candidate piece and worldgen runs that loop across chunk threads.
Frame Cadence
- The interval is cached until Max Framerate changes, and the clock advances to the target time so the cap does not drift. A cap change or a stall longer than one frame resets it.
- Caps of 260 and above, and non-positive caps, stay on vanilla
FramerateLimiter. - The stretch that is parked and the stretch that is spun is no longer a fixed 1 ms. Park granularity belongs to the kernel and the scheduler, so a window that is too small means the park lands late and the frame goes out late, and one that is too large burns a core on the same deadline. The window starts at 1 ms, grows by however late a park came back, gives half of any unused stretch back, stays between 20 µs and 1 ms, and resets when the cap changes.
- The busy-spin is skipped if the park already woke at or past the target, and a spurious wakeup re-parks instead of spinning through the remaining interval.
FrameCadence.releasereturns immediately when the clock is already released for that cap.CadenceMixincalls it every frame on the uncapped path, so the common case no longer readsSystem.nanoTime()and rewrites four fields per frame. Behaviour is unchanged: a cap change or a switch from a paced cap still resets the clock.FrameCadence.releasehands the clock back when Max Framerate returns to a cap vanilla keeps. Without it, the interval cache still held the cap Argon last paced, so re-enabling that same cap compared against a clock from however long ago the setting was off and skipped the wait.
Debug Line
- F3 left column shows
Argon-Quilt (version)on Quilt andArgon-Fabric (version)on Fabric. Colors stay aqua and green. - F3 no longer stacks the brand line on every
extractLinesbatch. Extra brand lines are stripped and only one is written per overlay pass. - 26.3 calls
extractLinesmore than once per frame and only the left batch can use the line, so the text is built when a brand slot is actually filled rather than on every call. - The layout counters sit still across most frames, so the line is cached until one of them moves. The text and the counts it was built from are held together so a line can never disagree with its own numbers.
- While Argon paces frames, F3 also shows the smoothed frame-release jitter and the current spin window in microseconds, so you can see how well the scheduler is landing parks on this machine. It is read-only telemetry; nothing paces on it, and it disappears when vanilla keeps the cap.
- Loader brand is resolved once at class init.
- The line is client-only.
Performance
BoxOctreenodes hold their bounds as doubles instead of keeping anAABB, so a subdivision no longer allocates anAABBper octant.boundaryContainsuses the same half-open comparison asAABB.contains.- Octree leaves start at four boxes and grow by doubling instead of reserving sixteen up front and growing linearly, which cuts allocation for the many leaves that hold only a few pieces.
TrojanVoxelShapeshares one placeholderDiscreteVoxelShapeacross instances instead of building one per structure start.
Build
BitwiseMathis nowargon.util.Arithmetic. It is Argon's own integer helper set: ordering goes throughInteger.compare, and the mask, branchless select, and floor and ceiling division helpers are documented against the overflow that subtract-then-shift runs into.- The
-Xlint:all -Werrorbuild is clean, andbuild.gradlenow passes both to everyJavaCompile, so a warning is a build failure rather than something to notice later. The source carries no@SuppressWarningsand pulls in noMutableObject, so the deprecated commons-lang3 getter is out of the picture too. - Source files end with a newline and carry no tabs or trailing whitespace.
- Homepage, sources, and issues point at https://github.com/hasaanamerravid-source/Argon-Performance-Fabric.
- Windows wrapper, license packed in the jar, and Java 25 toolchain resolver configured.
- Quilt keeps using
fabric.mod.jsonso the mod is not registered twice. - Export no longer ships
build/,.gradle/, orlogs/output. - JUnit 5 is wired in, and
argon.mainClassesandargon.mainResourcesare passed to the test JVM so tests read the compiled output rather than a re-derived path. MixinInjectionTestreads mixin annotations as CLASS-retained data and resolves handler@Localparameters against the target method's local variable table, so it validates the capture that MixinExtras will actually perform.- The test logging syntax in
build.gradleno longer uses the removed assignment form.
Fixed
- The octree no longer answers differently depending on how full it is. A piece that never reaches the region the tree was built around was kept in the root's leaf array until the node subdivided, and a subdivision then pushed it into no octant, so the same piece was found before the split and lost after it.
addBoxnow refuses a box that does not reach the node it is offered to, so the answer is the same at any size. - The jigsaw
@Localcaptures are named.targetBBintryPlacingChildrenis the fourthBoundingBoxlocal in scope, and the implicit form was ambiguous againstsourceBB,hackBox, andrawTargetBB. A mixin whose capture is ambiguous is dropped at apply time with the rest of the mixins, which would have left the piece-recording wrap unwrapped. LoaderNames.presentcatchesLinkageErroras well asClassNotFoundException, so a mod whose class is present but fails to link is reported as absent instead of propagating out of the brand-line lookup.ArgonProfilerreportsOCTREE_CHECKS_SAVEDas a real counter, andArgonDebugLines.isBrandLinerecognises a full Argon brand line.
This mod has no additional files

