Ownership graph

Ownership is explicit and hierarchical. Destroying an owner invalidates its owned handles. The most important rule is that handles are process-local opaque pointers; persist logical IDs and source identity, never raw handles.

OwnerOwned stateImportant exceptions / notes
gx3de_engineScenes, render targets, STEP documents, jobs, in-memory cache/policy stateCalls on one engine are serialized by the caller; independent engines do not share mutable state.
gx3de_sceneObjects, groups, planes, anchors, sections, profiles, measurements, constraints, views, timelinesScene teardown destroys remaining timelines before views/objects.
gx3de_targetViewport regions and backend rendering resourcesTarget/OpenGL context is owned by the creating thread.
gx3de_animationLazy-loader-created frame objects, layers and derived animation stateBorrowed external objects remain caller-owned and must outlive the timeline.
gx3de_step_documentImported assembly/XDE document representationObjects instantiated from a document retain independent immutable B-Rep prototypes and may outlive the document.
gx3de_repeat_resultPrototype/remainder analysis snapshot and captured placementsDestroy explicitly when finished.

Authoritative state vs presentation

Transforms and coordinate spaces

Matrices are affine, double-precision, column-major gx3de_mat4. Object-local geometry is transformed through parent/group hierarchy into world space. Planes and field seed definitions explicitly state whether coordinates are local or world in their descriptors. B-Rep topology queries refer to the immutable local shape; transforms do not change topology indices.

Stable vs transient identity
A source mesh triangle index is stable for that immutable mesh. A B-Rep topology index is stable only for the exact immutable shape. Renderer display cell IDs are transient across rerender, tessellation, LOD and rebuild; never persist them.

Destruction semantics

Threading model

The base API is not an arbitrary concurrent scene graph. Target rendering and mutators are intended for the creating/owner thread. Only documented job poll/progress/cancel style operations are designed for concurrent observation. A prepared background job works on private input/result state; the owner thread takes the resulting object/document.