pub struct RenderDataBundleStorage {
pub observer_position: ObserverPosition,
pub bundles: Vec<RenderDataBundle>,
pub light_sources: Vec<LightSource>,
pub environment_map: Option<TextureResource>,
/* private fields */
}Expand description
Bundle storage handles bundle generation for a scene before rendering. It is used to optimize rendering by reducing amount of state changes of OpenGL context.
Fields§
§observer_position: ObserverPositionPosition of an observer for which this data bundle was created.
bundles: Vec<RenderDataBundle>A sorted list of bundles.
light_sources: Vec<LightSource>§environment_map: Option<TextureResource>Implementations§
Source§impl RenderDataBundleStorage
impl RenderDataBundleStorage
pub fn new_empty(observer_position: ObserverPosition) -> Self
Sourcepub fn from_graph(
graph: &Graph,
render_mask: BitMask,
elapsed_time: f32,
observer_position: &ObserverPosition,
render_pass_name: ImmutableString,
options: RenderDataBundleStorageOptions,
dynamic_surface_cache: &mut DynamicSurfaceCache,
) -> Self
pub fn from_graph( graph: &Graph, render_mask: BitMask, elapsed_time: f32, observer_position: &ObserverPosition, render_pass_name: ImmutableString, options: RenderDataBundleStorageOptions, dynamic_surface_cache: &mut DynamicSurfaceCache, ) -> Self
Creates a new render bundle storage from the given graph and observer info. It “asks” every node in the
graph one-by-one to give render data which is then put in the storage, sorted and ready for rendering.
Frustum culling is done on scene node side (crate::scene::node::NodeTrait::collect_render_data).
pub fn write_global_uniform_blocks( &self, render_context: &mut BundleRenderContext<'_>, ) -> GlobalUniformData
Sourcepub fn render_to_frame_buffer<BundleFilter, InstanceFilter>(
&self,
server: &dyn GraphicsServer,
geometry_cache: &mut GeometryCache,
shader_cache: &mut ShaderCache,
bundle_filter: BundleFilter,
instance_filter: InstanceFilter,
render_context: BundleRenderContext<'_>,
) -> Result<RenderPassStatistics, FrameworkError>where
BundleFilter: FnMut(&RenderDataBundle) -> bool,
InstanceFilter: FnMut(&SurfaceInstanceData) -> bool,
pub fn render_to_frame_buffer<BundleFilter, InstanceFilter>(
&self,
server: &dyn GraphicsServer,
geometry_cache: &mut GeometryCache,
shader_cache: &mut ShaderCache,
bundle_filter: BundleFilter,
instance_filter: InstanceFilter,
render_context: BundleRenderContext<'_>,
) -> Result<RenderPassStatistics, FrameworkError>where
BundleFilter: FnMut(&RenderDataBundle) -> bool,
InstanceFilter: FnMut(&SurfaceInstanceData) -> bool,
Draws the entire bundle set to the specified frame buffer with the specified rendering environment.
Trait Implementations§
Source§impl RenderDataBundleStorageTrait for RenderDataBundleStorage
impl RenderDataBundleStorageTrait for RenderDataBundleStorage
Source§fn push_triangles(
&mut self,
dynamic_surface_cache: &mut DynamicSurfaceCache,
layout: &[VertexAttributeDescriptor],
material: &MaterialResource,
render_path: RenderPath,
sort_index: u64,
node_handle: Handle<Node>,
func: &mut dyn FnMut(VertexBufferRefMut<'_>, TriangleBufferRefMut<'_>),
)
fn push_triangles( &mut self, dynamic_surface_cache: &mut DynamicSurfaceCache, layout: &[VertexAttributeDescriptor], material: &MaterialResource, render_path: RenderPath, sort_index: u64, node_handle: Handle<Node>, func: &mut dyn FnMut(VertexBufferRefMut<'_>, TriangleBufferRefMut<'_>), )
Adds a new mesh to the bundle storage using the given set of vertices and triangles. This method automatically creates a render bundle according to a hash of the following parameters:
- Material
- Vertex Type
- Render Path
If one of these parameters is different, then a new bundle will be created and used to store the given vertices and indices. If an appropriate bundle exists, the method will store the given vertices and the triangles in it.
§When to use
This method is used to reduce amount of draw calls of underlying GAPI, by merging small portions of data into one big block that shares drawing parameters and can be rendered in a single draw call. The vertices in this case should be pre-processed by applying world transform to them.
Do not use this method if you have a mesh with lots of vertices and triangles, because pre-processing them on CPU could take more time than rendering them directly on GPU one-by-one.
Source§fn push(
&mut self,
data: &SurfaceResource,
material: &MaterialResource,
render_path: RenderPath,
sort_index: u64,
instance_data: SurfaceInstanceData,
)
fn push( &mut self, data: &SurfaceResource, material: &MaterialResource, render_path: RenderPath, sort_index: u64, instance_data: SurfaceInstanceData, )
Adds a new surface instance to the storage. The method will automatically put the instance in the appropriate bundle. Bundle selection is done using the material, surface data, render path. If only one of these parameters is different, then the surface instance will be put in a separate bundle.
Auto Trait Implementations§
impl Freeze for RenderDataBundleStorage
impl !RefUnwindSafe for RenderDataBundleStorage
impl Send for RenderDataBundleStorage
impl Sync for RenderDataBundleStorage
impl Unpin for RenderDataBundleStorage
impl !UnwindSafe for RenderDataBundleStorage
Blanket Implementations§
Source§impl<T> AsyncTaskResult for T
impl<T> AsyncTaskResult for T
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
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreSource§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T, U> ObjectOrVariant<T> for Uwhere
PhantomData<U>: ObjectOrVariantHelper<T, U>,
impl<T, U> ObjectOrVariant<T> for Uwhere
PhantomData<U>: ObjectOrVariantHelper<T, U>,
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.