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 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<Pointer<Over>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>,
q_target: Query<&Handle<StandardMaterial>>,
mut ra_mats: ResMut<Assets<GizmoMaterial>>,
q_target: Query<&Handle<GizmoMaterial>>,
) {
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<Pointer<Out>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>,
q_target: Query<&Handle<StandardMaterial>>,
mut ra_mats: ResMut<Assets<GizmoMaterial>>,
q_target: Query<&Handle<GizmoMaterial>>,
) {
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},
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::<GizmoMaterial>::default());
}
}
+27 -74
View File
@@ -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<StandardMaterial>,
pub translate_y: Handle<StandardMaterial>,
pub translate_z: Handle<StandardMaterial>,
pub translate_yz: Handle<StandardMaterial>,
pub translate_xz: Handle<StandardMaterial>,
pub translate_xy: Handle<StandardMaterial>,
pub translate_ss: Handle<StandardMaterial>,
pub rotate_x: Handle<StandardMaterial>,
pub rotate_y: Handle<StandardMaterial>,
pub rotate_z: Handle<StandardMaterial>,
pub rotate_trackball: Handle<StandardMaterial>,
pub rotate_ss: Handle<StandardMaterial>,
pub translate_x: Handle<GizmoMaterial>,
pub translate_y: Handle<GizmoMaterial>,
pub translate_z: Handle<GizmoMaterial>,
pub translate_yz: Handle<GizmoMaterial>,
pub translate_xz: Handle<GizmoMaterial>,
pub translate_xy: Handle<GizmoMaterial>,
pub translate_ss: Handle<GizmoMaterial>,
pub rotate_x: Handle<GizmoMaterial>,
pub rotate_y: Handle<GizmoMaterial>,
pub rotate_z: Handle<GizmoMaterial>,
pub rotate_trackball: Handle<GizmoMaterial>,
pub rotate_ss: Handle<GizmoMaterial>,
}
pub(super) fn init_resources(
mut cmd: Commands,
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 {
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,
+8 -8
View File
@@ -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<Pointer<Over>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>,
q_target: Query<&Handle<StandardMaterial>>,
mut ra_mats: ResMut<Assets<GizmoMaterial>>,
q_target: Query<&Handle<GizmoMaterial>>,
) {
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<Pointer<Out>>,
mut ra_mats: ResMut<Assets<StandardMaterial>>,
q_target: Query<&Handle<StandardMaterial>>,
mut ra_mats: ResMut<Assets<GizmoMaterial>>,
q_target: Query<&Handle<GizmoMaterial>>,
) {
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(