Skip to content

RenderContext Reference

RenderContext<'_> is the renderer facade exposed through ctx.render inside every FerrousApp callback. It hides all GPU internals and exposes only what application code needs.


Shading style

// Switch shading style — takes effect from the next frame
ctx.render.set_style(RenderStyle::Pbr);
ctx.render.set_style(RenderStyle::FlatShaded);
ctx.render.set_style(RenderStyle::CelShaded { toon_levels: 4, outline_width: 1.5 });

// Shortcut on AppContext (equivalent)
ctx.set_render_style(RenderStyle::FlatShaded);

Passes

// Toggle SSAO (screen-space ambient occlusion)
ctx.render.set_ssao(true);

// Change clear/background colour
ctx.render.set_clear_color(Color::rgb(0.05, 0.05, 0.05));

// Append a custom render pass after built-ins
ctx.render.add_pass(MyVignettePass::new(0.4));

Materials

use ferrous_renderer::{MaterialDescriptor, AlphaMode};

// Create a material
let mut desc = MaterialDescriptor::default();
desc.base_color = [1.0, 0.2, 0.2, 1.0]; // red
desc.metallic   = 0.0;
desc.roughness  = 0.8;
let handle = ctx.render.create_material(&desc);

// Assign to a world entity
ctx.world.set_material_handle(entity_id, handle);

// Update scalar params later (texture handles stay fixed)
desc.base_color = [0.2, 1.0, 0.2, 1.0]; // green
ctx.render.update_material(handle, &desc);

MaterialDescriptor fields

Field Type Default Description
base_color [f32; 4] [1,1,1,1] RGBA albedo
metallic f32 0.0 0 = dielectric, 1 = metal
roughness f32 0.5 0 = mirror, 1 = fully rough
emissive [f32; 3] [0,0,0] Emissive colour (HDR values allowed)
albedo_tex Option<TextureHandle> None Albedo / diffuse texture
alpha_mode AlphaMode Opaque Opaque, Mask(cutoff), Blend

Textures

// Upload raw RGBA8 pixels
let tex = ctx.render.renderer_mut()
    .create_texture_from_rgba(width, height, &rgba_bytes);

// Hot-reload (update pixels in place)
ctx.render.renderer_mut()
    .update_texture_data(tex, width, height, &new_bytes);

// Release
ctx.render.renderer_mut().free_texture(tex);

Lighting

// Override the global directional light
// direction: normalised vec pointing FROM light TOWARD scene
ctx.render.set_directional_light(
    [0.0, -1.0, -0.3],     // direction
    [1.0, 0.95, 0.85],     // colour (linear RGB)
    2.5,                    // intensity multiplier
);

Prefer spawning a DirectionalLight ECS component for scene-managed lights; use this method for imperative / UI-driven control.


Camera helpers

ctx.render.camera_eye()             // Vec3 — current eye position
ctx.render.camera_target()          // Vec3 — current look-at target
ctx.render.camera_orbit_distance()  // f32  — orbit radius

// Override eye position (call once in setup; after that drive via ECS)
ctx.render.set_camera_eye(Vec3::new(0.0, 5.0, 10.0));

Statistics

let stats = ctx.render.stats();
println!("vertices: {}  draw calls: {}", stats.vertices, stats.draw_calls);