-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxr_render.rs
70 lines (59 loc) · 2.03 KB
/
xr_render.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use crate::*;
use anyhow::Result;
use bevy::prelude::*;
use bevy::render::camera::ManualTextureViews;
use bevy::render::render_asset::RenderAssets;
use bevy::render::render_phase::AddRenderCommand;
use bevy::render::renderer::{RenderDevice, RenderQueue};
use bevy::render::RenderApp;
use std::cell::RefCell;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsValue;
use wasm_bindgen_futures::{future_to_promise, JsFuture};
use web_sys::*;
pub async fn init_xr_render(
app: &mut App,
) -> Result<(XrSession, XrReferenceSpace), JsValue> {
let gl = xr_utils::create_webgl_context(true)?;
// xr_utils::clear_canvas(&gl)?;
// let mode = web_sys::XrSessionMode::Inline;
let mode = web_sys::XrSessionMode::ImmersiveVr;
app.insert_non_send_resource(mode);
let session = xr_utils::create_xr_session_with_mode(&gl, mode).await?;
let gl_layer = xr_utils::create_xr_gl_layer(&session, &gl).await?;
bevy_utils::insert_blit_target(app, &gl_layer);
let reference_space =
xr_utils::get_reference_space(&session, &mode).await?;
return Ok((session, reference_space));
}
pub fn update_framebuffer_texture(
render_device: Res<RenderDevice>,
mut blit_target: ResMut<bevy_utils::BlitTarget>,
frame: NonSend<XrFrame>,
) {
let gl_layer = frame.session().render_state().base_layer().unwrap();
let dest_texture = wgpu_utils::create_framebuffer_texture(
&render_device.wgpu_device(),
&gl_layer,
);
blit_target.update_dest(dest_texture);
}
pub fn update_manual_texture_views(
frame: NonSend<web_sys::XrFrame>,
render_device: Res<RenderDevice>,
mut manual_tex_view: ResMut<ManualTextureViews>,
) {
let gl_layer = frame.session().render_state().base_layer().unwrap();
let dest_texture = wgpu_utils::create_framebuffer_texture(
&render_device.wgpu_device(),
&gl_layer,
);
let resolution =
UVec2::new(gl_layer.framebuffer_width(), gl_layer.framebuffer_height());
let view =
dest_texture.create_view(&wgpu::TextureViewDescriptor::default());
//TODO use real id
manual_tex_view.insert(0, (view.into(), resolution));
}