2019-04-09 15:41:15 -04:00
|
|
|
use crate::magicleap::MagicLeapLandscape;
|
2019-03-09 12:57:44 -05:00
|
|
|
use crate::magicleap::MagicLeapLogger;
|
|
|
|
use crate::magicleap::MagicLeapWindow;
|
|
|
|
|
|
|
|
use egl;
|
|
|
|
use egl::EGLContext;
|
|
|
|
use egl::EGLDisplay;
|
2019-04-09 15:41:15 -04:00
|
|
|
use egl::EGLSurface;
|
2019-03-09 12:57:44 -05:00
|
|
|
|
|
|
|
use log::debug;
|
2019-04-09 15:41:15 -04:00
|
|
|
use log::info;
|
2019-03-09 12:57:44 -05:00
|
|
|
|
|
|
|
use pathfinder_demo::Background;
|
|
|
|
use pathfinder_demo::DemoApp;
|
|
|
|
use pathfinder_demo::Options;
|
2019-04-09 15:41:15 -04:00
|
|
|
use pathfinder_demo::window::Event;
|
2019-03-09 12:57:44 -05:00
|
|
|
use pathfinder_demo::window::Mode;
|
2019-04-09 15:41:15 -04:00
|
|
|
use pathfinder_demo::window::SVGPath;
|
|
|
|
use pathfinder_demo::window::WindowSize;
|
|
|
|
use pathfinder_geometry::basic::point::Point2DI32;
|
2019-03-09 12:57:44 -05:00
|
|
|
|
2019-04-09 15:41:15 -04:00
|
|
|
use std::ffi::CStr;
|
2019-03-09 12:57:44 -05:00
|
|
|
use std::ffi::CString;
|
2019-03-29 16:28:16 -04:00
|
|
|
use std::os::raw::c_char;
|
2019-04-09 15:41:15 -04:00
|
|
|
use std::os::raw::c_void;
|
2019-03-09 12:57:44 -05:00
|
|
|
|
|
|
|
mod c_api;
|
|
|
|
mod magicleap;
|
|
|
|
|
|
|
|
#[cfg(feature = "mocked")]
|
|
|
|
mod mocked_c_api;
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
pub extern "C" fn magicleap_pathfinder_demo(egl_display: EGLDisplay, egl_context: EGLContext) {
|
|
|
|
unsafe { c_api::MLLoggingLog(c_api::MLLogLevel::Info, &b"Pathfinder Demo\0"[0], &b"Initializing\0"[0]) };
|
|
|
|
|
|
|
|
let tag = CString::new("Pathfinder Demo").unwrap();
|
|
|
|
let level = log::LevelFilter::Warn;
|
|
|
|
let logger = MagicLeapLogger::new(tag, level);
|
|
|
|
log::set_boxed_logger(Box::new(logger)).unwrap();
|
|
|
|
log::set_max_level(level);
|
|
|
|
debug!("Initialized logging");
|
|
|
|
|
|
|
|
let window = MagicLeapWindow::new(egl_display, egl_context);
|
|
|
|
let window_size = window.size();
|
|
|
|
|
|
|
|
let mut options = Options::default();
|
|
|
|
options.ui = false;
|
|
|
|
options.background = Background::None;
|
|
|
|
options.mode = Mode::VR;
|
2019-03-28 15:36:27 -04:00
|
|
|
options.jobs = Some(3);
|
2019-03-28 12:22:22 -04:00
|
|
|
options.pipeline = 0;
|
2019-03-09 12:57:44 -05:00
|
|
|
|
|
|
|
let mut app = DemoApp::new(window, window_size, options);
|
|
|
|
debug!("Initialized app");
|
|
|
|
|
|
|
|
while app.window.running() {
|
|
|
|
let mut events = Vec::new();
|
|
|
|
while let Some(event) = app.window.try_get_event() {
|
|
|
|
events.push(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
let scene_count = app.prepare_frame(events);
|
|
|
|
for scene_index in 0..scene_count {
|
|
|
|
app.draw_scene(scene_index);
|
|
|
|
}
|
|
|
|
app.finish_drawing_frame();
|
|
|
|
}
|
2019-03-29 16:28:16 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
const SVG_FILENAMES: &[*const c_char] = &[
|
|
|
|
&b"svg/Ghostscript_Tiger.svg\0"[0],
|
|
|
|
&b"svg/paper.svg\0"[0],
|
|
|
|
&b"svg/julius-caesar-with-bg.svg\0"[0],
|
|
|
|
&b"svg/nba-notext.svg\0"[0],
|
|
|
|
&b"svg/pathfinder_logo.svg\0"[0],
|
|
|
|
];
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
pub extern "C" fn magicleap_pathfinder_svg_filecount() -> usize {
|
|
|
|
SVG_FILENAMES.len()
|
|
|
|
}
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
pub extern "C" fn magicleap_pathfinder_svg_filenames() -> *const *const c_char {
|
|
|
|
&SVG_FILENAMES[0]
|
2019-04-09 15:41:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
pub extern "C" fn magicleap_pathfinder_init() -> *mut c_void {
|
|
|
|
unsafe { c_api::MLLoggingLog(c_api::MLLogLevel::Info, &b"Pathfinder Demo\0"[0], &b"Initializing\0"[0]) };
|
|
|
|
|
|
|
|
let tag = CString::new("Pathfinder Demo").unwrap();
|
|
|
|
let level = log::LevelFilter::Info;
|
|
|
|
let logger = MagicLeapLogger::new(tag, level);
|
|
|
|
log::set_boxed_logger(Box::new(logger)).unwrap();
|
|
|
|
log::set_max_level(level);
|
|
|
|
info!("Initialized logging");
|
|
|
|
|
|
|
|
let window = MagicLeapLandscape::new();
|
|
|
|
let window_size = window.window_size();
|
|
|
|
let options = Options::default();
|
|
|
|
info!("Initializing app");
|
|
|
|
let app = DemoApp::new(window, window_size, options);
|
|
|
|
info!("Initialized app");
|
|
|
|
|
|
|
|
Box::into_raw(Box::new(app)) as *mut c_void
|
|
|
|
}
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn magicleap_pathfinder_render(app: *mut c_void, dpy: EGLDisplay, surf: EGLSurface, svg_filename: *const c_char) {
|
|
|
|
let app = app as *mut DemoApp<MagicLeapLandscape>;
|
|
|
|
if let Some(app) = app.as_mut() {
|
|
|
|
let mut width = 0;
|
|
|
|
let mut height = 0;
|
|
|
|
egl::query_surface(dpy, surf, egl::EGL_WIDTH, &mut width);
|
|
|
|
egl::query_surface(dpy, surf, egl::EGL_HEIGHT, &mut height);
|
|
|
|
gl::Viewport(0, 0, width, height);
|
|
|
|
let svg_filename = CStr::from_ptr(svg_filename).to_string_lossy().into_owned();
|
|
|
|
info!("w={}, h={}.", width, height);
|
|
|
|
app.window.set_size(width, height);
|
|
|
|
let events = vec![
|
|
|
|
Event::WindowResized(app.window.window_size()),
|
|
|
|
Event::OpenSVG(SVGPath::Resource(svg_filename)),
|
|
|
|
];
|
|
|
|
app.prepare_frame(events);
|
|
|
|
app.draw_scene(0);
|
|
|
|
app.finish_drawing_frame();
|
|
|
|
app.prepare_frame(vec![]);
|
|
|
|
app.draw_scene(0);
|
|
|
|
app.finish_drawing_frame();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
pub unsafe extern "C" fn magicleap_pathfinder_deinit(app: *mut c_void) {
|
|
|
|
Box::from_raw(app as *mut DemoApp<MagicLeapLandscape>);
|
2019-03-09 12:57:44 -05:00
|
|
|
}
|