Simple Example • Usage • Features • Documentation
A Rust crate for creating graphic experiences, with a focus on ease of use and beginner friendliness. Also helpful for visualizing algorithms when learning Rust.
This creative coding library draws a lot of inspiration from p5.js.
This example draws a cube in the center of the window, rotating and coloring it based on the time that has passed.
use duku::Camera;
use duku::Duku;
use duku::Hsb;
use duku::Light;
use duku::Result;
use std::time::Instant;
fn main() -> Result<()> {
// create duku context and window
let (mut duku, window) = Duku::windowed(500, 500)?;
// create 3D camera with 90 fov
let camera = Camera::perspective(90);
// create directional light
let light = Light::directional("#ffffff", [-1.0, -1.0, 1.0]);
// start timer for rotation and color
let timer = Instant::now();
// start window loop
window.while_open(move |_| {
// start drawing on window
duku.draw(Some(&camera), |t| {
// setup scene
t.background("#ababab");
t.light(light);
// get elapsed time since start
let elapsed = timer.elapsed().as_secs_f32();
// transform scene
let angle = elapsed * 45.0;
t.rotate_x(angle);
t.rotate_y(angle);
t.translate_z(2.0);
// draw cube
let hue = (elapsed * 60.0) as u16;
t.tint(Hsb::new(hue, 70, 80));
t.cube([1.0, 1.0, 1.0]);
});
});
Ok(())
}
To use this crate, add this dependency to your Cargo.toml
file.
[dependencies]
duku = "0.2.1"
- Supports - Windows and Linux X11
- Vulkan - uses the Vulkan SDK
- 3D - mesh rendering with materials and shaders
- 2D - shape, texture and text rendering with batching
- PBR - uses a PBR material/shader system
- Shadows - uses PCF shadow maps
- Text - uses Fira Mono or other OTF/TTF fonts
- Shaders - uses custom glsl shaders
This crate supports additional features that you can add
to your dependency in your Cargo.toml
file.
[dependencies]
duku = { ... , features = ["feature-name"] }
The features include:
Name | Default | Uses | Description |
---|---|---|---|
window |
yes | winit | adds OS window creation support |
png |
no | png | adds png file loading support |
jpeg |
no | jpeg-decoder | adds jpeg file loading support |
gltf |
no | gltf | adds gltf file loading support |
glsl |
no | shaderc | adds custom glsl file loading support |
otf |
no | ab_glyph | adds otf/ttf file loading support |
log |
no | n/a | adds informational logs |
The crate documentation can be found here and for shader compilation here. Commented examples on how to use this crate can be found here.