use raylib
All checks were successful
Build project / Build (push) Successful in 1m55s

Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
2026-03-28 16:14:53 +02:00
parent e3e4657cc9
commit d6e461b816
4 changed files with 124 additions and 2738 deletions

2791
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,6 @@ edition = "2024"
[dependencies]
anyhow = "1.0.102"
#notan = { version = "0.14.0", default-features = false, features = ["backend", "draw", "shaderc"] }
notan = { version = "0.14.0" }
midly = "0.5.3"
serialport = "4.9.0"
raylib = { version = "5.5.1", default-features = false, features = ["wayland"] }

View File

@@ -69,6 +69,8 @@
[
udev
libGL
glfw
llvmPackages.libclang
]
++ x11Libs
);
@@ -90,6 +92,7 @@
nativeBuildInputs = commonNativeBuildInputs;
buildInputs = commonBuildInputs;
LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib";
postFixup = pkgs.lib.optionalString (!isDarwin) ''
wrapProgram $out/bin/singer \
@@ -121,6 +124,7 @@
++ commonNativeBuildInputs;
LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath commonBuildInputs;
LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib";
shellHook = ''
export RUST_SRC_PATH="${pkgs.rustToolchain}/lib/rustlib/src/rust/library"

View File

@@ -1,4 +1,5 @@
use std::{
io::Write,
sync::mpsc::{self, Receiver, Sender},
thread::{self},
time::Duration,
@@ -6,7 +7,7 @@ use std::{
use anyhow::{anyhow, Result};
use midly::Smf;
use notan::{draw::*, prelude::*};
use raylib::prelude::*;
use serialport::SerialPortType;
#[derive(Clone, Copy, Debug)]
@@ -164,29 +165,23 @@ pub enum SerialStatus {
SerialDisconnected,
}
#[derive(AppState)]
struct SingerApp {
song_state: Option<AppSongState>,
tx: Sender<SerialCommand>,
rx: Receiver<SerialStatus>,
connected: Option<String>,
font: Font,
}
impl SingerApp {
pub fn new(gfx: &mut Graphics) -> Self {
pub fn new() -> Self {
let (tx_cmd, rx_cmd) = mpsc::channel();
let (tx_status, rx_status) = mpsc::channel();
Self::spawn_serial_worker(rx_cmd, tx_status);
let font = gfx
.create_font(include_bytes!("assets/Ubuntu-B.ttf"))
.expect("failed to load embedded font");
Self {
song_state: None,
tx: tx_cmd,
rx: rx_status,
connected: None,
font,
}
}
@@ -250,53 +245,40 @@ impl SingerApp {
}
}
fn draw(&mut self, gfx: &mut Graphics) {
let mut draw = gfx.create_draw();
draw.clear(Color::WHITE);
draw.line((40.0, 40.0), (100.0, 200.0))
.width(15.0)
.color(Color::BLUE);
draw.rect((220.0, 100.0), (120.0, 60.0)).color(Color::GREEN);
fn draw(&mut self, draw: &mut RaylibDrawHandle<'_>) {
draw.clear_background(Color::WHITE);
draw.draw_line_ex(
Vector2::new(40.0, 40.0),
Vector2::new(100.0, 200.0),
15.0,
Color::BLUE,
);
draw.draw_rectangle(220, 100, 120, 60, Color::GREEN);
let status_color = if self.connected.is_some() {
Color::GREEN
} else {
Color::GRAY
};
draw.rect((14.0, 14.0), (20.0, 20.0)).color(status_color);
draw.draw_rectangle(14, 14, 20, 20, status_color);
let status_text = match &self.connected {
Some(name) => format!("Serial connected: {name}"),
None => "Serial disconnected".to_string(),
};
draw.text(&self.font, &status_text)
.position(44.0, 30.0)
.size(22.0)
.color(Color::BLACK);
gfx.render(&draw);
draw.draw_text(&status_text, 44, 14, 22, Color::BLACK);
}
}
fn setup(gfx: &mut Graphics) -> SingerApp {
SingerApp::new(gfx)
}
fn main() {
let (mut rl, thread) = raylib::init().size(1280, 720).title("singer").build();
rl.toggle_fullscreen();
fn update(_app: &mut notan::app::App, state: &mut SingerApp) {
state.update();
}
let mut app = SingerApp::new();
fn draw(gfx: &mut Graphics, state: &mut SingerApp) {
state.draw(gfx);
}
#[notan_main]
fn main() -> Result<(), String> {
notan::init_with(setup)
.add_config(WindowConfig::new().set_title("singer").set_fullscreen(true))
.add_config(DrawConfig)
.update(update)
.draw(draw)
.build()
while !rl.window_should_close() {
app.update();
let mut draw = rl.begin_drawing(&thread);
app.draw(&mut draw);
}
}