Include UI node size in the vertex inputs for UiMaterial. (#11722)
# Objective Includes the UI node size as a parameter to the UiMaterial shader, useful for SDF-based rendering, aspect ratio correction and other use cases. Fixes #11392 ## Solution Added the node size to the UiMaterial vertex shader params and also to the data that is passed to the fragment shader. ## Migration Guide This change should be backwards compatible, using the new field is optional. Note to reviewers: render pipelines are a bit outside my comfort zone, so please make sure I haven't made any mistakes. --------- Co-authored-by: Rob Parrett <robparrett@gmail.com>
This commit is contained in:
parent
950bd2284d
commit
a57832bc9a
@ -13,11 +13,13 @@ var<uniform> globals: Globals;
|
|||||||
fn vertex(
|
fn vertex(
|
||||||
@location(0) vertex_position: vec3<f32>,
|
@location(0) vertex_position: vec3<f32>,
|
||||||
@location(1) vertex_uv: vec2<f32>,
|
@location(1) vertex_uv: vec2<f32>,
|
||||||
@location(2) border_widths: vec4<f32>,
|
@location(2) size: vec2<f32>,
|
||||||
|
@location(3) border_widths: vec4<f32>,
|
||||||
) -> UiVertexOutput {
|
) -> UiVertexOutput {
|
||||||
var out: UiVertexOutput;
|
var out: UiVertexOutput;
|
||||||
out.uv = vertex_uv;
|
out.uv = vertex_uv;
|
||||||
out.position = view.view_proj * vec4<f32>(vertex_position, 1.0);
|
out.position = view.view_proj * vec4<f32>(vertex_position, 1.0);
|
||||||
|
out.size = size;
|
||||||
out.border_widths = border_widths;
|
out.border_widths = border_widths;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -120,6 +120,7 @@ impl<M: UiMaterial> Default for UiMaterialMeta<M> {
|
|||||||
pub struct UiMaterialVertex {
|
pub struct UiMaterialVertex {
|
||||||
pub position: [f32; 3],
|
pub position: [f32; 3],
|
||||||
pub uv: [f32; 2],
|
pub uv: [f32; 2],
|
||||||
|
pub size: [f32; 2],
|
||||||
pub border_widths: [f32; 4],
|
pub border_widths: [f32; 4],
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,6 +157,8 @@ where
|
|||||||
VertexFormat::Float32x3,
|
VertexFormat::Float32x3,
|
||||||
// uv
|
// uv
|
||||||
VertexFormat::Float32x2,
|
VertexFormat::Float32x2,
|
||||||
|
// size
|
||||||
|
VertexFormat::Float32x2,
|
||||||
// border_widths
|
// border_widths
|
||||||
VertexFormat::Float32x4,
|
VertexFormat::Float32x4,
|
||||||
],
|
],
|
||||||
@ -558,6 +561,7 @@ pub fn prepare_uimaterial_nodes<M: UiMaterial>(
|
|||||||
ui_meta.vertices.push(UiMaterialVertex {
|
ui_meta.vertices.push(UiMaterialVertex {
|
||||||
position: positions_clipped[i].into(),
|
position: positions_clipped[i].into(),
|
||||||
uv: uvs[i].into(),
|
uv: uvs[i].into(),
|
||||||
|
size: extracted_uinode.rect.size().into(),
|
||||||
border_widths: extracted_uinode.border,
|
border_widths: extracted_uinode.border,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,5 +5,7 @@ struct UiVertexOutput {
|
|||||||
@location(0) uv: vec2<f32>,
|
@location(0) uv: vec2<f32>,
|
||||||
// The size of the borders in UV space. Order is Left, Right, Top, Bottom.
|
// The size of the borders in UV space. Order is Left, Right, Top, Bottom.
|
||||||
@location(1) border_widths: vec4<f32>,
|
@location(1) border_widths: vec4<f32>,
|
||||||
|
// The size of the node in pixels. Order is width, height.
|
||||||
|
@location(2) @interpolate(flat) size: vec2<f32>,
|
||||||
@builtin(position) position: vec4<f32>,
|
@builtin(position) position: vec4<f32>,
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user