1use crate::hierarchy;
3use crate::Renderable;
4use crate::{
5 Component, Instantiable, Material, Mesh, ShortIndex, Skeleton, Texture, Transformation,
6 Vertices,
7};
8use hierarchy::Hierarchy;
9
10pub struct Object<'object, M, R>
16where
17 R: Renderable,
18 M: Material + 'object,
19{
20 pub skeleton: Option<Skeleton>,
22 pub vertices: Vec<&'object Vertices<'object, R>>,
24 pub textures: Vec<&'object Texture<'object, R>>,
26 pub materials: Vec<&'object M>,
28 pub components: Hierarchy<Component>,
30 }
35
36impl<'object, M, R> std::fmt::Display for Object<'object, M, R>
38where
39 R: Renderable,
40 M: Material + 'object,
41{
42 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
43 writeln!(fmt, "Object: {{")?;
44 for v in &self.vertices {
45 writeln!(fmt, " {v}")?;
46 }
47 writeln!(fmt, "}}")
48 }
49}
50
51impl<'object, M, R> Default for Object<'object, M, R>
53where
54 M: Material + 'object,
55 R: Renderable,
56{
57 fn default() -> Self {
58 Self::new()
59 }
60}
61
62impl<'object, M, R> Object<'object, M, R>
64where
65 M: Material + 'object,
66 R: Renderable,
67{
68 pub fn new() -> Self {
71 let skeleton = None;
72 let vertices = Vec::new();
73 let textures = Vec::new();
74 let materials = Vec::new();
75 let components = Hierarchy::new();
76 Self {
77 skeleton,
78 vertices,
79 textures,
80 materials,
81 components,
82 }
83 }
84
85 pub fn vertices(&self, n: ShortIndex) -> &Vertices<'object, R> {
88 self.vertices[n.as_usize()]
89 }
90
91 pub fn texture(&self, n: ShortIndex) -> &Texture<'object, R> {
94 self.textures[n.as_usize()]
95 }
96
97 pub fn material(&self, n: ShortIndex) -> &M {
100 self.materials[n.as_usize()]
101 }
102
103 pub fn add_vertices(&mut self, vertices: &'object Vertices<'object, R>) -> ShortIndex {
106 let n = self.vertices.len();
107 self.vertices.push(vertices);
108 n.into()
109 }
110
111 pub fn add_texture(&mut self, texture: &'object Texture<'object, R>) -> ShortIndex {
114 let n = self.textures.len();
115 self.textures.push(texture);
116 n.into()
117 }
118
119 pub fn add_material(&mut self, material: &'object M) -> ShortIndex {
122 let n = self.materials.len();
123 self.materials.push(material);
124 n.into()
125 }
126
127 pub fn add_component(
130 &mut self,
131 parent: Option<usize>,
132 transformation: Option<Transformation>,
133 mesh: Mesh,
134 ) -> usize {
135 let node = Component::new(transformation, mesh);
136 let child = self.components.add_node(node);
137 if let Some(parent) = parent {
138 self.components.relate(parent, child);
139 }
140 child
141 }
142
143 pub fn relate(&mut self, parent: usize, child: usize) {
146 self.components.relate(parent, child);
147 }
148
149 pub fn analyze(&mut self) {
156 self.components.find_roots();
157 }
158
159 pub fn into_instantiable(self, renderer: &mut R) -> Instantiable<R> {
169 for v in &self.vertices {
170 v.create_client(renderer);
171 }
172 for t in &self.textures {
173 t.create_client(renderer);
174 }
175 let materials: Vec<R::Material> = self
176 .materials
177 .iter()
178 .map(|m| renderer.create_material_client(&self, m))
179 .collect();
180 Instantiable::<R>::new::<M>(
181 self.skeleton,
182 self.vertices,
183 self.textures,
184 materials,
185 self.components,
186 )
187 }
188
189 }