Merge pull request #136 from asajeffrey/pf3-magicleap-updates
Pathfinder magicleap demo updates
This commit is contained in:
commit
7cd05cd3ef
|
@ -1,3 +1,4 @@
|
||||||
[target.aarch64-linux-android]
|
[target.aarch64-linux-android]
|
||||||
linker = "./fake-ld.sh"
|
linker = "./fake-ld.sh"
|
||||||
ar = "aarch64-linux-android-ar"
|
ar = "aarch64-linux-android-ar"
|
||||||
|
rustflags = "-Clinker-flavor=ld"
|
||||||
|
|
|
@ -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"]
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue