three_d/renderer/
object.rs1#![macro_use]
2macro_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
60pub trait Object: Geometry {
64 fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]);
70
71 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}