ui is back!

This commit is contained in:
Carter Anderson 2020-05-03 19:30:31 -07:00
parent 05dbf31fd1
commit d50313c285
8 changed files with 72 additions and 43 deletions

View File

@ -9,6 +9,7 @@ pub struct ActiveCamera;
#[derive(Default)] #[derive(Default)]
pub struct ActiveCamera2d; pub struct ActiveCamera2d;
#[derive(Debug)]
pub struct OrthographicCamera { pub struct OrthographicCamera {
pub left: f32, pub left: f32,
pub right: f32, pub right: f32,
@ -45,6 +46,7 @@ impl Default for OrthographicCamera {
} }
} }
#[derive(Debug)]
pub struct PerspectiveCamera { pub struct PerspectiveCamera {
pub fov: f32, pub fov: f32,
pub aspect_ratio: f32, pub aspect_ratio: f32,
@ -70,6 +72,7 @@ impl Default for PerspectiveCamera {
} }
} }
#[derive(Debug)]
pub enum CameraType { pub enum CameraType {
Perspective(PerspectiveCamera), Perspective(PerspectiveCamera),
Orthographic(OrthographicCamera), Orthographic(OrthographicCamera),
@ -91,7 +94,7 @@ impl Default for CameraType {
} }
} }
#[derive(Default)] #[derive(Default, Debug)]
pub struct Camera { pub struct Camera {
pub view_matrix: Mat4, pub view_matrix: Mat4,
pub camera_type: CameraType, pub camera_type: CameraType,

View File

@ -80,6 +80,7 @@ impl DrawTarget for AssignedMeshesDrawTarget {
pipeline_descriptor, pipeline_descriptor,
&renderable.render_resource_assignments, &renderable.render_resource_assignments,
); );
render_pass.draw_indexed(0..current_mesh_index_len, 0, 0..1); render_pass.draw_indexed(0..current_mesh_index_len, 0, 0..1);
} }
} }

View File

@ -8,7 +8,6 @@ use crate::{
renderer::{GlobalRenderResourceContext, RenderContext}, renderer::{GlobalRenderResourceContext, RenderContext},
}; };
use bevy_transform::components::LocalToWorld;
use legion::prelude::*; use legion::prelude::*;
use zerocopy::AsBytes; use zerocopy::AsBytes;
@ -41,7 +40,7 @@ impl SystemNode for Camera2dNode {
// TODO: this write on RenderResourceAssignments will prevent this system from running in parallel with other systems that do the same // TODO: this write on RenderResourceAssignments will prevent this system from running in parallel with other systems that do the same
.write_resource::<RenderResourceAssignments>() .write_resource::<RenderResourceAssignments>()
.read_resource::<Events<WindowResized>>() .read_resource::<Events<WindowResized>>()
.with_query(<(Read<Camera>, Read<LocalToWorld>, Read<ActiveCamera2d>)>::query()) .with_query(<(Read<Camera>, Read<ActiveCamera2d>)>::query())
.build( .build(
move |_, move |_,
world, world,
@ -66,9 +65,9 @@ impl SystemNode for Camera2dNode {
.find_latest(&window_resized_events, |event| event.is_primary); .find_latest(&window_resized_events, |event| event.is_primary);
if let Some(_) = primary_window_resized_event { if let Some(_) = primary_window_resized_event {
let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>(); let matrix_size = std::mem::size_of::<[[f32; 4]; 4]>();
for (camera, local_to_world, _) in query.iter(world) { for (camera, _) in query.iter(world) {
let camera_matrix: [[f32; 4]; 4] = let camera_matrix: [[f32; 4]; 4] =
(camera.view_matrix * local_to_world.0).to_cols_array_2d(); camera.view_matrix.to_cols_array_2d();
if let Some(old_tmp_buffer) = tmp_buffer { if let Some(old_tmp_buffer) = tmp_buffer {
render_resources.remove_buffer(old_tmp_buffer); render_resources.remove_buffer(old_tmp_buffer);

View File

@ -10,7 +10,7 @@ pub struct UiEntity {
pub node: Node, pub node: Node,
pub rect: Rect, pub rect: Rect,
pub mesh: Handle<Mesh>, // TODO: maybe abstract this out pub mesh: Handle<Mesh>, // TODO: maybe abstract this out
// pub renderable: Renderable, pub renderable: Renderable,
} }
impl Default for UiEntity { impl Default for UiEntity {
@ -19,12 +19,12 @@ impl Default for UiEntity {
node: Default::default(), node: Default::default(),
rect: Default::default(), rect: Default::default(),
mesh: QUAD_HANDLE, mesh: QUAD_HANDLE,
// renderable: Renderable { renderable: Renderable {
// pipelines: vec![ pipelines: vec![
// UI_PIPELINE_HANDLE UI_PIPELINE_HANDLE
// ], ],
// ..Default::default() ..Default::default()
// } }
} }
} }
} }

View File

@ -1,7 +1,6 @@
use super::{Anchors, Margins}; use super::{Anchors, Margins};
use bevy_render::Color;
use glam::{self, Vec2};
use crate::Rect; use crate::Rect;
use glam::Vec2;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
enum GrowDirection { enum GrowDirection {
@ -12,36 +11,30 @@ enum GrowDirection {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Node { pub struct Node {
pub position: Vec2, pub position: Vec2,
pub size: Vec2,
pub anchors: Anchors, pub anchors: Anchors,
pub margins: Margins, pub margins: Margins,
pub color: Color,
} }
impl Default for Node { impl Default for Node {
fn default() -> Self { fn default() -> Self {
Node { Node {
position: Vec2::default(), position: Vec2::default(),
size: Vec2::default(),
anchors: Anchors::default(), anchors: Anchors::default(),
margins: Margins::default(), margins: Margins::default(),
color: Color::rgb(0.0, 0.0, 0.0),
} }
} }
} }
impl Node { impl Node {
pub fn new(position: Vec2, anchors: Anchors, margins: Margins, color: Color) -> Self { pub fn new(position: Vec2, anchors: Anchors, margins: Margins) -> Self {
Node { Node {
position, position,
size: Vec2::default(),
anchors, anchors,
margins, margins,
color,
} }
} }
pub fn update(&mut self, rect: &mut Rect, parent_dimensions: Vec2, parent_position: Vec2) { pub fn update(&mut self, rect: &mut Rect, parent_dimensions: Vec2, parent_position: Vec2, z_index: f32) {
let (rect_x, rect_width) = Self::compute_dimension_properties( let (rect_x, rect_width) = Self::compute_dimension_properties(
self.position.x(), self.position.x(),
self.margins.left, self.margins.left,
@ -59,8 +52,9 @@ impl Node {
parent_dimensions.y(), parent_dimensions.y(),
); );
self.size = glam::vec2(rect_width, rect_height); rect.size = Vec2::new(rect_width, rect_height);
rect.position = glam::vec2(rect_x, rect_y) + parent_position; rect.position = Vec2::new(rect_x, rect_y) + parent_position;
rect.z_index = z_index;
} }
fn compute_dimension_properties( fn compute_dimension_properties(

View File

@ -25,8 +25,8 @@ pub fn build_ui_pipeline(shaders: &mut AssetStorage<Shader>) -> PipelineDescript
}), }),
depth_stencil_state: Some(DepthStencilStateDescriptor { depth_stencil_state: Some(DepthStencilStateDescriptor {
format: TextureFormat::Depth32Float, format: TextureFormat::Depth32Float,
depth_write_enabled: true, depth_write_enabled: false,
depth_compare: CompareFunction::Less, depth_compare: CompareFunction::Always,
stencil_front: StencilStateFaceDescriptor::IGNORE, stencil_front: StencilStateFaceDescriptor::IGNORE,
stencil_back: StencilStateFaceDescriptor::IGNORE, stencil_back: StencilStateFaceDescriptor::IGNORE,
stencil_read_mask: 0, stencil_read_mask: 0,

View File

@ -9,7 +9,7 @@ use legion::{prelude::*, systems::SubWorld};
pub fn ui_update_system() -> Box<dyn Schedulable> { pub fn ui_update_system() -> Box<dyn Schedulable> {
SystemBuilder::new("ui_update") SystemBuilder::new("ui_update")
.read_resource::<Windows>() .read_resource::<Windows>()
.with_query(<(Write<Node>,)>::query().filter(!component::<Parent>())) .with_query(<Read<Node>>::query().filter(!component::<Parent>()))
.write_component::<Node>() .write_component::<Node>()
.write_component::<Rect>() .write_component::<Rect>()
.read_component::<Children>() .read_component::<Children>()
@ -17,11 +17,15 @@ pub fn ui_update_system() -> Box<dyn Schedulable> {
if let Some(window) = windows.get_primary() { if let Some(window) = windows.get_primary() {
let parent_size = glam::vec2(window.width as f32, window.height as f32); let parent_size = glam::vec2(window.width as f32, window.height as f32);
let parent_position = glam::vec2(0.0, 0.0); let parent_position = glam::vec2(0.0, 0.0);
for (entity, _) in node_query.iter_entities_mut(world) { for entity in node_query
.iter_entities(world)
.map(|(e, _)| e)
.collect::<Vec<Entity>>()
{
run_on_hierarchy_subworld_mut( run_on_hierarchy_subworld_mut(
world, world,
entity, entity,
(parent_size, parent_position), (parent_size, parent_position, 0.9999),
&mut update_node_entity, &mut update_node_entity,
); );
} }
@ -32,15 +36,15 @@ pub fn ui_update_system() -> Box<dyn Schedulable> {
fn update_node_entity( fn update_node_entity(
world: &mut SubWorld, world: &mut SubWorld,
entity: Entity, entity: Entity,
parent_properties: (Vec2, Vec2), parent_properties: (Vec2, Vec2, f32),
) -> Option<(Vec2, Vec2)> { ) -> Option<(Vec2, Vec2, f32)> {
let (parent_size, parent_position) = parent_properties; let (parent_size, parent_position, z_index) = parent_properties;
// TODO: Somehow remove this unsafe // TODO: Somehow remove this unsafe
unsafe { unsafe {
if let Some(mut node) = world.get_component_mut_unchecked::<Node>(entity) { if let Some(mut node) = world.get_component_mut_unchecked::<Node>(entity) {
if let Some(mut rect) = world.get_component_mut_unchecked::<Rect>(entity) { if let Some(mut rect) = world.get_component_mut_unchecked::<Rect>(entity) {
node.update(&mut rect, parent_size, parent_position); node.update(&mut rect, parent_size, parent_position, z_index);
return Some((node.size, rect.position)); return Some((rect.size, rect.position, z_index - 0.0001));
} }
} }
} }

View File

@ -1,4 +1,5 @@
use bevy::prelude::*; use bevy::prelude::*;
use bevy_ui::Rect;
fn main() { fn main() {
App::build() App::build()
@ -51,8 +52,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(0.0, 0.0), math::vec2(0.0, 0.0),
Anchors::new(0.0, 0.0, 0.0, 1.0), Anchors::new(0.0, 0.0, 0.0, 1.0),
Margins::new(10.0, 200.0, 10.0, 10.0), Margins::new(10.0, 200.0, 10.0, 10.0),
Color::rgb(0.1, 0.1, 0.1),
), ),
rect: Rect {
color: Color::rgb(0.02, 0.02, 0.02),
..Default::default()
},
..Default::default() ..Default::default()
}) })
// top right anchor with vertical fill // top right anchor with vertical fill
@ -61,8 +65,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(0.0, 0.0), math::vec2(0.0, 0.0),
Anchors::new(1.0, 1.0, 0.0, 1.0), Anchors::new(1.0, 1.0, 0.0, 1.0),
Margins::new(10.0, 100.0, 50.0, 100.0), Margins::new(10.0, 100.0, 50.0, 100.0),
Color::rgb(0.1, 0.1, 0.1),
), ),
rect: Rect {
color: Color::rgb(0.02, 0.02, 0.02),
..Default::default()
},
..Default::default() ..Default::default()
}) })
// render order test: reddest in the back, whitest in the front // render order test: reddest in the back, whitest in the front
@ -71,8 +78,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(75.0, 75.0), math::vec2(75.0, 75.0),
Anchors::new(0.5, 0.5, 0.5, 0.5), Anchors::new(0.5, 0.5, 0.5, 0.5),
Margins::new(0.0, 100.0, 0.0, 100.0), Margins::new(0.0, 100.0, 0.0, 100.0),
Color::rgb(1.0, 0.1, 0.1),
), ),
rect: Rect {
color: Color::rgb(1.0, 0.00, 0.0),
..Default::default()
},
..Default::default() ..Default::default()
}) })
.add_entity(UiEntity { .add_entity(UiEntity {
@ -80,8 +90,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(50.0, 50.0), math::vec2(50.0, 50.0),
Anchors::new(0.5, 0.5, 0.5, 0.5), Anchors::new(0.5, 0.5, 0.5, 0.5),
Margins::new(0.0, 100.0, 0.0, 100.0), Margins::new(0.0, 100.0, 0.0, 100.0),
Color::rgb(1.0, 0.3, 0.3),
), ),
rect: Rect {
color: Color::rgb(1.0, 0.3, 0.3),
..Default::default()
},
..Default::default() ..Default::default()
}) })
.add_entity(UiEntity { .add_entity(UiEntity {
@ -89,8 +102,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(100.0, 100.0), math::vec2(100.0, 100.0),
Anchors::new(0.5, 0.5, 0.5, 0.5), Anchors::new(0.5, 0.5, 0.5, 0.5),
Margins::new(0.0, 100.0, 0.0, 100.0), Margins::new(0.0, 100.0, 0.0, 100.0),
Color::rgb(1.0, 0.5, 0.5),
), ),
rect: Rect {
color: Color::rgb(1.0, 0.5, 0.5),
..Default::default()
},
..Default::default() ..Default::default()
}) })
.add_entity(UiEntity { .add_entity(UiEntity {
@ -98,8 +114,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(150.0, 150.0), math::vec2(150.0, 150.0),
Anchors::new(0.5, 0.5, 0.5, 0.5), Anchors::new(0.5, 0.5, 0.5, 0.5),
Margins::new(0.0, 100.0, 0.0, 100.0), Margins::new(0.0, 100.0, 0.0, 100.0),
Color::rgb(1.0, 0.7, 0.7),
), ),
rect: Rect {
color: Color::rgb(1.0, 0.7, 0.7),
..Default::default()
},
..Default::default() ..Default::default()
}) })
// parenting // parenting
@ -108,8 +127,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(300.0, 300.0), math::vec2(300.0, 300.0),
Anchors::new(0.0, 0.0, 0.0, 0.0), Anchors::new(0.0, 0.0, 0.0, 0.0),
Margins::new(0.0, 200.0, 0.0, 200.0), Margins::new(0.0, 200.0, 0.0, 200.0),
Color::rgb(0.1, 0.1, 1.0),
), ),
rect: Rect {
color: Color::rgb(0.1, 0.1, 1.0),
..Default::default()
},
..Default::default() ..Default::default()
}) })
.add_children(|builder| { .add_children(|builder| {
@ -118,8 +140,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(0.0, 0.0), math::vec2(0.0, 0.0),
Anchors::new(0.0, 1.0, 0.0, 1.0), Anchors::new(0.0, 1.0, 0.0, 1.0),
Margins::new(20.0, 20.0, 20.0, 20.0), Margins::new(20.0, 20.0, 20.0, 20.0),
Color::rgb(0.6, 0.6, 1.0),
), ),
rect: Rect {
color: Color::rgb(0.6, 0.6, 1.0),
..Default::default()
},
..Default::default() ..Default::default()
}); });
}) })
@ -129,8 +154,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(200.0, 200.0), math::vec2(200.0, 200.0),
Anchors::new(0.5, 0.5, 0.5, 0.5), Anchors::new(0.5, 0.5, 0.5, 0.5),
Margins::new(0.0, 100.0, 0.0, 100.0), Margins::new(0.0, 100.0, 0.0, 100.0),
Color::rgba(1.0, 0.9, 0.9, 0.4),
), ),
rect: Rect {
color: Color::rgba(1.0, 0.9, 0.9, 0.4),
..Default::default()
},
..Default::default() ..Default::default()
}); });
} }