Simplify gridlines in the demo shader
This commit is contained in:
parent
cf3dcfdd0e
commit
5e64876579
|
@ -10,9 +10,8 @@
|
||||||
|
|
||||||
//! GPU rendering code specifically for the demo.
|
//! GPU rendering code specifically for the demo.
|
||||||
|
|
||||||
use crate::GRIDLINE_COUNT;
|
|
||||||
use pathfinder_gpu::resources::ResourceLoader;
|
use pathfinder_gpu::resources::ResourceLoader;
|
||||||
use pathfinder_gpu::{BufferData, BufferTarget, BufferUploadMode, Device, VertexAttrType};
|
use pathfinder_gpu::{BufferTarget, Device, VertexAttrType};
|
||||||
|
|
||||||
pub struct GroundProgram<D>
|
pub struct GroundProgram<D>
|
||||||
where
|
where
|
||||||
|
@ -20,7 +19,9 @@ where
|
||||||
{
|
{
|
||||||
pub program: D::Program,
|
pub program: D::Program,
|
||||||
pub transform_uniform: D::Uniform,
|
pub transform_uniform: D::Uniform,
|
||||||
pub color_uniform: D::Uniform,
|
pub gridline_count_uniform: D::Uniform,
|
||||||
|
pub ground_color_uniform: D::Uniform,
|
||||||
|
pub gridline_color_uniform: D::Uniform,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<D> GroundProgram<D>
|
impl<D> GroundProgram<D>
|
||||||
|
@ -30,23 +31,27 @@ where
|
||||||
pub fn new(device: &D, resources: &dyn ResourceLoader) -> GroundProgram<D> {
|
pub fn new(device: &D, resources: &dyn ResourceLoader) -> GroundProgram<D> {
|
||||||
let program = device.create_program(resources, "demo_ground");
|
let program = device.create_program(resources, "demo_ground");
|
||||||
let transform_uniform = device.get_uniform(&program, "Transform");
|
let transform_uniform = device.get_uniform(&program, "Transform");
|
||||||
let color_uniform = device.get_uniform(&program, "Color");
|
let gridline_count_uniform = device.get_uniform(&program, "GridlineCount");
|
||||||
|
let ground_color_uniform = device.get_uniform(&program, "GroundColor");
|
||||||
|
let gridline_color_uniform = device.get_uniform(&program, "GridlineColor");
|
||||||
GroundProgram {
|
GroundProgram {
|
||||||
program,
|
program,
|
||||||
transform_uniform,
|
transform_uniform,
|
||||||
color_uniform,
|
gridline_count_uniform,
|
||||||
|
ground_color_uniform,
|
||||||
|
gridline_color_uniform,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct GroundSolidVertexArray<D>
|
pub struct GroundVertexArray<D>
|
||||||
where
|
where
|
||||||
D: Device,
|
D: Device,
|
||||||
{
|
{
|
||||||
pub vertex_array: D::VertexArray,
|
pub vertex_array: D::VertexArray,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<D> GroundSolidVertexArray<D>
|
impl<D> GroundVertexArray<D>
|
||||||
where
|
where
|
||||||
D: Device,
|
D: Device,
|
||||||
{
|
{
|
||||||
|
@ -54,7 +59,7 @@ where
|
||||||
device: &D,
|
device: &D,
|
||||||
ground_program: &GroundProgram<D>,
|
ground_program: &GroundProgram<D>,
|
||||||
quad_vertex_positions_buffer: &D::Buffer,
|
quad_vertex_positions_buffer: &D::Buffer,
|
||||||
) -> GroundSolidVertexArray<D> {
|
) -> GroundVertexArray<D> {
|
||||||
let vertex_array = device.create_vertex_array();
|
let vertex_array = device.create_vertex_array();
|
||||||
|
|
||||||
let position_attr = device.get_vertex_attr(&ground_program.program, "Position");
|
let position_attr = device.get_vertex_attr(&ground_program.program, "Position");
|
||||||
|
@ -64,57 +69,6 @@ where
|
||||||
device.bind_buffer(quad_vertex_positions_buffer, BufferTarget::Vertex);
|
device.bind_buffer(quad_vertex_positions_buffer, BufferTarget::Vertex);
|
||||||
device.configure_float_vertex_attr(&position_attr, 2, VertexAttrType::U8, false, 0, 0, 0);
|
device.configure_float_vertex_attr(&position_attr, 2, VertexAttrType::U8, false, 0, 0, 0);
|
||||||
|
|
||||||
GroundSolidVertexArray { vertex_array }
|
GroundVertexArray { vertex_array }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct GroundLineVertexArray<D>
|
|
||||||
where
|
|
||||||
D: Device,
|
|
||||||
{
|
|
||||||
pub vertex_array: D::VertexArray,
|
|
||||||
#[allow(dead_code)]
|
|
||||||
grid_vertex_positions_buffer: D::Buffer,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<D> GroundLineVertexArray<D>
|
|
||||||
where
|
|
||||||
D: Device,
|
|
||||||
{
|
|
||||||
pub fn new(device: &D, ground_program: &GroundProgram<D>) -> GroundLineVertexArray<D> {
|
|
||||||
let grid_vertex_positions_buffer = device.create_buffer();
|
|
||||||
device.allocate_buffer(
|
|
||||||
&grid_vertex_positions_buffer,
|
|
||||||
BufferData::Memory(&create_grid_vertex_positions()),
|
|
||||||
BufferTarget::Vertex,
|
|
||||||
BufferUploadMode::Static,
|
|
||||||
);
|
|
||||||
|
|
||||||
let vertex_array = device.create_vertex_array();
|
|
||||||
|
|
||||||
let position_attr = device.get_vertex_attr(&ground_program.program, "Position");
|
|
||||||
|
|
||||||
device.bind_vertex_array(&vertex_array);
|
|
||||||
device.use_program(&ground_program.program);
|
|
||||||
device.bind_buffer(&grid_vertex_positions_buffer, BufferTarget::Vertex);
|
|
||||||
device.configure_float_vertex_attr(&position_attr, 2, VertexAttrType::U8, false, 0, 0, 0);
|
|
||||||
|
|
||||||
GroundLineVertexArray {
|
|
||||||
vertex_array,
|
|
||||||
grid_vertex_positions_buffer,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn create_grid_vertex_positions() -> Vec<(u8, u8)> {
|
|
||||||
let mut positions = vec![];
|
|
||||||
for index in 0..(GRIDLINE_COUNT + 1) {
|
|
||||||
positions.extend_from_slice(&[
|
|
||||||
(0, index),
|
|
||||||
(GRIDLINE_COUNT, index),
|
|
||||||
(index, 0),
|
|
||||||
(index, GRIDLINE_COUNT),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
positions
|
|
||||||
}
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
|
||||||
use crate::concurrent::DemoExecutor;
|
use crate::concurrent::DemoExecutor;
|
||||||
use crate::device::{GroundLineVertexArray, GroundProgram, GroundSolidVertexArray};
|
use crate::device::{GroundProgram, GroundVertexArray};
|
||||||
use crate::ui::{DemoUI, UIAction};
|
use crate::ui::{DemoUI, UIAction};
|
||||||
use crate::window::{Event, Keycode, OcularTransform, SVGPath, View, Window, WindowSize};
|
use crate::window::{Event, Keycode, OcularTransform, SVGPath, View, Window, WindowSize};
|
||||||
use clap::{App, Arg};
|
use clap::{App, Arg};
|
||||||
|
@ -27,7 +27,7 @@ use pathfinder_geometry::color::{ColorF, ColorU};
|
||||||
use pathfinder_gl::GLDevice;
|
use pathfinder_gl::GLDevice;
|
||||||
use pathfinder_gpu::resources::ResourceLoader;
|
use pathfinder_gpu::resources::ResourceLoader;
|
||||||
use pathfinder_gpu::{ClearParams, DepthFunc, DepthState, Device, Primitive, RenderState};
|
use pathfinder_gpu::{ClearParams, DepthFunc, DepthState, Device, Primitive, RenderState};
|
||||||
use pathfinder_gpu::{StencilFunc, StencilState, TextureFormat, UniformData};
|
use pathfinder_gpu::{TextureFormat, UniformData};
|
||||||
use pathfinder_renderer::concurrent::scene_proxy::{RenderCommandStream, SceneProxy};
|
use pathfinder_renderer::concurrent::scene_proxy::{RenderCommandStream, SceneProxy};
|
||||||
use pathfinder_renderer::gpu::renderer::{DestFramebuffer, RenderMode, RenderStats, Renderer};
|
use pathfinder_renderer::gpu::renderer::{DestFramebuffer, RenderMode, RenderStats, Renderer};
|
||||||
use pathfinder_renderer::gpu_data::RenderCommand;
|
use pathfinder_renderer::gpu_data::RenderCommand;
|
||||||
|
@ -96,7 +96,7 @@ const MESSAGE_TIMEOUT_SECS: u64 = 5;
|
||||||
// Half of the eye separation distance.
|
// Half of the eye separation distance.
|
||||||
const DEFAULT_EYE_OFFSET: f32 = 0.025;
|
const DEFAULT_EYE_OFFSET: f32 = 0.025;
|
||||||
|
|
||||||
pub const GRIDLINE_COUNT: u8 = 10;
|
pub const GRIDLINE_COUNT: i32 = 10;
|
||||||
|
|
||||||
pub mod window;
|
pub mod window;
|
||||||
|
|
||||||
|
@ -134,8 +134,7 @@ pub struct DemoApp<W> where W: Window {
|
||||||
scene_framebuffer: Option<<GLDevice as Device>::Framebuffer>,
|
scene_framebuffer: Option<<GLDevice as Device>::Framebuffer>,
|
||||||
|
|
||||||
ground_program: GroundProgram<GLDevice>,
|
ground_program: GroundProgram<GLDevice>,
|
||||||
ground_solid_vertex_array: GroundSolidVertexArray<GLDevice>,
|
ground_vertex_array: GroundVertexArray<GLDevice>,
|
||||||
ground_line_vertex_array: GroundLineVertexArray<GLDevice>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W> DemoApp<W> where W: Window {
|
impl<W> DemoApp<W> where W: Window {
|
||||||
|
@ -168,13 +167,9 @@ impl<W> DemoApp<W> where W: Window {
|
||||||
let scene_proxy = SceneProxy::new(built_svg.scene, executor);
|
let scene_proxy = SceneProxy::new(built_svg.scene, executor);
|
||||||
|
|
||||||
let ground_program = GroundProgram::new(&renderer.device, resources);
|
let ground_program = GroundProgram::new(&renderer.device, resources);
|
||||||
let ground_solid_vertex_array = GroundSolidVertexArray::new(
|
let ground_vertex_array = GroundVertexArray::new(&renderer.device,
|
||||||
&renderer.device,
|
|
||||||
&ground_program,
|
&ground_program,
|
||||||
&renderer.quad_vertex_positions_buffer(),
|
&renderer.quad_vertex_positions_buffer());
|
||||||
);
|
|
||||||
let ground_line_vertex_array =
|
|
||||||
GroundLineVertexArray::new(&renderer.device, &ground_program);
|
|
||||||
|
|
||||||
let mut ui = DemoUI::new(&renderer.device, resources, options.clone());
|
let mut ui = DemoUI::new(&renderer.device, resources, options.clone());
|
||||||
let mut message_epoch = 0;
|
let mut message_epoch = 0;
|
||||||
|
@ -215,8 +210,7 @@ impl<W> DemoApp<W> where W: Window {
|
||||||
scene_framebuffer: None,
|
scene_framebuffer: None,
|
||||||
|
|
||||||
ground_program,
|
ground_program,
|
||||||
ground_solid_vertex_array,
|
ground_vertex_array,
|
||||||
ground_line_vertex_array,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -731,57 +725,28 @@ impl<W> DemoApp<W> where W: Window {
|
||||||
-0.5 * ground_scale,
|
-0.5 * ground_scale,
|
||||||
));
|
));
|
||||||
|
|
||||||
// Draw gridlines. Use the stencil buffer to avoid Z-fighting.
|
|
||||||
let mut transform = base_transform;
|
|
||||||
let gridline_scale = ground_scale / GRIDLINE_COUNT as f32;
|
|
||||||
transform = transform.post_mul(&Transform3DF32::from_scale(
|
|
||||||
gridline_scale,
|
|
||||||
1.0,
|
|
||||||
gridline_scale,
|
|
||||||
));
|
|
||||||
let device = &self.renderer.device;
|
|
||||||
device.bind_vertex_array(&self.ground_line_vertex_array.vertex_array);
|
|
||||||
device.use_program(&self.ground_program.program);
|
|
||||||
device.set_uniform(
|
|
||||||
&self.ground_program.transform_uniform,
|
|
||||||
UniformData::Mat4([transform.c0, transform.c1, transform.c2, transform.c3]),
|
|
||||||
);
|
|
||||||
device.set_uniform(
|
|
||||||
&self.ground_program.color_uniform,
|
|
||||||
UniformData::Vec4(GROUND_LINE_COLOR.to_f32().0),
|
|
||||||
);
|
|
||||||
device.draw_arrays(
|
|
||||||
Primitive::Lines,
|
|
||||||
(GRIDLINE_COUNT as u32 + 1) * 4,
|
|
||||||
&RenderState {
|
|
||||||
depth: Some(DepthState {
|
|
||||||
func: DepthFunc::Always,
|
|
||||||
write: true,
|
|
||||||
}),
|
|
||||||
stencil: Some(StencilState {
|
|
||||||
func: StencilFunc::Always,
|
|
||||||
reference: 2,
|
|
||||||
mask: 2,
|
|
||||||
write: true,
|
|
||||||
}),
|
|
||||||
..RenderState::default()
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
// Fill ground.
|
// Fill ground.
|
||||||
let mut transform = base_transform;
|
let mut transform = base_transform;
|
||||||
transform =
|
transform =
|
||||||
transform.post_mul(&Transform3DF32::from_scale(ground_scale, 1.0, ground_scale));
|
transform.post_mul(&Transform3DF32::from_scale(ground_scale, 1.0, ground_scale));
|
||||||
device.bind_vertex_array(&self.ground_solid_vertex_array.vertex_array);
|
|
||||||
|
let device = &self.renderer.device;
|
||||||
|
device.bind_vertex_array(&self.ground_vertex_array.vertex_array);
|
||||||
device.use_program(&self.ground_program.program);
|
device.use_program(&self.ground_program.program);
|
||||||
device.set_uniform(
|
device.set_uniform(
|
||||||
&self.ground_program.transform_uniform,
|
&self.ground_program.transform_uniform,
|
||||||
UniformData::from_transform_3d(&transform),
|
UniformData::from_transform_3d(&transform),
|
||||||
);
|
);
|
||||||
device.set_uniform(
|
device.set_uniform(
|
||||||
&self.ground_program.color_uniform,
|
&self.ground_program.ground_color_uniform,
|
||||||
UniformData::Vec4(GROUND_SOLID_COLOR.to_f32().0),
|
UniformData::Vec4(GROUND_SOLID_COLOR.to_f32().0),
|
||||||
);
|
);
|
||||||
|
device.set_uniform(
|
||||||
|
&self.ground_program.gridline_color_uniform,
|
||||||
|
UniformData::Vec4(GROUND_LINE_COLOR.to_f32().0),
|
||||||
|
);
|
||||||
|
device.set_uniform(&self.ground_program.gridline_count_uniform,
|
||||||
|
UniformData::Int(GRIDLINE_COUNT));
|
||||||
device.draw_arrays(
|
device.draw_arrays(
|
||||||
Primitive::TriangleFan,
|
Primitive::TriangleFan,
|
||||||
4,
|
4,
|
||||||
|
@ -790,12 +755,7 @@ impl<W> DemoApp<W> where W: Window {
|
||||||
func: DepthFunc::Less,
|
func: DepthFunc::Less,
|
||||||
write: true,
|
write: true,
|
||||||
}),
|
}),
|
||||||
stencil: Some(StencilState {
|
stencil: None,
|
||||||
func: StencilFunc::NotEqual,
|
|
||||||
reference: 2,
|
|
||||||
mask: 2,
|
|
||||||
write: false,
|
|
||||||
}),
|
|
||||||
..RenderState::default()
|
..RenderState::default()
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -12,10 +12,14 @@
|
||||||
|
|
||||||
precision highp float;
|
precision highp float;
|
||||||
|
|
||||||
uniform vec4 uColor;
|
uniform vec4 uGroundColor;
|
||||||
|
uniform vec4 uGridlineColor;
|
||||||
|
|
||||||
|
in vec2 vTexCoord;
|
||||||
|
|
||||||
out vec4 oFragColor;
|
out vec4 oFragColor;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
oFragColor = uColor;
|
vec2 texCoordPx = fract(vTexCoord) / fwidth(vTexCoord);
|
||||||
|
oFragColor = any(lessThanEqual(texCoordPx, vec2(1.0))) ? uGridlineColor : uGroundColor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,13 @@
|
||||||
precision highp float;
|
precision highp float;
|
||||||
|
|
||||||
uniform mat4 uTransform;
|
uniform mat4 uTransform;
|
||||||
|
uniform int uGridlineCount;
|
||||||
|
|
||||||
in vec2 aPosition;
|
in vec2 aPosition;
|
||||||
|
|
||||||
|
out vec2 vTexCoord;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
vTexCoord = aPosition * float(uGridlineCount);
|
||||||
gl_Position = uTransform * vec4(aPosition.x, 0.0, aPosition.y, 1.0);
|
gl_Position = uTransform * vec4(aPosition.x, 0.0, aPosition.y, 1.0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue