Include RadientTypesX.hpp for C++ wrappers that own descriptor metadata and retain data blobs. The wrappers can be passed to functions accepting the corresponding C descriptors. Get() returns the same descriptor as a const reference and does not allocate.
RadientVertexLayoutDescX owns attribute descriptors, buffer descriptors, and semantic strings. AddBuffer appends a logical source buffer, and AddAttribute appends an attribute. Buffer indices follow insertion order.
The default attribute buffer index is zero. Attribute offsets and buffer strides default to the existing automatic values. Optional arguments to AddAttribute specify buffer index, byte offset, and normalization, in that order. You can also pass a RadientVertexAttributeDesc directly. SetAttribute and SetBuffer replace existing entries. These settings describe source bytes; the renderer still selects its stored layout.
RadientTextureDataX owns its mip descriptor array and retains every referenced blob. Mips are appended in order from level zero. AddMip and SetMip accept a blob, optional byte offset, and optional row stride. A zero stride retains its existing meaning of tightly packed rows. Multiple levels can share a blob.
GenerateMips keeps its default of True; use SetGenerateMips(False) to load only the supplied levels. Format support and loading behavior are unchanged.
RadientTextureLoadInfoX owns URI and base-URI strings, nested texture metadata, and source blob references. SetTextureData selects supplied mip data and clears the encoded source; SetDataBlob selects encoded bytes and clears supplied mips. ClearSourceData clears both while preserving URIs and options. SetURI preserves supplied data because the URI can also identify a memory-backed texture. For URI-based loading, set URI on a wrapper with no supplied data.
Constructing a wrapper from a C descriptor copies its arrays and strings and retains its blobs. Copying a wrapper creates independent metadata and shares blob references. Moving transfers ownership and leaves the source at its default state. Self-move preserves the object. No operation copies pixel bytes or acquires blob read access, so mutable blobs can be populated before loading. Reference-mode blobs retain their existing external-memory lifetime rules.
Descriptor views are valid until the owning wrapper is modified, moved, or destroyed. Keep the wrapper alive through the consuming API call; Radient copies metadata and retains blobs during that call. The wrapper is not required to remain alive during asynchronous processing. Synchronize access if one thread modifies a wrapper while another accesses it.