summaryrefslogtreecommitdiff
path: root/crates/renderer/src/overlay/asset.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/renderer/src/overlay/asset.rs')
-rw-r--r--crates/renderer/src/overlay/asset.rs120
1 files changed, 120 insertions, 0 deletions
diff --git a/crates/renderer/src/overlay/asset.rs b/crates/renderer/src/overlay/asset.rs
new file mode 100644
index 0000000..a616703
--- /dev/null
+++ b/crates/renderer/src/overlay/asset.rs
@@ -0,0 +1,120 @@
+use teleia::*;
+
+use crate::overlay;
+
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub enum AssetSort {
+ Texture,
+ Mesh,
+}
+impl AssetSort {
+ pub fn from_str(s: &str) -> Option<Self> {
+ match s {
+ "texture" => Some(Self::Texture),
+ "mesh" => Some(Self::Mesh),
+ _ => None,
+ }
+ }
+}
+#[derive(Clone, PartialEq, Eq)]
+pub struct DisplayedAsset {
+ sort: AssetSort,
+ path: String,
+}
+pub struct Overlay {
+ loaded: Option<DisplayedAsset>,
+ displayed: Option<DisplayedAsset>,
+ texture_placeholder: texture::Texture,
+ texture: texture::Texture,
+ mesh: mesh::Mesh,
+}
+impl Overlay {
+ pub fn new(ctx: &context::Context) -> Self {
+ Self {
+ loaded: None,
+ displayed: None,
+ texture_placeholder: texture::Texture::new(ctx, include_bytes!("../assets/textures/placeholder.png")),
+ texture: texture::Texture::new_empty(ctx),
+ mesh: mesh::Mesh::new_empty(ctx, true, true),
+ }
+ }
+ pub fn load_displayed(&mut self, ctx: &context::Context) -> Erm<()> {
+ if let Some(d) = &self.displayed {
+ match d.sort {
+ AssetSort::Texture => {
+ let bs = std::fs::read(&d.path)?;
+ self.texture.upload(ctx, &bs);
+ },
+ AssetSort::Mesh => {
+ let bs = std::fs::read(&d.path)?;
+ self.mesh.upload_obj(ctx, &bs);
+ },
+ }
+ }
+ Ok(())
+ }
+}
+impl overlay::Overlay for Overlay {
+ fn handle_binary(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut overlay::State, msg: &net::fig::BinaryMessage) -> Erm<()> {
+ match &*msg.event {
+ b"overlay asset display" => {
+ let mut reader = std::io::Cursor::new(&msg.data);
+ let ssort = net::fig::read_length_prefixed_utf8(&mut reader)?;
+ let path = net::fig::read_length_prefixed_utf8(&mut reader)?;
+ if let Some(sort) = AssetSort::from_str(&ssort) {
+ log::warn!("displaying {} asset at: {}", ssort, path);
+ let new = Some(DisplayedAsset {sort, path});
+ if new != self.displayed {
+ self.displayed = new.clone();
+ if self.displayed != self.loaded {
+ if let Err(e) = self.load_displayed(ctx) {
+ self.displayed = None;
+ log::warn!("error when loading asset: {}", e);
+ } else {
+ self.loaded = new;
+ }
+ }
+ }
+ } else {
+ log::warn!("unknown asset sort: {}", ssort);
+ }
+ },
+ b"overlay asset clear" => {
+ self.displayed = None;
+ },
+ _ => {},
+ }
+ Ok(())
+ }
+ fn render(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut overlay::State) -> Erm<()> {
+ if let Some(d) = &self.displayed {
+ match d.sort {
+ AssetSort::Texture => {
+ st.bind_2d(ctx, &ost.assets.shader_flat);
+ self.texture.bind(ctx);
+ ost.assets.shader_flat.set_position_2d(
+ ctx, st,
+ &glam::Vec2::new(ost.info.emacs_cursor.0, ost.info.emacs_cursor.1),
+ &glam::Vec2::new(self.texture.width as f32, self.texture.height as f32)
+ );
+ st.mesh_square.render(ctx);
+ },
+ AssetSort::Mesh => {
+ st.bind_3d(ctx, &ost.assets.shader_flat);
+ ost.assets.shader_flat.set_f32(ctx, "transparency", 0.0);
+ self.texture_placeholder.bind(ctx);
+ ost.assets.shader_flat.set_position_3d(
+ ctx, st,
+ &glam::Mat4::from_scale_rotation_translation(
+ glam::Vec3::new(1.0, 1.0, 1.0),
+ glam::Quat::from_rotation_y(st.tick as f32 / 75.0),
+ glam::Vec3::new(0.0, 0.0, -8.0)
+ ),
+ );
+ self.mesh.render(ctx);
+ },
+ }
+ }
+ Ok(())
+ }
+}