commit 2784dfae9c098381898fdf008ba361a9d51070a9 Author: Able Date: Fri Jan 14 07:54:24 2022 -0600 patching together a scuffed shader lang diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..7434b7b --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,224 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "libc" +version = "0.2.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rhai" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c7433068977c56619bf2b7831da26eb986d0645fe56f2ad9357eda7ae4c435e" +dependencies = [ + "ahash", + "instant", + "num-traits", + "rhai_codegen", + "smallvec", + "smartstring", +] + +[[package]] +name = "rhai-rand" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f631680dbade170949a4330ae8937c87e86a0c1f7830121ec82d3780ebe5a1" +dependencies = [ + "rand", + "rhai", +] + +[[package]] +name = "rhai_codegen" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02d33d76a7aa8ec72ac8298d5b52134fd2dff77445ada0c65f6f8c40d8f2931" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shadeable" +version = "0.1.0" +dependencies = [ + "rhai", + "rhai-rand", +] + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "smartstring" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31aa6a31c0c2b21327ce875f7e8952322acfcfd0c27569a6e18a647281352c9b" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9899d76 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "shadeable" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rhai = "*" +rhai-rand = "0.1" \ No newline at end of file diff --git a/example_shaders/simple.shade b/example_shaders/simple.shade new file mode 100644 index 0000000..8dff847 --- /dev/null +++ b/example_shaders/simple.shade @@ -0,0 +1,15 @@ +// This gets executed for each pixel on the buffer + + + +const VERSION = 0.5; + + +fn main(){ + let abcd = RGBA(0, 33, 0, 0); + + // print(rand_float()); + + + PIXEL_RGBA; +} \ No newline at end of file diff --git a/src/engine_internals.rs b/src/engine_internals.rs new file mode 100644 index 0000000..b887596 --- /dev/null +++ b/src/engine_internals.rs @@ -0,0 +1,19 @@ +use crate::pixel_format::{rgba_add, rgba_div, rgba_mult, rgba_sub, RGBA}; +use rhai_rand::RandomPackage; + +use rhai::{packages::Package, Engine}; +pub fn engine_startup() -> Engine { + let mut engine = Engine::new(); + + engine + .register_type::() + .register_fn("RGBA", RGBA::new) + .register_fn("*", rgba_mult) + .register_fn("/", rgba_div) + .register_fn("+", rgba_add) + .register_fn("-", rgba_sub); + + engine.register_global_module(RandomPackage::new().as_shared_module()); + + engine +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..1d495ea --- /dev/null +++ b/src/main.rs @@ -0,0 +1,70 @@ +use pixel_format::Rgba64; +use rhai::{EvalAltResult, Scope}; + +use crate::{ + engine_internals::engine_startup, + pixel_format::{rgba_div, RGBA}, +}; + +pub const SHADER: &str = include_str!("../example_shaders/simple.shade"); + +mod engine_internals; +pub mod pixel_format; + +fn main() -> Result<(), Box> { + let rgba: Rgba64 = 0xffffffff; + let rgba_2: Rgba64 = 0x02010101; + + println!("{}", rgba_div(rgba, rgba_2)); + + /* + pixel_format::get_g(rgba); + pixel_format::get_b(rgba); + pixel_format::get_a(rgba); + */ + + let engine = engine_startup(); + let ast = engine.compile(SHADER)?; + let mut scope = Scope::new(); + + let a = vec![ + RGBA { + r: 255, + g: 0, + b: 0, + a: 0, + }, + RGBA { + r: 0, + g: 255, + b: 0, + a: 0, + }, + RGBA { + r: 0, + g: 0, + b: 255, + a: 0, + }, + RGBA { + r: 0, + g: 0, + b: 0, + a: 255, + }, + ]; + + let mut index = 0; + /* + for pixel in a { + scope.push("PIXEL_X", 0); // add constant variable + scope.push("PIXEL_Y", index); // add constant variable + scope.push("PIXEL_RGBA", pixel); + + let result: RGBA = engine.call_fn(&mut scope, &ast, "main", ())?; + println!("Pixel {}: {:?}", index, result); // prints 42 + index += 1; + } + */ + Ok(()) +} diff --git a/src/pixel_format.rs b/src/pixel_format.rs new file mode 100644 index 0000000..726f6a0 --- /dev/null +++ b/src/pixel_format.rs @@ -0,0 +1,112 @@ +use rhai::INT; + +pub type Rgba64 = u64; + +pub fn get_r(rgba: Rgba64) -> u8 { + let x: u64 = rgba; + + let y = x >> 24; + + return (y & 0xff).try_into().unwrap(); +} +pub fn get_g(rgba: Rgba64) -> u8 { + let x: u64 = rgba; + + let y = x >> 16; + + return (y & 0xff).try_into().unwrap(); +} +pub fn get_b(rgba: Rgba64) -> u8 { + let x: u64 = rgba; + + let y = x >> (24 - 16); + + return (y & 0xff).try_into().unwrap(); +} +pub fn get_a(rgba: Rgba64) -> u8 { + let x = rgba; + + let y = x >> (24 - 16 - 8); + + return (y & 0xff).try_into().unwrap(); +} + +pub fn set_r(rgba: Rgba64, r: u8) -> Rgba64 { + let z = (r as Rgba64) << 24; + let y = rgba & 0xffffff; + return z | y; +} + +pub fn set_g(rgba: Rgba64, r: u8) -> Rgba64 { + let z = (r as Rgba64) << 16; + let y = rgba & 0xffffff; + return z | y; +} + +pub fn set_b(rgba: Rgba64, r: u8) -> Rgba64 { + let z = (r as Rgba64) << 26 - 16; + let y = rgba & 0xffffff; + return z | y; +} + +pub fn set_a(rgba: Rgba64, r: u8) -> Rgba64 { + let z = (r as Rgba64) << 8; + let y = rgba & 0xffffff; + return z | y; +} + +#[derive(Debug, Clone)] +pub struct RGBA { + pub r: INT, + pub g: INT, + pub b: INT, + pub a: INT, +} +impl RGBA { + pub fn new(r: INT, g: INT, b: INT, a: INT) -> Self { + Self { r, g, b, a } + } +} + +pub fn rgba_div(a: Rgba64, b: Rgba64) -> Rgba64 { + let mut fin: Rgba64 = 0; + + println!("{}", fin); + fin = set_r(fin, get_r(a) / get_r(b)); + println!("{}", fin); + + fin = set_g(fin, get_g(a) / get_g(b)); + /* + + get_b(a) / get_b(b); + + get_a(a) / get_a(b); + */ + + return fin; +} + +pub fn rgba_mult(a: RGBA, b: RGBA) -> RGBA { + RGBA { + r: a.r * b.r, + g: a.g * b.g, + b: a.b * b.b, + a: a.a * b.a, + } +} +pub fn rgba_add(a: RGBA, b: RGBA) -> RGBA { + RGBA { + r: a.r + b.r, + g: a.g + b.g, + b: a.b + b.b, + a: a.a + b.a, + } +} +pub fn rgba_sub(a: RGBA, b: RGBA) -> RGBA { + RGBA { + r: a.r - b.r, + g: a.g - b.g, + b: a.b - b.b, + a: a.a - b.a, + } +}