Skip to content

Commit 37ade28

Browse files
authored
Nuon layers and scroll (#278)
* Layers * Nuon Scroll
1 parent 6e134cd commit 37ade28

3 files changed

Lines changed: 288 additions & 80 deletions

File tree

neothesia/src/scene/mod.rs

Lines changed: 90 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pub mod menu_scene;
22
pub mod playing_scene;
33

44
use crate::context::Context;
5+
use iced_core::image::Renderer as _;
56
use midi_file::midly::MidiMessage;
67
use neothesia_core::render::{QuadRenderer, TextRenderer};
78
use std::time::Duration;
@@ -14,67 +15,104 @@ pub trait Scene {
1415
fn midi_event(&mut self, _ctx: &mut Context, _channel: u8, _message: &MidiMessage) {}
1516
}
1617

17-
fn render_nuon(
18-
ui: &mut nuon::Ui,
19-
quad_pipeline: &mut QuadRenderer,
20-
text_renderer: &mut TextRenderer,
21-
renderer: &mut impl iced_core::image::Renderer<Handle = iced_core::image::Handle>,
22-
) {
23-
for quad in ui.quads.iter() {
24-
quad_pipeline.push(neothesia_core::render::QuadInstance {
25-
position: quad.rect.origin.into(),
26-
size: quad.rect.size.into(),
27-
color: wgpu_jumpstart::Color::new(
28-
quad.color.r,
29-
quad.color.g,
30-
quad.color.b,
31-
quad.color.a,
32-
)
33-
.into_linear_rgba(),
34-
border_radius: quad.border_radius,
18+
struct NuonLayer {
19+
quad_renderer: QuadRenderer,
20+
text_renderer: TextRenderer,
21+
}
22+
23+
#[derive(Default)]
24+
pub struct NuonRenderer {
25+
layers: Vec<NuonLayer>,
26+
}
27+
28+
impl NuonRenderer {
29+
fn ensure_layers(&mut self, ctx: &mut Context, len: usize) {
30+
self.layers.resize_with(len, || NuonLayer {
31+
quad_renderer: ctx.quad_renderer_facotry.new_renderer(),
32+
text_renderer: ctx.text_renderer_factory.new_renderer(),
3533
});
3634
}
3735

38-
for img in ui.images.iter() {
39-
renderer.draw_image(
40-
iced_core::Image {
41-
handle: img.image.clone(),
42-
filter_method: iced_core::image::FilterMethod::default(),
43-
rotation: iced_core::Radians(0.0),
44-
opacity: 1.0,
45-
snap: false,
46-
},
47-
iced_core::Rectangle {
48-
x: img.rect.origin.x,
49-
y: img.rect.origin.y,
50-
width: img.rect.size.width,
51-
height: img.rect.size.height,
52-
},
53-
);
36+
pub fn render<'rpass>(&'rpass self, rpass: &mut wgpu_jumpstart::RenderPass<'rpass>) {
37+
for layer in self.layers.iter() {
38+
layer.quad_renderer.render(rpass);
39+
layer.text_renderer.render(rpass);
40+
}
5441
}
42+
}
5543

56-
for icon in ui.icons.iter() {
57-
text_renderer.queue_icon(icon.origin.x, icon.origin.y, icon.size, &icon.icon);
58-
}
44+
fn render_nuon(ui: &mut nuon::Ui, nuon_renderer: &mut NuonRenderer, ctx: &mut Context) {
45+
nuon_renderer.ensure_layers(ctx, ui.layers.len());
5946

60-
for text in ui.text.iter() {
61-
let buffer = if text.bold {
62-
TextRenderer::gen_buffer_bold(text.size, &text.text)
63-
} else {
64-
TextRenderer::gen_buffer(text.size, &text.text)
65-
};
47+
let renderer = &mut ctx.iced_manager.renderer;
6648

67-
match text.text_justify {
68-
nuon::TextJustify::Left => {
69-
text_renderer.queue_buffer_left(text.rect, buffer);
70-
}
71-
nuon::TextJustify::Right => {
72-
text_renderer.queue_buffer_right(text.rect, buffer);
73-
}
74-
nuon::TextJustify::Center => {
75-
text_renderer.queue_buffer_centered(text.rect, buffer);
49+
for (layer, out) in ui.layers.iter().zip(nuon_renderer.layers.iter_mut()) {
50+
out.quad_renderer.clear();
51+
out.quad_renderer.set_scissor_rect(layer.scissor_rect);
52+
out.text_renderer.set_scissor_rect(layer.scissor_rect);
53+
54+
for quad in layer.quads.iter() {
55+
out.quad_renderer
56+
.push(neothesia_core::render::QuadInstance {
57+
position: quad.rect.origin.into(),
58+
size: quad.rect.size.into(),
59+
color: wgpu_jumpstart::Color::new(
60+
quad.color.r,
61+
quad.color.g,
62+
quad.color.b,
63+
quad.color.a,
64+
)
65+
.into_linear_rgba(),
66+
border_radius: quad.border_radius,
67+
});
68+
}
69+
70+
for img in layer.images.iter() {
71+
renderer.draw_image(
72+
iced_core::Image {
73+
handle: img.image.clone(),
74+
filter_method: iced_core::image::FilterMethod::default(),
75+
rotation: iced_core::Radians(0.0),
76+
opacity: 1.0,
77+
snap: false,
78+
},
79+
iced_core::Rectangle {
80+
x: img.rect.origin.x,
81+
y: img.rect.origin.y,
82+
width: img.rect.size.width,
83+
height: img.rect.size.height,
84+
},
85+
);
86+
}
87+
88+
for icon in layer.icons.iter() {
89+
out.text_renderer
90+
.queue_icon(icon.origin.x, icon.origin.y, icon.size, &icon.icon);
91+
}
92+
93+
for text in layer.text.iter() {
94+
let buffer = if text.bold {
95+
TextRenderer::gen_buffer_bold(text.size, &text.text)
96+
} else {
97+
TextRenderer::gen_buffer(text.size, &text.text)
98+
};
99+
100+
match text.text_justify {
101+
nuon::TextJustify::Left => {
102+
out.text_renderer.queue_buffer_left(text.rect, buffer);
103+
}
104+
nuon::TextJustify::Right => {
105+
out.text_renderer.queue_buffer_right(text.rect, buffer);
106+
}
107+
nuon::TextJustify::Center => {
108+
out.text_renderer.queue_buffer_centered(text.rect, buffer);
109+
}
76110
}
77111
}
112+
113+
out.quad_renderer.prepare();
114+
out.text_renderer
115+
.update(ctx.window_state.logical_size.into());
78116
}
79117

80118
ui.done();

neothesia/src/scene/playing_scene/mod.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use winit::{
1010

1111
use self::top_bar::TopBar;
1212

13-
use super::Scene;
13+
use super::{NuonRenderer, Scene};
1414
use crate::{context::Context, render::WaterfallRenderer, song::Song, NeothesiaEvent};
1515

1616
mod keyboard;
@@ -42,6 +42,7 @@ pub struct PlayingScene {
4242
waterfall: WaterfallRenderer,
4343
guidelines: GuidelineRenderer,
4444
text_renderer: TextRenderer,
45+
nuon_renderer: NuonRenderer,
4546

4647
note_labels: Option<NoteLabels>,
4748

@@ -119,6 +120,7 @@ impl PlayingScene {
119120
guidelines,
120121
note_labels,
121122
text_renderer,
123+
nuon_renderer: NuonRenderer::default(),
122124

123125
waterfall,
124126
player,
@@ -232,12 +234,7 @@ impl Scene for PlayingScene {
232234

233235
TopBar::update(self, ctx);
234236

235-
super::render_nuon(
236-
&mut self.nuon,
237-
&mut self.quad_renderer_fg,
238-
&mut self.text_renderer,
239-
&mut ctx.iced_manager.renderer,
240-
);
237+
super::render_nuon(&mut self.nuon, &mut self.nuon_renderer, ctx);
241238

242239
self.quad_renderer_bg.prepare();
243240
self.quad_renderer_fg.prepare();
@@ -275,6 +272,8 @@ impl Scene for PlayingScene {
275272
glow.pipeline.render(rpass);
276273
}
277274
self.text_renderer.render(rpass);
275+
276+
self.nuon_renderer.render(rpass);
278277
}
279278

280279
fn window_event(&mut self, ctx: &mut Context, event: &WindowEvent) {

0 commit comments

Comments
 (0)