Skip to content

Commit

Permalink
Merge pull request rust-windowing#136 from asajeffrey/pf3-magicleap-u…
Browse files Browse the repository at this point in the history
…pdates

Pathfinder magicleap demo updates
  • Loading branch information
pcwalton authored Apr 22, 2019
2 parents 58d55c5 + 3d81bf1 commit 7cd05cd
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 21 deletions.
1 change: 1 addition & 0 deletions demo/magicleap/.cargo/config
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[target.aarch64-linux-android]
linker = "./fake-ld.sh"
ar = "aarch64-linux-android-ar"
rustflags = "-Clinker-flavor=ld"
1 change: 1 addition & 0 deletions demo/magicleap/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ egl = "0.2"
log = "0.4"
smallvec = "0.6"
glutin = { version = "0.19", optional = true }
crossbeam-channel = "0.3"

[lib]
crate-type = ["cdylib"]
Expand Down
36 changes: 15 additions & 21 deletions demo/magicleap/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,8 @@ use pathfinder_gpu::resources::ResourceLoader;
use pathfinder_renderer::builder::RenderOptions;
use pathfinder_renderer::builder::RenderTransform;
use pathfinder_renderer::builder::SceneBuilder;
use pathfinder_renderer::builder::SceneBuilderContext;
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_svg::BuiltSVG;

Expand All @@ -52,7 +51,6 @@ use std::ffi::CStr;
use std::ffi::CString;
use std::os::raw::c_char;
use std::os::raw::c_void;
use std::sync::mpsc;

use usvg::Options as UsvgOptions;
use usvg::Tree;
Expand All @@ -64,8 +62,8 @@ mod magicleap;
mod mocked_c_api;

struct ImmersiveApp {
sender: mpsc::Sender<Event>,
receiver: mpsc::Receiver<Event>,
sender: crossbeam_channel::Sender<Event>,
receiver: crossbeam_channel::Receiver<Event>,
demo: DemoApp<MagicLeapWindow>,
}

Expand Down Expand Up @@ -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);
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
}

Expand Down Expand Up @@ -133,7 +131,6 @@ struct MagicLeapPathfinder {
renderers: HashMap<(EGLSurface, EGLDisplay), Renderer<GLDevice>>,
svgs: HashMap<String, BuiltSVG>,
resources: FilesystemResourceLoader,
scene_builder_context: SceneBuilderContext,
}

#[repr(C)]
Expand Down Expand Up @@ -165,7 +162,6 @@ pub extern "C" fn magicleap_pathfinder_init() -> *mut c_void {
renderers: HashMap::new(),
svgs: HashMap::new(),
resources: FilesystemResourceLoader::locate(),
scene_builder_context: SceneBuilderContext::new(),
};
info!("Initialized pf");

Expand All @@ -187,26 +183,28 @@ pub unsafe extern "C" fn magicleap_pathfinder_render(pf: *mut c_void, options: *
});

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_HEIGHT, &mut height);
let size = Point2DI32::new(width, height);

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 = 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 renderer = pf.renderers.entry((options.display, options.surface)).or_insert_with(|| {
let mut fbo = 0;
gl::GetIntegerv(gl::DRAW_FRAMEBUFFER_BINDING, &mut fbo);
let mut fbo = 0;
gl::GetIntegerv(gl::DRAW_FRAMEBUFFER_BINDING, &mut fbo);
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_viewport(viewport);
renderer.set_dest_framebuffer(dest_framebuffer);
renderer.device.bind_default_framebuffer(viewport);
renderer.device.clear(Some(bg_color), Some(1.0), Some(0));
renderer.disable_depth();
Expand All @@ -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 quad = built_options.quad();

let mut built_scene = BuiltScene::new(svg.scene.view_box, &quad, svg.scene.objects.len() as u32);
built_scene.shaders = svg.scene.build_shaders();

let (command_sender, command_receiver) = mpsc::channel();
let (command_sender, command_receiver) = crossbeam_channel::unbounded();
let command_sender_clone = command_sender.clone();

SceneBuilder::new(&pf.scene_builder_context, &svg.scene, &built_options)
.build_sequentially(Box::new(move |command| { let _ = command_sender.send(Some(command)); }));
SceneBuilder::new(&svg.scene, &built_options, Box::new(move |command| { let _ = command_sender.send(Some(command)); }))
.build_sequentially();

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() {
renderer.render_command(&command);
}
Expand Down

0 comments on commit 7cd05cd

Please sign in to comment.