From fcd09c1d1db748d7d94be9c95e430faa0346b839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=81NCZOS=20Vilmos=20Zsombor?= Date: Sat, 31 May 2025 23:35:57 +0200 Subject: [PATCH] get some more variables from storage --- assets/shaders/mandelbulb.wgsl | 12 +++++--- src/main.rs | 7 +---- src/mandelbulb.rs | 56 +++++++++++++++++++++++++++++----- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/assets/shaders/mandelbulb.wgsl b/assets/shaders/mandelbulb.wgsl index bc9de50..b4c84d3 100644 --- a/assets/shaders/mandelbulb.wgsl +++ b/assets/shaders/mandelbulb.wgsl @@ -10,6 +10,10 @@ struct VoluMaterial { model_inverse: mat4x4, power: f32, iterations: i32, + max_distance: f32, + max_steps: i32, + ray_epsilon: f32, + normal_epsilon: f32, } @group(2) @binding(100) @@ -47,7 +51,7 @@ fn mandelbulb_sdf(p: vec3) -> f32 { } fn mandelbulb_normal(p: vec3) -> vec3 { - let e = 0.001; + let e = volu_material.normal_epsilon; let dx = mandelbulb_sdf(p + vec3(e, 0.0, 0.0)) - mandelbulb_sdf(p - vec3(e, 0.0, 0.0)); let dy = mandelbulb_sdf(p + vec3(0.0, e, 0.0)) - mandelbulb_sdf(p - vec3(0.0, e, 0.0)); let dz = mandelbulb_sdf(p + vec3(0.0, 0.0, e)) - mandelbulb_sdf(p - vec3(0.0, 0.0, e)); @@ -56,9 +60,9 @@ fn mandelbulb_normal(p: vec3) -> vec3 { fn raymarch(ray_origin: vec3, ray_direction: vec3) -> f32 { var t = 0.0; - let max_distance = 100.0; - let max_steps = 128; - let epsilon = 0.001; + let max_distance = volu_material.max_distance; + let max_steps = volu_material.max_steps; + let epsilon = volu_material.ray_epsilon; for (var i = 0; i < max_steps; i++) { let current_pos = ray_origin + t * ray_direction; diff --git a/src/main.rs b/src/main.rs index 588d557..2041992 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,12 +27,7 @@ fn setup( ) { let transform = Transform::from_xyz(0.0, 0.0, 0.0); - let storage = buffers.add(ShaderStorageBuffer::from(MandelbulbStorage { - mesh_translation: transform.translation, - model_inverse: transform.compute_matrix().inverse(), - power: 8.0, - iterations: 32, - })); + let storage = buffers.add(ShaderStorageBuffer::from(MandelbulbStorage::default())); commands.spawn(( Mesh3d(meshes.add(Cuboid::new(2.0, 2.0, 2.0))), diff --git a/src/mandelbulb.rs b/src/mandelbulb.rs index 82dab75..ca30cfc 100644 --- a/src/mandelbulb.rs +++ b/src/mandelbulb.rs @@ -13,13 +13,38 @@ const SHADER_ASSET_PATH: &str = "shaders/mandelbulb.wgsl"; pub fn plugin(app: &mut App) { app.add_plugins(MaterialPlugin::::default()) + .init_resource::() .add_systems(Update, update_volu_material); } +#[derive(Resource)] +struct MandelbulbSettings { + power: f32, + iterations: i32, + max_distance: f32, + max_steps: i32, + ray_epsilon: f32, + normal_epsilon: f32, +} + +impl Default for MandelbulbSettings { + fn default() -> Self { + Self { + power: 8., + iterations: 256, + max_distance: 100., + max_steps: 128, + ray_epsilon: 0.001, + normal_epsilon: 0.001, + } + } +} + fn update_volu_material( q: Query<(&Transform, &MeshMaterial3d)>, mut volu_materials: ResMut>, mut buffers: ResMut>, + settings: Res, ) { for (transform, material) in q.iter() { let volu_material = volu_materials.get_mut(material.0.id()).unwrap(); @@ -28,11 +53,24 @@ fn update_volu_material( .get_mut(volu_material.extension.storage.id()) .unwrap(); + let MandelbulbSettings { + power, + iterations, + max_distance, + max_steps, + ray_epsilon, + normal_epsilon, + } = *settings; + let volu_storage = MandelbulbStorage { mesh_translation: transform.translation, model_inverse: transform.compute_matrix(), - power: 8.0, - iterations: 32, + power, + iterations, + max_distance, + max_steps, + ray_epsilon, + normal_epsilon, }; buffer.set_data(volu_storage); @@ -42,7 +80,7 @@ fn update_volu_material( #[derive(Asset, AsBindGroup, Reflect, Debug, Clone)] pub struct MandelbulbExtension { #[storage(100, read_only)] - pub storage: Handle, + storage: Handle, } impl MaterialExtension for MandelbulbExtension { @@ -65,8 +103,12 @@ impl MandelbulbExtension { #[derive(ShaderType, Clone, Default, Debug)] pub struct MandelbulbStorage { - pub mesh_translation: Vec3, - pub model_inverse: Mat4, - pub power: f32, - pub iterations: i32, + mesh_translation: Vec3, + model_inverse: Mat4, + power: f32, + iterations: i32, + max_distance: f32, + max_steps: i32, + ray_epsilon: f32, + normal_epsilon: f32, }