1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
use crate::renderer::*;
///
/// Similar to [Model], except it is possible to render many instances of the same model efficiently.
///
pub type InstancedModel<M> = Gm<InstancedMesh, M>;
impl InstancedModel<ColorMaterial> {
///
/// Creates a new instanced 3D model with a triangle mesh as geometry and a default [ColorMaterial].
/// The model is rendered in as many instances as there are [Instance] structs given as input.
/// The transformation and texture transform in [Instance] are applied to each model instance before they are rendered.
///
pub fn new(
context: &Context,
instances: &[Instance],
cpu_mesh: &CpuMesh,
) -> ThreeDResult<Self> {
Self::new_with_material(context, instances, cpu_mesh, ColorMaterial::default())
}
}
impl<M: Material> InstancedModel<M> {
///
/// Creates a new instanced 3D model with a triangle mesh as geometry and the given material.
/// The model is rendered in as many instances as there are [Instance] structs given as input.
/// The transformation and texture transform in [Instance] are applied to each model instance before they are rendered.
///
pub fn new_with_material(
context: &Context,
instances: &[Instance],
cpu_mesh: &CpuMesh,
material: M,
) -> ThreeDResult<Self> {
Ok(Self {
geometry: InstancedMesh::new(context, instances, cpu_mesh)?,
material,
})
}
}