tirbofish/dropbear · commit
8d20f7fdaf38f6a2589f0dcd49ef058e38f4284e
damn allat just for me having to return back to wgsl :( at least i did get **some** slang compat to work, but looks like wgsl is the way to go. merging to the ui branch to continue on with ui. i do have a neat little tool tho... Unverified
@@ -1,28 +0,0 @@ -struct VertexOutput { - @builtin(position) clip_position: vec4<f32>, - @location(0) uv: vec2<f32>, -} - -@group(0) @binding(0) -var tex: texture_2d<f32>; -@group(0) @binding(1) -var tex_sampler: sampler; - -@vertex -fn vs_main( - @builtin(vertex_index) in_vertex_index: u32, -) -> VertexOutput { - var out: VertexOutput; - - let x = f32((in_vertex_index << 1u) & 2u); - let y = f32(in_vertex_index & 2u); - out.clip_position = vec4<f32>(x * 2.0 - 1.0, y * 2.0 - 1.0, 0.0, 1.0); - out.uv = vec2<f32>(x, 1.0 - y); - return out; -} - -@fragment -fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { - let s = textureSample(tex, tex_sampler, in.uv); - return s; -} @@ -1,3 +1,8 @@ +struct Globals { + uint num_lights; + float ambient_strength; +}; + /// A standard light descriptor struct. struct Light { float4 position; @@ -16,6 +21,14 @@ struct CameraUniform { float4x4 view_proj; }; +struct MaterialUniform { + // for stuff like tinting + float4 colour; + + // scales incoming UVs before sampling + float2 uv_tiling; +}; + /// Converts a wgpu matrix (in the form of 4 float4) into a matrix usable for Slang. float4x4 vs_input_matrix( float4 mat1, @@ -24,7 +24,7 @@ macro_rules! include_slang_path { pub mod compiled; pub mod utils; -use std::path::{Path, PathBuf}; +use std::{fmt::Display, path::{Path, PathBuf}}; use crate::compiled::CompiledSlangShader; #[derive(Debug, Clone)] @@ -77,6 +77,8 @@ pub struct SlangShaderBuilder { label: String, sources: Vec<SourceFile>, entries: Vec<EntryPoint>, + profile: Option<Profile>, + additional_args: Vec<String>, } impl SlangShaderBuilder { @@ -86,6 +88,8 @@ impl SlangShaderBuilder { sources: Vec::new(), entries: Vec::new(), label: label.to_string(), + profile: None, + additional_args: Vec::new(), } } @@ -212,6 +216,18 @@ impl SlangShaderBuilder { self } + pub fn with_profile(mut self, profile: Profile) -> Self { + self.profile = Some(profile); + self + } + + /// In the case that there was an argument not available to this builder, you can + /// manually provide it here. + pub fn with_additional_args(mut self, args: &[&str]) -> Self { + self.additional_args = args.to_vec().iter().map(|v| v.to_string()).collect::<Vec<_>>(); + self + } + pub fn compile_to_out_dir(self, target: SlangTarget) -> anyhow::Result<()> { let label = self.label.clone(); let compiled = self.build(target)?; @@ -237,7 +253,7 @@ impl SlangShaderBuilder { cmd.arg("-target").arg(target.as_arg()); use std::fmt::Write; - write!(&mut args_record, " -target {}", target.as_arg()).unwrap(); + write!(&mut args_record, " -target {}", target.as_arg())?; for (source_idx, source) in self.sources.iter().enumerate() { let path_to_use = if let Some(path) = &source.path { @@ -271,6 +287,9 @@ impl SlangShaderBuilder { } } + cmd.args(&self.additional_args); + write!(&mut args_record, " {}", self.additional_args.join(" "))?; + let temp_dir = tempfile::tempdir()?; let output_path = temp_dir.path().join("output"); @@ -509,6 +528,31 @@ impl std::str::FromStr for SlangTarget { } } +pub enum Profile { + Sm(String), + Glsl(String), + Vs(String), + Hs(String), + Ds(String), + Gs(String), + Ps(String), +} + +impl Display for Profile { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let string = match self { + Profile::Sm(v) => format!("sm_{v}"), + Profile::Glsl(v) => format!("glsl_{v}"), + Profile::Vs(v) => format!("vs_{v}"), + Profile::Hs(v) => format!("hs_{v}"), + Profile::Ds(v) => format!("ds_{v}"), + Profile::Gs(v) => format!("gs_{v}"), + Profile::Ps(v) => format!("ps_{v}"), + }; + write!(f, "{}", string) + } +} + #[cfg(test)] mod tests { use super::*;