Derive Macro willow::Program[][src]

#[derive(Program)]
{
    // Attributes available to this derive:
    #[willow]
}
Expand description

Derives a user-friendly wrapper for WebGlProgram from a struct.

The struct must only contain the following fields:

  • Exactly one ProgramData field
  • Uniform<T> fields (use #[willow(uniform(T)] if aliased)
  • Attribute<T> fields (use #[willow(attribute(T))] if aliased)

In the struct attribute, the path to the GLSL shaders must be specified:

#[willow(path = "scene")]

This will load the GLSL shaders by running include_str!("scene.vert") and include_str!("scene.frag").

If they are already loaded in a constant, write this instead:

#[willow(vert = VERTEX_SHADER_CODE, frag = FRAGMENT_SHADER_CODE)]

Example

#[derive(willow::Program)]
#[willow(path = "scene")]
struct Scene {
    vertices: Attribute<Vector3<f32>>,
    normals: Attribute<Vector3<f32>>,
    projection: Uniform<Matrix4<f32>>,
}

With the files scene.vert and scene.frag containing at least these declarations:

attribute vec3 vertices;
attribute vec3 normals;
uniform mat4 projection;

Then it can be used like this:

fn render(
    gl: &WebGlRenderingContext,
    scene: &Scene,
    buffer: &Buffer,
    projection: Matrix,
) {
    scene.call()
        .vertices(vertices)
        .normals(normals)
        .projection(projection)
        .draw_indexed(WebGlRenderingContext::TRIANGLES, indices);
}