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 <dannymcgee@gmail.com>
This commit is contained in:
Brooks Palin
2024-02-19 16:11:29 -07:00
committed by GitHub
parent f1c1b85a98
commit c4c778cde9
6 changed files with 88 additions and 88 deletions
+9
View File
@@ -0,0 +1,9 @@
#import bevy_pbr::forward_io::VertexOutput
@group(1) @binding(0)
var<uniform> material_color: vec4<f32>;
@fragment
fn fragment(mesh: VertexOutput) -> @location(0) vec4<f32> {
return material_color;
}
+8 -6
View File
@@ -3,6 +3,8 @@ use bevy_mod_picking::prelude::*;
use crate::interaction::TransformSpace; use crate::interaction::TransformSpace;
use super::material::GizmoMaterial;
#[derive(Component, Reflect)] #[derive(Component, Reflect)]
pub(super) struct TransformGizmo { pub(super) struct TransformGizmo {
pub(super) target: Entity, pub(super) target: Entity,
@@ -67,18 +69,18 @@ impl TransformGizmoBundle {
pub(super) fn on_gizmo_element_hover( pub(super) fn on_gizmo_element_hover(
ev: Listener<Pointer<Over>>, ev: Listener<Pointer<Over>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>, mut ra_mats: ResMut<Assets<GizmoMaterial>>,
q_target: Query<&Handle<StandardMaterial>>, q_target: Query<&Handle<GizmoMaterial>>,
) { ) {
let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap(); 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( pub(super) fn on_gizmo_element_unhover(
ev: Listener<Pointer<Out>>, ev: Listener<Pointer<Out>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>, mut ra_mats: ResMut<Assets<GizmoMaterial>>,
q_target: Query<&Handle<StandardMaterial>>, q_target: Query<&Handle<GizmoMaterial>>,
) { ) {
let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap(); let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap();
mat.base_color *= 0.5; mat.color *= 0.5;
} }
+31
View File
@@ -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<Color> 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
}
}
+5
View File
@@ -6,6 +6,7 @@ use self::{
camera::{spawn_gizmo_camera, GizmoCamera}, camera::{spawn_gizmo_camera, GizmoCamera},
combo::spawn_combo_translation_rotation_gizmo, combo::spawn_combo_translation_rotation_gizmo,
common::*, common::*,
material::GizmoMaterial,
resources::{init_resources, GizmoMats, GizmoMeshes}, resources::{init_resources, GizmoMats, GizmoMeshes},
rotation::{spawn_rotation_gizmo, update_ss_ring_rotation}, rotation::{spawn_rotation_gizmo, update_ss_ring_rotation},
translation::spawn_translation_gizmo, translation::spawn_translation_gizmo,
@@ -16,6 +17,7 @@ use super::{Selection, TransformMode, TransformType};
pub mod camera; pub mod camera;
mod combo; mod combo;
mod common; mod common;
mod material;
mod resources; mod resources;
mod rotation; mod rotation;
mod translation; mod translation;
@@ -70,6 +72,9 @@ impl Plugin for GizmoPlugin {
PostUpdate, PostUpdate,
update_ss_ring_rotation.after(TransformSystem::TransformPropagate), update_ss_ring_rotation.after(TransformSystem::TransformPropagate),
); );
//This is the material code for the gizmo material
app.add_plugins(MaterialPlugin::<GizmoMaterial>::default());
} }
} }
+27 -74
View File
@@ -2,6 +2,8 @@ use bevy::prelude::*;
use crate::{design_system, math::geo}; use crate::{design_system, math::geo};
use super::material::GizmoMaterial;
#[derive(Resource, Reflect, Debug, Default)] #[derive(Resource, Reflect, Debug, Default)]
#[reflect(Resource)] #[reflect(Resource)]
pub(super) struct GizmoMeshes { pub(super) struct GizmoMeshes {
@@ -17,24 +19,24 @@ pub(super) struct GizmoMeshes {
#[derive(Resource, Reflect, Debug, Default)] #[derive(Resource, Reflect, Debug, Default)]
#[reflect(Resource)] #[reflect(Resource)]
pub(super) struct GizmoMats { pub(super) struct GizmoMats {
pub translate_x: Handle<StandardMaterial>, pub translate_x: Handle<GizmoMaterial>,
pub translate_y: Handle<StandardMaterial>, pub translate_y: Handle<GizmoMaterial>,
pub translate_z: Handle<StandardMaterial>, pub translate_z: Handle<GizmoMaterial>,
pub translate_yz: Handle<StandardMaterial>, pub translate_yz: Handle<GizmoMaterial>,
pub translate_xz: Handle<StandardMaterial>, pub translate_xz: Handle<GizmoMaterial>,
pub translate_xy: Handle<StandardMaterial>, pub translate_xy: Handle<GizmoMaterial>,
pub translate_ss: Handle<StandardMaterial>, pub translate_ss: Handle<GizmoMaterial>,
pub rotate_x: Handle<StandardMaterial>, pub rotate_x: Handle<GizmoMaterial>,
pub rotate_y: Handle<StandardMaterial>, pub rotate_y: Handle<GizmoMaterial>,
pub rotate_z: Handle<StandardMaterial>, pub rotate_z: Handle<GizmoMaterial>,
pub rotate_trackball: Handle<StandardMaterial>, pub rotate_trackball: Handle<GizmoMaterial>,
pub rotate_ss: Handle<StandardMaterial>, pub rotate_ss: Handle<GizmoMaterial>,
} }
pub(super) fn init_resources( pub(super) fn init_resources(
mut cmd: Commands, mut cmd: Commands,
mut ra_meshes: ResMut<Assets<Mesh>>, mut ra_meshes: ResMut<Assets<Mesh>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>, mut ra_mats: ResMut<Assets<GizmoMaterial>>,
) { ) {
let translate_line = ra_meshes.add(Mesh::from(shape::Cylinder { let translate_line = ra_meshes.add(Mesh::from(shape::Cylinder {
radius: 0.03, radius: 0.03,
@@ -86,71 +88,22 @@ pub(super) fn init_resources(
rotate_ss, rotate_ss,
}); });
let translate_x = ra_mats.add(StandardMaterial { let translate_x = ra_mats.add(design_system::Color::RED.into());
base_color: design_system::Color::RED, let translate_yz = ra_mats.add(design_system::Color::RED.into());
unlit: true,
..default()
});
let translate_yz = ra_mats.add(StandardMaterial {
base_color: design_system::Color::RED,
unlit: true,
..default()
});
let translate_y = ra_mats.add(StandardMaterial { let translate_y = ra_mats.add(design_system::Color::GREEN.into());
base_color: design_system::Color::GREEN, let translate_xz = ra_mats.add(design_system::Color::GREEN.into());
unlit: true,
..default()
});
let translate_xz = ra_mats.add(StandardMaterial {
base_color: design_system::Color::GREEN,
unlit: true,
..default()
});
let translate_z = ra_mats.add(StandardMaterial { let translate_z = ra_mats.add(design_system::Color::BLUE.into());
base_color: design_system::Color::BLUE, let translate_xy = ra_mats.add(design_system::Color::BLUE.into());
unlit: true,
..default()
});
let translate_xy = ra_mats.add(StandardMaterial {
base_color: design_system::Color::BLUE,
unlit: true,
..default()
});
let translate_ss = ra_mats.add(StandardMaterial { let translate_ss = ra_mats.add(Color::WHITE.into());
base_color: Color::WHITE,
unlit: true,
..default()
});
let rotate_x = ra_mats.add(StandardMaterial { let rotate_x = ra_mats.add(design_system::Color::RED.into());
base_color: design_system::Color::RED, let rotate_y = ra_mats.add(design_system::Color::GREEN.into());
unlit: true, let rotate_z = ra_mats.add(design_system::Color::BLUE.into());
..default() let rotate_trackball = ra_mats.add(Color::WHITE.with_a(0.0).into());
}); let rotate_ss = ra_mats.add(Color::WHITE.into());
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()
});
cmd.insert_resource(GizmoMats { cmd.insert_resource(GizmoMats {
translate_x, translate_x,
+8 -8
View File
@@ -14,8 +14,8 @@ use crate::{
}; };
use super::{ use super::{
on_gizmo_element_hover, on_gizmo_element_unhover, GizmoMats, GizmoMeshes, InitialTransform, material::GizmoMaterial, on_gizmo_element_hover, on_gizmo_element_unhover, GizmoMats,
TransformGizmo, TransformGizmoBundle, GIZMO_RENDER_LAYER, GizmoMeshes, InitialTransform, TransformGizmo, TransformGizmoBundle, GIZMO_RENDER_LAYER,
}; };
#[derive(Component)] #[derive(Component)]
@@ -159,20 +159,20 @@ pub(super) fn update_ss_ring_rotation(
fn on_trackball_hover( fn on_trackball_hover(
ev: Listener<Pointer<Over>>, ev: Listener<Pointer<Over>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>, mut ra_mats: ResMut<Assets<GizmoMaterial>>,
q_target: Query<&Handle<StandardMaterial>>, q_target: Query<&Handle<GizmoMaterial>>,
) { ) {
let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap(); 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( fn on_trackball_unhover(
ev: Listener<Pointer<Out>>, ev: Listener<Pointer<Out>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>, mut ra_mats: ResMut<Assets<GizmoMaterial>>,
q_target: Query<&Handle<StandardMaterial>>, q_target: Query<&Handle<GizmoMaterial>>,
) { ) {
let mat = ra_mats.get_mut(q_target.get(ev.target).unwrap()).unwrap(); 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( pub(super) fn on_rotation_start(