feat(drawable): set sky

This commit is contained in:
Nova
2022-09-26 00:39:56 -04:00
parent bbd3159a62
commit a80ddf501d
4 changed files with 74 additions and 43 deletions

View File

@@ -1,19 +1,60 @@
pub mod model;
use super::Node;
use crate::core::{client::Client, registry::Registry};
use std::sync::Arc;
use stereokit::{lifecycle::DrawContext, StereoKit};
pub trait Drawable: Send + Sync {
fn draw(&self, sk: &StereoKit, draw_ctx: &DrawContext);
}
pub static DRAWABLE_REGISTRY: Registry<dyn Drawable> = Registry::new();
use crate::core::client::Client;
use anyhow::Result;
use parking_lot::Mutex;
use std::{path::PathBuf, str::FromStr, sync::Arc};
use stereokit::{lifecycle::DrawContext, texture::Texture, StereoKit};
pub fn create_interface(client: &Arc<Client>) {
let node = Node::create(client, "", "drawable", false);
node.add_local_signal("createModelFromFile", model::create_from_file);
node.add_local_signal("createModelFromResource", model::create_from_resource);
node.add_local_signal("setSkyFile", set_sky_file_flex);
node.add_to_scenegraph();
}
pub fn draw(sk: &mut StereoKit, draw_ctx: &DrawContext) {
model::draw_all(sk, draw_ctx);
let new_skytex = QUEUED_SKYTEX.lock().take();
let mut new_skylight = QUEUED_SKYLIGHT.lock().take();
let same_file = new_skytex == new_skylight;
if let Some(skytex) = new_skytex {
if let Some((skytex, skylight)) =
Texture::from_cubemap_equirectangular(sk, &skytex, true, i32::MAX)
{
sk.set_skytex(&skytex);
if same_file {
sk.set_skylight(&skylight);
new_skylight = None;
}
}
}
if let Some(skylight) = new_skylight {
if let Some((_, skylight)) =
Texture::from_cubemap_equirectangular(sk, &skylight, true, i32::MAX)
{
sk.set_skylight(&skylight);
}
}
}
static QUEUED_SKYLIGHT: Mutex<Option<PathBuf>> = Mutex::new(None);
static QUEUED_SKYTEX: Mutex<Option<PathBuf>> = Mutex::new(None);
fn set_sky_file_flex(_node: &Node, _calling_client: Arc<Client>, data: &[u8]) -> Result<()> {
let flex_vec = flexbuffers::Reader::get_root(data)?.get_vector()?;
let path = PathBuf::from_str(flex_vec.index(0)?.get_str()?)?;
path.metadata()?;
if flex_vec.idx(1).as_bool() {
QUEUED_SKYTEX.lock().replace(path.clone());
}
if flex_vec.idx(2).as_bool() {
QUEUED_SKYLIGHT.lock().replace(path);
}
Ok(())
}

View File

@@ -1,8 +1,7 @@
use super::{Drawable, Node};
use super::Node;
use crate::core::client::Client;
use crate::core::registry::Registry;
use crate::core::resource::{NamespacedResourceID, ResourceID};
use crate::nodes::drawable::DRAWABLE_REGISTRY;
use crate::nodes::spatial::{get_spatial_parent_flex, Spatial};
use anyhow::{anyhow, bail, ensure, Result};
use flexbuffers::FlexBufferType;
@@ -24,9 +23,9 @@ use stereokit::render::RenderLayer;
use stereokit::texture::Texture;
use stereokit::StereoKit;
pub static MODEL_REGISTRY: Registry<Model> = Registry::new();
static MODEL_REGISTRY: Registry<Model> = Registry::new();
lazy_static! {
pub static ref MODELS_TO_DROP: Mutex<Vec<SendWrapper<SKModel>>> = Default::default();
static ref MODELS_TO_DROP: Mutex<Vec<SendWrapper<SKModel>>> = Default::default();
}
pub enum MaterialParameter {
@@ -62,7 +61,6 @@ impl Model {
};
node.add_local_signal("setMaterialParameter", Model::set_material_parameter);
let model_arc = MODEL_REGISTRY.add(model);
DRAWABLE_REGISTRY.add_raw(&(model_arc.clone() as Arc<dyn Drawable>));
let _ = model_arc.pending_model_path.set(
model_arc
.resource_id
@@ -104,8 +102,7 @@ impl Model {
Ok(())
}
}
impl Drawable for Model {
fn draw(&self, sk: &StereoKit, draw_ctx: &DrawContext) {
let sk_model = self
.sk_model
@@ -162,7 +159,12 @@ impl Drop for Model {
MODELS_TO_DROP.lock().push(model);
}
MODEL_REGISTRY.remove(self);
DRAWABLE_REGISTRY.remove(self);
}
}
pub fn draw_all(sk: &StereoKit, draw_ctx: &DrawContext) {
for model in MODEL_REGISTRY.get_valid_contents() {
model.draw(sk, draw_ctx);
}
}