Disposing a display or geometry object still in use no longer crashes the process. A client
disconnect, a meshed-geometry reset or an app shutdown could take the process down with an access
violation. DispEngine and CubeTree native calls are now gated against
a concurrent dispose, and disposals run serialized on a single background chain —
IsDisposed reports the state and
DisposeBackground enqueues a tree, or a collection of its attachments,
onto that chain.
Large geometry no longer freezes the UI.Solid builds its display
topology off-thread and draws a wire bounding box with a “Loading” mark until it is ready.
ClStrip raises a Cleared event after Clear, pairing with
the existing PosAdded.
A P/Invoke correctness sweep reconciled the managed declarations against the real export table.
It fixed a non-existent export (substraction_ExpandToBox3d), two void natives declared as
struct returns (a garbage register read), two ToString marshals that made the CLR free foreign
memory, and a log-callback delegate nothing rooted against GC — native could call a dead thunk long
after the P/Invoke returned. These are the crashes a user reports as “it crashes randomly”.
Milled step colours no longer go stale at random. Step colours are baked into the native cube-tree
attachment, but the refresh only flagged the strip while the display cache was freed immediately, so a
frame landing in that window rebuilt the cache from stale colours and nothing cleaned it again. The
service now cleans the cache once more after the re-stamp. A paired fix stops an empty strip display
window swallowing a pending recolor indefinitely.
The dimension bar reads on any background. It was a single hard-coded near-black stroke left over
from the light-host era, invisible once the front end went dark. It is now drawn as a wider dark halo
under a white main stroke, with the halo pushed back whole depth steps rather than the white pass
nudged forward by half a depth LSB — which intermittently lost the depth test.
New geometry API.CarveStl is the managed face of the native exact
triangle-CSG container. Add is the boolean-union counterpart of Substract,
returning UnmanagedAddition, and AddBySweepingVolume
mirrors RemoveBySweepingVolume — the geometry-layer symmetric point for additive processes. There is
no deposition step in the machining runner yet, so this is a geometry-level API only.
FreeformBottomContour is the user-editable point-list bottom
contour, mirroring the side contour with the key axis switched to radius.
A host with no usable OpenGL no longer aborts the process. The native display initialiser
used to end the whole process when the GL loader failed — before any NC play, physics or training,
none of which need GL — which is what made every service on a machine whose graphics driver and
kernel module disagree unstartable, and kept it dead until the driver was fixed. It now reports
and returns; IsGlAvailable carries the verdict, ContextProjDepth reads
0 in that state, and HiNc logs one line at startup saying so. The contract is that a host must
not obtain a DispEngine while IsGlAvailable is false, rather than guard
individual draw calls.
The cube tree folds a re-cut flat region again. A comparison in the simplification gate had
been inverted since 2023: it demanded the marching-cubes ambiguous face pattern instead of
forbidding it, so almost no cell reached the reproduction test and a floor roughened by one pass
and re-cut flat by a later one stayed at its finest level for the life of the tree. 128 of the 256
corner masks now pass, the 1e-9 reproduction test behind the gate is unchanged. On a 1000-move CL
replay the node count drops 17% and the peak working set 8%. Because folds are now routine, the
meshed-geometry writer and the fly-piece remover tolerate a child array folded away under them
while a cut runs on another thread — a snapshot taken mid-cut stays torn, but no longer crashes.