Table of Contents

Geometry, rendering and native stability

  • 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.