# glslt glslt is the main library that supports the GLSL Template compiler transforms. If you are building a system that relies on transforming GLSLT code, you'll want to interact with this library directly instead of the command-line interface provided by `glsltc`. ## Usage ### Rust crate The glslt crate manipulates syntax trees generated by the [glsl-lang crate](https://github.com/alixinne/glsl-lang). ```rust use glslt::glsl_lang::{ast::*, parse::IntoParseBuilderExt}; use glslt::transform::{Unit, TransformUnit}; let glsl_src = r#" float sdf3d(in vec3 p); float colort(); float sdSphere(vec3 p, float r) { return length(p) - r; } float opElongate(in sdf3d primitive, in colort C, in vec3 p, in colort D, in vec3 h) { vec3 q = p - clamp(p, -h, h); return C() * primitive(q) * D(); } void mainImage(out vec4 fragColor, in vec2 fragCoord) { float sz = 5.; fragColor = vec4(vec3(opElongate(sdSphere(_p, sz), 1.0, vec3(fragCoord, 0.), 2.0, vec3(1., 2., 3.))), 1.0); } "#; // Parse the GLSLT source code let tu: TranslationUnit = glsl_src .builder() .context(&glslt::parse::make_parse_context(None)) .parse() .expect("failed to parse GLSLT source") .0; // Create the transform unit let mut unit = Unit::new(); // Parse declarations for decl in tu.0.into_iter() { unit.parse_external_declaration(decl).expect("failed to parse declaration"); } // Generate the result let tu = unit.into_translation_unit().expect("failed to generate output"); // Transpile the syntax tree to GLSL source let mut output_src = String::new(); glsl_lang::transpiler::glsl::show_translation_unit( &mut output_src, &tu, glsl_lang::transpiler::glsl::FormattingState::default(), ).expect("failed to generate GLSL"); ``` ### Python library If you installed the glslt library via `pip install glslt` or `maturin develop`, you may use the Python interface to the GLSLT compiler. ```python import glslt # Parse the `sdf.glsl` file with `my-glsl-lib/include` being a system include # directory for #include resolution translation_unit = glslt.parse_files(["sdf.glsl"], ["my-glsl-lib/include"]) # Create a new minimizing transform unit unit = glslt.MinUnit() # Add the parsed declarations to the transform unit unit.add_unit(translation_unit) # Get the output of the transform result = unit.to_translation_unit(["mainImage"]) # Print the GLSL code print(result.to_glsl()) ``` ## Author Alixinne