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
57mod wireframe;
58#[doc(inline)]
59pub use wireframe::*;
60
61use crate::core::*;
62use crate::renderer::*;
63
64pub trait Object: Geometry {
68 fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]);
74
75 fn material_type(&self) -> MaterialType;
79}
80
81use std::ops::Deref;
82impl<T: Object + ?Sized> Object for &T {
83 impl_object_body!(deref);
84}
85
86impl<T: Object + ?Sized> Object for &mut T {
87 impl_object_body!(deref);
88}
89
90impl<T: Object> Object for Box<T> {
91 impl_object_body!(as_ref);
92}
93
94impl<T: Object> Object for std::rc::Rc<T> {
95 impl_object_body!(as_ref);
96}
97
98impl<T: Object> Object for std::sync::Arc<T> {
99 impl_object_body!(as_ref);
100}
101
102impl<T: Object> Object for std::cell::RefCell<T> {
103 impl_object_body!(borrow);
104}
105
106impl<T: Object> Object for std::sync::RwLock<T> {
107 fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]) {
108 self.read().unwrap().render(viewer, lights)
109 }
110
111 fn material_type(&self) -> MaterialType {
112 self.read().unwrap().material_type()
113 }
114}