Updated to latest pf3 API

This commit is contained in:
Alan Jeffrey 2019-04-22 11:57:24 -05:00
parent c549bdec7a
commit 3d81bf170f
2 changed files with 16 additions and 21 deletions

View File

@ -12,6 +12,7 @@ egl = "0.2"
log = "0.4" log = "0.4"
smallvec = "0.6" smallvec = "0.6"
glutin = { version = "0.19", optional = true } glutin = { version = "0.19", optional = true }
crossbeam-channel = "0.3"
[lib] [lib]
crate-type = ["cdylib"] crate-type = ["cdylib"]

View File

@ -41,9 +41,8 @@ use pathfinder_gpu::resources::ResourceLoader;
use pathfinder_renderer::builder::RenderOptions; use pathfinder_renderer::builder::RenderOptions;
use pathfinder_renderer::builder::RenderTransform; use pathfinder_renderer::builder::RenderTransform;
use pathfinder_renderer::builder::SceneBuilder; use pathfinder_renderer::builder::SceneBuilder;
use pathfinder_renderer::builder::SceneBuilderContext;
use pathfinder_renderer::gpu::renderer::Renderer; use pathfinder_renderer::gpu::renderer::Renderer;
use pathfinder_renderer::gpu_data::BuiltScene; use pathfinder_renderer::gpu::renderer::DestFramebuffer;
use pathfinder_simd::default::F32x4; use pathfinder_simd::default::F32x4;
use pathfinder_svg::BuiltSVG; use pathfinder_svg::BuiltSVG;
@ -52,7 +51,6 @@ use std::ffi::CStr;
use std::ffi::CString; use std::ffi::CString;
use std::os::raw::c_char; use std::os::raw::c_char;
use std::os::raw::c_void; use std::os::raw::c_void;
use std::sync::mpsc;
use usvg::Options as UsvgOptions; use usvg::Options as UsvgOptions;
use usvg::Tree; use usvg::Tree;
@ -64,8 +62,8 @@ mod magicleap;
mod mocked_c_api; mod mocked_c_api;
struct ImmersiveApp { struct ImmersiveApp {
sender: mpsc::Sender<Event>, sender: crossbeam_channel::Sender<Event>,
receiver: mpsc::Receiver<Event>, receiver: crossbeam_channel::Receiver<Event>,
demo: DemoApp<MagicLeapWindow>, demo: DemoApp<MagicLeapWindow>,
} }
@ -94,7 +92,7 @@ pub extern "C" fn magicleap_pathfinder_demo_init(egl_display: EGLDisplay, egl_co
let demo = DemoApp::new(window, window_size, options); let demo = DemoApp::new(window, window_size, options);
info!("Initialized app"); info!("Initialized app");
let (sender, receiver) = mpsc::channel(); let (sender, receiver) = crossbeam_channel::unbounded();
Box::into_raw(Box::new(ImmersiveApp { sender, receiver, demo })) as *mut c_void Box::into_raw(Box::new(ImmersiveApp { sender, receiver, demo })) as *mut c_void
} }
@ -133,7 +131,6 @@ struct MagicLeapPathfinder {
renderers: HashMap<(EGLSurface, EGLDisplay), Renderer<GLDevice>>, renderers: HashMap<(EGLSurface, EGLDisplay), Renderer<GLDevice>>,
svgs: HashMap<String, BuiltSVG>, svgs: HashMap<String, BuiltSVG>,
resources: FilesystemResourceLoader, resources: FilesystemResourceLoader,
scene_builder_context: SceneBuilderContext,
} }
#[repr(C)] #[repr(C)]
@ -165,7 +162,6 @@ pub extern "C" fn magicleap_pathfinder_init() -> *mut c_void {
renderers: HashMap::new(), renderers: HashMap::new(),
svgs: HashMap::new(), svgs: HashMap::new(),
resources: FilesystemResourceLoader::locate(), resources: FilesystemResourceLoader::locate(),
scene_builder_context: SceneBuilderContext::new(),
}; };
info!("Initialized pf"); info!("Initialized pf");
@ -187,7 +183,7 @@ pub unsafe extern "C" fn magicleap_pathfinder_render(pf: *mut c_void, options: *
}); });
let mut width = 0; let mut width = 0;
let mut height = 0; let mut height = 0;
egl::query_surface(options.display, options.surface, egl::EGL_WIDTH, &mut width); egl::query_surface(options.display, options.surface, egl::EGL_WIDTH, &mut width);
egl::query_surface(options.display, options.surface, egl::EGL_HEIGHT, &mut height); egl::query_surface(options.display, options.surface, egl::EGL_HEIGHT, &mut height);
let size = Point2DI32::new(width, height); let size = Point2DI32::new(width, height);
@ -195,18 +191,20 @@ pub unsafe extern "C" fn magicleap_pathfinder_render(pf: *mut c_void, options: *
let viewport_origin = Point2DI32::new(options.viewport[0] as i32, options.viewport[1] as i32); let viewport_origin = Point2DI32::new(options.viewport[0] as i32, options.viewport[1] as i32);
let viewport_size = Point2DI32::new(options.viewport[2] as i32, options.viewport[3] as i32); let viewport_size = Point2DI32::new(options.viewport[2] as i32, options.viewport[3] as i32);
let viewport = RectI32::new(viewport_origin, viewport_size); let viewport = RectI32::new(viewport_origin, viewport_size);
let dest_framebuffer = DestFramebuffer::Default { viewport, window_size: size };
let bg_color = F32x4::new(options.bg_color[0], options.bg_color[1], options.bg_color[2], options.bg_color[3]); let bg_color = F32x4::new(options.bg_color[0], options.bg_color[1], options.bg_color[2], options.bg_color[3]);
let renderer = pf.renderers.entry((options.display, options.surface)).or_insert_with(|| { let renderer = pf.renderers.entry((options.display, options.surface)).or_insert_with(|| {
let mut fbo = 0; let mut fbo = 0;
gl::GetIntegerv(gl::DRAW_FRAMEBUFFER_BINDING, &mut fbo); gl::GetIntegerv(gl::DRAW_FRAMEBUFFER_BINDING, &mut fbo);
let device = GLDevice::new(GLVersion::GLES3, fbo as GLuint); let device = GLDevice::new(GLVersion::GLES3, fbo as GLuint);
Renderer::new(device, resources, viewport, size) let dest_framebuffer = DestFramebuffer::Default { viewport, window_size: size };
Renderer::new(device, resources, dest_framebuffer)
}); });
renderer.set_main_framebuffer_size(size); renderer.set_main_framebuffer_size(size);
renderer.set_viewport(viewport); renderer.set_dest_framebuffer(dest_framebuffer);
renderer.device.bind_default_framebuffer(viewport); renderer.device.bind_default_framebuffer(viewport);
renderer.device.clear(Some(bg_color), Some(1.0), Some(0)); renderer.device.clear(Some(bg_color), Some(1.0), Some(0));
renderer.disable_depth(); renderer.disable_depth();
@ -227,20 +225,16 @@ pub unsafe extern "C" fn magicleap_pathfinder_render(pf: *mut c_void, options: *
}; };
let built_options = render_options.prepare(svg.scene.bounds); let built_options = render_options.prepare(svg.scene.bounds);
let quad = built_options.quad();
let mut built_scene = BuiltScene::new(svg.scene.view_box, &quad, svg.scene.objects.len() as u32); let (command_sender, command_receiver) = crossbeam_channel::unbounded();
built_scene.shaders = svg.scene.build_shaders();
let (command_sender, command_receiver) = mpsc::channel();
let command_sender_clone = command_sender.clone(); let command_sender_clone = command_sender.clone();
SceneBuilder::new(&pf.scene_builder_context, &svg.scene, &built_options) SceneBuilder::new(&svg.scene, &built_options, Box::new(move |command| { let _ = command_sender.send(Some(command)); }))
.build_sequentially(Box::new(move |command| { let _ = command_sender.send(Some(command)); })); .build_sequentially();
let _ = command_sender_clone.send(None); let _ = command_sender_clone.send(None);
renderer.begin_scene(&built_scene); renderer.begin_scene(&svg.scene.build_descriptor(&built_options));
while let Ok(Some(command)) = command_receiver.recv() { while let Ok(Some(command)) = command_receiver.recv() {
renderer.render_command(&command); renderer.render_command(&command);
} }