Impl
Demonstrates struct impl blocks with associated constants and methods. Methods are called with explicit Type::method(receiver, args) syntax and constants with Type::CONSTANT; both translate to Type_member in WGSL.
Rust Source
#![allow(unused)]
fn main() {
#[wgsl]
pub mod impl_example {
//! Demonstrates struct impl blocks with explicit receiver syntax.
//!
//! Methods and constants are defined in impl blocks.
//! - Methods are called using `Type::method(receiver, args)` syntax
//! - Constants are accessed using `Type::CONSTANT` syntax
//!
//! Both translate to `Type_member` in WGSL output.
use wgsl_rs::std::*;
pub struct Light {
pub position: Vec3f,
pub intensity: f32,
}
impl Light {
// Associated constants
pub const DEFAULT_INTENSITY: f32 = 1.0;
pub const DEFAULT_RANGE: f32 = 10.0;
// Create a new light at the given position with the given intensity.
pub fn new(position: Vec3f, intensity: f32) -> Light {
Light {
position,
intensity,
}
}
// Calculate light attenuation based on distance.
// Uses inverse-square falloff.
pub fn attenuate(light: Light, distance: f32) -> f32 {
light.intensity / (distance * distance)
}
// Get the light's position.
pub fn get_position(light: Light) -> Vec3f {
light.position
}
}
#[fragment]
pub fn frag_main() -> Vec4f {
// Create a light using the explicit receiver syntax
let light = Light::new(vec3f(0.0, 5.0, 0.0), Light::DEFAULT_INTENSITY);
// Call a method using explicit path syntax: Type::method(receiver, args)
let attenuation = Light::attenuate(light, Light::DEFAULT_RANGE / 5.0);
// Return a color based on attenuation
vec4f(attenuation, attenuation, attenuation, 1.0)
}
}
}
Generated WGSL
struct Light {
position: vec3f,
intensity: f32
}
const Light__1DEFAULT_INTENSITY: f32 = 1.0;
const Light__1DEFAULT_RANGE: f32 = 10.0;
fn Light_new(position: vec3f, intensity: f32) -> Light {
return Light(position, intensity);
}
fn Light_attenuate(light: Light, distance: f32) -> f32 {
return light.intensity / (distance * distance);
}
fn Light__1get_position(light: Light) -> vec3f {
return light.position;
}
@fragment fn frag_main() -> @location(0) vec4f {
let light = Light_new(vec3f(0.0, 5.0, 0.0), Light__1DEFAULT_INTENSITY);
let attenuation = Light_attenuate(light, Light__1DEFAULT_RANGE / 5.0);
return vec4f(attenuation, attenuation, attenuation, 1.0);
}
Notes
- Associated constants and methods are mangled into
Type_member(with_1separating the type name from the member name when needed for uniqueness). Type::method(receiver, args)calls become free functionsType_method(receiver, args)in WGSL.