scissor attempt
This commit is contained in:
@@ -3,9 +3,10 @@ use std::{cell::RefCell, rc::Rc, sync::Arc};
|
||||
use cosmic_text::Buffer;
|
||||
use glam::{Mat4, Vec2, Vec3};
|
||||
use slotmap::{SlotMap, new_key_type};
|
||||
use vulkano::{buffer::view, pipeline::graphics::viewport};
|
||||
|
||||
use crate::{
|
||||
drawing,
|
||||
drawing::{self, Scissor},
|
||||
gfx::{WGfx, cmd::GfxCommandBuffer},
|
||||
};
|
||||
|
||||
@@ -24,10 +25,11 @@ struct RendererPass<'a> {
|
||||
text_areas: Vec<TextArea<'a>>,
|
||||
text_renderer: TextRenderer,
|
||||
rect_renderer: RectRenderer,
|
||||
scissor: Option<Scissor>,
|
||||
}
|
||||
|
||||
impl RendererPass<'_> {
|
||||
fn new(text_atlas: &mut TextAtlas, rect_pipeline: RectPipeline) -> anyhow::Result<Self> {
|
||||
fn new(text_atlas: &mut TextAtlas, rect_pipeline: RectPipeline, scissor: Option<Scissor>) -> anyhow::Result<Self> {
|
||||
let text_renderer = TextRenderer::new(text_atlas)?;
|
||||
let rect_renderer = RectRenderer::new(rect_pipeline)?;
|
||||
|
||||
@@ -36,6 +38,7 @@ impl RendererPass<'_> {
|
||||
text_renderer,
|
||||
rect_renderer,
|
||||
text_areas: Vec::new(),
|
||||
scissor,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -49,6 +52,19 @@ impl RendererPass<'_> {
|
||||
if self.submitted {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let vk_scissor = if let Some(scissor) = self.scissor {
|
||||
viewport::Scissor {
|
||||
offset: [scissor.x, scissor.y],
|
||||
extent: [scissor.w, scissor.h],
|
||||
}
|
||||
} else {
|
||||
viewport::Scissor::default()
|
||||
};
|
||||
|
||||
// TODO?
|
||||
// cmd_buf.command_buffer.set_scissor(0, smallvec::smallvec![vk_scissor])?;
|
||||
|
||||
self.submitted = true;
|
||||
self.rect_renderer.render(gfx, viewport, cmd_buf)?;
|
||||
|
||||
@@ -152,10 +168,7 @@ impl Context {
|
||||
self.dirty = true;
|
||||
}
|
||||
|
||||
let size = Vec2::new(
|
||||
resolution[0] as f32 / pixel_scale,
|
||||
resolution[1] as f32 / pixel_scale,
|
||||
);
|
||||
let size = Vec2::new(resolution[0] as f32 / pixel_scale, resolution[1] as f32 / pixel_scale);
|
||||
|
||||
let fov = 0.4;
|
||||
let aspect_ratio = size.x / size.y;
|
||||
@@ -187,22 +200,28 @@ impl Context {
|
||||
|
||||
let atlas = shared.atlas_map.get_mut(self.shared_ctx_key).unwrap();
|
||||
|
||||
let mut passes = vec![RendererPass::new(
|
||||
&mut atlas.text_atlas,
|
||||
shared.rect_pipeline.clone(),
|
||||
)?];
|
||||
let mut passes = Vec::<RendererPass>::new();
|
||||
let mut needs_new_pass = true;
|
||||
let mut next_scissor: Option<Scissor> = None;
|
||||
|
||||
for primitive in primitives {
|
||||
if needs_new_pass {
|
||||
passes.push(RendererPass::new(
|
||||
&mut atlas.text_atlas,
|
||||
shared.rect_pipeline.clone(),
|
||||
next_scissor,
|
||||
)?);
|
||||
next_scissor = None;
|
||||
needs_new_pass = false;
|
||||
}
|
||||
|
||||
let pass = passes.last_mut().unwrap(); // always safe
|
||||
|
||||
match &primitive.payload {
|
||||
drawing::PrimitivePayload::Rectangle(rectangle) => {
|
||||
pass.rect_renderer.add_rect(
|
||||
primitive.boundary,
|
||||
*rectangle,
|
||||
&primitive.transform,
|
||||
primitive.depth,
|
||||
);
|
||||
pass
|
||||
.rect_renderer
|
||||
.add_rect(primitive.boundary, *rectangle, &primitive.transform, primitive.depth);
|
||||
}
|
||||
drawing::PrimitivePayload::Text(text) => {
|
||||
pass.text_areas.push(TextArea {
|
||||
@@ -230,16 +249,16 @@ impl Context {
|
||||
transform: primitive.transform,
|
||||
});
|
||||
}
|
||||
drawing::PrimitivePayload::Scissor(scissor) => {
|
||||
next_scissor = Some(*scissor);
|
||||
needs_new_pass = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let pass = passes.last_mut().unwrap();
|
||||
pass.submit(
|
||||
&shared.gfx,
|
||||
&mut self.viewport,
|
||||
cmd_buf,
|
||||
&mut atlas.text_atlas,
|
||||
)?;
|
||||
for mut pass in passes {
|
||||
pass.submit(&shared.gfx, &mut self.viewport, cmd_buf, &mut atlas.text_atlas)?
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -43,8 +43,7 @@ impl ModelBuffer {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn clear(&mut self) {
|
||||
self.models.clear(); // note: capacity is being preserved here
|
||||
pub const fn begin(&mut self) {
|
||||
self.idx = 0;
|
||||
}
|
||||
|
||||
@@ -83,9 +82,7 @@ impl ModelBuffer {
|
||||
}*/
|
||||
|
||||
if self.idx == self.models.len() as u32 {
|
||||
self
|
||||
.models
|
||||
.resize(self.models.len() * 2, Default::default());
|
||||
self.models.resize((self.models.len() * 2).max(1), Default::default());
|
||||
//log::info!("ModelBuffer: resized to {}", self.models.len());
|
||||
}
|
||||
|
||||
@@ -96,12 +93,7 @@ impl ModelBuffer {
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn register_pos_size(
|
||||
&mut self,
|
||||
pos: &glam::Vec2,
|
||||
size: &glam::Vec2,
|
||||
transform: &Mat4,
|
||||
) -> u32 {
|
||||
pub fn register_pos_size(&mut self, pos: &glam::Vec2, size: &glam::Vec2, transform: &Mat4) -> u32 {
|
||||
let mut model = glam::Mat4::from_translation(Vec3::new(pos.x, pos.y, 0.0));
|
||||
model *= *transform;
|
||||
model *= glam::Mat4::from_scale(Vec3::new(size.x, size.y, 1.0));
|
||||
|
||||
@@ -75,12 +75,11 @@ pub struct RectRenderer {
|
||||
|
||||
impl RectRenderer {
|
||||
pub fn new(pipeline: RectPipeline) -> anyhow::Result<Self> {
|
||||
const BUFFER_SIZE: usize = 128;
|
||||
const BUFFER_SIZE: usize = 32;
|
||||
|
||||
let vert_buffer = pipeline.gfx.empty_buffer(
|
||||
BufferUsage::VERTEX_BUFFER | BufferUsage::TRANSFER_DST,
|
||||
BUFFER_SIZE as _,
|
||||
)?;
|
||||
let vert_buffer = pipeline
|
||||
.gfx
|
||||
.empty_buffer(BufferUsage::VERTEX_BUFFER | BufferUsage::TRANSFER_DST, BUFFER_SIZE as _)?;
|
||||
|
||||
Ok(Self {
|
||||
model_buffer: ModelBuffer::new(&pipeline.gfx)?,
|
||||
@@ -92,17 +91,15 @@ impl RectRenderer {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn add_rect(
|
||||
&mut self,
|
||||
boundary: Boundary,
|
||||
rectangle: Rectangle,
|
||||
transform: &Mat4,
|
||||
depth: f32,
|
||||
) {
|
||||
let in_model_idx =
|
||||
self
|
||||
.model_buffer
|
||||
.register_pos_size(&boundary.pos, &boundary.size, transform);
|
||||
pub fn begin(&mut self) {
|
||||
self.rect_vertices.clear();
|
||||
self.model_buffer.begin();
|
||||
}
|
||||
|
||||
pub fn add_rect(&mut self, boundary: Boundary, rectangle: Rectangle, transform: &Mat4, depth: f32) {
|
||||
let in_model_idx = self
|
||||
.model_buffer
|
||||
.register_pos_size(&boundary.pos, &boundary.size, transform);
|
||||
|
||||
self.rect_vertices.push(RectVertex {
|
||||
in_model_idx,
|
||||
@@ -123,10 +120,10 @@ impl RectRenderer {
|
||||
fn upload_verts(&mut self) -> anyhow::Result<()> {
|
||||
if self.vert_buffer_size < self.rect_vertices.len() {
|
||||
let new_size = self.vert_buffer_size * 2;
|
||||
self.vert_buffer = self.pipeline.gfx.empty_buffer(
|
||||
BufferUsage::VERTEX_BUFFER | BufferUsage::TRANSFER_DST,
|
||||
new_size as _,
|
||||
)?;
|
||||
self.vert_buffer = self
|
||||
.pipeline
|
||||
.gfx
|
||||
.empty_buffer(BufferUsage::VERTEX_BUFFER | BufferUsage::TRANSFER_DST, new_size as _)?;
|
||||
self.vert_buffer_size = new_size;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user