summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-01-31 13:50:14 -0500
committerLLLL Colonq <llll@colonq>2025-01-31 13:50:14 -0500
commitc4f96d2b3f3b3878d6e0bbca7e0c4cd3f5d8bc85 (patch)
tree422e7075f191badb3ccee2c02bd24332e6ee5b9e /src/common
parent7e1ccc9f3e83d7b807ffaa7706085437df69fb67 (diff)
Terminal (it doesn't do the colors right for some reason)
Diffstat (limited to 'src/common')
-rw-r--r--src/common/overlay.rs26
-rw-r--r--src/common/overlay/terminal.rs31
2 files changed, 55 insertions, 2 deletions
diff --git a/src/common/overlay.rs b/src/common/overlay.rs
index 6e68974..492f1bd 100644
--- a/src/common/overlay.rs
+++ b/src/common/overlay.rs
@@ -4,12 +4,19 @@ mod terminal;
mod fig;
use teleia::*;
+use termion::raw::IntoRawMode;
use std::{collections::HashMap, f32::consts::PI};
use lexpr::sexp;
use base64::prelude::*;
+pub enum RenderMode {
+ Overlay,
+ Terminal(termion::raw::RawTerminal<std::io::Stdout>),
+}
+
pub struct Overlay {
+ mode: RenderMode,
assets: assets::Assets,
model: scene::Scene,
model_neck_base: glam::Mat4,
@@ -22,13 +29,14 @@ pub struct Overlay {
}
impl Overlay {
- pub async fn new(ctx: &context::Context) -> Self {
+ pub async fn new(ctx: &context::Context, mode: RenderMode) -> Self {
let model = scene::Scene::from_gltf(ctx, include_bytes!("overlay/assets/scenes/lcolonq.vrm"));
let model_neck_base = model.nodes_by_name.get("J_Bip_C_Neck")
.and_then(|i| model.nodes.get(*i))
.expect("failed to find neck joint")
.transform;
Self {
+ mode,
assets: assets::Assets::new(ctx),
model,
model_neck_base,
@@ -50,6 +58,13 @@ impl Overlay {
tracking_neck: glam::Quat::IDENTITY,
}
}
+ pub async fn overlay(ctx: &context::Context) -> Self {
+ Self::new(ctx, RenderMode::Overlay).await
+ }
+ pub async fn terminal(ctx: &context::Context) -> Self {
+ let raw_stdout = std::io::stdout().into_raw_mode().expect("failed to set raw mode");
+ Self::new(ctx, RenderMode::Terminal(raw_stdout)).await
+ }
pub fn handle_tracking(&mut self, msg: fig::Message) -> Option<()> {
let eyes = msg.data.get(0)?;
let eye_left = eyes.get(0)?.as_str()?.parse::<f32>().ok()?;
@@ -135,7 +150,14 @@ impl teleia::state::Game for Overlay {
self.model.render(ctx, &self.assets.shader_scene);
st.render_framebuffer.bind(ctx);
self.terminal.update(ctx, &self.model_fb);
- self.terminal.render(ctx, &glam::Vec2::new(12.0, 250.0));
+ match &mut self.mode {
+ RenderMode::Overlay => {
+ self.terminal.render(ctx, &glam::Vec2::new(12.0, 250.0));
+ },
+ RenderMode::Terminal(stdout) => if st.tick % 10 == 0 {
+ self.terminal.write_tty(stdout);
+ },
+ }
// self.model_fb.blit(
// ctx, &st.render_framebuffer,
// &glam::Vec2::new(ctx.render_width / 2.0 - 512.0, ctx.render_height / 2.0 - 512.0),
diff --git a/src/common/overlay/terminal.rs b/src/common/overlay/terminal.rs
index 1b8df4c..e631899 100644
--- a/src/common/overlay/terminal.rs
+++ b/src/common/overlay/terminal.rs
@@ -1,3 +1,6 @@
+use std::io::Write;
+use colored::Colorize;
+
use teleia::*;
pub const WIDTH: usize = 64;
@@ -164,4 +167,32 @@ impl Terminal {
}
self.font.render_text_helper(ctx, pos, &s, &colors);
}
+ pub fn write_tty<W>(&self, out: &mut W)
+ where W: Write {
+ let mut output: Vec<u8> = Vec::new();
+ write!(output, "\x1b[2J\x1b[1;1H").expect("failed to write output");
+ for row in 0..64 {
+ for col in 0..64 {
+ let pos = Pos::new(col, row);
+ let c = self.get_color(pos);
+ let new = if let Some(p) = self.set_char.get(pos) {
+ if c == glam::Vec3::new(0.0, 0.0, 0.0) {
+ String::from(" ")
+ } else if let Some(pat) = self.outline_pattern(pos) {
+ pat
+ } else {
+ format!("{}{}", p.first, if let Some(snd) = p.second { snd } else { ' ' })
+ }
+ } else {
+ String::from(" ")
+ };
+ write!(
+ output, "{}",
+ new.truecolor((c.x * 255.0) as u8, (c.y * 255.0) as u8, (c.z * 255.0) as u8)
+ ).unwrap();
+ }
+ write!(output, "\r\n").unwrap();
+ }
+ out.write(&output).expect("failed to write to terminal");
+ }
}