diff --git a/demo/common/src/device.rs b/demo/common/src/device.rs index cf12f1b9..ccd0b877 100644 --- a/demo/common/src/device.rs +++ b/demo/common/src/device.rs @@ -10,9 +10,8 @@ //! GPU rendering code specifically for the demo. -use crate::GRIDLINE_COUNT; use pathfinder_gpu::resources::ResourceLoader; -use pathfinder_gpu::{BufferData, BufferTarget, BufferUploadMode, Device, VertexAttrType}; +use pathfinder_gpu::{BufferTarget, Device, VertexAttrType}; pub struct GroundProgram where @@ -20,7 +19,9 @@ where { pub program: D::Program, 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 GroundProgram @@ -30,23 +31,27 @@ where pub fn new(device: &D, resources: &dyn ResourceLoader) -> GroundProgram { let program = device.create_program(resources, "demo_ground"); 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 { program, transform_uniform, - color_uniform, + gridline_count_uniform, + ground_color_uniform, + gridline_color_uniform, } } } -pub struct GroundSolidVertexArray +pub struct GroundVertexArray where D: Device, { pub vertex_array: D::VertexArray, } -impl GroundSolidVertexArray +impl GroundVertexArray where D: Device, { @@ -54,7 +59,7 @@ where device: &D, ground_program: &GroundProgram, quad_vertex_positions_buffer: &D::Buffer, - ) -> GroundSolidVertexArray { + ) -> GroundVertexArray { let vertex_array = device.create_vertex_array(); 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.configure_float_vertex_attr(&position_attr, 2, VertexAttrType::U8, false, 0, 0, 0); - GroundSolidVertexArray { vertex_array } + GroundVertexArray { vertex_array } } } - -pub struct GroundLineVertexArray -where - D: Device, -{ - pub vertex_array: D::VertexArray, - #[allow(dead_code)] - grid_vertex_positions_buffer: D::Buffer, -} - -impl GroundLineVertexArray -where - D: Device, -{ - pub fn new(device: &D, ground_program: &GroundProgram) -> GroundLineVertexArray { - 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 -} diff --git a/demo/common/src/lib.rs b/demo/common/src/lib.rs index b24fa4e0..543841e8 100644 --- a/demo/common/src/lib.rs +++ b/demo/common/src/lib.rs @@ -14,7 +14,7 @@ extern crate log; use crate::concurrent::DemoExecutor; -use crate::device::{GroundLineVertexArray, GroundProgram, GroundSolidVertexArray}; +use crate::device::{GroundProgram, GroundVertexArray}; use crate::ui::{DemoUI, UIAction}; use crate::window::{Event, Keycode, OcularTransform, SVGPath, View, Window, WindowSize}; use clap::{App, Arg}; @@ -27,7 +27,7 @@ use pathfinder_geometry::color::{ColorF, ColorU}; use pathfinder_gl::GLDevice; use pathfinder_gpu::resources::ResourceLoader; 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::gpu::renderer::{DestFramebuffer, RenderMode, RenderStats, Renderer}; use pathfinder_renderer::gpu_data::RenderCommand; @@ -96,7 +96,7 @@ const MESSAGE_TIMEOUT_SECS: u64 = 5; // Half of the eye separation distance. const DEFAULT_EYE_OFFSET: f32 = 0.025; -pub const GRIDLINE_COUNT: u8 = 10; +pub const GRIDLINE_COUNT: i32 = 10; pub mod window; @@ -134,8 +134,7 @@ pub struct DemoApp where W: Window { scene_framebuffer: Option<::Framebuffer>, ground_program: GroundProgram, - ground_solid_vertex_array: GroundSolidVertexArray, - ground_line_vertex_array: GroundLineVertexArray, + ground_vertex_array: GroundVertexArray, } impl DemoApp where W: Window { @@ -168,13 +167,9 @@ impl DemoApp where W: Window { let scene_proxy = SceneProxy::new(built_svg.scene, executor); let ground_program = GroundProgram::new(&renderer.device, resources); - let ground_solid_vertex_array = GroundSolidVertexArray::new( - &renderer.device, - &ground_program, - &renderer.quad_vertex_positions_buffer(), - ); - let ground_line_vertex_array = - GroundLineVertexArray::new(&renderer.device, &ground_program); + let ground_vertex_array = GroundVertexArray::new(&renderer.device, + &ground_program, + &renderer.quad_vertex_positions_buffer()); let mut ui = DemoUI::new(&renderer.device, resources, options.clone()); let mut message_epoch = 0; @@ -215,8 +210,7 @@ impl DemoApp where W: Window { scene_framebuffer: None, ground_program, - ground_solid_vertex_array, - ground_line_vertex_array, + ground_vertex_array, } } @@ -731,57 +725,28 @@ impl DemoApp where W: Window { -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. let mut transform = base_transform; transform = 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.set_uniform( &self.ground_program.transform_uniform, UniformData::from_transform_3d(&transform), ); device.set_uniform( - &self.ground_program.color_uniform, + &self.ground_program.ground_color_uniform, 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( Primitive::TriangleFan, 4, @@ -790,12 +755,7 @@ impl DemoApp where W: Window { func: DepthFunc::Less, write: true, }), - stencil: Some(StencilState { - func: StencilFunc::NotEqual, - reference: 2, - mask: 2, - write: false, - }), + stencil: None, ..RenderState::default() }, ); diff --git a/resources/shaders/demo_ground.fs.glsl b/resources/shaders/demo_ground.fs.glsl index 5be6578d..a34a29d5 100644 --- a/resources/shaders/demo_ground.fs.glsl +++ b/resources/shaders/demo_ground.fs.glsl @@ -12,10 +12,14 @@ precision highp float; -uniform vec4 uColor; +uniform vec4 uGroundColor; +uniform vec4 uGridlineColor; + +in vec2 vTexCoord; out vec4 oFragColor; void main() { - oFragColor = uColor; + vec2 texCoordPx = fract(vTexCoord) / fwidth(vTexCoord); + oFragColor = any(lessThanEqual(texCoordPx, vec2(1.0))) ? uGridlineColor : uGroundColor; } diff --git a/resources/shaders/demo_ground.vs.glsl b/resources/shaders/demo_ground.vs.glsl index b50bd65c..15287408 100644 --- a/resources/shaders/demo_ground.vs.glsl +++ b/resources/shaders/demo_ground.vs.glsl @@ -13,9 +13,13 @@ precision highp float; uniform mat4 uTransform; +uniform int uGridlineCount; in vec2 aPosition; +out vec2 vTexCoord; + void main() { + vTexCoord = aPosition * float(uGridlineCount); gl_Position = uTransform * vec4(aPosition.x, 0.0, aPosition.y, 1.0); }