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