Allow depth to be attached to text using metadata
This commit is contained in:
parent
74e9aa37a1
commit
c25f394c16
4 changed files with 45 additions and 8 deletions
|
@ -44,6 +44,7 @@ pub(crate) struct GlyphToRender {
|
||||||
uv: [u16; 2],
|
uv: [u16; 2],
|
||||||
color: u32,
|
color: u32,
|
||||||
content_type: u32,
|
content_type: u32,
|
||||||
|
depth: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The screen resolution to use when rendering text.
|
/// The screen resolution to use when rendering text.
|
||||||
|
|
|
@ -5,10 +5,11 @@ struct VertexInput {
|
||||||
@location(2) uv: u32,
|
@location(2) uv: u32,
|
||||||
@location(3) color: u32,
|
@location(3) color: u32,
|
||||||
@location(4) content_type: u32,
|
@location(4) content_type: u32,
|
||||||
|
@location(5) depth: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct VertexOutput {
|
struct VertexOutput {
|
||||||
@builtin(position) position: vec4<f32>,
|
@invariant @builtin(position) position: vec4<f32>,
|
||||||
@location(0) color: vec4<f32>,
|
@location(0) color: vec4<f32>,
|
||||||
@location(1) uv: vec2<f32>,
|
@location(1) uv: vec2<f32>,
|
||||||
@location(2) content_type: u32,
|
@location(2) content_type: u32,
|
||||||
|
@ -62,7 +63,7 @@ fn vs_main(in_vert: VertexInput) -> VertexOutput {
|
||||||
|
|
||||||
vert_output.position = vec4<f32>(
|
vert_output.position = vec4<f32>(
|
||||||
2.0 * vec2<f32>(pos) / vec2<f32>(params.screen_resolution) - 1.0,
|
2.0 * vec2<f32>(pos) / vec2<f32>(params.screen_resolution) - 1.0,
|
||||||
0.0,
|
in_vert.depth,
|
||||||
1.0,
|
1.0,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -151,6 +151,11 @@ impl TextAtlas {
|
||||||
offset: size_of::<u32>() as u64 * 5,
|
offset: size_of::<u32>() as u64 * 5,
|
||||||
shader_location: 4,
|
shader_location: 4,
|
||||||
},
|
},
|
||||||
|
wgpu::VertexAttribute {
|
||||||
|
format: VertexFormat::Float32,
|
||||||
|
offset: size_of::<u32>() as u64 * 6,
|
||||||
|
shader_location: 5,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ impl TextRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Prepares all of the provided text areas for rendering.
|
/// Prepares all of the provided text areas for rendering.
|
||||||
pub fn prepare<'a, 'b: 'a>(
|
pub fn prepare_with_depth<'a, 'b: 'a>(
|
||||||
&mut self,
|
&mut self,
|
||||||
device: &Device,
|
device: &Device,
|
||||||
queue: &Queue,
|
queue: &Queue,
|
||||||
|
@ -72,6 +72,7 @@ impl TextRenderer {
|
||||||
text_areas: &[TextArea<'a, 'b>],
|
text_areas: &[TextArea<'a, 'b>],
|
||||||
default_color: Color,
|
default_color: Color,
|
||||||
cache: &mut SwashCache,
|
cache: &mut SwashCache,
|
||||||
|
mut metadata_to_depth: impl FnMut(usize) -> f32,
|
||||||
) -> Result<(), PrepareError> {
|
) -> Result<(), PrepareError> {
|
||||||
self.screen_resolution = screen_resolution;
|
self.screen_resolution = screen_resolution;
|
||||||
|
|
||||||
|
@ -258,11 +259,6 @@ impl TextRenderer {
|
||||||
let line_y = run.line_y;
|
let line_y = run.line_y;
|
||||||
|
|
||||||
for glyph in run.glyphs.iter() {
|
for glyph in run.glyphs.iter() {
|
||||||
let color = match glyph.color_opt {
|
|
||||||
Some(some) => some,
|
|
||||||
None => default_color,
|
|
||||||
};
|
|
||||||
|
|
||||||
let details = atlas.glyph(&glyph.cache_key).unwrap();
|
let details = atlas.glyph(&glyph.cache_key).unwrap();
|
||||||
|
|
||||||
let mut x = glyph.x_int + details.left as i32 + text_area.left;
|
let mut x = glyph.x_int + details.left as i32 + text_area.left;
|
||||||
|
@ -321,6 +317,13 @@ impl TextRenderer {
|
||||||
height = bounds_max_y - y;
|
height = bounds_max_y - y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let color = match glyph.color_opt {
|
||||||
|
Some(some) => some,
|
||||||
|
None => default_color,
|
||||||
|
};
|
||||||
|
|
||||||
|
let depth = metadata_to_depth(glyph.metadata);
|
||||||
|
|
||||||
glyph_vertices.extend(
|
glyph_vertices.extend(
|
||||||
iter::repeat(GlyphToRender {
|
iter::repeat(GlyphToRender {
|
||||||
pos: [x, y],
|
pos: [x, y],
|
||||||
|
@ -328,6 +331,7 @@ impl TextRenderer {
|
||||||
uv: [atlas_x, atlas_y],
|
uv: [atlas_x, atlas_y],
|
||||||
color: color.0,
|
color: color.0,
|
||||||
content_type: content_type as u32,
|
content_type: content_type as u32,
|
||||||
|
depth,
|
||||||
})
|
})
|
||||||
.take(4),
|
.take(4),
|
||||||
);
|
);
|
||||||
|
@ -406,6 +410,28 @@ impl TextRenderer {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn prepare<'a, 'b: 'a>(
|
||||||
|
&mut self,
|
||||||
|
device: &Device,
|
||||||
|
queue: &Queue,
|
||||||
|
atlas: &mut TextAtlas,
|
||||||
|
screen_resolution: Resolution,
|
||||||
|
text_areas: &[TextArea<'a, 'b>],
|
||||||
|
default_color: Color,
|
||||||
|
cache: &mut SwashCache,
|
||||||
|
) -> Result<(), PrepareError> {
|
||||||
|
self.prepare_with_depth(
|
||||||
|
device,
|
||||||
|
queue,
|
||||||
|
atlas,
|
||||||
|
screen_resolution,
|
||||||
|
text_areas,
|
||||||
|
default_color,
|
||||||
|
cache,
|
||||||
|
zero_depth,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/// Renders all layouts that were previously provided to `prepare`.
|
/// Renders all layouts that were previously provided to `prepare`.
|
||||||
pub fn render<'pass>(
|
pub fn render<'pass>(
|
||||||
&'pass mut self,
|
&'pass mut self,
|
||||||
|
@ -469,3 +495,7 @@ fn create_oversized_buffer(
|
||||||
buffer.unmap();
|
buffer.unmap();
|
||||||
(buffer, size)
|
(buffer, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn zero_depth(_: usize) -> f32 {
|
||||||
|
0f32
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue