Skip to content

Commit

Permalink
Managed to put a reference to the whole renderer in the RenderContext
Browse files Browse the repository at this point in the history
  • Loading branch information
villuna committed Apr 14, 2024
1 parent d0c176a commit e66273b
Show file tree
Hide file tree
Showing 9 changed files with 68 additions and 103 deletions.
35 changes: 20 additions & 15 deletions src/app/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use winit::{
event_loop::ControlFlow,

Check warning on line 18 in src/app/mod.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/app/mod.rs
};

use crate::render::{self, context::Renderable, texture::Texture};
use crate::render::{self, Renderable, texture::Texture, Renderer};

const FPS_POLL_TIME: f32 = 0.5;
const SPRITES_PATH: &str = "assets/images";
Expand All @@ -31,24 +31,27 @@ pub enum StateTransition {
Exit,
}

pub struct Context<'app> {
pub audio: &'app mut AudioManager,
pub renderer: &'app mut render::Renderer,
pub keyboard: &'app KeyboardState,
pub textures: &'app mut TextureCache,
pub mouse: &'app MouseState,
pub struct Context<'ctx> {
pub audio: &'ctx mut AudioManager,
pub renderer: &'ctx mut render::Renderer,
pub keyboard: &'ctx KeyboardState,
pub textures: &'ctx mut TextureCache,
pub mouse: &'ctx MouseState,
}

pub struct RenderContext<'app, 'pass> {
pub audio: &'app mut AudioManager,
pub render_pass: &'app mut render::RenderPassContext<'pass>,
pub keyboard: &'app KeyboardState,
pub textures: &'app mut TextureCache,
pub struct RenderContext<'ctx, 'pass> {
pub audio: &'ctx mut AudioManager,
pub renderer: &'pass Renderer,
pub textures: &'ctx mut TextureCache,
pub keyboard: &'ctx KeyboardState,
pub mouse: &'ctx MouseState,

pub render_pass: &'ctx mut wgpu::RenderPass<'pass>,
}

impl<'pass> RenderContext<'_, 'pass> {
pub fn render<R: Renderable>(&mut self, target: &'pass R) {
self.render_pass.render(target);
target.render(self.renderer, self.render_pass);
}
}

Expand Down Expand Up @@ -291,12 +294,14 @@ impl App {
}

Check warning on line 294 in src/app/mod.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/app/mod.rs
}

pub fn render<'pass>(&'pass mut self, rctx: &mut render::RenderPassContext<'pass>) {
pub fn render<'pass>(&'pass mut self, renderer: &'pass Renderer, render_pass: &mut wgpu::RenderPass<'pass>) {
let mut ctx = RenderContext {
audio: &mut self.audio_manager,
render_pass: rctx,
renderer,
keyboard: &self.keyboard,
mouse: &self.mouse,
textures: &mut self.textures,
render_pass,
};

self.state.last_mut().unwrap().render(&mut ctx)
Expand Down
6 changes: 3 additions & 3 deletions src/app/taiko_mode/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ impl GameState for TaikoMode {
0.0,
0.0,
],
ctx.render_pass.queue,
&ctx.renderer.queue,
);

ctx.render(v_barline);
Expand All @@ -514,7 +514,7 @@ impl GameState for TaikoMode {
NOTE_Y,
note.time,
],
ctx.render_pass.queue,
&ctx.renderer.queue,
);

ctx.render(v_note)
Expand All @@ -532,7 +532,7 @@ impl GameState for TaikoMode {

self.ui.judgement_text[i]
.sprite
.set_position([0.0, -10.0 * progress + 5.0, 0.0], ctx.render_pass.queue);
.set_position([0.0, -10.0 * progress + 5.0, 0.0], &ctx.renderer.queue);

ctx.render(&self.ui.judgement_text[i]);
}
Expand Down
12 changes: 6 additions & 6 deletions src/app/taiko_mode/note.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
use lyon::lyon_tessellation::TessellationError;

use crate::beatmap_parser::track::NoteType;
use crate::render::Renderer;
use crate::{app::TextureCache, render::shapes::ShapeBuilder};

Check warning on line 5 in src/app/taiko_mode/note.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/app/taiko_mode/note.rs

use crate::render::{
context::Renderable,
Renderable,
shapes::{Shape, SolidColour},
texture::Sprite,
RenderPassContext,
};

const ROLL_COLOUR: [f32; 4] = [1.0, 195.0 / 255.0, 44.0 / 255.0, 1.0];
Expand Down Expand Up @@ -141,14 +141,14 @@ impl VisualNote {
}

Check warning on line 141 in src/app/taiko_mode/note.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/app/taiko_mode/note.rs

impl Renderable for VisualNote {
fn render<'a>(&'a self, ctx: &mut RenderPassContext<'a>) {
fn render<'pass>(&'pass self, renderer: &'pass Renderer, render_pass: &mut wgpu::RenderPass<'pass>) {
match self {
VisualNote::Note(sprite) => sprite.render(ctx),
VisualNote::Note(sprite) => sprite.render(renderer, render_pass),
VisualNote::Roll { start, body } => {
// If start and body both have the same depth, then start should render on top
// of the body, given the compare function is `LessEqual`
body.render(ctx);
start.render(ctx);
body.render(renderer, render_pass);
start.render(renderer, render_pass);
}
}
}
Expand Down
16 changes: 8 additions & 8 deletions src/app/ui_elements/button.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use crate::app::Context;

Check warning on line 1 in src/app/ui_elements/button.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/app/ui_elements/button.rs
use crate::render::context::Renderable;
use crate::render::Renderable;
use crate::render::shapes::{Shape, ShapeBuilder, ShapeVertex, SolidColour};
use crate::render::text::Text;
use crate::render::{RenderPassContext, Renderer};
use crate::render::Renderer;
use lyon::tessellation::FillVertexConstructor;
use wgpu_text::glyph_brush;
use wgpu_text::glyph_brush::{HorizontalAlign, Layout, Section, VerticalAlign};
Expand Down Expand Up @@ -100,14 +100,14 @@ impl Button {
}

Check warning on line 100 in src/app/ui_elements/button.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/app/ui_elements/button.rs

impl Renderable for Button {
fn render<'pass>(&'pass self, ctx: &mut RenderPassContext<'pass>) {
self.shadow.render(ctx);
self.bg.render(ctx);
self.text.render(ctx);
fn render<'pass>(&'pass self, renderer: &'pass Renderer, render_pass: &mut wgpu::RenderPass<'pass>) {
self.shadow.render(renderer, render_pass);
self.bg.render(renderer, render_pass);
self.text.render(renderer, render_pass);

if self.mouse_entered {
self.hover_overlay.render(ctx);
self.outline.render(ctx);
self.hover_overlay.render(renderer, render_pass);
self.outline.render(renderer, render_pass);
}
}
}
35 changes: 0 additions & 35 deletions src/render/context.rs

This file was deleted.

26 changes: 11 additions & 15 deletions src/render/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,17 @@ const SAMPLE_COUNT: u32 = 4;
const CLEAR_COLOUR: wgpu::Color = wgpu::Color::BLACK;
const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth32Float;

pub mod context;
mod egui;
pub mod shapes;
pub mod text;
pub mod texture;

pub use context::RenderPassContext;
/// A trait that allows objects to render themselves to the screen in any given render pass. If a
/// type implements Renderable, then it is able to be rendered by the [RenderPassContext]'s render

Check warning on line 30 in src/render/mod.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/render/mod.rs
/// function.
pub trait Renderable {
fn render<'pass>(&'pass self, renderer: &'pass Renderer, render_pass: &mut wgpu::RenderPass<'pass>);
}

#[repr(C)]
#[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)]
Expand Down Expand Up @@ -480,7 +484,7 @@ impl Renderer {
&self.window,
);

let render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("Render pass"),
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view: if SAMPLE_COUNT == 1 {
Expand Down Expand Up @@ -508,23 +512,15 @@ impl Renderer {
.queue(&self.device, &self.queue, Vec::<Section>::new())
.unwrap();

let mut ctx = RenderPassContext {
render_pass,
device: &self.device,
queue: &self.queue,
pipeline_cache: &self.pipeline_cache,
};

ctx.render_pass
.set_bind_group(0, &self.screen_bind_group, &[]);
render_pass.set_bind_group(0, &self.screen_bind_group, &[]);

// Rendering goes here...
app.render(&mut ctx);
app.render(self, &mut render_pass);

self.egui_handler
.render(&mut ctx.render_pass, &paint_jobs, &screen_descriptor);
.render(&mut render_pass, &paint_jobs, &screen_descriptor);

drop(ctx);
drop(render_pass);

self.queue.submit([encoder.finish()]);
texture.present();
Expand Down
16 changes: 8 additions & 8 deletions src/render/shapes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use wgpu::{
vertex_attr_array,
};

use super::{context::Renderable, SpriteInstance};
use super::{Renderable, Renderer, SpriteInstance};

#[repr(C)]
#[derive(Copy, Clone, Debug, bytemuck::Zeroable, bytemuck::Pod)]
Expand Down Expand Up @@ -415,22 +415,22 @@ impl Shape {
}

Check warning on line 415 in src/render/shapes.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/render/shapes.rs

impl Renderable for Shape {
fn render<'a>(&'a self, ctx: &mut super::RenderPassContext<'a>) {
fn render<'pass>(&'pass self, renderer: &'pass Renderer, render_pass: &mut wgpu::RenderPass<'pass>) {
let pipeline = if self.has_depth {
"primitive_depth"
} else {
"primitive"
};

Check warning on line 423 in src/render/shapes.rs

View workflow job for this annotation

GitHub Actions / cargo fmt

Diff in /home/runner/work/taiko/taiko/src/render/shapes.rs

ctx.render_pass.set_pipeline(
ctx.pipeline(pipeline)
render_pass.set_pipeline(
renderer.pipeline(pipeline)
.unwrap_or_else(|| panic!("{pipeline} render pipeline doesn't exist!")),
);
ctx.render_pass.set_vertex_buffer(0, self.vertex.slice(..));
ctx.render_pass
render_pass.set_vertex_buffer(0, self.vertex.slice(..));
render_pass
.set_vertex_buffer(1, self.instance.slice(..));
ctx.render_pass
render_pass
.set_index_buffer(self.index.slice(..), wgpu::IndexFormat::Uint32);
ctx.render_pass.draw_indexed(0..self.indices, 0, 0..1);
render_pass.draw_indexed(0..self.indices, 0, 0..1);
}
}
6 changes: 3 additions & 3 deletions src/render/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::rc::Rc;

use wgpu_text::glyph_brush::Section;

use crate::render::{context::Renderable, texture, RenderPassContext, Renderer};
use crate::render::{Renderable, texture, Renderer};

#[derive(Debug)]
pub struct Text {
Expand Down Expand Up @@ -105,7 +105,7 @@ impl Text {
}

impl Renderable for Text {
fn render<'a>(&'a self, ctx: &mut RenderPassContext<'a>) {
ctx.render(&self.sprite);
fn render<'pass>(&'pass self, renderer: &'pass Renderer, render_pass: &mut wgpu::RenderPass<'pass>) {
self.sprite.render(renderer, render_pass);
}
}
19 changes: 9 additions & 10 deletions src/render/texture.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
//! Various types used for drawing textures
use crate::render;
use image::GenericImageView;
use std::{path::Path, rc::Rc, sync::OnceLock};
use wgpu::{
util::{BufferInitDescriptor, DeviceExt},
vertex_attr_array,
};

use super::context::Renderable;
use super::{Renderable, Renderer};

static TEXTURE_BIND_GROUP_LAYOUT: OnceLock<wgpu::BindGroupLayout> = OnceLock::new();

Expand Down Expand Up @@ -318,25 +317,25 @@ impl Sprite {
}

impl Renderable for Sprite {
fn render<'a>(&'a self, ctx: &mut render::context::RenderPassContext<'a>) {
ctx.render_pass.set_pipeline(
ctx.pipeline(if self.use_depth {
fn render<'pass>(&'pass self, renderer: &'pass Renderer, render_pass: &mut wgpu::RenderPass<'pass>) {
render_pass.set_pipeline(
renderer.pipeline(if self.use_depth {
"texture_depth"
} else {
"texture"
})
.expect("texture render pipeline does not exist!"),
);
ctx.render_pass
render_pass
.set_vertex_buffer(0, self.texture.vertex_buffer.slice(..));
ctx.render_pass.set_index_buffer(
render_pass.set_index_buffer(
self.texture.index_buffer.slice(..),
wgpu::IndexFormat::Uint16,
);
ctx.render_pass
render_pass
.set_bind_group(1, &self.texture.bind_group, &[]);
ctx.render_pass
render_pass
.set_vertex_buffer(1, self.instance_buffer.slice(..));
ctx.render_pass.draw_indexed(0..6 as _, 0, 0..1);
render_pass.draw_indexed(0..6 as _, 0, 0..1);
}
}

0 comments on commit e66273b

Please sign in to comment.