diff --git a/Cargo.lock b/Cargo.lock index 1ae16f7..a31c01c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,9 +139,9 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "ash" -version = "0.37.2+1.3.238" +version = "0.37.3+1.3.251" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bf19c1f0a470be5fbf7522a308a05df06610252c5bcf5143e1b23f629a9a03" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" dependencies = [ "libloading 0.7.3", ] @@ -227,7 +227,7 @@ dependencies = [ [[package]] name = "blue_engine" -version = "0.4.28" +version = "0.4.29" dependencies = [ "android_logger", "anyhow", @@ -356,7 +356,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", "libc", ] @@ -368,7 +368,7 @@ checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" dependencies = [ "bitflags 1.3.2", "core-foundation", - "foreign-types", + "foreign-types 0.3.2", "libc", ] @@ -434,12 +434,12 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "d3d12" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da" +checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" dependencies = [ - "bitflags 1.3.2", - "libloading 0.7.3", + "bitflags 2.3.1", + "libloading 0.8.0", "winapi", ] @@ -564,7 +564,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.16", ] [[package]] @@ -573,6 +594,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "futures" version = "0.3.21" @@ -693,9 +720,9 @@ checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" [[package]] name = "glow" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e007a07a24de5ecae94160f141029e9a347282cfe25d1d58d85d845cf3130f1" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" dependencies = [ "js-sys", "slotmap", @@ -705,21 +732,21 @@ dependencies = [ [[package]] name = "gpu-alloc" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.3.1", "gpu-alloc-types", ] [[package]] name = "gpu-alloc-types" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.3.1", ] [[package]] @@ -919,9 +946,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -1044,16 +1071,17 @@ dependencies = [ [[package]] name = "metal" -version = "0.24.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060" +checksum = "623b5e6cefd76e58f774bd3cc0c6f5c7615c58c03a97815245a25c3c9bdee318" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.3.1", "block", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", + "paste", ] [[package]] @@ -1094,12 +1122,12 @@ dependencies = [ [[package]] name = "naga" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d3edd593521f4a1dfd9b25193ed0224764572905f013d30ca5fbb85e010876" +checksum = "c1ceaaa4eedaece7e4ec08c55c640ba03dbb73fb812a6570a59bcf1930d0f70e" dependencies = [ "bit-set", - "bitflags 1.3.2", + "bitflags 2.3.1", "codespan-reporting", "hexf-parse", "indexmap", @@ -1885,9 +1913,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1895,16 +1923,16 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.99", + "syn 2.0.16", "wasm-bindgen-shared", ] @@ -1922,9 +1950,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1932,22 +1960,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.99", + "syn 2.0.16", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wayland-client" @@ -2024,9 +2052,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -2040,9 +2068,9 @@ checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" [[package]] name = "wgpu" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13edd72c7b08615b7179dd7e778ee3f0bdc870ef2de9019844ff2cceeee80b11" +checksum = "7472f3b69449a8ae073f6ec41d05b6f846902d92a6c45313c50cb25857b736ce" dependencies = [ "arrayvec", "cfg-if", @@ -2064,9 +2092,9 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625bea30a0ba50d88025f95c80211d1a85c86901423647fb74f397f614abbd9a" +checksum = "ecf7454d9386f602f7399225c92dd2fbdcde52c519bc8fb0bd6fbeb388075dc2" dependencies = [ "arrayvec", "bit-vec", @@ -2087,9 +2115,9 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41af2ea7d87bd41ad0a37146252d5f7c26490209f47f544b2ee3b3ff34c7732e" +checksum = "6654a13885a17f475e8324efb46dc6986d7aaaa98353330f8de2077b153d0101" dependencies = [ "android_system_properties", "arrayvec", @@ -2099,7 +2127,6 @@ dependencies = [ "block", "core-graphics-types", "d3d12", - "foreign-types", "glow", "gpu-alloc", "gpu-allocator", @@ -2129,9 +2156,9 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd33a976130f03dcdcd39b3810c0c3fc05daf86f0aaf867db14bfb7c4a9a32b" +checksum = "ee64d7398d0c2f9ca48922c902ef69c42d000c759f3db41e355f4a570b052b67" dependencies = [ "bitflags 2.3.1", "js-sys", diff --git a/Cargo.toml b/Cargo.toml index 31b612b..25cfc96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "blue_engine" -version = "0.4.28" +version = "0.4.29" authors = ["Elham Aryanpur "] edition = "2021" description = "General-Purpose, Easy-to-use, Fast, and Portable graphics engine" @@ -26,7 +26,7 @@ winit = "0.28" bytemuck = { version = "1.13", features = ["derive"] } winit_input_helper = "0.14" anyhow = "1.0" -wgpu = { version = "0.16.0" } +wgpu = { version = "0.17.0" } downcast = "0.11" nalgebra-glm = "0.18" # debug logs @@ -36,7 +36,7 @@ log = { version = "0.4", optional = true } android_logger = { version = "0.13", optional = true } [target.'cfg(target_arch = "wasm32")'.dependencies] -wgpu = { version = "0.16", features = ["webgl"] } +wgpu = { version = "0.17", features = ["webgl"] } # ========== EXAMPLES ========== # diff --git a/src/definition.rs b/src/definition.rs index edc8585..8c66a26 100644 --- a/src/definition.rs +++ b/src/definition.rs @@ -8,8 +8,8 @@ use image::GenericImageView; use wgpu::{util::DeviceExt, BindGroupLayout, Sampler, Texture, TextureView}; use crate::header::{ - Pipeline, ShaderSettings, Shaders, TextureData, TextureMode, Textures, UniformBuffers, Vertex, - VertexBuffers, + Pipeline, PipelineData, ShaderSettings, Shaders, StringBuffer, TextureData, TextureMode, + Textures, UniformBuffers, Vertex, VertexBuffers, }; impl crate::header::Renderer { @@ -22,17 +22,17 @@ impl crate::header::Renderer { uniform: Option, ) -> Result { Ok(Pipeline { - shader, - vertex_buffer, - texture, - uniform, + shader: PipelineData::Data(shader), + vertex_buffer: PipelineData::Data(vertex_buffer), + texture: PipelineData::Data(texture), + uniform: PipelineData::Data(uniform), }) } /// Creates a shader group, the input must be spir-v compiled vertex and fragment shader pub fn build_shader( &mut self, - name: &str, + name: impl StringBuffer, shader_source: String, uniform_layout: Option<&BindGroupLayout>, settings: ShaderSettings, @@ -40,7 +40,7 @@ impl crate::header::Renderer { let shader = self .device .create_shader_module(wgpu::ShaderModuleDescriptor { - label: Some(format!("{} Shader", name).as_str()), + label: Some(format!("{} Shader", name.as_str()).as_str()), source: wgpu::ShaderSource::Wgsl(shader_source.into()), }); @@ -63,7 +63,7 @@ impl crate::header::Renderer { let render_pipeline = self .device .create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some(name), + label: Some(name.as_str()), layout: Some(&render_pipeline_layout), vertex: wgpu::VertexState { module: &shader, @@ -110,7 +110,7 @@ impl crate::header::Renderer { /// Creates a new texture data pub fn build_texture( &mut self, - name: &'static str, + name: impl StringBuffer, texture_data: TextureData, texture_mode: TextureMode, //texture_format: TextureFormat, @@ -131,10 +131,10 @@ impl crate::header::Renderer { let img = match texture_data { TextureData::Bytes(data) => image::load_from_memory(data.as_slice()) - .expect(format!("Couldn't Load Image For Texture Of {}", name).as_str()), + .expect(format!("Couldn't Load Image For Texture Of {}", name.as_str()).as_str()), TextureData::Image(data) => data, TextureData::Path(path) => image::open(path) - .expect(format!("Couldn't Load Image For Texture Of {}", name).as_str()), + .expect(format!("Couldn't Load Image For Texture Of {}", name.as_str()).as_str()), }; let rgba = img.to_rgba8(); @@ -146,7 +146,7 @@ impl crate::header::Renderer { depth_or_array_layers: 1, }; let texture = self.device.create_texture(&wgpu::TextureDescriptor { - label: Some(name), + label: Some(name.as_str()), size, mip_level_count: 1, sample_count: 1, @@ -202,7 +202,7 @@ impl crate::header::Renderer { } pub(crate) fn build_depth_buffer( - label: &str, + label: impl StringBuffer, device: &wgpu::Device, config: &wgpu::SurfaceConfiguration, ) -> (Texture, TextureView, Sampler) { @@ -212,7 +212,7 @@ impl crate::header::Renderer { depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { - label: Some(label), + label: Some(label.as_str()), size, mip_level_count: 1, sample_count: 1, @@ -242,12 +242,12 @@ impl crate::header::Renderer { pub fn build_uniform_buffer_part( &self, - name: &str, + name: impl StringBuffer, value: T, ) -> wgpu::Buffer { self.device .create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(name), + label: Some(name.as_str()), contents: bytemuck::cast_slice(&[value]), usage: wgpu::BufferUsages::UNIFORM, }) @@ -260,46 +260,7 @@ impl crate::header::Renderer { ) -> Result<(UniformBuffers, BindGroupLayout), anyhow::Error> { let mut buffer_entry = Vec::::new(); let mut buffer_layout = Vec::::new(); - /*for i in uniforms.iter() { - match i { - UniformBuffer::Matrix(name, value) => { - buffer_vec.push(self.device.create_buffer_init( - &wgpu::util::BufferInitDescriptor { - label: Some(*name), - contents: bytemuck::cast_slice(&[*value]), - usage: wgpu::BufferUsages::UNIFORM, - }, - )); - } - UniformBuffer::Array3(name, value) => { - buffer_vec.push(self.device.create_buffer_init( - &wgpu::util::BufferInitDescriptor { - label: Some(*name), - contents: bytemuck::cast_slice(&[*value]), - usage: wgpu::BufferUsages::UNIFORM, - }, - )); - } - UniformBuffer::Array4(name, value) => { - buffer_vec.push(self.device.create_buffer_init( - &wgpu::util::BufferInitDescriptor { - label: Some(*name), - contents: bytemuck::cast_slice(&[*value]), - usage: wgpu::BufferUsages::UNIFORM, - }, - )); - } - UniformBuffer::Float(name, value) => { - buffer_vec.push(self.device.create_buffer_init( - &wgpu::util::BufferInitDescriptor { - label: Some(*name), - contents: bytemuck::cast_slice(&[*value]), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, - }, - )); - } - } - } */ + for i in 0..uniforms.len() { let descriptor = wgpu::BindGroupEntry { binding: i as u32, diff --git a/src/header.rs b/src/header.rs index 24a0206..04b9392 100644 --- a/src/header.rs +++ b/src/header.rs @@ -183,14 +183,22 @@ unsafe impl Sync for Engine {} /// Container for pipeline values. Each pipeline takes only 1 vertex shader, 1 fragment shader, 1 texture data, and optionally a vector of uniform data. #[derive(Debug)] pub struct Pipeline { - pub shader: crate::Shaders, - pub vertex_buffer: VertexBuffers, - pub texture: crate::Textures, - pub uniform: Option, + pub shader: PipelineData, + pub vertex_buffer: PipelineData, + pub texture: PipelineData, + pub uniform: PipelineData>, } unsafe impl Send for Pipeline {} unsafe impl Sync for Pipeline {} +/// Container for pipeline data. Allows for sharing resources with other objects +#[derive(Debug)] +pub enum PipelineData { + Copy(String), + Data(T), +} +//? ADD IT TO ALL OF PIPELINE + /// Container for vertex and index buffer #[derive(Debug)] pub struct VertexBuffers { diff --git a/src/objects.rs b/src/objects.rs index 35f5254..eaff66c 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -5,8 +5,8 @@ */ use crate::header::{ - glm, pixel_to_cartesian, uniform_type, Object, ObjectSettings, Pipeline, Renderer, RotateAxis, - TextureData, Textures, Vertex, + glm, pixel_to_cartesian, uniform_type, Object, ObjectSettings, Pipeline, PipelineData, + Renderer, RotateAxis, TextureData, Textures, Vertex, }; use crate::uniform_type::{Array4, Matrix}; use crate::utils::default_resources::{DEFAULT_MATRIX_4, DEFAULT_SHADER, DEFAULT_TEXTURE}; @@ -51,10 +51,10 @@ impl Renderer { vertices: verticies, indices: indicies, pipeline: Pipeline { - vertex_buffer, - shader: shader, - texture: texture, - uniform: Some(uniform.0), + vertex_buffer: PipelineData::Data(vertex_buffer), + shader: PipelineData::Data(shader), + texture: PipelineData::Data(texture), + uniform: PipelineData::Data(Some(uniform.0)), }, uniform_layout: uniform.1, size: glm::vec3(100f32, 100f32, 100f32), @@ -298,7 +298,7 @@ impl Object { /// Replaces the object's texture with provided one pub fn set_texture(&mut self, texture: Textures) -> anyhow::Result<()> { - self.pipeline.texture = texture; + self.pipeline.texture = PipelineData::Data(texture); self.changed = true; Ok(()) @@ -346,7 +346,7 @@ impl Object { pub fn update_vertex_buffer(&mut self, renderer: &mut Renderer) -> anyhow::Result<()> { let updated_buffer = renderer.build_vertex_buffer(&self.vertices, &self.indices)?; - self.pipeline.vertex_buffer = updated_buffer; + self.pipeline.vertex_buffer = PipelineData::Data(updated_buffer); Ok(()) } @@ -358,7 +358,7 @@ impl Object { ) -> anyhow::Result { let updated_buffer = renderer.build_vertex_buffer(&self.vertices, &self.indices)?; let updated_buffer_2 = renderer.build_vertex_buffer(&self.vertices, &self.indices)?; - self.pipeline.vertex_buffer = updated_buffer; + self.pipeline.vertex_buffer = PipelineData::Data(updated_buffer); Ok(updated_buffer_2) } @@ -370,7 +370,7 @@ impl Object { Some(&self.uniform_layout), self.shader_settings, )?; - self.pipeline.shader = updated_shader; + self.pipeline.shader = PipelineData::Data(updated_shader); Ok(()) } @@ -392,7 +392,7 @@ impl Object { Some(&self.uniform_layout), self.shader_settings, )?; - self.pipeline.shader = updated_shader; + self.pipeline.shader = PipelineData::Data(updated_shader); Ok(updated_shader2) } @@ -408,7 +408,7 @@ impl Object { let updated_buffer = renderer.build_uniform_buffer(&self.uniform_buffers)?; - self.pipeline.uniform = Some(updated_buffer.0); + self.pipeline.uniform = PipelineData::Data(Some(updated_buffer.0)); self.uniform_layout = updated_buffer.1; Ok(()) @@ -430,7 +430,7 @@ impl Object { let updated_buffer = renderer.build_uniform_buffer(&self.uniform_buffers)?; let updated_buffer2 = renderer.build_uniform_buffer(&self.uniform_buffers)?; - self.pipeline.uniform = Some(updated_buffer.0); + self.pipeline.uniform = PipelineData::Data(Some(updated_buffer.0)); self.uniform_layout = updated_buffer.1; Ok(updated_buffer2.0)