refactor: switch to bevys StandardMaterial for now
Signed-off-by: Schmarni <marnistromer@gmail.com>
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -1432,7 +1432,6 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "bevy_sk"
|
name = "bevy_sk"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/Schmarni-Dev/bevy_sk?branch=fix_mat_stuff#744e9bb442a690b1abc15f50ba2655228bd84eea"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bevy",
|
"bevy",
|
||||||
"bevy_mod_xr",
|
"bevy_mod_xr",
|
||||||
|
|||||||
@@ -83,7 +83,8 @@ bevy = { version = "0.16", features = ["wayland", "bevy_remote", "mp3", "wav"] }
|
|||||||
bevy_mod_xr = "0.3"
|
bevy_mod_xr = "0.3"
|
||||||
bevy_mod_openxr = "0.3"
|
bevy_mod_openxr = "0.3"
|
||||||
# bevy_sk.git = "https://github.com/MalekiRe/bevy_sk"
|
# bevy_sk.git = "https://github.com/MalekiRe/bevy_sk"
|
||||||
bevy_sk = { git = "https://github.com/Schmarni-Dev/bevy_sk", branch = "fix_mat_stuff" }
|
# bevy_sk = { git = "https://github.com/Schmarni-Dev/bevy_sk", branch = "fix_mat_stuff" }
|
||||||
|
bevy_sk.path = "../bevy_sk"
|
||||||
bevy-mesh-text-3d.git = "https://github.com/terhechte/bevy-mesh-text-3d"
|
bevy-mesh-text-3d.git = "https://github.com/terhechte/bevy-mesh-text-3d"
|
||||||
|
|
||||||
openxr = "0.19"
|
openxr = "0.19"
|
||||||
|
|||||||
12
src/main.rs
12
src/main.rs
@@ -39,7 +39,6 @@ use bevy_mod_openxr::render::{OxrRenderPlugin, OxrWaitFrameSystem};
|
|||||||
use bevy_mod_openxr::resources::{OxrFrameState, OxrFrameWaiter, OxrSessionConfig};
|
use bevy_mod_openxr::resources::{OxrFrameState, OxrFrameWaiter, OxrSessionConfig};
|
||||||
use bevy_mod_openxr::types::AppInfo;
|
use bevy_mod_openxr::types::AppInfo;
|
||||||
use bevy_mod_xr::camera::XrProjection;
|
use bevy_mod_xr::camera::XrProjection;
|
||||||
use bevy_mod_xr::hand_debug_gizmos::HandGizmosPlugin;
|
|
||||||
use bevy_mod_xr::session::{XrFirst, XrHandleEvents};
|
use bevy_mod_xr::session::{XrFirst, XrHandleEvents};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use core::client::{Client, tick_internal_client};
|
use core::client::{Client, tick_internal_client};
|
||||||
@@ -108,6 +107,8 @@ struct CliArgs {
|
|||||||
nvidia: bool,
|
nvidia: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub type BevyMaterial = StandardMaterial;
|
||||||
|
|
||||||
static STARDUST_INSTANCE: OnceLock<String> = OnceLock::new();
|
static STARDUST_INSTANCE: OnceLock<String> = OnceLock::new();
|
||||||
|
|
||||||
// #[tokio::main(flavor = "current_thread")]
|
// #[tokio::main(flavor = "current_thread")]
|
||||||
@@ -350,13 +351,14 @@ fn bevy_loop(
|
|||||||
|
|
||||||
app.add_plugins((
|
app.add_plugins((
|
||||||
bevy_sk::hand::HandPlugin,
|
bevy_sk::hand::HandPlugin,
|
||||||
bevy_sk::vr_materials::SkMaterialPlugin {
|
// bevy_sk::vr_materials::SkMaterialPlugin {
|
||||||
replace_standard_material: true,
|
// replace_standard_material: false,
|
||||||
},
|
// },
|
||||||
bevy_sk::skytext::SphericalHarmonicsPlugin,
|
// bevy_sk::skytext::SphericalHarmonicsPlugin,
|
||||||
));
|
));
|
||||||
// app.add_plugins(HandGizmosPlugin);
|
// app.add_plugins(HandGizmosPlugin);
|
||||||
app.init_asset::<Font>().init_asset_loader::<FontLoader>();
|
app.init_asset::<Font>().init_asset_loader::<FontLoader>();
|
||||||
|
app.world_mut().resource_mut::<AmbientLight>().brightness = 2000.0;
|
||||||
if let Some(priority) = args.overlay_priority {
|
if let Some(priority) = args.overlay_priority {
|
||||||
app.insert_resource(OxrOverlaySettings {
|
app.insert_resource(OxrOverlaySettings {
|
||||||
session_layer_placement: priority,
|
session_layer_placement: priority,
|
||||||
|
|||||||
@@ -5,9 +5,8 @@ use crate::{
|
|||||||
registry::Registry,
|
registry::Registry,
|
||||||
},
|
},
|
||||||
nodes::{
|
nodes::{
|
||||||
Node,
|
spatial::{Spatial, SpatialNode}, Node
|
||||||
spatial::{Spatial, SpatialNode},
|
}, BevyMaterial,
|
||||||
},
|
|
||||||
};
|
};
|
||||||
use bevy::{
|
use bevy::{
|
||||||
asset::RenderAssetUsages,
|
asset::RenderAssetUsages,
|
||||||
@@ -17,7 +16,6 @@ use bevy::{
|
|||||||
primitives::Aabb,
|
primitives::Aabb,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use bevy_sk::vr_materials::PbrMaterial;
|
|
||||||
use glam::Vec3;
|
use glam::Vec3;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use std::sync::{
|
use std::sync::{
|
||||||
@@ -54,7 +52,7 @@ fn update_visibillity(mut cmds: Commands) {
|
|||||||
fn build_line_mesh(
|
fn build_line_mesh(
|
||||||
mut meshes: ResMut<Assets<Mesh>>,
|
mut meshes: ResMut<Assets<Mesh>>,
|
||||||
mut cmds: Commands,
|
mut cmds: Commands,
|
||||||
mut materials: ResMut<Assets<PbrMaterial>>,
|
mut materials: ResMut<Assets<BevyMaterial>>,
|
||||||
) {
|
) {
|
||||||
for lines in LINES_REGISTRY
|
for lines in LINES_REGISTRY
|
||||||
.get_valid_contents()
|
.get_valid_contents()
|
||||||
@@ -171,9 +169,9 @@ fn build_line_mesh(
|
|||||||
let e = cmds.spawn((
|
let e = cmds.spawn((
|
||||||
Name::new("LinesNode"),
|
Name::new("LinesNode"),
|
||||||
SpatialNode(Arc::downgrade(&lines.spatial)),
|
SpatialNode(Arc::downgrade(&lines.spatial)),
|
||||||
MeshMaterial3d(materials.add(PbrMaterial {
|
MeshMaterial3d(materials.add(BevyMaterial {
|
||||||
color: Color::WHITE,
|
base_color: Color::WHITE,
|
||||||
roughness: 1.0,
|
perceptual_roughness: 1.0,
|
||||||
alpha_mode: AlphaMode::Opaque,
|
alpha_mode: AlphaMode::Opaque,
|
||||||
..default()
|
..default()
|
||||||
})),
|
})),
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use super::{MODEL_PART_ASPECT_ALIAS_INFO, MaterialParameter, ModelAspect, ModelPartAspect};
|
use super::{MODEL_PART_ASPECT_ALIAS_INFO, MaterialParameter, ModelAspect, ModelPartAspect};
|
||||||
use crate::bail;
|
|
||||||
use crate::core::bevy_channel::{BevyChannel, BevyChannelReader};
|
use crate::core::bevy_channel::{BevyChannel, BevyChannelReader};
|
||||||
use crate::core::client::Client;
|
use crate::core::client::Client;
|
||||||
use crate::core::color::ColorConvert as _;
|
use crate::core::color::ColorConvert as _;
|
||||||
@@ -10,9 +9,9 @@ use crate::core::resource::get_resource_file;
|
|||||||
use crate::nodes::Node;
|
use crate::nodes::Node;
|
||||||
use crate::nodes::alias::{Alias, AliasList};
|
use crate::nodes::alias::{Alias, AliasList};
|
||||||
use crate::nodes::spatial::{Spatial, SpatialNode};
|
use crate::nodes::spatial::{Spatial, SpatialNode};
|
||||||
|
use crate::{BevyMaterial, bail};
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy::render::primitives::Aabb;
|
use bevy::render::primitives::Aabb;
|
||||||
use bevy_sk::vr_materials::PbrMaterial;
|
|
||||||
use color_eyre::eyre::eyre;
|
use color_eyre::eyre::eyre;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use rustc_hash::{FxHashMap, FxHasher};
|
use rustc_hash::{FxHashMap, FxHasher};
|
||||||
@@ -79,10 +78,10 @@ fn load_models(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn apply_materials(
|
fn apply_materials(
|
||||||
mut query: Query<&mut MeshMaterial3d<PbrMaterial>>,
|
mut query: Query<&mut MeshMaterial3d<BevyMaterial>>,
|
||||||
mut material_registry: ResMut<MaterialRegistry>,
|
mut material_registry: ResMut<MaterialRegistry>,
|
||||||
asset_server: Res<AssetServer>,
|
asset_server: Res<AssetServer>,
|
||||||
mut materials: ResMut<Assets<PbrMaterial>>,
|
mut materials: ResMut<Assets<BevyMaterial>>,
|
||||||
) -> bevy::prelude::Result {
|
) -> bevy::prelude::Result {
|
||||||
for model_part in MODEL_REGISTRY
|
for model_part in MODEL_REGISTRY
|
||||||
.get_valid_contents()
|
.get_valid_contents()
|
||||||
@@ -248,16 +247,16 @@ fn gen_path(
|
|||||||
#[derive(PartialEq, Deref, DerefMut, Clone, Copy, Eq, PartialOrd, Ord, Hash)]
|
#[derive(PartialEq, Deref, DerefMut, Clone, Copy, Eq, PartialOrd, Ord, Hash)]
|
||||||
struct HashedPbrMaterial(u64);
|
struct HashedPbrMaterial(u64);
|
||||||
impl HashedPbrMaterial {
|
impl HashedPbrMaterial {
|
||||||
fn new(material: &PbrMaterial) -> Self {
|
fn new(material: &BevyMaterial) -> Self {
|
||||||
let mut hasher = FxHasher::default();
|
let mut hasher = FxHasher::default();
|
||||||
Self::hash_pbr_mat(material, &mut hasher);
|
Self::hash_pbr_mat(material, &mut hasher);
|
||||||
Self(hasher.finish())
|
Self(hasher.finish())
|
||||||
}
|
}
|
||||||
fn hash_pbr_mat<H: Hasher>(mat: &PbrMaterial, state: &mut H) {
|
fn hash_pbr_mat<H: Hasher>(mat: &BevyMaterial, state: &mut H) {
|
||||||
hash_color(mat.color, state);
|
hash_color(mat.base_color, state);
|
||||||
hash_color(mat.emission_factor, state);
|
hash_color(mat.emissive.into(), state);
|
||||||
state.write_u32(mat.metallic.to_bits());
|
state.write_u32(mat.metallic.to_bits());
|
||||||
state.write_u32(mat.roughness.to_bits());
|
state.write_u32(mat.perceptual_roughness.to_bits());
|
||||||
match mat.alpha_mode {
|
match mat.alpha_mode {
|
||||||
AlphaMode::Opaque => state.write_u8(0),
|
AlphaMode::Opaque => state.write_u8(0),
|
||||||
AlphaMode::Mask(v) => {
|
AlphaMode::Mask(v) => {
|
||||||
@@ -271,12 +270,12 @@ impl HashedPbrMaterial {
|
|||||||
AlphaMode::Multiply => state.write_u8(6),
|
AlphaMode::Multiply => state.write_u8(6),
|
||||||
}
|
}
|
||||||
state.write_u8(mat.double_sided as u8);
|
state.write_u8(mat.double_sided as u8);
|
||||||
mat.diffuse_texture.hash(state);
|
mat.base_color_texture.hash(state);
|
||||||
mat.emission_texture.hash(state);
|
mat.emissive_texture.hash(state);
|
||||||
mat.metal_texture.hash(state);
|
mat.metallic_roughness_texture.hash(state);
|
||||||
mat.occlusion_texture.hash(state);
|
mat.occlusion_texture.hash(state);
|
||||||
// should always be the same, TODO: make the spherical harmonics buffer a per mesh instance thing
|
// should always be the same, TODO: make the spherical harmonics buffer a per mesh instance thing
|
||||||
mat.spherical_harmonics.hash(state);
|
// mat.spherical_harmonics.hash(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn hash_color<H: Hasher>(color: Color, state: &mut H) {
|
fn hash_color<H: Hasher>(color: Color, state: &mut H) {
|
||||||
@@ -347,7 +346,7 @@ impl MaterialParameter {
|
|||||||
fn apply_to_material(
|
fn apply_to_material(
|
||||||
&self,
|
&self,
|
||||||
client: &Client,
|
client: &Client,
|
||||||
mat: &mut PbrMaterial,
|
mat: &mut BevyMaterial,
|
||||||
parameter_name: &str,
|
parameter_name: &str,
|
||||||
asset_server: &AssetServer,
|
asset_server: &AssetServer,
|
||||||
) {
|
) {
|
||||||
@@ -367,7 +366,7 @@ impl MaterialParameter {
|
|||||||
MaterialParameter::Float(val) => {
|
MaterialParameter::Float(val) => {
|
||||||
match parameter_name {
|
match parameter_name {
|
||||||
"metallic" => mat.metallic = *val,
|
"metallic" => mat.metallic = *val,
|
||||||
"roughness" => mat.roughness = *val,
|
"roughness" => mat.perceptual_roughness = *val,
|
||||||
// we probably don't want to expose tex_scale
|
// we probably don't want to expose tex_scale
|
||||||
// "tex_scale" => mat.tex_scale = *val,
|
// "tex_scale" => mat.tex_scale = *val,
|
||||||
v => {
|
v => {
|
||||||
@@ -382,8 +381,8 @@ impl MaterialParameter {
|
|||||||
// nothing uses a Vec3
|
// nothing uses a Vec3
|
||||||
}
|
}
|
||||||
MaterialParameter::Color(color) => match parameter_name {
|
MaterialParameter::Color(color) => match parameter_name {
|
||||||
"color" => mat.color = color.to_bevy(),
|
"color" => mat.base_color = color.to_bevy(),
|
||||||
"emission_factor" => mat.emission_factor = color.to_bevy(),
|
"emission_factor" => mat.emissive = color.to_bevy().to_linear(),
|
||||||
v => {
|
v => {
|
||||||
error!("unknown param_name ({v}) for color")
|
error!("unknown param_name ({v}) for color")
|
||||||
}
|
}
|
||||||
@@ -396,16 +395,15 @@ impl MaterialParameter {
|
|||||||
};
|
};
|
||||||
let handle = asset_server.load(texture_path);
|
let handle = asset_server.load(texture_path);
|
||||||
match parameter_name {
|
match parameter_name {
|
||||||
"diffuse" => mat.diffuse_texture = Some(handle),
|
"diffuse" => mat.base_color_texture = Some(handle),
|
||||||
"emission" => mat.emission_texture = Some(handle),
|
"emission" => mat.emissive_texture = Some(handle),
|
||||||
"metal" => mat.metal_texture = Some(handle),
|
"metal" => mat.metallic_roughness_texture = Some(handle),
|
||||||
"occlusion" => mat.occlusion_texture = Some(handle),
|
"occlusion" => mat.occlusion_texture = Some(handle),
|
||||||
v => {
|
v => {
|
||||||
error!("unknown param_name ({v}) for texture");
|
error!("unknown param_name ({v}) for texture");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mat.alpha_mode = AlphaMode::AlphaToCoverage;
|
// mat.alpha_mode = AlphaMode::Blend;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -426,23 +424,23 @@ pub struct Material {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Material {
|
impl Material {
|
||||||
fn to_pbr_mat(&self, asset_server: &AssetServer) -> PbrMaterial {
|
fn to_pbr_mat(&self, asset_server: &AssetServer) -> BevyMaterial {
|
||||||
PbrMaterial {
|
BevyMaterial {
|
||||||
color: self.color,
|
base_color: self.color,
|
||||||
emission_factor: self.emission_factor,
|
emissive: self.emission_factor.to_linear(),
|
||||||
metallic: self.metallic,
|
metallic: self.metallic,
|
||||||
roughness: self.roughness,
|
perceptual_roughness: self.roughness,
|
||||||
alpha_mode: self.alpha_mode,
|
alpha_mode: self.alpha_mode,
|
||||||
double_sided: self.double_sided,
|
double_sided: self.double_sided,
|
||||||
diffuse_texture: self
|
base_color_texture: self
|
||||||
.diffuse_texture
|
.diffuse_texture
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|p| asset_server.load(p.as_path())),
|
.map(|p| asset_server.load(p.as_path())),
|
||||||
emission_texture: self
|
emissive_texture: self
|
||||||
.emission_texture
|
.emission_texture
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|p| asset_server.load(p.as_path())),
|
.map(|p| asset_server.load(p.as_path())),
|
||||||
metal_texture: self
|
metallic_roughness_texture: self
|
||||||
.metal_texture
|
.metal_texture
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|p| asset_server.load(p.as_path())),
|
.map(|p| asset_server.load(p.as_path())),
|
||||||
@@ -450,7 +448,8 @@ impl Material {
|
|||||||
.occlusion_texture
|
.occlusion_texture
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|p| asset_server.load(p.as_path())),
|
.map(|p| asset_server.load(p.as_path())),
|
||||||
spherical_harmonics: bevy_sk::skytext::SPHERICAL_HARMONICS_HANDLE,
|
..Default::default()
|
||||||
|
// spherical_harmonics: bevy_sk::skytext::SPHERICAL_HARMONICS_HANDLE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -510,14 +509,14 @@ impl ModelPartAspect for ModelPart {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[derive(Default, Resource)]
|
#[derive(Default, Resource)]
|
||||||
pub struct MaterialRegistry(FxHashMap<HashedPbrMaterial, Handle<PbrMaterial>>);
|
pub struct MaterialRegistry(FxHashMap<HashedPbrMaterial, Handle<BevyMaterial>>);
|
||||||
impl MaterialRegistry {
|
impl MaterialRegistry {
|
||||||
/// returns strong handle for PbrMaterial elminitating duplications
|
/// returns strong handle for PbrMaterial elminitating duplications
|
||||||
pub fn get_handle(
|
pub fn get_handle(
|
||||||
&mut self,
|
&mut self,
|
||||||
material: PbrMaterial,
|
material: BevyMaterial,
|
||||||
materials: &mut ResMut<Assets<PbrMaterial>>,
|
materials: &mut ResMut<Assets<BevyMaterial>>,
|
||||||
) -> Handle<PbrMaterial> {
|
) -> Handle<BevyMaterial> {
|
||||||
let hash = HashedPbrMaterial::new(&material);
|
let hash = HashedPbrMaterial::new(&material);
|
||||||
match self
|
match self
|
||||||
.0
|
.0
|
||||||
|
|||||||
@@ -9,17 +9,14 @@ use crate::{
|
|||||||
resource::get_resource_file,
|
resource::get_resource_file,
|
||||||
},
|
},
|
||||||
nodes::{
|
nodes::{
|
||||||
Node,
|
drawable::XAlign, spatial::{Spatial, SpatialNode}, Node
|
||||||
drawable::XAlign,
|
}, BevyMaterial,
|
||||||
spatial::{Spatial, SpatialNode},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
use bevy::{platform::collections::HashMap, prelude::*};
|
use bevy::{platform::collections::HashMap, prelude::*};
|
||||||
use bevy_mesh_text_3d::{
|
use bevy_mesh_text_3d::{
|
||||||
Align, Attrs, MeshTextPlugin, Settings as FontSettings, generate_meshes,
|
Align, Attrs, MeshTextPlugin, Settings as FontSettings, generate_meshes,
|
||||||
text_glyphs::TextGlyphs,
|
text_glyphs::TextGlyphs,
|
||||||
};
|
};
|
||||||
use bevy_sk::vr_materials::PbrMaterial;
|
|
||||||
use color_eyre::eyre::eyre;
|
use color_eyre::eyre::eyre;
|
||||||
use core::f32;
|
use core::f32;
|
||||||
use cosmic_text::Metrics;
|
use cosmic_text::Metrics;
|
||||||
@@ -70,7 +67,7 @@ fn spawn_text(
|
|||||||
mut cmds: Commands,
|
mut cmds: Commands,
|
||||||
mut font_settings: ResMut<FontSettings>,
|
mut font_settings: ResMut<FontSettings>,
|
||||||
mut material_registry: ResMut<MaterialRegistry>,
|
mut material_registry: ResMut<MaterialRegistry>,
|
||||||
mut materials: ResMut<Assets<PbrMaterial>>,
|
mut materials: ResMut<Assets<BevyMaterial>>,
|
||||||
mut meshes: ResMut<Assets<Mesh>>,
|
mut meshes: ResMut<Assets<Mesh>>,
|
||||||
mut font_registry: Local<FontDatabaseRegistry>,
|
mut font_registry: Local<FontDatabaseRegistry>,
|
||||||
) {
|
) {
|
||||||
@@ -109,11 +106,11 @@ fn spawn_text(
|
|||||||
bevy_mesh_text_3d::InputText::Simple {
|
bevy_mesh_text_3d::InputText::Simple {
|
||||||
text: text_string,
|
text: text_string,
|
||||||
material: material_registry.get_handle(
|
material: material_registry.get_handle(
|
||||||
PbrMaterial {
|
BevyMaterial {
|
||||||
color: style.color.to_bevy(),
|
base_color: style.color.to_bevy(),
|
||||||
emission_factor: Color::WHITE,
|
emissive: Color::WHITE.to_linear(),
|
||||||
metallic: 0.0,
|
metallic: 0.0,
|
||||||
roughness: 1.0,
|
perceptual_roughness: 1.0,
|
||||||
// If alpha is supported on text we need to change this
|
// If alpha is supported on text we need to change this
|
||||||
alpha_mode: AlphaMode::Opaque,
|
alpha_mode: AlphaMode::Opaque,
|
||||||
double_sided: false,
|
double_sided: false,
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ use bevy_mod_xr::{
|
|||||||
session::{XrPreDestroySession, XrSessionCreated, XrSessionCreatedEvent},
|
session::{XrPreDestroySession, XrSessionCreated, XrSessionCreatedEvent},
|
||||||
spaces::{XrPrimaryReferenceSpace, XrReferenceSpace, XrSpace},
|
spaces::{XrPrimaryReferenceSpace, XrReferenceSpace, XrSpace},
|
||||||
};
|
};
|
||||||
use bevy_sk::vr_materials::PbrMaterial;
|
|
||||||
use color_eyre::eyre::Result;
|
use color_eyre::eyre::Result;
|
||||||
use glam::{Affine3A, Mat4, Vec2, Vec3};
|
use glam::{Affine3A, Mat4, Vec2, Vec3};
|
||||||
use openxr::{Action, ActiveActionSet, SpaceLocationFlags};
|
use openxr::{Action, ActiveActionSet, SpaceLocationFlags};
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use crate::nodes::{
|
|||||||
spatial::Spatial,
|
spatial::Spatial,
|
||||||
};
|
};
|
||||||
use crate::objects::{ObjectHandle, SpatialRef, Tracked};
|
use crate::objects::{ObjectHandle, SpatialRef, Tracked};
|
||||||
use crate::{DbusConnection, ObjectRegistryRes, PreFrameWait};
|
use crate::{BevyMaterial, DbusConnection, ObjectRegistryRes, PreFrameWait};
|
||||||
use bevy::prelude::Transform as BevyTransform;
|
use bevy::prelude::Transform as BevyTransform;
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_mod_openxr::helper_traits::{ToQuat, ToVec3};
|
use bevy_mod_openxr::helper_traits::{ToQuat, ToVec3};
|
||||||
@@ -18,7 +18,6 @@ use bevy_mod_xr::hands::{HandBone, HandSide, XrHandBoneEntities, XrHandBoneRadiu
|
|||||||
use bevy_mod_xr::session::{XrPreDestroySession, XrSessionCreated};
|
use bevy_mod_xr::session::{XrPreDestroySession, XrSessionCreated};
|
||||||
use bevy_mod_xr::spaces::{XrPrimaryReferenceSpace, XrSpaceLocationFlags};
|
use bevy_mod_xr::spaces::{XrPrimaryReferenceSpace, XrSpaceLocationFlags};
|
||||||
use bevy_sk::hand::GRADIENT_TEXTURE_HANDLE;
|
use bevy_sk::hand::GRADIENT_TEXTURE_HANDLE;
|
||||||
use bevy_sk::vr_materials::PbrMaterial;
|
|
||||||
use color_eyre::eyre::Result;
|
use color_eyre::eyre::Result;
|
||||||
use glam::{Mat4, Quat, Vec3};
|
use glam::{Mat4, Quat, Vec3};
|
||||||
use openxr::{HandJointLocation, SpaceLocationFlags};
|
use openxr::{HandJointLocation, SpaceLocationFlags};
|
||||||
@@ -44,7 +43,7 @@ fn update_hands(
|
|||||||
session: Option<Res<OxrSession>>,
|
session: Option<Res<OxrSession>>,
|
||||||
state: Option<Res<OxrFrameState>>,
|
state: Option<Res<OxrFrameState>>,
|
||||||
ref_space: Option<Res<XrPrimaryReferenceSpace>>,
|
ref_space: Option<Res<XrPrimaryReferenceSpace>>,
|
||||||
mut materials: ResMut<Assets<PbrMaterial>>,
|
mut materials: ResMut<Assets<BevyMaterial>>,
|
||||||
mut joint_query: Query<(
|
mut joint_query: Query<(
|
||||||
&mut BevyTransform,
|
&mut BevyTransform,
|
||||||
&mut XrSpaceLocationFlags,
|
&mut XrSpaceLocationFlags,
|
||||||
@@ -116,7 +115,7 @@ fn update_hand_material(
|
|||||||
(Entity, &HandSide),
|
(Entity, &HandSide),
|
||||||
(
|
(
|
||||||
With<XrHandBoneEntities>,
|
With<XrHandBoneEntities>,
|
||||||
With<MeshMaterial3d<PbrMaterial>>,
|
With<MeshMaterial3d<BevyMaterial>>,
|
||||||
Without<CorrectHandMaterial>,
|
Without<CorrectHandMaterial>,
|
||||||
),
|
),
|
||||||
>,
|
>,
|
||||||
@@ -137,7 +136,7 @@ fn update_hand_material(
|
|||||||
fn setup(
|
fn setup(
|
||||||
connection: Res<DbusConnection>,
|
connection: Res<DbusConnection>,
|
||||||
mut cmds: Commands,
|
mut cmds: Commands,
|
||||||
mut materials: ResMut<Assets<PbrMaterial>>,
|
mut materials: ResMut<Assets<BevyMaterial>>,
|
||||||
) {
|
) {
|
||||||
tokio::task::spawn({
|
tokio::task::spawn({
|
||||||
let connection = connection.clone();
|
let connection = connection.clone();
|
||||||
@@ -186,13 +185,13 @@ pub struct SkHand {
|
|||||||
tracked: ObjectHandle<Tracked>,
|
tracked: ObjectHandle<Tracked>,
|
||||||
tracker: Option<openxr::HandTracker>,
|
tracker: Option<openxr::HandTracker>,
|
||||||
captured: bool,
|
captured: bool,
|
||||||
material: Handle<PbrMaterial>,
|
material: Handle<BevyMaterial>,
|
||||||
}
|
}
|
||||||
impl SkHand {
|
impl SkHand {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
connection: &Connection,
|
connection: &Connection,
|
||||||
side: HandSide,
|
side: HandSide,
|
||||||
materials: &mut Assets<PbrMaterial>,
|
materials: &mut Assets<BevyMaterial>,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let (palm_spatial, palm_object) = SpatialRef::create(
|
let (palm_spatial, palm_object) = SpatialRef::create(
|
||||||
connection,
|
connection,
|
||||||
@@ -219,11 +218,11 @@ impl SkHand {
|
|||||||
let datamap = Datamap::from_typed(HandDatamap::default())?;
|
let datamap = Datamap::from_typed(HandDatamap::default())?;
|
||||||
let input = InputMethod::add_to(&node.0, hand, datamap)?;
|
let input = InputMethod::add_to(&node.0, hand, datamap)?;
|
||||||
|
|
||||||
let material = materials.add(PbrMaterial {
|
let material = materials.add(BevyMaterial {
|
||||||
color: Srgba::new(1.0, 1.0, 1.0, 1.0).into(),
|
base_color: Srgba::new(1.0, 1.0, 1.0, 1.0).into(),
|
||||||
alpha_mode: AlphaMode::Blend,
|
alpha_mode: AlphaMode::Blend,
|
||||||
diffuse_texture: Some(GRADIENT_TEXTURE_HANDLE),
|
base_color_texture: Some(GRADIENT_TEXTURE_HANDLE),
|
||||||
roughness: 1.0,
|
perceptual_roughness: 1.0,
|
||||||
..default()
|
..default()
|
||||||
});
|
});
|
||||||
Ok(SkHand {
|
Ok(SkHand {
|
||||||
@@ -255,7 +254,7 @@ impl SkHand {
|
|||||||
fn update(
|
fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
joints: Option<&openxr::HandJointLocations>,
|
joints: Option<&openxr::HandJointLocations>,
|
||||||
materials: &mut ResMut<Assets<PbrMaterial>>,
|
materials: &mut ResMut<Assets<BevyMaterial>>,
|
||||||
) {
|
) {
|
||||||
// TODO: use the hand data source ext
|
// TODO: use the hand data source ext
|
||||||
let real_hand = true;
|
let real_hand = true;
|
||||||
@@ -330,9 +329,9 @@ impl SkHand {
|
|||||||
*self.input.datamap.lock() = Datamap::from_typed(&self.datamap).unwrap();
|
*self.input.datamap.lock() = Datamap::from_typed(&self.datamap).unwrap();
|
||||||
let captured = self.capture_manager.capture.upgrade().is_some();
|
let captured = self.capture_manager.capture.upgrade().is_some();
|
||||||
if captured && !self.captured {
|
if captured && !self.captured {
|
||||||
materials.get_mut(&self.material).unwrap().color = Srgba::rgb(0., 1., 0.75).into();
|
materials.get_mut(&self.material).unwrap().base_color = Srgba::rgb(0., 1., 0.75).into();
|
||||||
} else if self.captured && !captured {
|
} else if self.captured && !captured {
|
||||||
materials.get_mut(&self.material).unwrap().color = Srgba::rgb(1., 1.0, 1.0).into();
|
materials.get_mut(&self.material).unwrap().base_color = Srgba::rgb(1., 1.0, 1.0).into();
|
||||||
}
|
}
|
||||||
self.captured = captured;
|
self.captured = captured;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user