three_d/renderer/
object.rs

1#![macro_use]
2//!
3//! A collection of objects implementing the [Object] trait.
4//!
5//! Objects can be rendered directly or used in a render call, for example [RenderTarget::render].
6//! Use the [Gm] struct to combine any [geometry] and [material] into an [Object].
7//!
8
9macro_rules! impl_object_body {
10    ($inner:ident) => {
11        fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]) {
12            self.$inner().render(viewer, lights)
13        }
14
15        fn material_type(&self) -> MaterialType {
16            self.$inner().material_type()
17        }
18    };
19}
20
21mod gm;
22#[doc(inline)]
23pub use gm::*;
24
25mod model;
26#[doc(inline)]
27pub use model::*;
28
29mod instanced_model;
30#[doc(inline)]
31pub use instanced_model::*;
32
33mod voxel_grid;
34#[doc(inline)]
35pub use voxel_grid::*;
36
37mod skybox;
38#[doc(inline)]
39pub use skybox::*;
40
41mod imposters;
42#[doc(inline)]
43pub use imposters::*;
44
45mod terrain;
46#[doc(inline)]
47pub use terrain::*;
48
49mod water;
50#[doc(inline)]
51pub use water::*;
52
53mod axes;
54#[doc(inline)]
55pub use axes::*;
56
57use crate::core::*;
58use crate::renderer::*;
59
60///
61/// Represents a 3D object which can be rendered directly or used in a render call, for example [RenderTarget::render].
62///
63pub trait Object: Geometry {
64    ///
65    /// Render the object.
66    /// Use an empty array for the `lights` argument, if the objects does not require lights to be rendered.
67    /// Must be called in the callback given as input to a [RenderTarget], [ColorTarget] or [DepthTarget] write method.
68    ///
69    fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]);
70
71    ///
72    /// Returns the type of material applied to this object.
73    ///
74    fn material_type(&self) -> MaterialType;
75}
76
77use std::ops::Deref;
78impl<T: Object + ?Sized> Object for &T {
79    impl_object_body!(deref);
80}
81
82impl<T: Object + ?Sized> Object for &mut T {
83    impl_object_body!(deref);
84}
85
86impl<T: Object> Object for Box<T> {
87    impl_object_body!(as_ref);
88}
89
90impl<T: Object> Object for std::rc::Rc<T> {
91    impl_object_body!(as_ref);
92}
93
94impl<T: Object> Object for std::sync::Arc<T> {
95    impl_object_body!(as_ref);
96}
97
98impl<T: Object> Object for std::cell::RefCell<T> {
99    impl_object_body!(borrow);
100}
101
102impl<T: Object> Object for std::sync::RwLock<T> {
103    fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]) {
104        self.read().unwrap().render(viewer, lights)
105    }
106
107    fn material_type(&self) -> MaterialType {
108        self.read().unwrap().material_type()
109    }
110}