summaryrefslogtreecommitdiff
path: root/engine/src/renderer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/renderer.rs')
-rw-r--r--engine/src/renderer.rs60
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