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

View File

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

View File

@ -8,7 +8,6 @@ use crate::{
renderer::{GlobalRenderResourceContext, RenderContext},
};
use bevy_transform::components::LocalToWorld;
use legion::prelude::*;
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
.write_resource::<RenderResourceAssignments>()
.read_resource::<Events<WindowResized>>()
.with_query(<(Read<Camera>, Read<LocalToWorld>, Read<ActiveCamera2d>)>::query())
.with_query(<(Read<Camera>, Read<ActiveCamera2d>)>::query())
.build(
move |_,
world,
@ -66,9 +65,9 @@ impl SystemNode for Camera2dNode {
.find_latest(&window_resized_events, |event| event.is_primary);
if let Some(_) = primary_window_resized_event {
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] =
(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 {
render_resources.remove_buffer(old_tmp_buffer);

View File

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

View File

@ -1,7 +1,6 @@
use super::{Anchors, Margins};
use bevy_render::Color;
use glam::{self, Vec2};
use crate::Rect;
use glam::Vec2;
#[derive(Debug, Clone)]
enum GrowDirection {
@ -12,36 +11,30 @@ enum GrowDirection {
#[derive(Debug, Clone)]
pub struct Node {
pub position: Vec2,
pub size: Vec2,
pub anchors: Anchors,
pub margins: Margins,
pub color: Color,
}
impl Default for Node {
fn default() -> Self {
Node {
position: Vec2::default(),
size: Vec2::default(),
anchors: Anchors::default(),
margins: Margins::default(),
color: Color::rgb(0.0, 0.0, 0.0),
}
}
}
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 {
position,
size: Vec2::default(),
anchors,
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(
self.position.x(),
self.margins.left,
@ -59,8 +52,9 @@ impl Node {
parent_dimensions.y(),
);
self.size = glam::vec2(rect_width, rect_height);
rect.position = glam::vec2(rect_x, rect_y) + parent_position;
rect.size = Vec2::new(rect_width, rect_height);
rect.position = Vec2::new(rect_x, rect_y) + parent_position;
rect.z_index = z_index;
}
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 {
format: TextureFormat::Depth32Float,
depth_write_enabled: true,
depth_compare: CompareFunction::Less,
depth_write_enabled: false,
depth_compare: CompareFunction::Always,
stencil_front: StencilStateFaceDescriptor::IGNORE,
stencil_back: StencilStateFaceDescriptor::IGNORE,
stencil_read_mask: 0,

View File

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

View File

@ -1,4 +1,5 @@
use bevy::prelude::*;
use bevy_ui::Rect;
fn main() {
App::build()
@ -51,8 +52,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(0.0, 0.0),
Anchors::new(0.0, 0.0, 0.0, 1.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()
})
// top right anchor with vertical fill
@ -61,8 +65,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(0.0, 0.0),
Anchors::new(1.0, 1.0, 0.0, 1.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()
})
// 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),
Anchors::new(0.5, 0.5, 0.5, 0.5),
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()
})
.add_entity(UiEntity {
@ -80,8 +90,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(50.0, 50.0),
Anchors::new(0.5, 0.5, 0.5, 0.5),
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()
})
.add_entity(UiEntity {
@ -89,8 +102,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(100.0, 100.0),
Anchors::new(0.5, 0.5, 0.5, 0.5),
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()
})
.add_entity(UiEntity {
@ -98,8 +114,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(150.0, 150.0),
Anchors::new(0.5, 0.5, 0.5, 0.5),
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()
})
// parenting
@ -108,8 +127,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(300.0, 300.0),
Anchors::new(0.0, 0.0, 0.0, 0.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()
})
.add_children(|builder| {
@ -118,8 +140,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(0.0, 0.0),
Anchors::new(0.0, 1.0, 0.0, 1.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()
});
})
@ -129,8 +154,11 @@ fn setup(world: &mut World, resources: &mut Resources) {
math::vec2(200.0, 200.0),
Anchors::new(0.5, 0.5, 0.5, 0.5),
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()
});
}