refactor: clean up code
This commit is contained in:
24
src/main.rs
24
src/main.rs
@@ -10,11 +10,11 @@ mod wayland;
|
|||||||
|
|
||||||
use crate::core::destroy_queue;
|
use crate::core::destroy_queue;
|
||||||
// use crate::nodes::items::camera;
|
// use crate::nodes::items::camera;
|
||||||
use crate::nodes::{audio, drawable, input};
|
use crate::nodes::input;
|
||||||
|
|
||||||
use bevy::a11y::AccessibilityPlugin;
|
use bevy::a11y::AccessibilityPlugin;
|
||||||
use bevy::app::{
|
use bevy::app::{
|
||||||
App, AppExit, PluginGroup, PluginsState, PostUpdate, ScheduleRunnerPlugin, Startup,
|
App, AppExit, PluginGroup, PostUpdate, ScheduleRunnerPlugin, Startup,
|
||||||
TerminalCtrlCHandlerPlugin, Update,
|
TerminalCtrlCHandlerPlugin, Update,
|
||||||
};
|
};
|
||||||
use bevy::asset::{load_internal_binary_asset, AssetApp as _, AssetPlugin, AssetServer, Handle};
|
use bevy::asset::{load_internal_binary_asset, AssetApp as _, AssetPlugin, AssetServer, Handle};
|
||||||
@@ -27,9 +27,8 @@ use bevy::image::Image;
|
|||||||
use bevy::input::InputPlugin;
|
use bevy::input::InputPlugin;
|
||||||
use bevy::pbr::PbrPlugin;
|
use bevy::pbr::PbrPlugin;
|
||||||
use bevy::prelude::{
|
use bevy::prelude::{
|
||||||
on_event, resource_added, Camera3d, ClearColor, Commands, Entity, EventReader, HierarchyPlugin,
|
on_event, Camera3d, ClearColor, Commands, Entity, EventReader, HierarchyPlugin, ImagePlugin,
|
||||||
ImagePlugin, IntoSystemConfigs, Local, Query, Res, ResMut, Resource, Transform,
|
IntoSystemConfigs, Local, Query, Res, ResMut, Resource, TransformPlugin, With, World,
|
||||||
TransformPlugin, With, World,
|
|
||||||
};
|
};
|
||||||
use bevy::render::pipelined_rendering::PipelinedRenderingPlugin;
|
use bevy::render::pipelined_rendering::PipelinedRenderingPlugin;
|
||||||
use bevy::render::RenderPlugin;
|
use bevy::render::RenderPlugin;
|
||||||
@@ -37,8 +36,8 @@ use bevy::scene::ScenePlugin;
|
|||||||
use bevy::text::{Font, FontLoader};
|
use bevy::text::{Font, FontLoader};
|
||||||
use bevy::time::Time;
|
use bevy::time::Time;
|
||||||
use bevy::window::WindowPlugin;
|
use bevy::window::WindowPlugin;
|
||||||
use bevy::winit::{EventLoopProxyWrapper, WakeUp, WinitPlugin};
|
use bevy::winit::{WakeUp, WinitPlugin};
|
||||||
use bevy::{DefaultPlugins, MinimalPlugins};
|
use bevy::MinimalPlugins;
|
||||||
use bevy_mod_meshtext::MeshTextPlugin;
|
use bevy_mod_meshtext::MeshTextPlugin;
|
||||||
use bevy_mod_openxr::action_set_syncing::{OxrActionSyncingPlugin, OxrSyncActionSet};
|
use bevy_mod_openxr::action_set_syncing::{OxrActionSyncingPlugin, OxrSyncActionSet};
|
||||||
use bevy_mod_openxr::exts::OxrExtensions;
|
use bevy_mod_openxr::exts::OxrExtensions;
|
||||||
@@ -55,7 +54,6 @@ use bevy_mod_xr::spaces::XrPrimaryReferenceSpace;
|
|||||||
use bevy_plugin::{DbusConnection, DummyPbrPlugin, InputUpdate, StardustBevyPlugin, StardustFirst};
|
use bevy_plugin::{DbusConnection, DummyPbrPlugin, InputUpdate, StardustBevyPlugin, StardustFirst};
|
||||||
use bevy_sk::skytext::SphericalHarmonicsPlugin;
|
use bevy_sk::skytext::SphericalHarmonicsPlugin;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use color_eyre::eyre::eyre;
|
|
||||||
use core::client::Client;
|
use core::client::Client;
|
||||||
use core::task;
|
use core::task;
|
||||||
use directories::ProjectDirs;
|
use directories::ProjectDirs;
|
||||||
@@ -77,7 +75,6 @@ use std::path::PathBuf;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tokio::net::UnixListener;
|
use tokio::net::UnixListener;
|
||||||
use tokio::sync::Notify;
|
use tokio::sync::Notify;
|
||||||
use tracing::level_filters::LevelFilter;
|
|
||||||
use tracing::{debug_span, error, info, warn};
|
use tracing::{debug_span, error, info, warn};
|
||||||
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
|
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
|
||||||
use zbus::fdo::ObjectManager;
|
use zbus::fdo::ObjectManager;
|
||||||
@@ -293,6 +290,7 @@ fn bevy_loop(
|
|||||||
.add(CorePipelinePlugin)
|
.add(CorePipelinePlugin)
|
||||||
// very unsure what is needed here
|
// very unsure what is needed here
|
||||||
.add(PbrPlugin {
|
.add(PbrPlugin {
|
||||||
|
// hoping that there is very little overdraw in stardust
|
||||||
prepass_enabled: false,
|
prepass_enabled: false,
|
||||||
add_default_deferred_lighting_plugin: false,
|
add_default_deferred_lighting_plugin: false,
|
||||||
use_gpu_instance_buffer_builder: false,
|
use_gpu_instance_buffer_builder: false,
|
||||||
@@ -366,7 +364,7 @@ fn bevy_loop(
|
|||||||
load_internal_binary_asset!(
|
load_internal_binary_asset!(
|
||||||
bevy_app,
|
bevy_app,
|
||||||
Handle::default(),
|
Handle::default(),
|
||||||
"FiraMono-subset.ttf",
|
"nodes/drawable/assets/FiraMono-subset.ttf",
|
||||||
|bytes: &[u8], _path: String| { Font::try_from_bytes(bytes.to_vec()).unwrap() }
|
|bytes: &[u8], _path: String| { Font::try_from_bytes(bytes.to_vec()).unwrap() }
|
||||||
);
|
);
|
||||||
#[derive(Resource)]
|
#[derive(Resource)]
|
||||||
@@ -452,7 +450,7 @@ fn bevy_loop(
|
|||||||
sk_ready_notifier.notify_waiters();
|
sk_ready_notifier.notify_waiters();
|
||||||
info!("Stardust ready!");
|
info!("Stardust ready!");
|
||||||
|
|
||||||
let mut objects = ServerObjects::new(dbus_connection.clone());
|
let objects = ServerObjects::new(dbus_connection.clone());
|
||||||
fn sync_sets(session: Res<OxrSession>, mut events: EventReader<OxrSyncActionSet>) {
|
fn sync_sets(session: Res<OxrSession>, mut events: EventReader<OxrSyncActionSet>) {
|
||||||
let sets = events
|
let sets = events
|
||||||
.read()
|
.read()
|
||||||
@@ -490,7 +488,7 @@ fn bevy_loop(
|
|||||||
.run_system_cached(openxr_session_running)
|
.run_system_cached(openxr_session_running)
|
||||||
.unwrap_or(true)
|
.unwrap_or(true)
|
||||||
{
|
{
|
||||||
world.run_system_cached(sync_sets);
|
let _ = world.run_system_cached(sync_sets);
|
||||||
}
|
}
|
||||||
let thread = world
|
let thread = world
|
||||||
.run_system_cached(should_run_frame_loop)
|
.run_system_cached(should_run_frame_loop)
|
||||||
@@ -525,7 +523,7 @@ fn bevy_loop(
|
|||||||
}
|
}
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
wayland.update();
|
wayland.update();
|
||||||
};
|
}
|
||||||
bevy_app.add_systems(StardustFirst, bevy_step);
|
bevy_app.add_systems(StardustFirst, bevy_step);
|
||||||
let out = bevy_app.run();
|
let out = bevy_app.run();
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ fn spawn_sounds(reader: Res<SpawnSoundReader>, mut cmds: Commands, asset_server:
|
|||||||
},
|
},
|
||||||
))
|
))
|
||||||
.id();
|
.id();
|
||||||
sound.entity.set(e);
|
let _ = sound.entity.set(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1,8 +1,5 @@
|
|||||||
pub mod lines;
|
pub mod lines;
|
||||||
pub mod model;
|
pub mod model;
|
||||||
#[cfg(feature = "wayland")]
|
|
||||||
pub mod shader_manipulation;
|
|
||||||
pub mod shaders;
|
|
||||||
pub mod text;
|
pub mod text;
|
||||||
|
|
||||||
use self::{lines::Lines, model::Model, text::Text};
|
use self::{lines::Lines, model::Model, text::Text};
|
||||||
@@ -16,7 +13,6 @@ use crate::core::{
|
|||||||
resource::get_resource_file,
|
resource::get_resource_file,
|
||||||
};
|
};
|
||||||
use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO;
|
use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO;
|
||||||
use color_eyre::eyre::eyre;
|
|
||||||
use model::ModelPart;
|
use model::ModelPart;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use stardust_xr::values::ResourceID;
|
use stardust_xr::values::ResourceID;
|
||||||
|
|||||||
@@ -46,33 +46,28 @@ impl MaterialParameter {
|
|||||||
asset_server: &AssetServer,
|
asset_server: &AssetServer,
|
||||||
) {
|
) {
|
||||||
match self {
|
match self {
|
||||||
MaterialParameter::Bool(val) => match parameter_name {
|
MaterialParameter::Bool(val) => {
|
||||||
name => {
|
let name = parameter_name;
|
||||||
if let Some(field) = material.get_field_mut::<bool>(name) {
|
if let Some(field) = material.get_field_mut::<bool>(name) {
|
||||||
*field = *val;
|
*field = *val;
|
||||||
} else {
|
} else {
|
||||||
warn!("unknown bool material parameter name: {name}");
|
warn!("unknown bool material parameter name: {name}");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
MaterialParameter::Int(val) => match parameter_name {
|
MaterialParameter::Int(val) => {
|
||||||
name => {
|
if let Some(field) = material.get_field_mut::<i32>(parameter_name) {
|
||||||
if let Some(field) = material.get_field_mut::<i32>(name) {
|
*field = *val;
|
||||||
*field = *val;
|
} else {
|
||||||
} else {
|
warn!("unknown i32 material parameter name: {parameter_name}");
|
||||||
warn!("unknown i32 material parameter name: {name}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
MaterialParameter::UInt(val) => match parameter_name {
|
MaterialParameter::UInt(val) => {
|
||||||
name => {
|
if let Some(field) = material.get_field_mut::<u32>(parameter_name) {
|
||||||
if let Some(field) = material.get_field_mut::<u32>(name) {
|
*field = *val;
|
||||||
*field = *val;
|
} else {
|
||||||
} else {
|
warn!("unknown u32 material parameter name: {parameter_name}");
|
||||||
warn!("unknown u32 material parameter name: {name}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
MaterialParameter::Float(val) => match parameter_name {
|
MaterialParameter::Float(val) => match parameter_name {
|
||||||
"cutoff" => {
|
"cutoff" => {
|
||||||
// should this only set the value if AlphaMode is already AlphaMode::Mask?
|
// should this only set the value if AlphaMode is already AlphaMode::Mask?
|
||||||
@@ -89,24 +84,20 @@ impl MaterialParameter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
MaterialParameter::Vec2(val) => match parameter_name {
|
MaterialParameter::Vec2(val) => {
|
||||||
name => {
|
if let Some(field) = material.get_field_mut::<Vec2>(parameter_name) {
|
||||||
if let Some(field) = material.get_field_mut::<Vec2>(name) {
|
*field = (*val).into();
|
||||||
*field = (*val).into();
|
} else {
|
||||||
} else {
|
warn!("unknown vec2 material parameter name: {parameter_name}");
|
||||||
warn!("unknown vec2 material parameter name: {name}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
MaterialParameter::Vec3(val) => match parameter_name {
|
MaterialParameter::Vec3(val) => {
|
||||||
name => {
|
if let Some(field) = material.get_field_mut::<Vec3>(parameter_name) {
|
||||||
if let Some(field) = material.get_field_mut::<Vec3>(name) {
|
*field = (*val).into();
|
||||||
*field = (*val).into();
|
} else {
|
||||||
} else {
|
warn!("unknown vec3 material parameter name: {parameter_name}");
|
||||||
warn!("unknown vec3 material parameter name: {name}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
MaterialParameter::Color(val) => match parameter_name {
|
MaterialParameter::Color(val) => match parameter_name {
|
||||||
"color" => {
|
"color" => {
|
||||||
material.color = Srgba::new(val.c.r, val.c.g, val.c.b, val.a).into()
|
material.color = Srgba::new(val.c.r, val.c.g, val.c.b, val.a).into()
|
||||||
@@ -176,7 +167,7 @@ pub struct StardustModelPlugin;
|
|||||||
impl Plugin for StardustModelPlugin {
|
impl Plugin for StardustModelPlugin {
|
||||||
fn build(&self, app: &mut bevy::prelude::App) {
|
fn build(&self, app: &mut bevy::prelude::App) {
|
||||||
let (tx, rx) = crossbeam_channel::unbounded();
|
let (tx, rx) = crossbeam_channel::unbounded();
|
||||||
LOAD_MODEL_SENDER.set(tx);
|
let _ = LOAD_MODEL_SENDER.set(tx);
|
||||||
app.insert_resource(LoadModelReader(rx));
|
app.insert_resource(LoadModelReader(rx));
|
||||||
app.add_systems(Update, create_model_parts_for_loaded_models);
|
app.add_systems(Update, create_model_parts_for_loaded_models);
|
||||||
app.add_systems(PreUpdate, load_models);
|
app.add_systems(PreUpdate, load_models);
|
||||||
@@ -214,7 +205,7 @@ fn load_models(rx: Res<LoadModelReader>, mut cmds: Commands, asset_server: Res<A
|
|||||||
UnprocessedModel,
|
UnprocessedModel,
|
||||||
))
|
))
|
||||||
.id();
|
.id();
|
||||||
model.entity.set(entity);
|
let _ = model.entity.set(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -444,7 +435,7 @@ impl Model {
|
|||||||
});
|
});
|
||||||
MODEL_REGISTRY.add_raw(&model);
|
MODEL_REGISTRY.add_raw(&model);
|
||||||
if let Some(sender) = LOAD_MODEL_SENDER.get() {
|
if let Some(sender) = LOAD_MODEL_SENDER.get() {
|
||||||
sender.send((pending_model_path, model.clone()));
|
let _ = sender.send((pending_model_path, model.clone()));
|
||||||
}
|
}
|
||||||
node.add_aspect_raw(model.clone());
|
node.add_aspect_raw(model.clone());
|
||||||
Ok(model)
|
Ok(model)
|
||||||
|
|||||||
@@ -1,137 +0,0 @@
|
|||||||
#![allow(dead_code)]
|
|
||||||
use smithay::backend::renderer::gles::{
|
|
||||||
ffi::{self, Gles2, FRAGMENT_SHADER, VERTEX_SHADER},
|
|
||||||
GlesError,
|
|
||||||
};
|
|
||||||
use stereokit_rust::shader::{Shader, _ShaderT};
|
|
||||||
use tracing::error;
|
|
||||||
|
|
||||||
struct FfiAssetHeader {
|
|
||||||
asset_type: i32,
|
|
||||||
asset_state: i32,
|
|
||||||
id: u64,
|
|
||||||
index: u64,
|
|
||||||
refs: i32,
|
|
||||||
debug: *mut u8,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FfiSkgShader {
|
|
||||||
meta: *mut u8,
|
|
||||||
vertex: u32,
|
|
||||||
pixel: u32,
|
|
||||||
program: u32,
|
|
||||||
compute: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FfiShader {
|
|
||||||
header: FfiAssetHeader,
|
|
||||||
shader: FfiSkgShader,
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe fn compile_shader(
|
|
||||||
gl: &ffi::Gles2,
|
|
||||||
variant: ffi::types::GLuint,
|
|
||||||
src: &str,
|
|
||||||
) -> Result<ffi::types::GLuint, GlesError> {
|
|
||||||
let shader = gl.CreateShader(variant);
|
|
||||||
if shader == 0 {
|
|
||||||
return Err(GlesError::CreateShaderObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
gl.ShaderSource(
|
|
||||||
shader,
|
|
||||||
1,
|
|
||||||
&src.as_ptr() as *const *const u8 as *const *const ffi::types::GLchar,
|
|
||||||
&(src.len() as i32) as *const _,
|
|
||||||
);
|
|
||||||
gl.CompileShader(shader);
|
|
||||||
|
|
||||||
let mut status = ffi::FALSE as i32;
|
|
||||||
gl.GetShaderiv(shader, ffi::COMPILE_STATUS, &mut status as *mut _);
|
|
||||||
if status == ffi::FALSE as i32 {
|
|
||||||
let mut max_len = 0;
|
|
||||||
gl.GetShaderiv(shader, ffi::INFO_LOG_LENGTH, &mut max_len as *mut _);
|
|
||||||
|
|
||||||
let mut error = Vec::with_capacity(max_len as usize);
|
|
||||||
let mut len = 0;
|
|
||||||
gl.GetShaderInfoLog(
|
|
||||||
shader,
|
|
||||||
max_len as _,
|
|
||||||
&mut len as *mut _,
|
|
||||||
error.as_mut_ptr() as *mut _,
|
|
||||||
);
|
|
||||||
error.set_len(len as usize);
|
|
||||||
|
|
||||||
error!(
|
|
||||||
"[GL] {}",
|
|
||||||
std::str::from_utf8(&error).unwrap_or("<Error Message no utf8>")
|
|
||||||
);
|
|
||||||
|
|
||||||
gl.DeleteShader(shader);
|
|
||||||
return Err(GlesError::ShaderCompileError);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(shader)
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe fn link_program(
|
|
||||||
gl: &ffi::Gles2,
|
|
||||||
vert: ffi::types::GLuint,
|
|
||||||
frag: ffi::types::GLuint,
|
|
||||||
) -> Result<ffi::types::GLuint, GlesError> {
|
|
||||||
let program = gl.CreateProgram();
|
|
||||||
gl.AttachShader(program, vert);
|
|
||||||
gl.AttachShader(program, frag);
|
|
||||||
gl.LinkProgram(program);
|
|
||||||
// gl.DetachShader(program, vert);
|
|
||||||
// gl.DetachShader(program, frag);
|
|
||||||
// gl.DeleteShader(vert);
|
|
||||||
// gl.DeleteShader(frag);
|
|
||||||
|
|
||||||
let mut status = ffi::FALSE as i32;
|
|
||||||
gl.GetProgramiv(program, ffi::LINK_STATUS, &mut status as *mut _);
|
|
||||||
if status == ffi::FALSE as i32 {
|
|
||||||
let mut max_len = 0;
|
|
||||||
gl.GetProgramiv(program, ffi::INFO_LOG_LENGTH, &mut max_len as *mut _);
|
|
||||||
|
|
||||||
let mut error = Vec::with_capacity(max_len as usize);
|
|
||||||
let mut len = 0;
|
|
||||||
gl.GetProgramInfoLog(
|
|
||||||
program,
|
|
||||||
max_len as _,
|
|
||||||
&mut len as *mut _,
|
|
||||||
error.as_mut_ptr() as *mut _,
|
|
||||||
);
|
|
||||||
error.set_len(len as usize);
|
|
||||||
|
|
||||||
error!(
|
|
||||||
"[GL] {}",
|
|
||||||
std::str::from_utf8(&error).unwrap_or("<Error Message no utf8>")
|
|
||||||
);
|
|
||||||
|
|
||||||
gl.DeleteProgram(program);
|
|
||||||
return Err(GlesError::ProgramLinkError);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(program)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn shader_inject(
|
|
||||||
c: &Gles2,
|
|
||||||
sk_shader: &mut Shader,
|
|
||||||
vert_str: &str,
|
|
||||||
frag_str: &str,
|
|
||||||
) -> Result<(), GlesError> {
|
|
||||||
let gl_vert = compile_shader(c, VERTEX_SHADER, vert_str)?;
|
|
||||||
let gl_frag = compile_shader(c, FRAGMENT_SHADER, frag_str)?;
|
|
||||||
let gl_prog = link_program(c, gl_vert, gl_frag)?;
|
|
||||||
|
|
||||||
let shader = sk_shader.0.as_mut() as *mut _ShaderT as *mut FfiShader;
|
|
||||||
if let Some(shader) = shader.as_mut() {
|
|
||||||
shader.shader.vertex = gl_vert;
|
|
||||||
shader.shader.pixel = gl_frag;
|
|
||||||
shader.shader.program = gl_prog;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
// Simula shader with fancy lanzcos sampling
|
|
||||||
pub const UNLIT_SHADER_BYTES: &[u8] = include_bytes!("assets/shaders/shader_unlit_gamma.hlsl.sks");
|
|
||||||
|
|
||||||
// Simula shader with fancy lanzcos sampling
|
|
||||||
pub const PANEL_SHADER_BYTES: &[u8] = include_bytes!("assets/shaders/shader_unlit_simula.hlsl.sks");
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
#include "stereokit.hlsli"
|
|
||||||
|
|
||||||
//--name = sk/unlit
|
|
||||||
//--diffuse = white
|
|
||||||
//--uv_offset = 0.0, 0.0
|
|
||||||
//--uv_scale = 1.0, 1.0
|
|
||||||
Texture2D diffuse : register(t0);
|
|
||||||
SamplerState diffuse_s : register(s0);
|
|
||||||
float2 uv_scale;
|
|
||||||
float2 uv_offset;
|
|
||||||
|
|
||||||
struct vsIn {
|
|
||||||
float4 pos : SV_Position;
|
|
||||||
float3 norm : NORMAL0;
|
|
||||||
float2 uv : TEXCOORD0;
|
|
||||||
};
|
|
||||||
struct psIn {
|
|
||||||
float4 pos : SV_POSITION;
|
|
||||||
float2 uv : TEXCOORD0;
|
|
||||||
uint view_id : SV_RenderTargetArrayIndex;
|
|
||||||
};
|
|
||||||
|
|
||||||
psIn vs(vsIn input, uint id : SV_InstanceID) {
|
|
||||||
psIn o;
|
|
||||||
o.view_id = id % sk_view_count;
|
|
||||||
id = id / sk_view_count;
|
|
||||||
|
|
||||||
float3 world = mul(float4(input.pos.xyz, 1), sk_inst[id].world).xyz;
|
|
||||||
o.pos = mul(float4(world, 1), sk_viewproj[o.view_id]);
|
|
||||||
|
|
||||||
o.uv = (input.uv + uv_offset) * uv_scale;
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
float4 ps(psIn input) : SV_TARGET {
|
|
||||||
float4 col = diffuse.Sample(diffuse_s, input.uv);
|
|
||||||
col.rgb = pow(col.rgb, float3(2.2));
|
|
||||||
|
|
||||||
return col;
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
#include "stereokit.hlsli"
|
|
||||||
|
|
||||||
// Port of https://github.com/SimulaVR/Simula/blob/master/addons/godot-haskell-plugin/TextShader.tres to StereoKit and HLSL.
|
|
||||||
|
|
||||||
//--name = stardust/text_shader
|
|
||||||
//--diffuse = white
|
|
||||||
//--uv_offset = 0.0, 0.0
|
|
||||||
//--uv_scale = 1.0, 1.0
|
|
||||||
//--fcFactor = 1.0
|
|
||||||
//--ripple = 4.0
|
|
||||||
//--alpha_min = 0.0
|
|
||||||
//--alpha_max = 1.0
|
|
||||||
Texture2D diffuse : register(t0);
|
|
||||||
SamplerState diffuse_s : register(s0);
|
|
||||||
float4 diffuse_i;
|
|
||||||
float2 uv_scale;
|
|
||||||
float2 uv_offset;
|
|
||||||
float fcFactor;
|
|
||||||
float ripple;
|
|
||||||
float alpha_min;
|
|
||||||
float alpha_max;
|
|
||||||
|
|
||||||
struct vsIn {
|
|
||||||
float4 pos : SV_Position;
|
|
||||||
float3 norm : NORMAL0;
|
|
||||||
float2 uv : TEXCOORD0;
|
|
||||||
};
|
|
||||||
struct psIn {
|
|
||||||
float4 pos : SV_POSITION;
|
|
||||||
float2 uv : TEXCOORD0;
|
|
||||||
uint view_id : SV_RenderTargetArrayIndex;
|
|
||||||
};
|
|
||||||
|
|
||||||
psIn vs(vsIn input, uint id : SV_InstanceID) {
|
|
||||||
psIn o;
|
|
||||||
o.view_id = id % sk_view_count;
|
|
||||||
id = id / sk_view_count;
|
|
||||||
|
|
||||||
float3 world = mul(float4(input.pos.xyz, 1), sk_inst[id].world).xyz;
|
|
||||||
o.pos = mul(float4(world, 1), sk_viewproj[o.view_id]);
|
|
||||||
|
|
||||||
o.uv = (input.uv + uv_offset) * uv_scale;
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
float map(float value, float min1, float max1, float min2, float max2) {
|
|
||||||
return min2 + (value - min1) * (max2 - min2) / (max1 - min1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// float gaussian(float x, float t) {
|
|
||||||
// float PI = 3.14159265358;
|
|
||||||
// return exp(-x*x/(2.0 * t*t))/(sqrt(2.0*PI)*t);
|
|
||||||
// }
|
|
||||||
|
|
||||||
float besselI0(float x) {
|
|
||||||
return 1.0 + pow(x, 2.0) * (0.25 + pow(x, 2.0) * (0.015625 + pow(x, 2.0) * (0.000434028 + pow(x, 2.0) * (6.78168e-6 + pow(x, 2.0) * (6.78168e-8 + pow(x, 2.0) * (4.7095e-10 + pow(x, 2.0) * (2.40281e-12 + pow(x, 2.0) * (9.38597e-15 + pow(x, 2.0) * (2.8969e-17 + 7.24226e-20 * pow(x, 2.0))))))))));
|
|
||||||
}
|
|
||||||
|
|
||||||
float kaiser(float x, float alpha) {
|
|
||||||
if (x > 1.0) {
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
return besselI0(alpha * sqrt(1.0-x*x));
|
|
||||||
}
|
|
||||||
|
|
||||||
float4 lowpassFilter(Texture2D tex, sampler2D texSampler, float2 uv, float alpha) {
|
|
||||||
float PI = 3.14159265358;
|
|
||||||
|
|
||||||
float4 q = float4(0.0);
|
|
||||||
|
|
||||||
float2 dx_uv = ddx(uv);
|
|
||||||
float2 dy_uv = ddy(uv);
|
|
||||||
//float width = sqrt(max(dot(dx_uv, dx_uv), dot(dy_uv, dy_uv)));
|
|
||||||
float2 width = abs(float2(dx_uv.x, dy_uv.y));
|
|
||||||
|
|
||||||
float2 pixelWidth = floor(width * diffuse_i.xy);
|
|
||||||
float2 aspectRatio = normalize(pixelWidth);
|
|
||||||
|
|
||||||
float2 xyf = uv * diffuse_i.xy;
|
|
||||||
int2 xy = int2(xyf);
|
|
||||||
|
|
||||||
pixelWidth = clamp(pixelWidth, float2(1.0), float2(2.0));
|
|
||||||
|
|
||||||
int2 start = xy - int2(pixelWidth);
|
|
||||||
int2 end = xy + int2(pixelWidth);
|
|
||||||
|
|
||||||
float4 outColor = float4(0.0);
|
|
||||||
|
|
||||||
float qSum = 0.0;
|
|
||||||
|
|
||||||
for (int v = start.y; v <= end.y; v++) {
|
|
||||||
for (int u = start.x; u <= end.x; u++) {
|
|
||||||
float kx = fcFactor * (xyf.x - float(u))/pixelWidth.x;
|
|
||||||
float ky = fcFactor * (xyf.y - float(v))/pixelWidth.y;
|
|
||||||
|
|
||||||
//float lanczosValue = gaussian(kx, fcx);
|
|
||||||
float lanczosValue = kaiser(sqrt(kx*kx + ky*ky), alpha);
|
|
||||||
|
|
||||||
q += tex.Sample(texSampler, (float2(u, v)+float2(0.5))/diffuse_i.xy) * lanczosValue;
|
|
||||||
// q += tex.Load(int3(u, v, 0)) * lanczosValue;
|
|
||||||
qSum += lanczosValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return q/qSum;
|
|
||||||
}
|
|
||||||
|
|
||||||
float4 ps(psIn input) : SV_TARGET {
|
|
||||||
float gamma = 2.2;
|
|
||||||
// float4 col = diffuse.Sample(diffuse_s, input.uv);
|
|
||||||
|
|
||||||
// float4 col = lowpassFilter(diffuse, diffuse_s, diffuse_i.xy, float2(1.0 - input.uv.x, input.uv.y), ripple);
|
|
||||||
float4 col = lowpassFilter(diffuse, diffuse_s, input.uv, ripple);
|
|
||||||
// float4 col = diffuse.Sample(diffuse_s, input.uv);
|
|
||||||
col.rgb = pow(col.rgb, float3(gamma));
|
|
||||||
col.a = map(col.a, 0, 1, alpha_min, alpha_max);
|
|
||||||
|
|
||||||
return col;
|
|
||||||
}
|
|
||||||
@@ -51,9 +51,9 @@ impl Plugin for StardustTextPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_text(mut surface_query: Query<(&mut Transform)>) {
|
fn update_text(mut surface_query: Query<&mut Transform>) {
|
||||||
for text in TEXT_REGISTRY.get_valid_contents() {
|
for text in TEXT_REGISTRY.get_valid_contents() {
|
||||||
let Some((mut transform)) = text
|
let Some(mut transform) = text
|
||||||
.entity
|
.entity
|
||||||
.get()
|
.get()
|
||||||
.and_then(|v| surface_query.get_mut(*v).ok())
|
.and_then(|v| surface_query.get_mut(*v).ok())
|
||||||
@@ -105,7 +105,7 @@ fn spawn_text(
|
|||||||
let entity = text_entity.id();
|
let entity = text_entity.id();
|
||||||
|
|
||||||
let _span = info_span!("setting OneCells").entered();
|
let _span = info_span!("setting OneCells").entered();
|
||||||
text.entity.set(entity);
|
let _ = text.entity.set(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static SPAWN_TEXT_SENDER: OnceCell<crossbeam_channel::Sender<Arc<Text>>> = OnceCell::new();
|
static SPAWN_TEXT_SENDER: OnceCell<crossbeam_channel::Sender<Arc<Text>>> = OnceCell::new();
|
||||||
@@ -133,7 +133,7 @@ impl Text {
|
|||||||
});
|
});
|
||||||
node.add_aspect_raw(text.clone());
|
node.add_aspect_raw(text.clone());
|
||||||
if let Some(sender) = SPAWN_TEXT_SENDER.get() {
|
if let Some(sender) = SPAWN_TEXT_SENDER.get() {
|
||||||
sender.send(text.clone());
|
let _ = sender.send(text.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(text)
|
Ok(text)
|
||||||
@@ -159,7 +159,7 @@ impl TextAspect for Text {
|
|||||||
impl Drop for Text {
|
impl Drop for Text {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if let Some(e) = self.entity.get() {
|
if let Some(e) = self.entity.get() {
|
||||||
DESTROY_ENTITY.send(*e);
|
let _ = DESTROY_ENTITY.send(*e);
|
||||||
}
|
}
|
||||||
TEXT_REGISTRY.remove(self);
|
TEXT_REGISTRY.remove(self);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -199,9 +199,9 @@ impl ServerObjects {
|
|||||||
// controller_right.update(token);
|
// controller_right.update(token);
|
||||||
// hand_left.update(sk, token);
|
// hand_left.update(sk, token);
|
||||||
// hand_right.update(sk, token);
|
// hand_right.update(sk, token);
|
||||||
if let Some(eye_pointer) = eye_pointer {
|
// if let Some(eye_pointer) = eye_pointer {
|
||||||
eye_pointer.update();
|
// eye_pointer.update();
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
Some(Inputs::MousePointer(mouse_pointer)) => {}
|
Some(Inputs::MousePointer(mouse_pointer)) => {}
|
||||||
// Inputs::Controllers((left, right)) => {
|
// Inputs::Controllers((left, right)) => {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use bevy::{
|
use bevy::{
|
||||||
app::{App, MainScheduleOrder, Plugin, PostUpdate},
|
app::{App, Plugin, PostUpdate},
|
||||||
ecs::schedule::ScheduleLabel,
|
|
||||||
prelude::{resource_added, IntoSystemConfigs as _, TransformSystem},
|
prelude::{resource_added, IntoSystemConfigs as _, TransformSystem},
|
||||||
render::{
|
render::{
|
||||||
extract_resource::ExtractResourcePlugin, pipelined_rendering::PipelinedRenderingPlugin,
|
extract_resource::ExtractResourcePlugin, pipelined_rendering::PipelinedRenderingPlugin,
|
||||||
@@ -19,7 +18,7 @@ use bevy_mod_openxr::{
|
|||||||
},
|
},
|
||||||
session::OxrSession,
|
session::OxrSession,
|
||||||
};
|
};
|
||||||
use bevy_mod_xr::session::{XrFirst, XrPreDestroySession, XrRenderSet, XrSessionCreated};
|
use bevy_mod_xr::session::{XrPreDestroySession, XrRenderSet, XrSessionCreated};
|
||||||
|
|
||||||
pub struct StardustOxrRenderPlugin;
|
pub struct StardustOxrRenderPlugin;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user