#define CANVAS_MAX 2048 #include "tuples.h" #include "canvas.h" #include "rays.h" #include "spheres.h" #include "intersections.h" #include "transformations.h" #include "materials.h" #include "world.h" #include "camera.h" static struct canvas _canvas; int main() { struct tuple ray_origin = point(0.0f, 0.0f, -5.0f); float wall_z = 10.0f; float wall_size = 7.0f; int canvas_pixels = 100; float pixel_size = wall_size / (float)canvas_pixels; float half = wall_size / 2.0f; struct shape floor = plane(); floor.material.color = color(1.0f, 0.9f, 0.9f); floor.material.specular = 0.0f; /* struct shape left_wall = sphere(); { struct mat4x4 _translation = translation(0.0f, 0.0f, 5.0f); struct mat4x4 _rotation_y = rotation_y(-pi / 4.0f); struct mat4x4 _rotation_x = rotation_x(pi / 2.0f); struct mat4x4 _scaling = scaling(10.0f, 0.05f, 10.0f); struct mat4x4 t0 = mat4x4_mul_m(_rotation_x, _scaling); struct mat4x4 t1 = mat4x4_mul_m(_rotation_y, t0); struct mat4x4 t2 = mat4x4_mul_m(_translation, t1); left_wall.transform = t2; } left_wall.material = floor.material; struct shape right_wall = sphere(); { struct mat4x4 _translation = translation(0.0f, 0.0f, 5.0f); struct mat4x4 _rotation_y = rotation_y(pi / 4.0f); struct mat4x4 _rotation_x = rotation_x(pi / 2.0f); struct mat4x4 _scaling = scaling(10.0f, 0.05f, 10.0f); struct mat4x4 t0 = mat4x4_mul_m(_rotation_x, _scaling); struct mat4x4 t1 = mat4x4_mul_m(_rotation_y, t0); struct mat4x4 t2 = mat4x4_mul_m(_translation, t1); right_wall.transform = t2; } right_wall.material = floor.material; */ struct shape middle = sphere(); middle.transform = translation(-0.5f, 1.0f, 0.5f); middle.material.color = color((float)0xfc / 255.f , (float)0x6d / 255.f, (float)0x09 / 255.f); middle.material.diffuse = 0.7; middle.material.specular = 0.3; struct shape right = sphere(); struct mat4x4 right_t = translation(1.5f, 0.5f, -0.5f); struct mat4x4 right_s = scaling(0.5f, 0.5f, 0.5f); right.transform = mat4x4_mul_m(right_t, right_s); right.material.color = color(0.5f, 1.0f, 0.1f); right.material.diffuse = 0.7; right.material.specular = 0.3; struct shape left = sphere(); struct mat4x4 left_t = translation(-1.5f, 0.33f, -0.75f); struct mat4x4 left_s = scaling(0.33f, 0.33f, 0.33f); left.transform = mat4x4_mul_m(left_t, left_s); left.material.color = color((float)0x12 / 255.f, (float)0xc9 / 255.f, (float)0xcc / 255.f); left.material.diffuse = 0.7; left.material.specular = 0.3; struct tuple light_position = point(-10.0f, 10.0f, -10.0f); struct tuple light_color = color(1.0f, 1.0f, 1.0f); struct light light = point_light(light_position, light_color); struct shape h1 = plane(); struct shape h2 = plane(); struct shape h3 = plane(); struct shape h4 = plane(); struct shape h5 = plane(); struct shape h6 = plane(); struct mat4x4 h1_t = translation(0, 8, 8); struct mat4x4 h2_t = translation(4, 0, 6.9282); struct mat4x4 h3_t = translation(-4, 0, 6.9282); struct mat4x4 h4_t = translation(0, -8, 8); struct mat4x4 h5_t = translation(-4, 0, -6.9282); struct mat4x4 h6_t = translation(4, 0, -6.9282); struct mat4x4 h1_r = rotation_x(tau / 4.0f); struct mat4x4 h2_r = rotation_x(tau / 4.0f); struct mat4x4 h3_r = rotation_x(tau / 4.0f); struct mat4x4 h4_r = rotation_x(tau / 4.0f); struct mat4x4 h5_r = rotation_x(tau / 4.0f); struct mat4x4 h6_r = rotation_x(tau / 4.0f); struct mat4x4 h1_rr = rotation_y(tau / 4.0f * 0); h1.transform = mat4x4_mul_m(h1_t, h1_r); h1.transform = mat4x4_mul_m(h1_rr, h1.transform); struct mat4x4 h2_rr = rotation_y(tau / 4.0f * 1); h2.transform = mat4x4_mul_m(h2_t, h2_r); h2.transform = mat4x4_mul_m(h2_rr, h2.transform); struct mat4x4 h3_rr = rotation_y(tau / 4.0f * 2); h3.transform = mat4x4_mul_m(h3_t, h3_r); h3.transform = mat4x4_mul_m(h3_rr, h3.transform); struct mat4x4 h4_rr = rotation_y(tau / 4.0f * 3); h4.transform = mat4x4_mul_m(h4_t, h4_r); h4.transform = mat4x4_mul_m(h4_rr, h4.transform); struct mat4x4 h5_rr = rotation_y(tau / 4.0f); h5.transform = mat4x4_mul_m(h5_rr, h5_r); h5.transform = mat4x4_mul_m(h5_t, h5.transform); struct mat4x4 h6_rr = rotation_y(tau / 4.0f); h6.transform = mat4x4_mul_m(h6_rr, h6_r); h6.transform = mat4x4_mul_m(h6_t, h6.transform); h1.material = floor.material; h1.material.color = color(1.0f, 0.0f, 0.0f); h2.material = floor.material; h2.material.color = color(0.0f, 1.0f, 0.0f); h3.material = floor.material; h3.material.color = color(0.0f, 0.0f, 1.0f); h4.material = floor.material; h4.material.color = color(1.0f, 1.0f, 0.0f); h5.material = floor.material; h5.material.color = color(0.0f, 1.0f, 1.0f); h6.material = floor.material; h6.material.color = color(1.0f, 0.0f, 1.0f); struct world world; world.light = light; world.object_count = 4 + 4; world.objects[0] = floor; world.objects[1] = middle; world.objects[2] = right; world.objects[3] = left; world.objects[4] = h1; world.objects[5] = h2; world.objects[6] = h3; world.objects[7] = h4; world.objects[8] = h5; world.objects[9] = h6; struct camera _camera = camera(1600.0f, 800.0f, pi / 4.f); _camera.transform = view_transform(point(0.0f, 1.5f, -5.0f), point(0.0f, 1.0f, 0.0f), vector(0.0f, 1.0f, 0.0f)); struct mat4x4 middle_t = world.objects[1].transform; for (int i = 0; i < 360; i++) { _camera.transform = view_transform(point(2.0f * cosf(pi / 360 * (float)i * 0.5), 8.5f, 1.0f * sinf(pi / 360 * (float)i * 0.5)), point(0.0f, 1.0f, 0.0f), vector(0.0f, 1.0f, 0.0f)); struct tuple light_position = point(-6.0f * cosf(pi / 360 * (float)i * 3), 10.0f, -6.0f * sinf(pi / 360 * (float)i * 3)); world.light.position = light_position; struct mat4x4 middle_s = scaling(1.0f, 0.4f, 1.0f); struct mat4x4 middle_rz = rotation_z(tau / 360.f * (float)i); struct mat4x4 middle_ry = rotation_y(tau / 360.f * (float)i); struct mat4x4 middle_r = mat4x4_mul_m(middle_rz, middle_ry); struct mat4x4 middle_transform = mat4x4_mul_m(middle_r, middle_s); world.objects[1].transform = mat4x4_mul_m(middle_t, middle_transform); camera_render(&_camera, &world, &_canvas); char s[128]; snprintf(s, 128, "test%03d.ppm", i); printf("%s\n", s); canvas_to_ppm(&_canvas, s); } }