From c4c778cde901f522ff4333300c63db0c10951925 Mon Sep 17 00:00:00 2001 From: Brooks Palin Date: Mon, 19 Feb 2024 16:11:29 -0700 Subject: [PATCH] Add minimal Gizmo Material (#43) This is a small feature push that adds a simple Shader for the Gizmo. This shader only takes one value: the color of the object. Very simple and fast to compile. This PR is missing: - Shader Pre Compiling. This is something that I am looking into now, however I thought it out of scope for this feature. Just thought I would drop this real fast. Let me know what y'all think! --------- Co-authored-by: Danny McGee --- studio/assets/shaders/gizmo.wgsl | 9 ++ studio/src/interaction/gizmos/common.rs | 14 +-- studio/src/interaction/gizmos/material.rs | 31 +++++++ studio/src/interaction/gizmos/mod.rs | 5 + studio/src/interaction/gizmos/resources.rs | 101 ++++++--------------- studio/src/interaction/gizmos/rotation.rs | 16 ++-- 6 files changed, 88 insertions(+), 88 deletions(-) create mode 100644 studio/assets/shaders/gizmo.wgsl create mode 100644 studio/src/interaction/gizmos/material.rs diff --git a/studio/assets/shaders/gizmo.wgsl b/studio/assets/shaders/gizmo.wgsl new file mode 100644 index 0000000..1151581 --- /dev/null +++ b/studio/assets/shaders/gizmo.wgsl @@ -0,0 +1,9 @@ +#import bevy_pbr::forward_io::VertexOutput + +@group(1) @binding(0) +var material_color: vec4; + +@fragment +fn fragment(mesh: VertexOutput) -> @location(0) vec4 { + return material_color; +} diff --git a/studio/src/interaction/gizmos/common.rs b/studio/src/interaction/gizmos/common.rs index c10a1e1..b507901 100644 --- a/studio/src/interaction/gizmos/common.rs +++ b/studio/src/interaction/gizmos/common.rs @@ -3,6 +3,8 @@ use bevy_mod_picking::prelude::*; use crate::interaction::TransformSpace; +use super::material::GizmoMaterial; + #[derive(Component, Reflect)] pub(super) struct TransformGizmo { pub(super) target: Entity, @@ -67,18 +69,18 @@ impl TransformGizmoBundle { pub(super) fn on_gizmo_element_hover( ev: Listener>, - mut ra_mats: ResMut>, - q_target: Query<&Handle>, + mut ra_mats: ResMut>, + q_target: Query<&Handle>, ) { let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap(); - mat.base_color *= 2.; + mat.color *= 2.; } pub(super) fn on_gizmo_element_unhover( ev: Listener>, - mut ra_mats: ResMut>, - q_target: Query<&Handle>, + mut ra_mats: ResMut>, + q_target: Query<&Handle>, ) { let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap(); - mat.base_color *= 0.5; + mat.color *= 0.5; } diff --git a/studio/src/interaction/gizmos/material.rs b/studio/src/interaction/gizmos/material.rs new file mode 100644 index 0000000..ad26936 --- /dev/null +++ b/studio/src/interaction/gizmos/material.rs @@ -0,0 +1,31 @@ +use bevy::{ + prelude::*, + render::render_resource::{AsBindGroup, ShaderRef}, +}; + +#[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] +pub struct GizmoMaterial { + #[uniform(0)] + pub color: Color, + + pub blend_mode: AlphaMode, +} + +impl From for GizmoMaterial { + fn from(color: Color) -> Self { + GizmoMaterial { + color, + blend_mode: AlphaMode::Blend, + } + } +} + +impl Material for GizmoMaterial { + fn fragment_shader() -> ShaderRef { + "shaders/gizmo.wgsl".into() + } + + fn alpha_mode(&self) -> AlphaMode { + self.blend_mode + } +} diff --git a/studio/src/interaction/gizmos/mod.rs b/studio/src/interaction/gizmos/mod.rs index 53e9b14..1a4c0fc 100644 --- a/studio/src/interaction/gizmos/mod.rs +++ b/studio/src/interaction/gizmos/mod.rs @@ -6,6 +6,7 @@ use self::{ camera::{spawn_gizmo_camera, GizmoCamera}, combo::spawn_combo_translation_rotation_gizmo, common::*, + material::GizmoMaterial, resources::{init_resources, GizmoMats, GizmoMeshes}, rotation::{spawn_rotation_gizmo, update_ss_ring_rotation}, translation::spawn_translation_gizmo, @@ -16,6 +17,7 @@ use super::{Selection, TransformMode, TransformType}; pub mod camera; mod combo; mod common; +mod material; mod resources; mod rotation; mod translation; @@ -70,6 +72,9 @@ impl Plugin for GizmoPlugin { PostUpdate, update_ss_ring_rotation.after(TransformSystem::TransformPropagate), ); + + //This is the material code for the gizmo material + app.add_plugins(MaterialPlugin::::default()); } } diff --git a/studio/src/interaction/gizmos/resources.rs b/studio/src/interaction/gizmos/resources.rs index b97d923..2d71506 100644 --- a/studio/src/interaction/gizmos/resources.rs +++ b/studio/src/interaction/gizmos/resources.rs @@ -2,6 +2,8 @@ use bevy::prelude::*; use crate::{design_system, math::geo}; +use super::material::GizmoMaterial; + #[derive(Resource, Reflect, Debug, Default)] #[reflect(Resource)] pub(super) struct GizmoMeshes { @@ -17,24 +19,24 @@ pub(super) struct GizmoMeshes { #[derive(Resource, Reflect, Debug, Default)] #[reflect(Resource)] pub(super) struct GizmoMats { - pub translate_x: Handle, - pub translate_y: Handle, - pub translate_z: Handle, - pub translate_yz: Handle, - pub translate_xz: Handle, - pub translate_xy: Handle, - pub translate_ss: Handle, - pub rotate_x: Handle, - pub rotate_y: Handle, - pub rotate_z: Handle, - pub rotate_trackball: Handle, - pub rotate_ss: Handle, + pub translate_x: Handle, + pub translate_y: Handle, + pub translate_z: Handle, + pub translate_yz: Handle, + pub translate_xz: Handle, + pub translate_xy: Handle, + pub translate_ss: Handle, + pub rotate_x: Handle, + pub rotate_y: Handle, + pub rotate_z: Handle, + pub rotate_trackball: Handle, + pub rotate_ss: Handle, } pub(super) fn init_resources( mut cmd: Commands, mut ra_meshes: ResMut>, - mut ra_mats: ResMut>, + mut ra_mats: ResMut>, ) { let translate_line = ra_meshes.add(Mesh::from(shape::Cylinder { radius: 0.03, @@ -86,71 +88,22 @@ pub(super) fn init_resources( rotate_ss, }); - let translate_x = ra_mats.add(StandardMaterial { - base_color: design_system::Color::RED, - unlit: true, - ..default() - }); - let translate_yz = ra_mats.add(StandardMaterial { - base_color: design_system::Color::RED, - unlit: true, - ..default() - }); + let translate_x = ra_mats.add(design_system::Color::RED.into()); + let translate_yz = ra_mats.add(design_system::Color::RED.into()); - let translate_y = ra_mats.add(StandardMaterial { - base_color: design_system::Color::GREEN, - unlit: true, - ..default() - }); - let translate_xz = ra_mats.add(StandardMaterial { - base_color: design_system::Color::GREEN, - unlit: true, - ..default() - }); + let translate_y = ra_mats.add(design_system::Color::GREEN.into()); + let translate_xz = ra_mats.add(design_system::Color::GREEN.into()); - let translate_z = ra_mats.add(StandardMaterial { - base_color: design_system::Color::BLUE, - unlit: true, - ..default() - }); - let translate_xy = ra_mats.add(StandardMaterial { - base_color: design_system::Color::BLUE, - unlit: true, - ..default() - }); + let translate_z = ra_mats.add(design_system::Color::BLUE.into()); + let translate_xy = ra_mats.add(design_system::Color::BLUE.into()); - let translate_ss = ra_mats.add(StandardMaterial { - base_color: Color::WHITE, - unlit: true, - ..default() - }); + let translate_ss = ra_mats.add(Color::WHITE.into()); - let rotate_x = ra_mats.add(StandardMaterial { - base_color: design_system::Color::RED, - unlit: true, - ..default() - }); - let rotate_y = ra_mats.add(StandardMaterial { - base_color: design_system::Color::GREEN, - unlit: true, - ..default() - }); - let rotate_z = ra_mats.add(StandardMaterial { - base_color: design_system::Color::BLUE, - unlit: true, - ..default() - }); - let rotate_trackball = ra_mats.add(StandardMaterial { - base_color: Color::NONE, - emissive: Color::WHITE, - alpha_mode: AlphaMode::Add, - ..default() - }); - let rotate_ss = ra_mats.add(StandardMaterial { - base_color: Color::WHITE, - unlit: true, - ..default() - }); + let rotate_x = ra_mats.add(design_system::Color::RED.into()); + let rotate_y = ra_mats.add(design_system::Color::GREEN.into()); + let rotate_z = ra_mats.add(design_system::Color::BLUE.into()); + let rotate_trackball = ra_mats.add(Color::WHITE.with_a(0.0).into()); + let rotate_ss = ra_mats.add(Color::WHITE.into()); cmd.insert_resource(GizmoMats { translate_x, diff --git a/studio/src/interaction/gizmos/rotation.rs b/studio/src/interaction/gizmos/rotation.rs index 10508d9..fea3e3f 100644 --- a/studio/src/interaction/gizmos/rotation.rs +++ b/studio/src/interaction/gizmos/rotation.rs @@ -14,8 +14,8 @@ use crate::{ }; use super::{ - on_gizmo_element_hover, on_gizmo_element_unhover, GizmoMats, GizmoMeshes, InitialTransform, - TransformGizmo, TransformGizmoBundle, GIZMO_RENDER_LAYER, + material::GizmoMaterial, on_gizmo_element_hover, on_gizmo_element_unhover, GizmoMats, + GizmoMeshes, InitialTransform, TransformGizmo, TransformGizmoBundle, GIZMO_RENDER_LAYER, }; #[derive(Component)] @@ -159,20 +159,20 @@ pub(super) fn update_ss_ring_rotation( fn on_trackball_hover( ev: Listener>, - mut ra_mats: ResMut>, - q_target: Query<&Handle>, + mut ra_mats: ResMut>, + q_target: Query<&Handle>, ) { let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap(); - mat.base_color.set_a(0.2); + mat.color.set_a(0.05); } fn on_trackball_unhover( ev: Listener>, - mut ra_mats: ResMut>, - q_target: Query<&Handle>, + mut ra_mats: ResMut>, + q_target: Query<&Handle>, ) { let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap(); - mat.base_color.set_a(0.); + mat.color.set_a(0.); } pub(super) fn on_rotation_start(