add XrTracker component that auto parents the entity to the XrTrackingRoot, XrSpace requires XrTracker
Signed-off-by: Schmarni <marnistromer@gmail.com>
This commit is contained in:
@@ -11,7 +11,7 @@ use bevy_mod_openxr::{
|
||||
spaces::OxrSpaceExt,
|
||||
};
|
||||
use bevy_mod_xr::{
|
||||
session::{session_available, session_running, XrSessionCreated, XrTrackingRoot},
|
||||
session::{session_available, session_running, XrSessionCreated},
|
||||
spaces::XrSpace,
|
||||
};
|
||||
use openxr::Posef;
|
||||
@@ -108,7 +108,6 @@ fn create_actions(instance: Res<OxrInstance>, mut cmds: Commands) {
|
||||
fn spawn_hands(
|
||||
actions: Res<ControllerActions>,
|
||||
mut cmds: Commands,
|
||||
root: Query<Entity, With<XrTrackingRoot>>,
|
||||
session: Res<OxrSession>,
|
||||
mut meshes: ResMut<Assets<Mesh>>,
|
||||
mut materials: ResMut<Assets<StandardMaterial>>,
|
||||
@@ -128,26 +127,18 @@ fn spawn_hands(
|
||||
let right_space = session
|
||||
.create_action_space(&actions.right, openxr::Path::NULL, Isometry3d::IDENTITY)
|
||||
.unwrap();
|
||||
let left = cmds
|
||||
.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.1, 0.1, 0.05))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(124, 144, 255))),
|
||||
Transform::from_xyz(0.0, 0.5, 0.0),
|
||||
left_space,
|
||||
Controller,
|
||||
))
|
||||
.id();
|
||||
let right = cmds
|
||||
.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.1, 0.1, 0.05))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(124, 144, 255))),
|
||||
Transform::from_xyz(0.0, 0.5, 0.0),
|
||||
right_space,
|
||||
Controller,
|
||||
))
|
||||
.id();
|
||||
|
||||
cmds.entity(root.single()).add_children(&[left, right]);
|
||||
cmds.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.1, 0.1, 0.05))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(124, 144, 255))),
|
||||
left_space,
|
||||
Controller,
|
||||
));
|
||||
cmds.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.1, 0.1, 0.05))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(124, 144, 255))),
|
||||
right_space,
|
||||
Controller,
|
||||
));
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
use bevy::prelude::*;
|
||||
use bevy_mod_openxr::add_xr_plugins;
|
||||
use bevy_mod_xr::session::XrSessionCreated;
|
||||
use bevy_mod_xr::session::{XrSessionCreated, XrTracker};
|
||||
use bevy_xr_utils::tracking_utils::{
|
||||
TrackingUtilitiesPlugin, XrTrackedLeftGrip, XrTrackedLocalFloor, XrTrackedRightGrip,
|
||||
XrTrackedStage, XrTrackedView,
|
||||
@@ -53,50 +53,42 @@ fn spawn_hands(
|
||||
mut meshes: ResMut<Assets<Mesh>>,
|
||||
mut materials: ResMut<Assets<StandardMaterial>>,
|
||||
) {
|
||||
let left = cmds
|
||||
.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.1, 0.1, 0.05))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(124, 144, 255))),
|
||||
Transform::from_xyz(0.0, 0.5, 0.0),
|
||||
XrTrackedLeftGrip,
|
||||
))
|
||||
.id();
|
||||
let bundle = (
|
||||
cmds.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.1, 0.1, 0.05))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(124, 144, 255))),
|
||||
Transform::from_xyz(0.0, 0.5, 0.0),
|
||||
XrTrackedLeftGrip,
|
||||
XrTracker,
|
||||
));
|
||||
cmds.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.1, 0.1, 0.05))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(124, 144, 255))),
|
||||
Transform::from_xyz(0.0, 0.5, 0.0),
|
||||
XrTrackedRightGrip,
|
||||
);
|
||||
let right = cmds.spawn(bundle).id();
|
||||
XrTracker,
|
||||
));
|
||||
//head
|
||||
|
||||
let head = cmds
|
||||
.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.2, 0.2, 0.2))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(255, 144, 144))),
|
||||
Transform::from_xyz(0.0, 0.0, 0.0),
|
||||
XrTrackedView,
|
||||
))
|
||||
.id();
|
||||
cmds.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.2, 0.2, 0.2))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(255, 144, 144))),
|
||||
Transform::from_xyz(0.0, 0.0, 0.0),
|
||||
XrTrackedView,
|
||||
XrTracker,
|
||||
));
|
||||
//local_floor emulated
|
||||
let local_floor = cmds
|
||||
.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.5, 0.1, 0.5))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(144, 255, 144))),
|
||||
Transform::from_xyz(0.0, 0.0, 0.0),
|
||||
XrTrackedLocalFloor,
|
||||
))
|
||||
.id();
|
||||
cmds.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.5, 0.1, 0.5))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(144, 255, 144))),
|
||||
Transform::from_xyz(0.0, 0.0, 0.0),
|
||||
XrTrackedLocalFloor,
|
||||
XrTracker,
|
||||
));
|
||||
|
||||
let stage = cmds
|
||||
.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.5, 0.1, 0.5))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(144, 255, 255))),
|
||||
Transform::from_xyz(0.0, 0.0, 0.0),
|
||||
XrTrackedStage,
|
||||
))
|
||||
.id();
|
||||
|
||||
cmds.entity(stage)
|
||||
.add_children(&[left, right, head, local_floor]);
|
||||
cmds.spawn((
|
||||
Mesh3d(meshes.add(Cuboid::new(0.5, 0.1, 0.5))),
|
||||
MeshMaterial3d(materials.add(Color::srgb_u8(144, 255, 255))),
|
||||
Transform::from_xyz(0.0, 0.0, 0.0),
|
||||
XrTrackedStage,
|
||||
XrTracker,
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
use bevy::prelude::*;
|
||||
use bevy_mod_xr::hands::{
|
||||
spawn_hand_bones, HandBone, HandBoneRadius, HandSide, SpawnHandTracker,
|
||||
SpawnHandTrackerCommandExecutor,
|
||||
spawn_hand_bones, HandBone, HandSide, SpawnHandTracker, SpawnHandTrackerCommandExecutor,
|
||||
XrHandBoneRadius,
|
||||
};
|
||||
use bevy_mod_xr::hands::{LeftHand, RightHand, XrHandBoneEntities};
|
||||
use bevy_mod_xr::session::{XrPreDestroySession, XrSessionCreated, XrTrackingRoot};
|
||||
use bevy_mod_xr::session::{XrPreDestroySession, XrSessionCreated};
|
||||
use bevy_mod_xr::spaces::{
|
||||
XrPrimaryReferenceSpace, XrReferenceSpace, XrSpaceLocationFlags, XrSpaceVelocityFlags,
|
||||
XrVelocity,
|
||||
@@ -70,11 +70,7 @@ fn handle_tracker_spawn(world: &mut World, tracker: Entity, side: HandSide) {
|
||||
.insert(OxrHandTracker(oxr_tracker));
|
||||
}
|
||||
|
||||
fn spawn_default_hands(mut cmds: Commands, root: Query<Entity, With<XrTrackingRoot>>) {
|
||||
let Ok(root) = root.get_single() else {
|
||||
error!("unable to get tracking root, skipping handtracker creation");
|
||||
return;
|
||||
};
|
||||
fn spawn_default_hands(mut cmds: Commands) {
|
||||
debug!("spawning default hands");
|
||||
let left_bones = spawn_hand_bones(&mut cmds, |_| {
|
||||
(
|
||||
@@ -90,8 +86,6 @@ fn spawn_default_hands(mut cmds: Commands, root: Query<Entity, With<XrTrackingRo
|
||||
OxrSpaceLocationFlags(openxr::SpaceLocationFlags::default()),
|
||||
)
|
||||
});
|
||||
cmds.entity(root).add_children(&left_bones);
|
||||
cmds.entity(root).add_children(&right_bones);
|
||||
cmds.queue(SpawnHandTracker {
|
||||
joints: XrHandBoneEntities(left_bones),
|
||||
tracker_bundle: DefaultHandTracker,
|
||||
@@ -134,7 +128,7 @@ fn locate_hands(
|
||||
session: Res<OxrSession>,
|
||||
mut bone_query: Query<(
|
||||
&HandBone,
|
||||
&mut HandBoneRadius,
|
||||
&mut XrHandBoneRadius,
|
||||
&mut Transform,
|
||||
Option<&mut XrVelocity>,
|
||||
&mut OxrSpaceLocationFlags,
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use bevy::{
|
||||
ecs::query::QuerySingleError,
|
||||
prelude::*,
|
||||
render::{
|
||||
camera::{ManualTextureView, ManualTextureViewHandle, ManualTextureViews, RenderTarget},
|
||||
@@ -12,9 +11,7 @@ use bevy::{
|
||||
};
|
||||
use bevy_mod_xr::{
|
||||
camera::{XrCamera, XrProjection},
|
||||
session::{
|
||||
XrFirst, XrHandleEvents, XrPreDestroySession, XrRenderSet, XrRootTransform, XrTrackingRoot,
|
||||
},
|
||||
session::{XrFirst, XrHandleEvents, XrPreDestroySession, XrRenderSet, XrRootTransform},
|
||||
spaces::XrPrimaryReferenceSpace,
|
||||
};
|
||||
use openxr::ViewStateFlags;
|
||||
@@ -34,10 +31,6 @@ impl Plugin for OxrRenderPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
if app.is_plugin_added::<PipelinedRenderingPlugin>() {
|
||||
app.init_resource::<Pipelined>();
|
||||
|
||||
// if let Some(sub_app) = app.remove_sub_app(RenderExtractApp) {
|
||||
// app.insert_sub_app(RenderExtractApp, SubApp::new(sub_app.app, update_rendering));
|
||||
// }
|
||||
}
|
||||
|
||||
app.add_plugins((
|
||||
@@ -140,7 +133,6 @@ pub fn init_views(
|
||||
graphics_info: Res<OxrGraphicsInfo>,
|
||||
mut manual_texture_views: ResMut<ManualTextureViews>,
|
||||
swapchain_images: Res<OxrSwapchainImages>,
|
||||
root: Query<Entity, With<XrTrackingRoot>>,
|
||||
mut commands: Commands,
|
||||
) {
|
||||
let _span = info_span!("xr_init_views");
|
||||
@@ -150,27 +142,13 @@ pub fn init_views(
|
||||
info!("XrCamera resolution: {}", graphics_info.resolution);
|
||||
let view_handle =
|
||||
add_texture_view(&mut manual_texture_views, temp_tex, &graphics_info, index);
|
||||
let cam = commands
|
||||
.spawn((
|
||||
Camera {
|
||||
target: RenderTarget::TextureView(view_handle),
|
||||
..Default::default()
|
||||
},
|
||||
XrCamera(index),
|
||||
))
|
||||
.remove::<Projection>()
|
||||
.id();
|
||||
match root.get_single() {
|
||||
Ok(root) => {
|
||||
commands.entity(root).add_child(cam);
|
||||
}
|
||||
Err(QuerySingleError::NoEntities(_)) => {
|
||||
warn!("No XrTrackingRoot!");
|
||||
}
|
||||
Err(QuerySingleError::MultipleEntities(_)) => {
|
||||
warn!("Multiple XrTrackingRoots! this is not allowed");
|
||||
}
|
||||
}
|
||||
commands.spawn((
|
||||
Camera {
|
||||
target: RenderTarget::TextureView(view_handle),
|
||||
..Default::default()
|
||||
},
|
||||
XrCamera(index),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user