diff options
Diffstat (limited to 'engine/src/renderer.rs')
| -rw-r--r-- | engine/src/renderer.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/engine/src/renderer.rs b/engine/src/renderer.rs index 79f2bd5..bdbbe0c 100644 --- a/engine/src/renderer.rs +++ b/engine/src/renderer.rs @@ -4,9 +4,11 @@ use std::sync::atomic::{AtomicU64, Ordering}; use bitflags::bitflags; use ecs::entity::obtainer::Obtainer as EntityObtainer; +use ecs::event::component::Changed; use ecs::pair::{ChildOf, Pair, Wildcard}; use ecs::phase::{POST_UPDATE as POST_UPDATE_PHASE, Phase}; use ecs::sole::Single; +use ecs::system::observer::Observe; use ecs::uid::Uid; use ecs::{Component, Query, Sole, declare_entity}; @@ -25,6 +27,7 @@ use crate::shader::cursor::{ }; use crate::texture::Texture; use crate::vector::Vec2; +use crate::windowing::window::Window; pub mod blending; pub mod main_render_pass; @@ -190,6 +193,11 @@ pub enum Command RemoveMesh(ObjectId), DrawMesh(ObjectId, DrawMeshOptions), UpdateDrawProperties(DrawProperties, DrawPropertiesUpdateFlags), + SetViewport + { + size: Dimens<u32>, + position: Vec2<u32>, + }, } builder! { @@ -444,6 +452,58 @@ pub fn enqueue_commands_from_render_passes( } } +#[tracing::instrument(skip_all)] +fn handle_window_changed( + observe: Observe<Pair<Changed, Window>>, + entity_obtainer: EntityObtainer, +) +{ + for evt_match in &observe { + let window_ent = evt_match.get_ent_infallible(); + + let Some(window_surface_spec) = window_ent.get::<SurfaceSpec>() else { + continue; + }; + + let Some(renderer_ctx_ent_id) = window_ent + .get_matching_components( + Pair::builder() + .relation::<WindowUsingRendererCtx>() + .target_id(Wildcard::uid()) + .build() + .id(), + ) + .next() + .map(|comp_ref| comp_ref.id().target_entity()) + else { + continue; + }; + + let Some(renderer_ctx_ent) = entity_obtainer.get_entity(renderer_ctx_ent_id) + else { + tracing::error!("Renderer context entity does not exist"); + continue; + }; + + let Some(mut command_queue) = renderer_ctx_ent.get_mut::<CommandQueue>() else { + tracing::error!( + "Renderer context entity does not have a {} component", + type_name::<CommandQueue>() + ); + continue; + }; + + command_queue.queue.push_front(Command::SetViewport { + position: Vec2 { x: 0, y: 0 }, + size: *evt_match.get_changed_comp().inner_size(), + }); + + command_queue + .queue + .push_front(Command::MakeCurrent(window_surface_spec.id)); + } +} + // TODO: Maybe move this struct to somewhere more appropriate #[derive(Default, Clone, Component)] pub struct PendingShaderBindings |
