summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRosyid Haryadi <rosyid_haryadi@protonmail.com>2025-02-26 18:05:40 +0700
committerRosyid Haryadi <rosyid_haryadi@protonmail.com>2025-02-26 18:05:40 +0700
commit7c868a16da77f3aefbf0d33f14dd3d0ded542fc4 (patch)
treef3ca85602c5109fd014ff03c9ca1fbc80e1343a4
parentafa026412fad832c85d28ddedb6b4bb74a4042d1 (diff)
upd: renderer
-rw-r--r--src/calculus.rs8
-rw-r--r--src/global.rs2
-rw-r--r--src/main.rs9
-rw-r--r--src/renderer.rs32
-rw-r--r--src/view.rs4
5 files changed, 41 insertions, 14 deletions
diff --git a/src/calculus.rs b/src/calculus.rs
index 40caff8..ac33514 100644
--- a/src/calculus.rs
+++ b/src/calculus.rs
@@ -67,12 +67,12 @@ pub mod calculus {
}
}
- pub struct Ray {
- pub origin: Point3,
- pub direction: Vec3,
+ pub struct Ray<'a> {
+ pub origin: &'a Point3,
+ pub direction: &'a Vec3,
}
- impl Ray {
+ impl<'a> Ray<'a> {
pub fn at(&self, t: f32) -> Point3 {
// Get parametric location
self.origin.add(&self.direction.scalar_mul(t))
diff --git a/src/global.rs b/src/global.rs
index 932daa2..2f99cb9 100644
--- a/src/global.rs
+++ b/src/global.rs
@@ -4,7 +4,7 @@ use crate::calculus::calculus::Point3;
// "Ideal" aspect ratio, allowing fraction
pub const ASPECT_RATIO: f32 = 9.0f32 / 5.0f32;
-pub const IMG_WIDTH: usize = 400;
+pub const IMG_WIDTH: usize = 1000;
const IMG_HEIGHT_TMP: usize = (IMG_WIDTH as f32 / ASPECT_RATIO) as usize;
pub const IMG_HEIGHT: usize = if (IMG_HEIGHT_TMP < 1) { 1 } else { IMG_HEIGHT_TMP };
diff --git a/src/main.rs b/src/main.rs
index 6e1b9e6..a2d8646 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,15 +4,18 @@ mod calculus;
mod renderer;
use crate::global::*;
+use crate::renderer::render;
use crate::view::{render_viewer, View};
fn main() {
- let mut data: DisplayBuffer = [[Pixel::default(); IMG_WIDTH]; IMG_HEIGHT];
+ let mut display_buffer: DisplayBuffer = [[Pixel::default(); IMG_WIDTH]; IMG_HEIGHT];
+
+ // test_render(&mut data);
+ render(&mut display_buffer);
- test_render(&mut data);
let view = View {
- data: &data,
+ display_buffer: &display_buffer,
viewer: render_viewer::ppm_exporter,
};
view.display();
diff --git a/src/renderer.rs b/src/renderer.rs
index 7815673..f712939 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -1,12 +1,21 @@
-use crate::calculus::calculus::Vec3;
-use crate::global::{CAMERA_CENTER, FOCAL_LENGTH, VIEWPORT_HEIGHT, VIEWPORT_WIDTH};
+use crate::calculus::calculus::{Ray, Vec3};
+use crate::global::{DisplayBuffer, Pixel, CAMERA_CENTER, FOCAL_LENGTH, IMG_HEIGHT, IMG_WIDTH, VIEWPORT_HEIGHT, VIEWPORT_WIDTH};
-fn render() {
+fn ray_color(ray: &Ray) -> Vec3 {
+ let unit_direction = ray.direction.unit();
+ let a = 0.5 * (unit_direction.y + 1.0);
+ let vec_1 = Vec3 { x:1.0, y: 1.0, z: 1.0 };
+ let vec_2 = Vec3 { x: 0.5, y: 0.7, z: 1.0 };
+ vec_1.scalar_mul(1.0 - a)
+ .add(&vec_2.scalar_mul(a))
+}
+
+pub fn render(display_buffer: &mut DisplayBuffer) {
let viewport_hor_vector = Vec3{ x: VIEWPORT_WIDTH as f32, y: 0.0, z: 0.0 };
let viewport_ver_vector = Vec3 { x: 0.0, y: -1f32 * VIEWPORT_HEIGHT as f32, z: 0.0 };
let delta_pixel_u = viewport_hor_vector.scalar_mul(1.0 / VIEWPORT_WIDTH as f32);
- let delta_u = viewport_ver_vector.scalar_mul(1.0 / VIEWPORT_WIDTH as f32);
+ let delta_pixel_v = viewport_ver_vector.scalar_mul(1.0 / VIEWPORT_WIDTH as f32);
let viewport_upper_left = CAMERA_CENTER
.sub(&Vec3 { x: 0f32, y: 0f32, z: FOCAL_LENGTH})
@@ -15,4 +24,19 @@ fn render() {
let pixel_upper_left = viewport_upper_left.add(
&delta_pixel_u.add(&delta_pixel_u).scalar_mul(0.5)
);
+
+ (0..IMG_HEIGHT).for_each(|j| {
+ (0..IMG_WIDTH).for_each(|i| {
+ let pixel_center = pixel_upper_left
+ .add(&delta_pixel_u.scalar_mul(i as f32))
+ .add(&delta_pixel_v.scalar_mul(j as f32));
+ let ray_direction = pixel_center.sub(&CAMERA_CENTER);
+ let ray = Ray {
+ origin: &CAMERA_CENTER,
+ direction: &ray_direction,
+ };
+ let Vec3 {x, y, z} = ray_color(&ray);
+ display_buffer[j][i] = Pixel::from_frac(x, y, z);
+ })
+ })
} \ No newline at end of file
diff --git a/src/view.rs b/src/view.rs
index e4a09b1..28ce849 100644
--- a/src/view.rs
+++ b/src/view.rs
@@ -3,13 +3,13 @@ use std::io::Write;
use crate::global::{DisplayBuffer, IMG_HEIGHT, IMG_WIDTH};
pub struct View<'a> {
- pub data: &'a DisplayBuffer,
+ pub display_buffer: &'a DisplayBuffer,
pub viewer: fn(&DisplayBuffer) -> Result<String, std::io::Error>,
}
impl<'a> View<'a> {
pub fn display(&self) {
- let result = (self.viewer)(self.data);
+ let result = (self.viewer)(self.display_buffer);
match result {
Ok(success_msg) => {
println!("{}", success_msg);