mirror of
https://github.com/storytold/storyteller-bevy.git
synced 2026-10-28 08:58:07 +00:00
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:
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user