wip: clear_color command words.

This commit is contained in:
James Harton 2024-05-16 17:50:10 +12:00
parent 9e1bb5db14
commit 7a812e8e63
Signed by: james
GPG key ID: 90E82DAA13F624F4
4 changed files with 107 additions and 4 deletions

View file

@ -1038,6 +1038,18 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
[[package]]
name = "hsl"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "575fb7f1167f3b88ed825e90eb14918ac460461fdeaa3965c6a50951dee1c970"
[[package]]
name = "hsv"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a03664f940932e7453c5f1dd0ce278a7af2ff47d440fad00f679b4f5bf0da869"
[[package]]
name = "image"
version = "0.24.9"
@ -1841,6 +1853,8 @@ version = "0.1.0"
dependencies = [
"anyhow",
"clap",
"hsl",
"hsv",
"ipc-channel",
"renderling",
"rustler",

View file

@ -12,6 +12,8 @@ path = "src/lib.rs"
[dependencies]
anyhow = "1"
clap = {version = "4", features = ["derive"]}
hsl = "0.1.1"
hsv = "0.1.1"
ipc-channel = "0.18.0"
renderling = "0.4.2"
rustler = {version = "0.32.1", features = ["serde", "nif_version_2_16"]}

View file

@ -1,3 +1,5 @@
use std::collections::HashMap;
use renderling::{
camera::Camera,
math::{UVec2, Vec4},
@ -6,10 +8,13 @@ use renderling::{
Context,
};
use crate::message::{Color, ScriptItem};
pub struct Renderer {
pub stage: Stage,
pub ctx: Context,
camera: Hybrid<Camera>,
scripts: HashMap<String, Vec<ScriptItem>>,
}
impl Renderer {
@ -18,12 +23,18 @@ impl Renderer {
.new_stage()
.with_lighting(false)
.with_bloom(false)
.with_background_color(Vec4::new(0.0, 0.0, 0.0, 1.0));
.with_background_color(Vec4::new(1.0, 0.0, 0.0, 1.0));
let size = ctx.get_size();
let camera = stage.new_value(Camera::default_ortho2d(size.x as f32, size.y as f32));
let scripts = HashMap::default();
Self { stage, camera, ctx }
Self {
stage,
camera,
ctx,
scripts,
}
}
pub fn set_size(&mut self, width: u32, height: u32) {
@ -39,4 +50,70 @@ impl Renderer {
self.stage.render(&frame.view());
frame.present();
}
pub fn clear_color(&mut self, color: Color) {
self.stage.set_background_color(color);
}
pub fn reset_scene(&mut self) {
// ?
}
pub fn update_scene(&mut self, script_id: String, script: Vec<ScriptItem>) {
self.scripts.insert(script_id, script);
}
pub fn delete_scripts(&mut self, script_ids: Vec<String>) {
for script_id in script_ids {
self.scripts.remove(&script_id);
}
}
}
impl Into<Vec4> for Color {
fn into(self) -> Vec4 {
match self {
Color::Gray(g) => {
let c = g as f32 / 255 as f32;
Vec4::new(c, c, c, 1.0)
}
Color::GrayAlpha(g, a) => {
let c = g as f32 / 255 as f32;
let a = a as f32 / 255 as f32;
Vec4::new(c, c, c, a)
}
Color::Rgb(r, g, b) => {
let r = r as f32 / 255 as f32;
let g = g as f32 / 255 as f32;
let b = b as f32 / 255 as f32;
Vec4::new(r, g, b, 1.0)
}
Color::RgbA(r, g, b, a) => {
let r = r as f32 / 255 as f32;
let g = g as f32 / 255 as f32;
let b = b as f32 / 255 as f32;
let a = a as f32 / 255 as f32;
Vec4::new(r, g, b, a)
}
Color::Hsv(h, s, v) => {
let (r, g, b) = hsv::hsv_to_rgb(h as f64, s as f64, v as f64);
let r = r as f32 / 255 as f32;
let g = g as f32 / 255 as f32;
let b = b as f32 / 255 as f32;
Vec4::new(r, g, b, 1.0)
}
Color::Hsl(h, s, l) => {
let (r, g, b) = hsl::HSL {
h: h as f64,
s: s as f64,
l: l as f64,
}
.to_rgb();
let r = r as f32 / 255 as f32;
let g = g as f32 / 255 as f32;
let b = b as f32 / 255 as f32;
Vec4::new(r, g, b, 1.0)
}
}
}
}

View file

@ -62,9 +62,9 @@ fn main() -> anyhow::Result<()> {
let event = c2s_recv.recv().unwrap();
match event {
Message::Init { .. } => unreachable!(),
Message::Shutdown(message::ShutdownReason::Normal) => exit(0),
Message::Shutdown(message::ShutdownReason::Terminate) => exit(1),
Message::Init { .. } => unreachable!(),
_ => event_loop_proxy.send_event(event).unwrap(),
};
});
@ -141,7 +141,17 @@ impl Application {
impl ApplicationHandler<Message> for Application {
fn user_event(&mut self, _event_loop: &ActiveEventLoop, event: Message) {
println!("message event {:?}", event)
if let Some(renderer) = &mut self.renderer {
match event {
Message::ClearColor(color) => renderer.clear_color(color),
Message::ResetScene => renderer.reset_scene(),
Message::UpdateScene(script_id, script) => renderer.update_scene(script_id, script),
Message::DeleteScripts(script_ids) => renderer.delete_scripts(script_ids),
_ => {
println!("unhandled message event {:?}", event)
}
};
}
}
fn window_event(