pub struct Lods {
pub detail: u8,
pub forms: Vec<LodForm>,
pub default: Option<usize>,
}Expand description
A prototype’s levels of detail (core.lods), on the prototype. Its own mesh is one form, at level detail (0 the
finest, larger coarser, 0 high to 3 very low in one source); forms are its other forms, as the source lists them
(finest first by convention; nothing depends on it).
A form is an entity of its own that holds everything the prototype holds for its mesh: core.mesh_file or
core.mesh, core.material_variants when it has variants, and every dialect component that goes with that mesh
(a reader that attaches per-primitive data to a prototype attaches it to each form too). A form with neither mesh
component draws nothing. Forms are not placed and have no forms of their own. What stays with the prototype
whichever form is drawn (its name, collision, identity) is the prototype’s: a reader may give a form its own name
or source too, and SelectLod leaves those behind.
default is the form the source itself takes: 0 the prototype’s own mesh, k forms[k - 1]; None when the
source authors none (a source switches between its levels by distance).
Fields§
§detail: u8§forms: Vec<LodForm>§default: Option<usize>Implementations§
Source§impl Lods
impl Lods
Sourcepub fn levels(&self) -> impl Iterator<Item = u8> + '_
pub fn levels(&self) -> impl Iterator<Item = u8> + '_
The levels of [own mesh, forms…], in that order.
Sourcepub fn choose(&self, choice: LodChoice) -> usize
pub fn choose(&self, choice: LodChoice) -> usize
The form choice takes, as an index into [own mesh, forms…] (LodChoice::AtMost takes the coarsest form
whose level is n or finer); LodChoice::Default without an authored default takes the finest.
Trait Implementations§
Source§impl Component for Lods
impl Component for Lods
Source§fn apply_linear(&self, _l: &Linear) -> Linearity<Self>
fn apply_linear(&self, _l: &Linear) -> Linearity<Self>
The forms are entities of their own (a pass mapping a prototype maps its forms itself).
Source§fn verify(&self, e: Entity, w: &World) -> Result<(), String>
fn verify(&self, e: Entity, w: &World) -> Result<(), String>
default, when there is one, one of the forms; with other forms, on an entity with a mesh; each form another
alive entity, listed once, not placed and without forms of its own. SelectLod checks it before it changes
anything, so it checks liveness itself, beside the world’s check of every reference.
const NAME: &'static str = "core.lods"
Source§const GEOMETRY: Geometry = crate::Geometry::None
const GEOMETRY: Geometry = crate::Geometry::None
Geometry). Stated by every component,
with no default, so data that describes a mesh can’t be left behind by an edit of it unawares: the World’s edit
paths take it from there.Source§fn to_json(&self) -> Result<Option<Value>, JsonError>
fn to_json(&self) -> Result<Option<Value>, JsonError>
Ok(None) for components
that are not shown (bulk data, handles). The view must never lose a value: components that can be shown
derive serde::Serialize and return crate::json::to_value(self).map(Some), which refuses non-finite
floats instead of writing them as null.Source§fn references(&self, out: &mut Vec<Entity>)
fn references(&self, out: &mut Vec<Entity>)
out: the edges
World::closure follows. A component holding entity references must declare every one of them.Source§const VERSION: u32 = 1
const VERSION: u32 = 1
Source§fn payload_bytes(&self) -> u64
fn payload_bytes(&self) -> u64
Source§fn remap_primitives(&self, _from: &[usize]) -> Option<Result<Self, String>>
fn remap_primitives(&self, _from: &[usize]) -> Option<Result<Self, String>>
Geometry::PerPrimitive, Geometry::PerVertex): new primitive i comes from old primitive
from[i] (a source may repeat, when a primitive is split, or be absent, when one is dropped). Such a component
always answers (a value holding nothing per primitive answers with itself); None, the default, is for
components of Geometry::None, and World::remap_primitives refuses a dependent component that gives it.
An index the component does not have is an error. remap_list does the work for a list with one entry per
primitive.Source§fn remap_vertices(
&self,
_primitive: usize,
_from: &[u32],
) -> Option<Result<Self, String>>
fn remap_vertices( &self, _primitive: usize, _from: &[u32], ) -> Option<Result<Self, String>>
primitive were compacted or reordered, for a
component that holds something per vertex (Geometry::PerVertex): new vertex i of that primitive is old
vertex from[i] (a source may repeat or be absent). Such a component always answers (with itself when it holds
nothing for that primitive); None, the default, is for the others, and World::remap_vertices refuses a
per-vertex component that gives it. An index the component does not have is an error. Every pass that compacts
or reorders a primitive’s vertices calls World::remap_vertices. After a rebuild of the primitive list
(World::rebuild_primitives, Component::remap_primitives) a primitive’s per-vertex data is its source
primitive’s, and the vertex map is relative to that source.Source§fn blend_vertices(
&self,
_primitive: usize,
_from: &[VertexBlend],
) -> Option<Result<Self, String>>
fn blend_vertices( &self, _primitive: usize, _from: &[VertexBlend], ) -> Option<Result<Self, String>>
primitive were rebuilt as blends of old ones
(VertexBlend), for a component that holds something per vertex (Geometry::PerVertex): new vertex i
is the combination from[i] of old vertices, in whatever way the component’s data combines (a morph target’s
delta is interpolated, the way the surface it moves is). It answers as Component::remap_vertices does: with
itself when it holds nothing for that primitive; None, the default, is for a component that does not know how
to combine its data, and World::blend_vertices refuses a per-vertex component that gives it. An index the
component does not have is an error. A vertex that is a copy of one old vertex (VertexBlend::copy) is the
case Component::remap_vertices states, and a component answering one answers the other alike.Source§fn restate(&self, _resolved: &Resolved<'_>) -> Restated<Self>
fn restate(&self, _resolved: &Resolved<'_>) -> Restated<Self>
resolve-state (crate::state::ResolveState) gave the axes in resolved their values: a
component that holds crate::state::Clauses of its own (a record of parts each present in some states) reduces
them as core.condition is reduced (crate::state::Resolved::reduce: a clause that fails is dropped, a clause
left with no literal holds whatever the other axes are). Restated::Absent says the entity is not present in
this state (every clause failed): it is despawned as one whose core.condition fails is. The default holds no
clause: Restated::Unchanged.impl Eq for Lods
impl StructuralPartialEq for Lods
Auto Trait Implementations§
impl Forget for Lods
impl Freeze for Lods
impl RefUnwindSafe for Lods
impl Send for Lods
impl Sync for Lods
impl Unpin for Lods
impl UnsafeUnpin for Lods
impl UnwindSafe for Lods
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.