Compare commits
11 Commits
camera-ite
...
camera-ite
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e7adbca48 | ||
|
|
f80f891636 | ||
|
|
fe9daf168d | ||
|
|
c653c3caa4 | ||
|
|
ce775d8820 | ||
|
|
e9d859961f | ||
|
|
05128f84be | ||
|
|
2a160079bc | ||
|
|
b60c756d8b | ||
|
|
70ab9c5c1d | ||
|
|
ff7b8273c8 |
42
Cargo.lock
generated
42
Cargo.lock
generated
@@ -133,9 +133,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.73"
|
||||
version = "0.1.74"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
|
||||
checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -261,9 +261,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.4.0"
|
||||
version = "2.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
|
||||
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
@@ -303,7 +303,7 @@ version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b50b5a44d59a98c55a9eeb518f39bf7499ba19fd98ee7d22618687f3f10adbf"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"log",
|
||||
"polling",
|
||||
"rustix",
|
||||
@@ -597,7 +597,7 @@ version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "97fb1b703ffbc7ebd216eba7900008049a56ace55580ecb2ee7fa801e8d8be87"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"bytemuck",
|
||||
"drm-ffi",
|
||||
"drm-fourcc",
|
||||
@@ -1303,7 +1303,7 @@ version = "0.27.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"memoffset 0.9.0",
|
||||
@@ -1756,13 +1756,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.10.1"
|
||||
version = "1.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aaac441002f822bc9705a681810a4dd2963094b9ca0ddc41cb963a4c189189ea"
|
||||
checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-automata 0.4.2",
|
||||
"regex-automata 0.4.3",
|
||||
"regex-syntax 0.8.2",
|
||||
]
|
||||
|
||||
@@ -1777,9 +1777,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.2"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5011c7e263a695dc8ca064cddb722af1be54e517a280b12a5356f98366899e5d"
|
||||
checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1825,7 +1825,7 @@ version = "0.38.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
@@ -1958,10 +1958,10 @@ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
|
||||
[[package]]
|
||||
name = "smithay"
|
||||
version = "0.3.0"
|
||||
source = "git+https://github.com/smithay/smithay.git#4e41ab0694c1c43324cc217dcf2a203cd240c0dc"
|
||||
source = "git+https://github.com/smithay/smithay.git#fb1afbf63e58d15b715251cf0f608ef1c0de6e6d"
|
||||
dependencies = [
|
||||
"appendlist",
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"calloop",
|
||||
"cgmath",
|
||||
"cursor-icon",
|
||||
@@ -2016,7 +2016,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "stardust-xr"
|
||||
version = "0.14.1"
|
||||
source = "git+https://github.com/StardustXR/core.git?branch=camera-item#2689f608c1375799f2042d5d8a5f3efa76bf57ec"
|
||||
source = "git+https://github.com/StardustXR/core.git?branch=camera-item#272f961be2c7e0369626ce70e56c266aefccef14"
|
||||
dependencies = [
|
||||
"cluFlock",
|
||||
"color-rs",
|
||||
@@ -2037,7 +2037,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "stardust-xr-schemas"
|
||||
version = "1.5.3"
|
||||
source = "git+https://github.com/StardustXR/core.git?branch=camera-item#2689f608c1375799f2042d5d8a5f3efa76bf57ec"
|
||||
source = "git+https://github.com/StardustXR/core.git?branch=camera-item#272f961be2c7e0369626ce70e56c266aefccef14"
|
||||
dependencies = [
|
||||
"flatbuffers",
|
||||
"flexbuffers",
|
||||
@@ -2498,7 +2498,7 @@ version = "0.31.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"wayland-backend",
|
||||
"wayland-scanner",
|
||||
"wayland-server",
|
||||
@@ -2510,7 +2510,7 @@ version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bfa5933740b200188c9b4c38601b8212e8c154d7de0d2cb171944e137a77de1e"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"wayland-backend",
|
||||
"wayland-protocols",
|
||||
"wayland-scanner",
|
||||
@@ -2523,7 +2523,7 @@ version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"wayland-backend",
|
||||
"wayland-protocols",
|
||||
"wayland-scanner",
|
||||
@@ -2547,7 +2547,7 @@ version = "0.31.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f3f0c52a445936ca1184c98f1a69cf4ad9c9130788884531ef04428468cb1ce"
|
||||
dependencies = [
|
||||
"bitflags 2.4.0",
|
||||
"bitflags 2.4.1",
|
||||
"downcast-rs",
|
||||
"io-lifetimes",
|
||||
"nix 0.26.4",
|
||||
|
||||
@@ -26,12 +26,12 @@ use smithay::backend::{
|
||||
dmabuf::{Dmabuf, DmabufFlags},
|
||||
Buffer,
|
||||
},
|
||||
renderer::{gles, ImportDma},
|
||||
renderer::ImportDma,
|
||||
};
|
||||
use stardust_xr::{
|
||||
scenegraph::ScenegraphError,
|
||||
schemas::flex::{deserialize, serialize},
|
||||
values::{BufferColorspace, BufferInfo, Transform},
|
||||
values::{BufferInfo, Transform},
|
||||
};
|
||||
use std::{ffi::c_void, sync::Arc};
|
||||
use stereokit::{
|
||||
@@ -43,7 +43,7 @@ use tokio::sync::mpsc::{self, error::SendError};
|
||||
lazy_static! {
|
||||
pub(super) static ref ITEM_TYPE_INFO_CAMERA: TypeInfo = TypeInfo {
|
||||
type_name: "camera",
|
||||
aliased_local_signals: vec!["apply_preview_material"],
|
||||
aliased_local_signals: vec!["apply_preview_material", "set_proj_matrix"],
|
||||
aliased_local_methods: vec!["render"],
|
||||
aliased_remote_signals: vec![],
|
||||
ui: Default::default(),
|
||||
@@ -62,9 +62,8 @@ pub struct CameraItem {
|
||||
frame_info: Mutex<FrameInfo>,
|
||||
sk_tex: OnceCell<Tex>,
|
||||
sk_mat: OnceCell<Arc<Material>>,
|
||||
render_requests_tx: mpsc::UnboundedSender<(Dmabuf, BufferColorspace, MethodResponseSender)>,
|
||||
render_requests_rx:
|
||||
Mutex<mpsc::UnboundedReceiver<(Dmabuf, BufferColorspace, MethodResponseSender)>>,
|
||||
render_requests_tx: mpsc::UnboundedSender<(Dmabuf, MethodResponseSender)>,
|
||||
render_requests_rx: Mutex<mpsc::UnboundedReceiver<(Dmabuf, MethodResponseSender)>>,
|
||||
rendered_notifiers: Mutex<Vec<MethodResponseSender>>,
|
||||
applied_preview_to: Registry<ModelPart>,
|
||||
apply_preview_to: Registry<ModelPart>,
|
||||
@@ -97,6 +96,7 @@ impl CameraItem {
|
||||
"apply_preview_material",
|
||||
CameraItem::apply_preview_material_flex,
|
||||
);
|
||||
node.add_local_signal("set_proj_matrix", CameraItem::set_proj_matrix_flex);
|
||||
}
|
||||
|
||||
fn render_flex(
|
||||
@@ -143,10 +143,8 @@ impl CameraItem {
|
||||
}
|
||||
let buffer_to_render = builder.build().unwrap();
|
||||
|
||||
if let Err(SendError((_dmabuf, _colorspace, sender))) =
|
||||
camera
|
||||
.render_requests_tx
|
||||
.send((buffer_to_render, buffer_info.colorspace, response))
|
||||
if let Err(SendError((_dmabuf, sender))) =
|
||||
camera.render_requests_tx.send((buffer_to_render, response))
|
||||
{
|
||||
sender.send(Err(ScenegraphError::MethodError {
|
||||
error: "Internal: sender broke????".to_string(),
|
||||
@@ -180,6 +178,26 @@ impl CameraItem {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn set_proj_matrix_flex(
|
||||
node: &Node,
|
||||
_calling_client: Arc<Client>,
|
||||
message: Message,
|
||||
) -> Result<()> {
|
||||
let Some(item) = node.item.get() else {
|
||||
bail!("Item not found?")
|
||||
};
|
||||
let ItemType::Camera(camera) = &item.specialization else {
|
||||
bail!("Wrong item type?")
|
||||
};
|
||||
|
||||
let proj_matrix: RowMatrix4<f32> = deserialize(&message.data)?;
|
||||
|
||||
let mut frame_info = camera.frame_info.lock();
|
||||
frame_info.proj_matrix = proj_matrix.into();
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn serialize_start_data(&self, id: &str) -> Result<Message> {
|
||||
Ok(serialize(id)?.into())
|
||||
}
|
||||
@@ -238,9 +256,7 @@ impl CameraItem {
|
||||
) {
|
||||
let mut render_notifiers = self.rendered_notifiers.lock();
|
||||
let mut render_requests_rx = self.render_requests_rx.lock();
|
||||
while let Ok((buffer_to_render, colorspace, render_response_sender)) =
|
||||
render_requests_rx.try_recv()
|
||||
{
|
||||
while let Ok((buffer_to_render, render_response_sender)) = render_requests_rx.try_recv() {
|
||||
let imported_dmabuf = buffer_manager
|
||||
.renderer
|
||||
.import_dmabuf(&buffer_to_render, None);
|
||||
@@ -254,52 +270,13 @@ impl CameraItem {
|
||||
}
|
||||
};
|
||||
|
||||
let texture_format;
|
||||
let native_format;
|
||||
|
||||
match colorspace {
|
||||
BufferColorspace::SRGB => match buffer_to_render.format().code {
|
||||
drm_fourcc::DrmFourcc::Argb8888 => {
|
||||
texture_format = TextureFormat::RGBA32;
|
||||
native_format = gles::ffi::SRGB8_ALPHA8;
|
||||
}
|
||||
drm_fourcc::DrmFourcc::Abgr8888 => {
|
||||
texture_format = TextureFormat::BGRA32;
|
||||
native_format = gles::ffi::SRGB8_ALPHA8;
|
||||
}
|
||||
_ => {
|
||||
let _ = render_response_sender.send(Err(ScenegraphError::MethodError {
|
||||
error: "Unsupported pixel format".to_string(),
|
||||
}));
|
||||
continue;
|
||||
}
|
||||
},
|
||||
BufferColorspace::Linear => match buffer_to_render.format().code {
|
||||
drm_fourcc::DrmFourcc::Argb8888 => {
|
||||
texture_format = TextureFormat::RGBA32Linear;
|
||||
native_format = gles::ffi::RGBA8;
|
||||
}
|
||||
drm_fourcc::DrmFourcc::Abgr8888 => {
|
||||
texture_format = TextureFormat::BGRA32Linear;
|
||||
native_format = gles::ffi::RGBA8;
|
||||
}
|
||||
_ => {
|
||||
let _ = render_response_sender.send(Err(ScenegraphError::MethodError {
|
||||
error: "Unsupported pixel format".to_string(),
|
||||
}));
|
||||
continue;
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// TODO: This doesn't seem to care about the texture format, it seems to always output with sRGB.
|
||||
let sk_tex = sk.tex_create(TextureType::IMAGE_NO_MIPS, texture_format);
|
||||
let sk_tex = sk.tex_create(TextureType::IMAGE_NO_MIPS, TextureFormat::RGBA32);
|
||||
unsafe {
|
||||
sk.tex_set_surface(
|
||||
&sk_tex,
|
||||
smithay_tex.tex_id() as usize as *mut c_void,
|
||||
TextureType::RENDER_TARGET,
|
||||
native_format.into(),
|
||||
smithay::backend::renderer::gles::ffi::SRGB8_ALPHA8.into(),
|
||||
buffer_to_render.size().w,
|
||||
buffer_to_render.size().h,
|
||||
1,
|
||||
|
||||
Reference in New Issue
Block a user