ui is back!
This commit is contained in:
parent
05dbf31fd1
commit
d50313c285
@ -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,
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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()
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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(
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user