Skip to content

Commit

Permalink
graphics: Add render_target_ex
Browse files Browse the repository at this point in the history
  • Loading branch information
not-fl3 committed Oct 3, 2024
1 parent 47918d9 commit 6f41b16
Showing 1 changed file with 66 additions and 31 deletions.
97 changes: 66 additions & 31 deletions src/texture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,25 @@ pub struct RenderPass {
pub(crate) render_pass: Arc<miniquad::RenderPass>,
}

#[derive(Debug, Clone)]
pub struct RenderTargetParams {
/// 1 means no multi sampling.
/// Note that sample_count > 1 is not supported on GL2, GLES2 and WebGL1
pub sample_count: i32,

/// depth: true creates a depth render target attachment and allows
/// such a render target being used for a depth-testing cameras
pub depth: bool,
}
impl Default for RenderTargetParams {
fn default() -> RenderTargetParams {
RenderTargetParams {
sample_count: 1,
depth: false,
}
}
}

impl RenderPass {
/// Returns the miniquad handle for this render pass.
pub fn raw_miniquad_id(&self) -> miniquad::RenderPass {
Expand All @@ -369,55 +388,71 @@ pub struct RenderTarget {
}

pub fn render_target(width: u32, height: u32) -> RenderTarget {
let context = get_context();
let texture_id = get_quad_context().new_render_texture(miniquad::TextureParams {
render_target_ex(width, height, RenderTargetParams::default())
}

pub fn render_target_msaa(width: u32, height: u32, sample_count: i32) -> RenderTarget {
render_target_ex(
width,
height,
..Default::default()
});
let render_pass = get_quad_context().new_render_pass_mrt(&[texture_id], None, None);
let texture = Texture2D {
texture: context.textures.store_texture(texture_id),
};
let render_pass = RenderPass {
color_texture: texture.clone(),
depth_texture: None,
render_pass: Arc::new(render_pass),
};
RenderTarget {
texture,
render_pass,
}
RenderTargetParams {
sample_count,
..Default::default()
},
)
}

pub fn render_target_msaa(width: u32, height: u32, sample_count: i32) -> RenderTarget {
pub fn render_target_ex(width: u32, height: u32, params: RenderTargetParams) -> RenderTarget {
let context = get_context();

let color_texture = get_quad_context().new_render_texture(miniquad::TextureParams {
width,
height,
sample_count,
..Default::default()
});
let color_resolve_texture = get_quad_context().new_render_texture(miniquad::TextureParams {
width,
height,
sample_count: params.sample_count,
..Default::default()
});
let render_pass = get_quad_context().new_render_pass_mrt(
&[color_texture],
Some(&[color_resolve_texture]),
None,
);
let depth_texture = if params.depth {
Some(
get_quad_context().new_render_texture(miniquad::TextureParams {
width,
height,
format: miniquad::TextureFormat::Depth,
sample_count: params.sample_count,
..Default::default()
}),
)
} else {
None
};
let render_pass;
let texture;
if params.sample_count != 0 {
let color_resolve_texture =
get_quad_context().new_render_texture(miniquad::TextureParams {
width,
height,
..Default::default()
});
render_pass = get_quad_context().new_render_pass_mrt(
&[color_texture],
Some(&[color_resolve_texture]),
depth_texture,
);
texture = color_resolve_texture;
} else {
render_pass = get_quad_context().new_render_pass_mrt(&[color_texture], None, depth_texture);
texture = color_texture;
}

let texture = Texture2D {
texture: context.textures.store_texture(color_resolve_texture),
texture: context.textures.store_texture(texture),
};

let render_pass = RenderPass {
color_texture: texture.clone(),
depth_texture: None,
render_pass: Arc::new(render_pass),
};

RenderTarget {
texture,
render_pass,
Expand Down

0 comments on commit 6f41b16

Please sign in to comment.