Skip to content

Latest commit

 

History

History
51 lines (34 loc) · 1.82 KB

README.md

File metadata and controls

51 lines (34 loc) · 1.82 KB

rustyrender

A simple, CPU-bound graphics renderer for learning purposes

Lessons

These will closely follow the tinyrenderer source on the basics of computer graphics and rendering, with the obvious exception that the original exercises will be translated from C++ to Rust.

Lesson 1 - Bresenham's Line Drawing Algorithm

Lesson guide: here

Run example:

cargo run --example lesson1

Misc

Profiling

Profiling this code can be done easily with the perf tool. Debug info is currently enabled for dev (non release) builds. Compile this project and run the corresponding binary like so (as root):

perf record --call-graph=lbr target/debug/examples/lesson1
perf report --hierarchy -M intel

Saved for Later

// TODO(mierdin): it wasn't enough to provide ImageBuffer, we had to provide the typs after as well. Why?
// https://stackoverflow.com/questions/35488820/how-to-create-a-rust-struct-with-an-imageimagebuffer-as-a-member
// Also, I originally had no return type, which meant that anything after this function call lost ownership of imgbuf. Had to return it to pass back ownership.
pub fn line(v0: Vec2f, v1: Vec2f, color: Rgb<u8>, mut imgbuf: ImageBuffer<Rgb<u8>, Vec<u8>>) -> ImageBuffer<Rgb<u8>, Vec<u8>>{

    debug!("Writing line from {},{} to {},{}", v0.x, v0.y, v1.x, v1.y);

    // Using width since we're only expecting square dimensions
    for t in 0..imgbuf.width() {
        let t = t as f32 * (1.0 / imgbuf.width() as f32);
        let x = v0.x + (v1.x - v0.x) * t;
        let y = v0.y + (v1.y - v0.y) * t;

        imgbuf.put_pixel(x as u32, y as u32, color);
    }
    imgbuf
}