patching together a scuffed shader lang

This commit is contained in:
Able 2022-01-14 07:54:24 -06:00
commit 251e20b041
7 changed files with 451 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

224
Cargo.lock generated Normal file
View file

@ -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"

10
Cargo.toml Normal file
View file

@ -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"

View file

@ -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;
}

19
src/engine_internals.rs Normal file
View file

@ -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::<RGBA>()
.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
}

70
src/main.rs Normal file
View file

@ -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<EvalAltResult>> {
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(())
}

112
src/pixel_format.rs Normal file
View file

@ -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,
}
}