2019-05-11 14:53:26 -04:00
|
|
|
// pathfinder/examples/canvas_minimal/src/main.rs
|
2019-05-03 15:35:19 -04:00
|
|
|
//
|
|
|
|
// Copyright © 2019 The Pathfinder Project Developers.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2019-05-30 00:15:03 -04:00
|
|
|
use pathfinder_canvas::{CanvasFontContext, CanvasRenderingContext2D, Path2D};
|
2019-05-29 22:13:42 -04:00
|
|
|
use pathfinder_geometry::basic::point::{Point2DF, Point2DI};
|
|
|
|
use pathfinder_geometry::basic::rect::RectF;
|
2019-05-03 15:35:19 -04:00
|
|
|
use pathfinder_geometry::color::ColorF;
|
|
|
|
use pathfinder_gl::{GLDevice, GLVersion};
|
|
|
|
use pathfinder_gpu::resources::FilesystemResourceLoader;
|
|
|
|
use pathfinder_gpu::{ClearParams, Device};
|
|
|
|
use pathfinder_renderer::concurrent::rayon::RayonExecutor;
|
|
|
|
use pathfinder_renderer::concurrent::scene_proxy::SceneProxy;
|
|
|
|
use pathfinder_renderer::gpu::renderer::{DestFramebuffer, Renderer};
|
|
|
|
use pathfinder_renderer::options::RenderOptions;
|
|
|
|
use sdl2::event::Event;
|
|
|
|
use sdl2::keyboard::Keycode;
|
|
|
|
use sdl2::video::GLProfile;
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
// Set up SDL2.
|
|
|
|
let sdl_context = sdl2::init().unwrap();
|
|
|
|
let video = sdl_context.video().unwrap();
|
|
|
|
|
|
|
|
// Make sure we have at least a GL 3.0 context. Pathfinder requires this.
|
|
|
|
let gl_attributes = video.gl_attr();
|
|
|
|
gl_attributes.set_context_profile(GLProfile::Core);
|
|
|
|
gl_attributes.set_context_version(3, 3);
|
|
|
|
|
|
|
|
// Open a window.
|
2019-05-29 22:13:42 -04:00
|
|
|
let window_size = Point2DI::new(640, 480);
|
2019-05-03 15:35:19 -04:00
|
|
|
let window = video.window("Minimal example", window_size.x() as u32, window_size.y() as u32)
|
|
|
|
.opengl()
|
|
|
|
.build()
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
// Create the GL context, and make it current.
|
|
|
|
let gl_context = window.gl_create_context().unwrap();
|
|
|
|
gl::load_with(|name| video.gl_get_proc_address(name) as *const _);
|
|
|
|
window.gl_make_current(&gl_context).unwrap();
|
|
|
|
|
|
|
|
// Create a Pathfinder renderer.
|
|
|
|
let mut renderer = Renderer::new(GLDevice::new(GLVersion::GL3, 0),
|
|
|
|
&FilesystemResourceLoader::locate(),
|
|
|
|
DestFramebuffer::full_window(window_size));
|
|
|
|
|
|
|
|
// Clear to white.
|
|
|
|
renderer.device.clear(&ClearParams { color: Some(ColorF::white()), ..ClearParams::default() });
|
|
|
|
|
|
|
|
// Make a canvas. We're going to draw a house.
|
2019-05-30 00:15:03 -04:00
|
|
|
let mut canvas = CanvasRenderingContext2D::new(CanvasFontContext::new(), window_size.to_f32());
|
2019-05-03 15:35:19 -04:00
|
|
|
|
|
|
|
// Set line width.
|
|
|
|
canvas.set_line_width(10.0);
|
|
|
|
|
|
|
|
// Draw walls.
|
2019-05-29 22:13:42 -04:00
|
|
|
canvas.stroke_rect(RectF::new(Point2DF::new(75.0, 140.0), Point2DF::new(150.0, 110.0)));
|
2019-05-03 15:35:19 -04:00
|
|
|
|
|
|
|
// Draw door.
|
2019-05-29 22:13:42 -04:00
|
|
|
canvas.fill_rect(RectF::new(Point2DF::new(130.0, 190.0), Point2DF::new(40.0, 60.0)));
|
2019-05-03 15:35:19 -04:00
|
|
|
|
|
|
|
// Draw roof.
|
|
|
|
let mut path = Path2D::new();
|
2019-05-29 22:13:42 -04:00
|
|
|
path.move_to(Point2DF::new(50.0, 140.0));
|
|
|
|
path.line_to(Point2DF::new(150.0, 60.0));
|
|
|
|
path.line_to(Point2DF::new(250.0, 140.0));
|
2019-05-03 15:35:19 -04:00
|
|
|
path.close_path();
|
|
|
|
canvas.stroke_path(path);
|
|
|
|
|
|
|
|
// Render the canvas to screen.
|
2019-05-13 21:29:33 -04:00
|
|
|
let scene = SceneProxy::from_scene(canvas.into_scene(), RayonExecutor);
|
2019-05-03 15:35:19 -04:00
|
|
|
scene.build_and_render(&mut renderer, RenderOptions::default());
|
|
|
|
window.gl_swap_window();
|
|
|
|
|
|
|
|
// Wait for a keypress.
|
|
|
|
let mut event_pump = sdl_context.event_pump().unwrap();
|
|
|
|
loop {
|
|
|
|
match event_pump.wait_event() {
|
|
|
|
Event::Quit {..} | Event::KeyDown { keycode: Some(Keycode::Escape), .. } => return,
|
|
|
|
_ => {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|