zigrtiow: partially configurable camera.

This commit is contained in:
Bill Thiede 2022-08-13 20:35:15 -07:00
parent a4baedefec
commit f2ade1eee2
2 changed files with 27 additions and 13 deletions

View File

@ -1,9 +1,19 @@
const vec = @import("./vec.zig");
const std = @import("std");
const Ray = @import("./ray.zig").Ray;
const Point3 = vec.Point3;
const Vec3 = vec.Vec3;
const math = std.math;
const pi = math.pi;
const tan = math.tan;
// Utility Functions
fn degrees_to_radians(degrees: f32) f32 {
return degrees * pi / 180.0;
}
pub const Camera = struct {
origin: Point3,
@ -11,10 +21,15 @@ pub const Camera = struct {
horizontal: Vec3,
vertical: Vec3,
pub fn init() Camera {
const aspect_ratio = 16.0 / 9.0;
const viewport_height = 2.0;
pub fn init(
vfov: f32, // vertical field-of-view in degrees
aspect_ratio: f32,
) Camera {
const theta = degrees_to_radians(vfov);
const h = tan(theta / 2);
const viewport_height = 2 * h;
const viewport_width = aspect_ratio * viewport_height;
const focal_length = 1.0;
const origin = Point3.init(0, 0, 0);
const horizontal = Vec3.init(viewport_width, 0.0, 0.0);

View File

@ -25,6 +25,9 @@ const Vec3 = vec.Vec3;
const info = std.log.info;
const random_in_hemisphere = vec.random_in_hemisphere;
const write_color = color.write_color;
const math = std.math;
const pi = math.pi;
const cos = math.cos;
fn ray_color(r: Ray, world: Hittable, depth: isize) Color {
// If we've exceeded the ray bounce limit, no more light is gathered.
@ -87,22 +90,18 @@ pub fn main() anyerror!void {
const max_depth = 50;
// World
const r = cos(pi / @as(f32, 4.0));
var tmp_world = HittableList.init();
const material_ground = Material{ .labertian = Labertian{ .albedo = Color.init(0.8, 0.8, 0.0) } };
const material_center = Material{ .labertian = Labertian{ .albedo = Color.init(0.1, 0.2, 0.5) } };
const material_left = Material{ .dielectric = Dielectric{ .ir = 1.5 } };
const material_right = Material{ .metal = Metal{ .albedo = Color.init(0.8, 0.6, 0.2), .fuzz = 0.0 } };
const material_left = Material{ .labertian = Labertian{ .albedo = Color.init(0, 0, 1) } };
const material_right = Material{ .labertian = Labertian{ .albedo = Color.init(1, 0, 0) } };
try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(0, -100.5, -1), 100, material_ground) });
try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(0, 0, -1), 0.5, material_center) });
try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(-1, 0, -1), 0.5, material_left) });
try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(-1, 0, -1), -0.4, material_left) });
try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(1, 0, -1), 0.5, material_right) });
try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(-r, 0, -1), r, material_left) });
try tmp_world.add(Hittable{ .sphere = Sphere.init(Point3.init(r, 0, -1), r, material_right) });
const world = Hittable{ .hittable_list = tmp_world };
// Camera
const cam = Camera.init();
const cam = Camera.init(90, aspect_ratio);
// Render
const Node = Queue(Task).Node;