blue_engine_core/objects/
mod.rs1use crate::utils::default_resources::{DEFAULT_SHADER, DEFAULT_TEXTURE};
9use crate::{
10 Matrix4, Pipeline, PipelineData, Quaternion, Renderer, ShaderSettings, TextureData,
11 UnsignedIntType, Vector3, Vector4, Vertex,
12};
13use std::sync::Arc;
14mod transformation;
15pub use transformation::{RotateAmount, RotateAxis};
16mod instance;
17pub use instance::{Instance, InstanceRaw};
18mod shader_builder;
19pub use shader_builder::{ShaderBuilder, ShaderConfigs};
20mod resource_sharing;
21mod updating;
22
23pub struct Object {
28 pub name: std::sync::Arc<str>,
30 pub vertices: Vec<Vertex>,
32 pub indices: Vec<UnsignedIntType>,
34 pub uniform_layout: wgpu::BindGroupLayout,
36 pub pipeline: Pipeline,
38 pub instances: Vec<Instance>,
40 pub instance_buffer: wgpu::Buffer,
42 pub size: Vector3,
44 pub position: Vector3,
46 pub rotation: Vector3,
48 pub(crate) changed: bool,
50 pub translation_matrix: Matrix4,
53 pub scale_matrix: Matrix4,
56 pub rotation_quaternion: Quaternion,
59 pub inverse_transformation_matrix: Matrix4,
61 pub color: Vector4,
63 pub shader_builder: crate::objects::ShaderBuilder,
65 pub shader_settings: ShaderSettings,
67 pub camera_effect: Option<std::sync::Arc<str>>,
69 pub uniform_buffers: Vec<wgpu::Buffer>,
71 pub is_visible: bool,
73 pub render_order: usize,
75}
76unsafe impl Send for Object {}
77unsafe impl Sync for Object {}
78
79#[derive(Debug, Clone)]
81pub struct ObjectSettings {
82 pub camera_effect: Option<std::sync::Arc<str>>,
84 pub shader_settings: ShaderSettings,
86}
87impl Default for ObjectSettings {
88 fn default() -> Self {
89 Self {
90 camera_effect: Some("main".into()),
91 shader_settings: ShaderSettings::default(),
92 }
93 }
94}
95unsafe impl Send for ObjectSettings {}
96unsafe impl Sync for ObjectSettings {}
97
98pub struct ObjectStorage(std::collections::HashMap<Arc<str>, Object>);
103impl ObjectStorage {
104 pub fn new() -> Self {
106 ObjectStorage(std::collections::HashMap::new())
107 }
108}
109impl Default for ObjectStorage {
110 fn default() -> Self {
111 Self::new()
112 }
113}
114unsafe impl Send for ObjectStorage {}
115unsafe impl Sync for ObjectStorage {}
116crate::macros::impl_deref!(ObjectStorage, std::collections::HashMap<Arc<str>, Object>);
117
118impl Object {
119 pub fn new(
124 name: impl AsRef<str>,
125 vertices: Vec<Vertex>,
126 indices: Vec<UnsignedIntType>,
127 settings: ObjectSettings,
128 renderer: &mut Renderer,
129 ) -> Result<Object, crate::error::Error> {
130 let vertex_buffer = renderer.build_vertex_buffer(&vertices, &indices);
131
132 let uniform = renderer.build_uniform_buffer(&vec![
133 renderer.build_uniform_buffer_part("Transformation Matrix", Matrix4::IDENTITY),
134 renderer
135 .build_uniform_buffer_part("Color", crate::utils::default_resources::DEFAULT_COLOR),
136 ]);
137
138 let shader_source =
139 ShaderBuilder::new(DEFAULT_SHADER.to_string(), settings.camera_effect.clone());
140 let shader = renderer.build_shader(
141 name.as_ref(),
142 shader_source.shader.clone(),
143 Some(&uniform.1),
144 settings.shader_settings,
145 );
146
147 let texture = renderer.build_texture(
148 "Default Texture",
149 TextureData::Bytes(DEFAULT_TEXTURE.to_vec()),
150 crate::prelude::TextureMode::Clamp,
151 )?;
153
154 let instance = Instance::default();
155 let instance_buffer = renderer.build_instance(vec![instance.build()]);
156
157 Ok(Object {
158 name: name.as_ref().into(),
159 vertices,
160 indices,
161 pipeline: Pipeline {
162 vertex_buffer: PipelineData::Data(vertex_buffer),
163 shader: PipelineData::Data(shader),
164 texture: PipelineData::Data(texture),
165 uniform: PipelineData::Data(Some(uniform.0)),
166 },
167 instances: vec![instance],
168 instance_buffer,
169 uniform_layout: uniform.1,
170 size: Vector3::ONE,
171 position: Vector3::ZERO,
172 rotation: Vector3::ZERO,
173 changed: false,
174 translation_matrix: Matrix4::IDENTITY,
175 scale_matrix: Matrix4::IDENTITY,
176 rotation_quaternion: Quaternion::IDENTITY,
177 inverse_transformation_matrix: Matrix4::transpose(&Matrix4::inverse(
178 &Matrix4::IDENTITY,
179 )),
180 color: crate::utils::default_resources::DEFAULT_COLOR,
181 shader_builder: shader_source,
182 shader_settings: settings.shader_settings,
183 camera_effect: settings.camera_effect,
184 uniform_buffers: vec![
185 renderer.build_uniform_buffer_part("Transformation Matrix", Matrix4::IDENTITY),
186 renderer.build_uniform_buffer_part(
187 "Color",
188 crate::utils::default_resources::DEFAULT_COLOR,
189 ),
190 ],
191 is_visible: true,
192 render_order: 0,
193 })
194 }
195}