summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/src/rendering.rs59
-rw-r--r--engine/src/rendering/backend/opengl.rs8
2 files changed, 22 insertions, 45 deletions
diff --git a/engine/src/rendering.rs b/engine/src/rendering.rs
index 57d9698..2a73625 100644
--- a/engine/src/rendering.rs
+++ b/engine/src/rendering.rs
@@ -10,7 +10,7 @@ use crate::data_types::dimens::Dimens;
use crate::draw_flags::PolygonModeConfig;
use crate::ecs::actions::Actions;
use crate::ecs::component::local::Local;
-use crate::ecs::event::component::{Changed, EventMatchExt, Removed};
+use crate::ecs::event::component::{EventMatchExt, Removed};
use crate::ecs::pair::{ChildOf, Pair};
use crate::ecs::phase::{Phase, POST_UPDATE as POST_UPDATE_PHASE};
use crate::ecs::query::term::With;
@@ -86,7 +86,6 @@ impl crate::ecs::extension::Extension for Extension
.initialize((ActiveDrawProperties::default(),)),
);
- collector.add_observer(handle_window_changed);
collector.add_observer(handle_window_removed);
crate::rendering::shader::prepare(&mut collector);
@@ -172,6 +171,7 @@ impl Default for GraphicsPropertiesBuilder
pub struct Surface
{
pub id: SurfaceId,
+ pub size: PhysicalSize<u32>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
@@ -429,7 +429,7 @@ impl Default for CommandQueue
#[tracing::instrument(skip_all)]
fn enqueue_commands_from_render_passes(
- window_surface_query: Query<(&Surface, With<Window>, With<TargetWindow>)>,
+ window_surface_query: Query<(&mut Surface, &Window, With<TargetWindow>)>,
mut command_queue: Single<CommandQueue>,
mut render_passes: Single<RenderPasses>,
mut active_draw_props: Local<ActiveDrawProperties>,
@@ -445,6 +445,17 @@ fn enqueue_commands_from_render_passes(
let mut last_render_pass_draw_props = active_draw_props.draw_properties.clone();
+ for (mut window_surface, window) in &window_surface_query {
+ if window_surface.size != window.inner_size {
+ command_queue.push(Command::SetSurfaceSize(
+ window_surface.id,
+ window.inner_size,
+ ));
+
+ window_surface.size = window.inner_size.clone();
+ }
+ }
+
for render_pass in render_passes.passes.drain(..) {
if render_pass.draw_properties != last_render_pass_draw_props {
command_queue.push(Command::UpdateDrawProperties(
@@ -473,52 +484,12 @@ fn enqueue_commands_from_render_passes(
active_draw_props.draw_properties = last_render_pass_draw_props;
- for (window_surface,) in &window_surface_query {
+ for (window_surface, _) in &window_surface_query {
command_queue.push(Command::SwapBuffers(window_surface.id));
}
}
#[tracing::instrument(skip_all)]
-fn handle_window_changed(
- observe: Observe<Pair<Changed, Window>>,
- mut command_queue: Single<CommandQueue>,
-)
-{
- let Ok(command_queue) = command_queue.get_mut() else {
- unreachable!();
- };
-
- for evt_match in &observe {
- let window_ent = evt_match.get_entity();
-
- if window_ent.get::<TargetWindow>().is_none() {
- continue;
- }
-
- let Some(window_surface) = window_ent.get::<Surface>() else {
- continue;
- };
-
- let window = evt_match.get_ent_target_comp();
-
- tracing::trace!(
- window_id=?window.wid(),
- window_title=&*window.title,
- "Handling potential resize of window"
- );
-
- command_queue.queue.push_front(Command::SetSurfaceSize(
- window_surface.id,
- evt_match.get_ent_target_comp().inner_size.clone(),
- ));
-
- command_queue
- .queue
- .push_front(Command::MakeCurrent(window_surface.id));
- }
-}
-
-#[tracing::instrument(skip_all)]
fn handle_window_removed(
observe: Observe<Pair<Removed, Window>>,
mut command_queue: Single<CommandQueue>,
diff --git a/engine/src/rendering/backend/opengl.rs b/engine/src/rendering/backend/opengl.rs
index 33a1712..e00faa2 100644
--- a/engine/src/rendering/backend/opengl.rs
+++ b/engine/src/rendering/backend/opengl.rs
@@ -427,7 +427,13 @@ fn init_window_graphics(
let surface_id = SurfaceId::new_unique();
- actions.add_components(window_ent_id, (Surface { id: surface_id },));
+ actions.add_components(
+ window_ent_id,
+ (Surface {
+ id: surface_id,
+ size: window.inner_size.clone(),
+ },),
+ );
graphics_ctx.surfaces.insert(
surface_id,