refactor: let the bevy rewrite begin: mostly working model nodes
Signed-off-by: Schmarni <marnistromer@gmail.com>
This commit is contained in:
@@ -9,16 +9,85 @@ use crate::core::client::Client;
|
||||
use crate::core::error::Result;
|
||||
use crate::core::registry::Registry;
|
||||
use crate::nodes::{Node, OWNED_ASPECT_ALIAS_INFO};
|
||||
use bevy::ecs::entity_disabling::Disabled;
|
||||
use bevy::prelude::Transform as BevyTransform;
|
||||
use bevy::prelude::*;
|
||||
use color_eyre::eyre::OptionExt;
|
||||
use glam::{Mat4, Quat, Vec3, vec3a};
|
||||
use mint::Vector3;
|
||||
use parking_lot::Mutex;
|
||||
use rustc_hash::FxHashMap;
|
||||
use std::fmt::Debug;
|
||||
use std::sync::atomic::Ordering;
|
||||
use std::sync::{Arc, OnceLock, Weak};
|
||||
use std::{f32, ptr};
|
||||
use stereokit_rust::maths::Bounds;
|
||||
|
||||
pub struct SpatialNodePlugin;
|
||||
impl Plugin for SpatialNodePlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_systems(
|
||||
PostUpdate,
|
||||
(replace_childof, update_spatial_nodes).before(TransformSystem::TransformPropagate),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
fn update_spatial_nodes(
|
||||
mut query: Query<(Entity, &mut BevyTransform, &SpatialNode, Has<Disabled>)>,
|
||||
cmds: ParallelCommands,
|
||||
) {
|
||||
query
|
||||
.par_iter_mut()
|
||||
.for_each(|(entity, mut transform, spatial_node, disabled)| {
|
||||
let Some(spatial) = spatial_node.0.upgrade() else {
|
||||
return;
|
||||
};
|
||||
if !spatial
|
||||
.node()
|
||||
.map(|n| n.enabled.load(Ordering::Relaxed))
|
||||
.unwrap_or(true)
|
||||
{
|
||||
// cmds.command_scope(|mut cmds| {
|
||||
// cmds.entity(entity).insert(Visibility::Hidden);
|
||||
// });
|
||||
// return;
|
||||
}
|
||||
let mat4 = spatial.global_transform();
|
||||
|
||||
let scale_zero = mat4.to_scale_rotation_translation().0.length_squared() > 0.0;
|
||||
if scale_zero {
|
||||
// cmds.command_scope(|mut cmds| {
|
||||
// cmds.entity(entity).insert(Visibility::Hidden);
|
||||
// });
|
||||
} else if disabled {
|
||||
// cmds.command_scope(|mut cmds| {
|
||||
// cmds.entity(entity).insert(Visibility::Visible);
|
||||
// });
|
||||
}
|
||||
*transform = BevyTransform::from_matrix(mat4);
|
||||
});
|
||||
}
|
||||
|
||||
fn replace_childof(query: Query<(Entity, &ChildOf), With<SpatialNode>>, mut cmds: Commands) {
|
||||
for (entity, parent) in &query {
|
||||
cmds.entity(entity)
|
||||
.insert(NonSpatialChildOf(parent.0))
|
||||
.remove::<ChildOf>();
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Component, Default, Debug, PartialEq, Eq)]
|
||||
#[relationship_target(relationship = NonSpatialChildOf, linked_spawn)]
|
||||
pub struct NonSpatialChildren(Vec<Entity>);
|
||||
#[derive(Component, Debug, PartialEq, Eq)]
|
||||
#[relationship(relationship_target = NonSpatialChildren)]
|
||||
pub struct NonSpatialChildOf(Entity);
|
||||
|
||||
#[derive(Clone, Component, Debug)]
|
||||
#[require(BevyTransform)]
|
||||
pub struct SpatialNode(pub Weak<Spatial>);
|
||||
|
||||
stardust_xr_server_codegen::codegen_spatial_protocol!();
|
||||
impl Transform {
|
||||
pub fn to_mat4(&self, position: bool, rotation: bool, scale: bool) -> Mat4 {
|
||||
|
||||
Reference in New Issue
Block a user