mirror of
https://github.com/bevyengine/bevy
synced 2025-02-16 14:08:32 +00:00
cargo fmt
This commit is contained in:
parent
057ad97a46
commit
115a009c16
39 changed files with 168 additions and 149 deletions
|
@ -1,7 +1,7 @@
|
|||
use crate::{
|
||||
plugin::{load_plugin, AppPlugin},
|
||||
schedule_plan::{SchedulePlan, System},
|
||||
stage, App, Events, AppExit,
|
||||
stage, App, AppExit, Events,
|
||||
};
|
||||
|
||||
use legion::prelude::{Resources, Universe, World};
|
||||
|
|
|
@ -161,25 +161,23 @@ where
|
|||
/// Retrieves the latest event. This updates the `event_reader`'s event counter,
|
||||
/// which means subsequent event reads will not include events that happened before now.
|
||||
pub fn latest(&self, event_reader: &mut EventReader<T>) -> Option<&T> {
|
||||
self.iter(event_reader)
|
||||
.rev()
|
||||
.next()
|
||||
self.iter(event_reader).rev().next()
|
||||
}
|
||||
|
||||
/// Retrieves the latest event that matches the given `predicate`. This updates the `event_reader`'s event counter,
|
||||
/// which means subsequent event reads will not include events that happened before now.
|
||||
pub fn find_latest(&self, event_reader: &mut EventReader<T>, predicate: impl FnMut(&&T) -> bool) -> Option<&T> {
|
||||
self.iter(event_reader)
|
||||
.rev()
|
||||
.filter(predicate)
|
||||
.next()
|
||||
pub fn find_latest(
|
||||
&self,
|
||||
event_reader: &mut EventReader<T>,
|
||||
predicate: impl FnMut(&&T) -> bool,
|
||||
) -> Option<&T> {
|
||||
self.iter(event_reader).rev().filter(predicate).next()
|
||||
}
|
||||
|
||||
/// Retrieves the earliest event. This updates the `event_reader`'s event counter,
|
||||
/// which means subsequent event reads will not include events that happened before now.
|
||||
pub fn earliest(&self, event_reader: &mut EventReader<T>) -> Option<&T> {
|
||||
self.iter(event_reader)
|
||||
.next()
|
||||
self.iter(event_reader).next()
|
||||
}
|
||||
|
||||
/// Gets a new [EventReader]. This will include all events already in the event buffers.
|
||||
|
|
|
@ -2,4 +2,4 @@ mod event;
|
|||
pub use event::*;
|
||||
|
||||
/// An event that indicates the app should exit. This will fully exit the app process.
|
||||
pub struct AppExit;
|
||||
pub struct AppExit;
|
||||
|
|
|
@ -74,7 +74,6 @@ fn load_node(buffer_data: &[Vec<u8>], node: &gltf::Node, depth: i32) -> Result<M
|
|||
})
|
||||
.map(|vertex_attribute| mesh.attributes.push(vertex_attribute));
|
||||
|
||||
|
||||
reader.read_indices().map(|indices| {
|
||||
mesh.indices = Some(indices.into_u32().collect::<Vec<u32>>());
|
||||
});
|
||||
|
|
|
@ -1,19 +1,23 @@
|
|||
use bevy_app::{Events, GetEventReader, AppExit};
|
||||
use crate::keyboard::{ElementState, KeyboardInput, VirtualKeyCode};
|
||||
use bevy_app::{AppExit, Events, GetEventReader};
|
||||
use legion::prelude::*;
|
||||
use crate::keyboard::{VirtualKeyCode, KeyboardInput, ElementState};
|
||||
|
||||
pub fn exit_on_esc_system(resources: &mut Resources) -> Box<dyn Schedulable> {
|
||||
let mut keyboard_input_event_reader = resources.get_event_reader::<KeyboardInput>();
|
||||
SystemBuilder::new("exit_on_esc")
|
||||
.read_resource::<Events<KeyboardInput>>()
|
||||
.write_resource::<Events<AppExit>>()
|
||||
.build(move |_, _, (ref keyboard_input_events, ref mut app_exit_events), _| {
|
||||
for event in keyboard_input_events.iter(&mut keyboard_input_event_reader) {
|
||||
if let Some(virtual_key_code) = event.virtual_key_code {
|
||||
if event.state == ElementState::Pressed && virtual_key_code == VirtualKeyCode::Escape {
|
||||
app_exit_events.send(AppExit);
|
||||
.build(
|
||||
move |_, _, (ref keyboard_input_events, ref mut app_exit_events), _| {
|
||||
for event in keyboard_input_events.iter(&mut keyboard_input_event_reader) {
|
||||
if let Some(virtual_key_code) = event.virtual_key_code {
|
||||
if event.state == ElementState::Pressed
|
||||
&& virtual_key_code == VirtualKeyCode::Escape
|
||||
{
|
||||
app_exit_events.send(AppExit);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
use crate::{light::Light, material::StandardMaterial};
|
||||
use bevy_asset::Handle;
|
||||
use bevy_derive::EntityArchetype;
|
||||
use bevy_render::{mesh::Mesh, Renderable};
|
||||
use bevy_transform::prelude::{LocalToWorld, Rotation, Scale, Translation};
|
||||
use bevy_derive::EntityArchetype;
|
||||
|
||||
#[derive(EntityArchetype, Default)]
|
||||
#[module(meta = false)]
|
||||
|
|
|
@ -8,10 +8,10 @@ pub mod pipelines;
|
|||
mod forward_pbr_render_graph;
|
||||
pub use forward_pbr_render_graph::*;
|
||||
|
||||
use bevy_app::{AppBuilder, AppPlugin, stage};
|
||||
use bevy_app::{stage, AppBuilder, AppPlugin};
|
||||
use bevy_asset::AssetStorage;
|
||||
use material::StandardMaterial;
|
||||
use bevy_render::{render_graph::RenderGraph, shader};
|
||||
use material::StandardMaterial;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct PbrPlugin;
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
use bevy_render::{Color, PerspectiveCamera};
|
||||
use bevy_transform::components::Translation;
|
||||
use glam::Mat4;
|
||||
use std::ops::Range;
|
||||
use zerocopy::{AsBytes, FromBytes};
|
||||
use bevy_render::{PerspectiveCamera, Color};
|
||||
|
||||
pub struct Light {
|
||||
pub color: Color,
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
use bevy_render::{texture::Texture, Color};
|
||||
use bevy_asset::Handle;
|
||||
use bevy_asset::{self, Handle};
|
||||
use bevy_derive::Uniforms;
|
||||
use bevy_asset;
|
||||
use bevy_render::{texture::Texture, Color};
|
||||
|
||||
#[derive(Uniforms)]
|
||||
#[module(meta = false)]
|
||||
|
|
|
@ -4,10 +4,10 @@ use bevy_render::{
|
|||
renderer::{GlobalRenderResourceContext, RenderContext},
|
||||
};
|
||||
|
||||
use crate::light::{Light, LightRaw};
|
||||
use bevy_transform::prelude::*;
|
||||
use legion::prelude::*;
|
||||
use zerocopy::AsBytes;
|
||||
use crate::light::{LightRaw, Light};
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct LightsNode {
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
mod lights_node;
|
||||
|
||||
pub use lights_node::*;
|
||||
pub use lights_node::*;
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
mod main;
|
||||
|
||||
pub use main::*;
|
||||
pub use main::*;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
use bevy_asset::AssetStorage;
|
||||
use bevy_render::{
|
||||
pipeline::{
|
||||
state_descriptors::{
|
||||
|
@ -10,7 +11,6 @@ use bevy_render::{
|
|||
shader::{Shader, ShaderStage, ShaderStages},
|
||||
texture::TextureFormat,
|
||||
};
|
||||
use bevy_asset::AssetStorage;
|
||||
|
||||
pub fn build_forward_pipeline(shaders: &mut AssetStorage<Shader>) -> PipelineDescriptor {
|
||||
PipelineDescriptor {
|
||||
|
@ -30,22 +30,20 @@ pub fn build_forward_pipeline(shaders: &mut AssetStorage<Shader>) -> PipelineDes
|
|||
stencil_read_mask: 0,
|
||||
stencil_write_mask: 0,
|
||||
}),
|
||||
color_states: vec![
|
||||
ColorStateDescriptor {
|
||||
format: TextureFormat::Bgra8UnormSrgb,
|
||||
color_blend: BlendDescriptor {
|
||||
src_factor: BlendFactor::SrcAlpha,
|
||||
dst_factor: BlendFactor::OneMinusSrcAlpha,
|
||||
operation: BlendOperation::Add,
|
||||
},
|
||||
alpha_blend: BlendDescriptor {
|
||||
src_factor: BlendFactor::One,
|
||||
dst_factor: BlendFactor::One,
|
||||
operation: BlendOperation::Add,
|
||||
},
|
||||
write_mask: ColorWrite::ALL,
|
||||
}
|
||||
],
|
||||
color_states: vec![ColorStateDescriptor {
|
||||
format: TextureFormat::Bgra8UnormSrgb,
|
||||
color_blend: BlendDescriptor {
|
||||
src_factor: BlendFactor::SrcAlpha,
|
||||
dst_factor: BlendFactor::OneMinusSrcAlpha,
|
||||
operation: BlendOperation::Add,
|
||||
},
|
||||
alpha_blend: BlendDescriptor {
|
||||
src_factor: BlendFactor::One,
|
||||
dst_factor: BlendFactor::One,
|
||||
operation: BlendOperation::Add,
|
||||
},
|
||||
write_mask: ColorWrite::ALL,
|
||||
}],
|
||||
..PipelineDescriptor::new(ShaderStages {
|
||||
vertex: shaders.add(Shader::from_glsl(
|
||||
ShaderStage::Vertex,
|
||||
|
@ -57,4 +55,4 @@ pub fn build_forward_pipeline(shaders: &mut AssetStorage<Shader>) -> PipelineDes
|
|||
))),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
use crate::{
|
||||
mesh::Mesh, ActiveCamera, ActiveCamera2d, Camera,
|
||||
CameraType, Renderable,
|
||||
};
|
||||
use crate::{mesh::Mesh, ActiveCamera, ActiveCamera2d, Camera, CameraType, Renderable};
|
||||
use bevy_asset::Handle;
|
||||
use bevy_derive::EntityArchetype;
|
||||
use bevy_transform::components::{LocalToWorld, Rotation, Scale, Translation};
|
||||
|
|
|
@ -48,8 +48,7 @@ pub static RENDER_STAGE: &str = "render";
|
|||
#[derive(Default)]
|
||||
pub struct RenderPlugin;
|
||||
|
||||
impl RenderPlugin {
|
||||
}
|
||||
impl RenderPlugin {}
|
||||
|
||||
impl AppPlugin for RenderPlugin {
|
||||
fn build(&self, app: &mut AppBuilder) {
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
use crate::{
|
||||
pipeline::{
|
||||
state_descriptors::{IndexFormat, PrimitiveTopology},
|
||||
VertexBufferDescriptor, VertexFormat, VertexBufferDescriptors,
|
||||
VertexBufferDescriptor, VertexBufferDescriptors, VertexFormat,
|
||||
},
|
||||
render_resource::{RenderResourceAssignments, AssetBatchers, BufferInfo, BufferUsage},
|
||||
Renderable, renderer::{GlobalRenderResourceContext, RenderResourceContext}, Vertex,
|
||||
render_resource::{AssetBatchers, BufferInfo, BufferUsage, RenderResourceAssignments},
|
||||
renderer::{GlobalRenderResourceContext, RenderResourceContext},
|
||||
shader::AsUniforms,
|
||||
Renderable, Vertex,
|
||||
};
|
||||
use bevy_asset::{AssetStorage, Handle};
|
||||
use glam::*;
|
||||
|
@ -326,12 +327,16 @@ pub fn mesh_specializer_system() -> Box<dyn Schedulable> {
|
|||
SystemBuilder::new("mesh_batcher")
|
||||
.read_resource::<AssetStorage<Mesh>>()
|
||||
.with_query(
|
||||
<(Read<Handle<Mesh>>, Write<Renderable>)>::query().filter(changed::<Handle<Mesh>>() | changed::<Renderable>()),
|
||||
<(Read<Handle<Mesh>>, Write<Renderable>)>::query()
|
||||
.filter(changed::<Handle<Mesh>>() | changed::<Renderable>()),
|
||||
)
|
||||
.build(|_, world, meshes, query| {
|
||||
for (mesh_handle, mut renderable) in query.iter_mut(world) {
|
||||
let mesh = meshes.get(&mesh_handle).unwrap();
|
||||
renderable.render_resource_assignments.pipeline_specialization.primitive_topology = mesh.primitive_topology;
|
||||
renderable
|
||||
.render_resource_assignments
|
||||
.pipeline_specialization
|
||||
.primitive_topology = mesh.primitive_topology;
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -422,11 +427,10 @@ pub fn mesh_resource_provider_system(resources: &mut Resources) -> Box<dyn Sched
|
|||
)
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::{Vertex, pipeline::state_descriptors::PrimitiveTopology, shader::AsUniforms};
|
||||
use super::{Mesh, VertexAttribute};
|
||||
use crate::{pipeline::state_descriptors::PrimitiveTopology, shader::AsUniforms, Vertex};
|
||||
use zerocopy::AsBytes;
|
||||
|
||||
#[test]
|
||||
|
@ -475,6 +479,10 @@ mod tests {
|
|||
];
|
||||
|
||||
let descriptor = Vertex::get_vertex_buffer_descriptor().unwrap();
|
||||
assert_eq!(mesh.get_vertex_buffer_bytes(descriptor).unwrap(), expected_vertices.as_bytes(), "buffer bytes are equal");
|
||||
assert_eq!(
|
||||
mesh.get_vertex_buffer_bytes(descriptor).unwrap(),
|
||||
expected_vertices.as_bytes(),
|
||||
"buffer bytes are equal"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ use crate::{
|
|||
render_resource::{
|
||||
BufferInfo, RenderResourceAssignments, RenderResourceAssignmentsId, ResourceInfo,
|
||||
},
|
||||
renderer::{RenderResourceContext, GlobalRenderResourceContext},
|
||||
renderer::{GlobalRenderResourceContext, RenderResourceContext},
|
||||
shader::{Shader, ShaderSource},
|
||||
Renderable,
|
||||
};
|
||||
|
@ -256,9 +256,7 @@ impl PipelineCompiler {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn iter_all_compiled_pipelines(
|
||||
&self,
|
||||
) -> impl Iterator<Item = &Handle<PipelineDescriptor>> {
|
||||
pub fn iter_all_compiled_pipelines(&self) -> impl Iterator<Item = &Handle<PipelineDescriptor>> {
|
||||
self.pipeline_source_to_compiled
|
||||
.values()
|
||||
.map(|compiled_pipelines| {
|
||||
|
@ -283,10 +281,7 @@ impl PipelineAssignments {
|
|||
}
|
||||
|
||||
// TODO: make this a system
|
||||
pub fn update_shader_assignments(
|
||||
world: &mut World,
|
||||
resources: &Resources,
|
||||
) {
|
||||
pub fn update_shader_assignments(world: &mut World, resources: &Resources) {
|
||||
// PERF: this seems like a lot of work for things that don't change that often.
|
||||
// lots of string + hashset allocations. sees uniform_resource_provider for more context
|
||||
{
|
||||
|
@ -294,7 +289,8 @@ pub fn update_shader_assignments(
|
|||
let mut pipeline_compiler = resources.get_mut::<PipelineCompiler>().unwrap();
|
||||
let mut shader_storage = resources.get_mut::<AssetStorage<Shader>>().unwrap();
|
||||
let vertex_buffer_descriptors = resources.get::<VertexBufferDescriptors>().unwrap();
|
||||
let global_render_resource_context = resources.get::<GlobalRenderResourceContext>().unwrap();
|
||||
let global_render_resource_context =
|
||||
resources.get::<GlobalRenderResourceContext>().unwrap();
|
||||
let mut pipeline_descriptor_storage = resources
|
||||
.get_mut::<AssetStorage<PipelineDescriptor>>()
|
||||
.unwrap();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use super::{Node, NodeId, NodeLabel, NodeState, RenderGraphError, SlotLabel, SystemNode, Edge};
|
||||
use super::{Edge, Node, NodeId, NodeLabel, NodeState, RenderGraphError, SlotLabel, SystemNode};
|
||||
use legion::prelude::{Executor, Resources, Schedulable};
|
||||
use std::{borrow::Cow, collections::HashMap, fmt::Debug};
|
||||
|
||||
|
@ -41,7 +41,12 @@ impl RenderGraph {
|
|||
self.add_node(node)
|
||||
}
|
||||
|
||||
pub fn add_system_node_named<T>(&mut self, name: impl Into<Cow<'static, str>>, node: T, resources: &Resources) -> NodeId
|
||||
pub fn add_system_node_named<T>(
|
||||
&mut self,
|
||||
name: impl Into<Cow<'static, str>>,
|
||||
node: T,
|
||||
resources: &Resources,
|
||||
) -> NodeId
|
||||
where
|
||||
T: SystemNode + 'static,
|
||||
{
|
||||
|
@ -49,7 +54,6 @@ impl RenderGraph {
|
|||
self.add_node_named(name, node)
|
||||
}
|
||||
|
||||
|
||||
pub fn get_node_state(
|
||||
&self,
|
||||
label: impl Into<NodeLabel>,
|
||||
|
@ -367,7 +371,7 @@ mod tests {
|
|||
let b_id = graph.add_node_named("B", TestNode::new(0, 1));
|
||||
let c_id = graph.add_node_named("C", TestNode::new(1, 1));
|
||||
let d_id = graph.add_node_named("D", TestNode::new(1, 0));
|
||||
|
||||
|
||||
graph.add_slot_edge("A", "out_0", "C", "in_0").unwrap();
|
||||
graph.add_node_edge("B", "C").unwrap();
|
||||
graph.add_slot_edge("C", 0, "D", 0).unwrap();
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
pub mod nodes;
|
||||
mod command;
|
||||
mod edge;
|
||||
mod graph;
|
||||
mod node;
|
||||
mod edge;
|
||||
mod node_slot;
|
||||
pub mod nodes;
|
||||
mod schedule;
|
||||
pub use command::*;
|
||||
pub use edge::*;
|
||||
pub use graph::*;
|
||||
pub use node::*;
|
||||
pub use edge::*;
|
||||
pub use node_slot::*;
|
||||
pub use schedule::*;
|
||||
|
||||
|
@ -36,5 +36,9 @@ pub enum RenderGraphError {
|
|||
#[error("Node has an unconnected output slot.")]
|
||||
UnconnectedNodeOutputSlot { node: NodeId, output_slot: usize },
|
||||
#[error("Node input slot already occupied")]
|
||||
NodeInputSlotAlreadyOccupied { node: NodeId, input_slot: usize, occupied_by_node: NodeId },
|
||||
}
|
||||
NodeInputSlotAlreadyOccupied {
|
||||
node: NodeId,
|
||||
input_slot: usize,
|
||||
occupied_by_node: NodeId,
|
||||
},
|
||||
}
|
||||
|
|
|
@ -155,7 +155,6 @@ impl NodeState {
|
|||
.ok_or_else(|| RenderGraphError::WrongNodeType)
|
||||
}
|
||||
|
||||
|
||||
pub fn validate_output_slots(&self) -> Result<(), RenderGraphError> {
|
||||
for i in 0..self.output_slots.len() {
|
||||
self.edges.get_output_slot_edge(i)?;
|
||||
|
|
|
@ -54,10 +54,7 @@ impl ResourceSlots {
|
|||
slot.resource.clone()
|
||||
}
|
||||
|
||||
pub fn get_slot(
|
||||
&self,
|
||||
label: impl Into<SlotLabel>,
|
||||
) -> Result<&ResourceSlot, RenderGraphError> {
|
||||
pub fn get_slot(&self, label: impl Into<SlotLabel>) -> Result<&ResourceSlot, RenderGraphError> {
|
||||
let label = label.into();
|
||||
let index = self.get_slot_index(&label)?;
|
||||
self.slots
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
mod camera_node;
|
||||
mod camera2d_node;
|
||||
mod window_texture_node;
|
||||
mod window_swapchain_node;
|
||||
mod camera_node;
|
||||
mod pass_node;
|
||||
mod uniform_node;
|
||||
mod window_swapchain_node;
|
||||
mod window_texture_node;
|
||||
|
||||
pub use camera_node::*;
|
||||
pub use camera2d_node::*;
|
||||
pub use window_texture_node::*;
|
||||
pub use window_swapchain_node::*;
|
||||
pub use camera_node::*;
|
||||
pub use pass_node::*;
|
||||
pub use uniform_node::*;
|
||||
pub use uniform_node::*;
|
||||
pub use window_swapchain_node::*;
|
||||
pub use window_texture_node::*;
|
||||
|
|
|
@ -3,7 +3,7 @@ use bevy_window::WindowResized;
|
|||
|
||||
use crate::{
|
||||
camera::{ActiveCamera2d, Camera},
|
||||
render_graph::{CommandQueue, Node, SystemNode, ResourceSlots},
|
||||
render_graph::{CommandQueue, Node, ResourceSlots, SystemNode},
|
||||
render_resource::{resource_name, BufferInfo, BufferUsage, RenderResourceAssignments},
|
||||
renderer::{GlobalRenderResourceContext, RenderContext},
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use crate::{
|
||||
render_graph::{CommandQueue, Node, SystemNode, ResourceSlots},
|
||||
render_graph::{CommandQueue, Node, ResourceSlots, SystemNode},
|
||||
render_resource::{resource_name, BufferInfo, BufferUsage, RenderResourceAssignments},
|
||||
renderer::{GlobalRenderResourceContext, RenderContext},
|
||||
ActiveCamera, Camera,
|
||||
|
@ -7,9 +7,9 @@ use crate::{
|
|||
|
||||
use bevy_app::{Events, GetEventReader};
|
||||
use bevy_transform::prelude::*;
|
||||
use bevy_window::WindowResized;
|
||||
use legion::prelude::*;
|
||||
use zerocopy::AsBytes;
|
||||
use bevy_window::WindowResized;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct CameraNode {
|
||||
|
@ -96,4 +96,4 @@ impl SystemNode for CameraNode {
|
|||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -332,7 +332,7 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: use something like this to remove redundancy between AssetUniformNode and UniformNode
|
||||
// TODO: use something like this to remove redundancy between AssetUniformNode and UniformNode
|
||||
// fn update_uniforms<T>(
|
||||
// render_resource_context: &dyn RenderResourceContext,
|
||||
// staging_buffer_resource: &mut Option<RenderResource>,
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
use crate::{
|
||||
render_graph::{Node, ResourceSlots, ResourceSlotInfo},
|
||||
render_graph::{Node, ResourceSlotInfo, ResourceSlots},
|
||||
render_resource::ResourceInfo,
|
||||
renderer::RenderContext,
|
||||
};
|
||||
use bevy_app::{EventReader, Events};
|
||||
use bevy_window::{WindowCreated, WindowResized, Windows, WindowReference};
|
||||
use bevy_window::{WindowCreated, WindowReference, WindowResized, Windows};
|
||||
use legion::prelude::*;
|
||||
use std::borrow::Cow;
|
||||
|
||||
|
@ -52,9 +52,7 @@ impl Node for WindowSwapChainNode {
|
|||
let windows = resources.get::<Windows>().unwrap();
|
||||
|
||||
let window = match self.window_reference {
|
||||
WindowReference::Primary => {
|
||||
windows.get_primary().expect("No primary window exists")
|
||||
}
|
||||
WindowReference::Primary => windows.get_primary().expect("No primary window exists"),
|
||||
WindowReference::Id(id) => windows
|
||||
.get(id)
|
||||
.expect("Received window resized event for non-existent window"),
|
||||
|
@ -64,9 +62,11 @@ impl Node for WindowSwapChainNode {
|
|||
|
||||
// create window swapchain when window is resized or created
|
||||
if window_created_events
|
||||
.find_latest(&mut self.window_created_event_reader, |e| e.id == window.id).is_some() ||
|
||||
window_resized_events
|
||||
.find_latest(&mut self.window_resized_event_reader, |e| e.id == window.id).is_some()
|
||||
.find_latest(&mut self.window_created_event_reader, |e| e.id == window.id)
|
||||
.is_some()
|
||||
|| window_resized_events
|
||||
.find_latest(&mut self.window_resized_event_reader, |e| e.id == window.id)
|
||||
.is_some()
|
||||
{
|
||||
render_resources.create_swap_chain(window);
|
||||
}
|
||||
|
|
|
@ -63,9 +63,11 @@ impl Node for WindowTextureNode {
|
|||
};
|
||||
|
||||
if window_created_events
|
||||
.find_latest(&mut self.window_created_event_reader, |e| e.id == window.id).is_some() ||
|
||||
window_resized_events
|
||||
.find_latest(&mut self.window_resized_event_reader, |e| e.id == window.id).is_some()
|
||||
.find_latest(&mut self.window_created_event_reader, |e| e.id == window.id)
|
||||
.is_some()
|
||||
|| window_resized_events
|
||||
.find_latest(&mut self.window_resized_event_reader, |e| e.id == window.id)
|
||||
.is_some()
|
||||
{
|
||||
let render_resources = render_context.resources_mut();
|
||||
if let Some(old_texture) = output.get(WINDOW_TEXTURE) {
|
||||
|
|
|
@ -141,9 +141,7 @@ pub struct RenderResourceSetId(u64);
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::pipeline::{
|
||||
BindType, BindingDescriptor, UniformProperty, UniformPropertyType,
|
||||
};
|
||||
use crate::pipeline::{BindType, BindingDescriptor, UniformProperty, UniformPropertyType};
|
||||
|
||||
#[test]
|
||||
fn test_render_resource_sets() {
|
||||
|
|
|
@ -14,4 +14,4 @@ pub struct Vertex {
|
|||
pub normal: [f32; 3],
|
||||
#[uniform(vertex)]
|
||||
pub uv: [f32; 2],
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
mod systems;
|
||||
mod wgpu_render_context;
|
||||
mod wgpu_render_resource_context;
|
||||
mod wgpu_render_graph_executor;
|
||||
mod wgpu_render_resource_context;
|
||||
|
||||
pub use systems::*;
|
||||
pub use wgpu_render_context::*;
|
||||
pub use wgpu_render_graph_executor::*;
|
||||
pub use wgpu_render_resource_context::*;
|
||||
pub use wgpu_render_graph_executor::*;
|
|
@ -1,7 +1,7 @@
|
|||
use bevy_asset::AssetStorage;
|
||||
use bevy_render::{
|
||||
pipeline::{PipelineAssignments, PipelineCompiler, PipelineDescriptor},
|
||||
render_resource::{EntityRenderResourceAssignments},
|
||||
render_resource::EntityRenderResourceAssignments,
|
||||
Renderable,
|
||||
};
|
||||
use legion::prelude::*;
|
||||
|
|
|
@ -47,7 +47,8 @@ impl WgpuRenderGraphExecutor {
|
|||
for job in jobs_chunk.iter_mut() {
|
||||
for node_state in job.node_states.iter_mut() {
|
||||
// bind inputs from connected node outputs
|
||||
for (i, mut input_slot) in node_state.input_slots.iter_mut().enumerate()
|
||||
for (i, mut input_slot) in
|
||||
node_state.input_slots.iter_mut().enumerate()
|
||||
{
|
||||
if let Edge::SlotEdge {
|
||||
output_node,
|
||||
|
|
|
@ -355,10 +355,7 @@ impl WgpuResources {
|
|||
.write()
|
||||
.unwrap()
|
||||
.insert(resource, texture_view);
|
||||
self.textures
|
||||
.write()
|
||||
.unwrap()
|
||||
.insert(resource, texture);
|
||||
self.textures.write().unwrap().insert(resource, texture);
|
||||
resource
|
||||
}
|
||||
|
||||
|
|
|
@ -34,4 +34,4 @@ pub struct WindowCreated {
|
|||
pub struct WindowCloseRequested {
|
||||
pub id: WindowId,
|
||||
pub is_primary: bool,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,22 +1,34 @@
|
|||
use crate::{WindowCloseRequested, WindowId};
|
||||
use bevy_app::{AppExit, Events, GetEventReader};
|
||||
use legion::prelude::*;
|
||||
use bevy_app::{Events, AppExit, GetEventReader};
|
||||
use crate::{WindowId, WindowCloseRequested};
|
||||
|
||||
pub fn exit_on_window_close_system(resources: &mut Resources, window_id: Option<WindowId>) -> Box<dyn Schedulable> {
|
||||
let mut window_close_requested_event_reader = resources.get_event_reader::<WindowCloseRequested>();
|
||||
pub fn exit_on_window_close_system(
|
||||
resources: &mut Resources,
|
||||
window_id: Option<WindowId>,
|
||||
) -> Box<dyn Schedulable> {
|
||||
let mut window_close_requested_event_reader =
|
||||
resources.get_event_reader::<WindowCloseRequested>();
|
||||
SystemBuilder::new("exit_on_window_close")
|
||||
.read_resource::<Events<WindowCloseRequested>>()
|
||||
.write_resource::<Events<AppExit>>()
|
||||
.build(move |_, _, (ref window_close_requested_events, ref mut app_exit_events), _| {
|
||||
for window_close_requested_event in window_close_requested_events.iter(&mut window_close_requested_event_reader) {
|
||||
match window_id.as_ref() {
|
||||
Some(window_id) => if *window_id == window_close_requested_event.id {
|
||||
app_exit_events.send(AppExit);
|
||||
},
|
||||
None => if window_close_requested_event.is_primary {
|
||||
app_exit_events.send(AppExit);
|
||||
.build(
|
||||
move |_, _, (ref window_close_requested_events, ref mut app_exit_events), _| {
|
||||
for window_close_requested_event in
|
||||
window_close_requested_events.iter(&mut window_close_requested_event_reader)
|
||||
{
|
||||
match window_id.as_ref() {
|
||||
Some(window_id) => {
|
||||
if *window_id == window_close_requested_event.id {
|
||||
app_exit_events.send(AppExit);
|
||||
}
|
||||
}
|
||||
None => {
|
||||
if window_close_requested_event.is_primary {
|
||||
app_exit_events.send(AppExit);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
|
@ -20,7 +20,8 @@ pub fn setup(world: &mut World, resources: &mut Resources) {
|
|||
..Default::default()
|
||||
});
|
||||
|
||||
world.build()
|
||||
world
|
||||
.build()
|
||||
// cube
|
||||
.add_entity(MeshEntity {
|
||||
mesh: cube_handle,
|
||||
|
@ -41,4 +42,4 @@ pub fn setup(world: &mut World, resources: &mut Resources) {
|
|||
)),
|
||||
..Default::default()
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,4 +34,4 @@ impl AddDefaultPlugins for AppBuilder {
|
|||
|
||||
self
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,8 +33,8 @@
|
|||
|
||||
#![feature(min_specialization)]
|
||||
|
||||
pub mod prelude;
|
||||
mod add_default_plugins;
|
||||
pub mod prelude;
|
||||
|
||||
pub use add_default_plugins::*;
|
||||
pub use bevy_app as app;
|
||||
|
@ -64,4 +64,4 @@ pub use bevy_transform as transform;
|
|||
#[cfg(feature = "ui")]
|
||||
pub use bevy_ui as ui;
|
||||
#[cfg(feature = "window")]
|
||||
pub use bevy_window as window;
|
||||
pub use bevy_window as window;
|
||||
|
|
|
@ -10,14 +10,20 @@ pub use crate::derive::*;
|
|||
#[cfg(feature = "diagnostic")]
|
||||
pub use crate::diagnostic::DiagnosticsPlugin;
|
||||
#[cfg(feature = "pbr")]
|
||||
pub use crate::pbr::{material::StandardMaterial, light::Light, entity::*};
|
||||
pub use crate::pbr::{entity::*, light::Light, material::StandardMaterial};
|
||||
#[cfg(feature = "render")]
|
||||
pub use crate::render::{
|
||||
entity::*,
|
||||
mesh::{Mesh, shape},
|
||||
pipeline::PipelineDescriptor,
|
||||
draw_target,
|
||||
render_graph::{RenderGraph, nodes::{UniformNode, AssetUniformNode, PassNode, WindowSwapChainNode, WindowTextureNode, Camera2dNode, CameraNode}},
|
||||
entity::*,
|
||||
mesh::{shape, Mesh},
|
||||
pipeline::PipelineDescriptor,
|
||||
render_graph::{
|
||||
nodes::{
|
||||
AssetUniformNode, Camera2dNode, CameraNode, PassNode, UniformNode, WindowSwapChainNode,
|
||||
WindowTextureNode,
|
||||
},
|
||||
RenderGraph,
|
||||
},
|
||||
render_resource::{resource_name, AssetBatchers},
|
||||
shader::{Shader, ShaderDefSuffixProvider, ShaderStage, ShaderStages},
|
||||
texture::{Texture, TextureType},
|
||||
|
|
Loading…
Add table
Reference in a new issue