ShapePlan

Enum ShapePlan 

Source
pub(super) enum ShapePlan {
    Identity,
    Shared {
        shapes: Vec<usize>,
        rows: Vec<PlannedRow>,
    },
}
Expand description

Which shapes get their vertices written, and how each mesh row reaches one.

Identity carries NO data on purpose: its plan is a function of the mesh index alone, so materializing it would allocate ~80 bytes per mesh — on every streamed batch of a writer that shares nothing — to store i and nine repeated constants.

Variants§

§

Identity

The -parquet-v8 layout: every mesh writes its own geometry. What the streaming route uses unless the client opted in to cross-batch sharing.

§

Shared

The -parquet-v9 layout.

Fields

§shapes: Vec<usize>

Mesh indices whose vertex/index data is emitted, in emission order.

§rows: Vec<PlannedRow>

One entry per input mesh, parallel to the mesh slice.

Implementations§

Source§

impl ShapePlan

Source

pub(super) fn shared_shapes( meshes: &[MeshData], baked_basis: Option<&Matrix4<f64>>, ) -> Self

Plan a whole model (the buffered route) in the SAME two-stage order /optimized uses (issue #5130): the rotation-aware collator (collate_rotation_aware_placements) runs first, and every occurrence it did not place falls through to a content hash of its (origin-relative) vertex and index buffers (mesh_geometry_key), so bit-identical occurrences the collator has no group for still collapse onto one shape.

Stage 1 reuses the collator verbatim — the same grouping, the same per-vertex residual check, the same all-or-nothing per group — so the flat route can never share a shape the /optimized route would have refused to share. Stage 2 mirrors serialize_to_parquet_optimized’s None branch: the hash’s first occurrence (by mesh index, not by slot) becomes the shared shape every later bit-identical occurrence points at.

Returns ShapePlan::Identity only when NEITHER stage shared anything — a hash-only match must still return Shared, not just a collator match — so a model with no repeats at all emits the v5 layout through the same path it always did rather than through a Shared plan that happens to be one-to-one.

Source

pub(super) fn shared_shapes_after( meshes: &[MeshData], baked_basis: Option<&Matrix4<f64>>, prior: &PriorShapes, ) -> (Self, Vec<NewShape>)

Plan one stream batch against the shapes earlier batches emitted (#5407). Everything Self::shared_shapes shares inside the batch is still shared; on top of that, a shape whose content hash matches one in prior is not written again — the row carries the earlier block’s whole-stream range instead.

Stage 1 reaches across batches the same way: every retained template whose representation occurs in this batch is put in FRONT of it for the collator, which takes a group’s first member as its template, so this batch’s occurrences are verified against the very geometry an earlier batch emitted and placed on its block.

Also returns every shape this batch DOES emit, in emission order, with its content hash, so the caller can record where each one lands without hashing its geometry a second time.

baked_basis is the stream’s frame, which the pipeline publishes before its first batch; None costs a site-rotated model its rotated sharing (#4118), never correctness.

Source

pub(super) fn shape_meshes<'a>( &self, meshes: &'a [MeshData], ) -> Vec<&'a MeshData>

The meshes whose geometry is emitted, in emission order.

Source

pub(super) fn row( &self, meshes: &[MeshData], i: usize, ) -> (ShapeRef, [f64; 3], [f32; 9])

Mesh row i’s shape and the placement mapping that shape’s geometry onto this occurrence. Computed, not stored, under Identity.

Source

pub(super) fn row_count(&self) -> Option<usize>

The mesh count this plan was built for; None fits any slice.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,