diff options
-rw-r--r-- | tests/raytrace.c | 97 |
1 files changed, 93 insertions, 4 deletions
diff --git a/tests/raytrace.c b/tests/raytrace.c index 83e6b2b..2c8419f 100644 --- a/tests/raytrace.c +++ b/tests/raytrace.c @@ -35,9 +35,22 @@ main() { /* Set the resilience low for tests */ dmnsn_set_resilience(DMNSN_SEVERITY_LOW); + /* Allocate our new scene */ scene = dmnsn_new_scene(); + if (!scene) { + fprintf(stderr, "--- Allocation of scene failed! ---\n"); + return EXIT_FAILURE; + } + + /* Allocate a canvas */ scene->canvas = dmnsn_new_canvas(768, 480); + if (!scene->canvas) { + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Allocation of scene failed! ---\n"); + return EXIT_FAILURE; + } + /* Set up the transformation matrix for the perspective camera */ trans = dmnsn_scale_matrix( dmnsn_vector_construct( ((double)scene->canvas->x)/scene->canvas->y, 1.0, 1.0 @@ -52,8 +65,16 @@ main() { trans ); + /* Create a perspective camera */ scene->camera = dmnsn_new_perspective_camera(trans); + if (!scene->camera) { + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Allocation of scene failed! ---\n"); + return EXIT_FAILURE; + } + /* Background color */ sRGB.R = 0.0; sRGB.G = 0.0; sRGB.B = 0.1; @@ -61,33 +82,101 @@ main() { color.filter = 0.1; scene->background = color; + /* Now make our objects */ + sphere = dmnsn_new_sphere(); + if (!sphere) { + dmnsn_delete_perspective_camera(scene->camera); + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Allocation of sphere failed! ---\n"); + return EXIT_FAILURE; + } + sphere->trans = dmnsn_matrix_inverse( dmnsn_scale_matrix(dmnsn_vector_construct(1.25, 1.25, 1.25)) ); dmnsn_array_push(scene->objects, &sphere); cube = dmnsn_new_cube(); + if (!cube) { + dmnsn_delete_sphere(sphere); + dmnsn_delete_perspective_camera(scene->camera); + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Allocation of sphere failed! ---\n"); + return EXIT_FAILURE; + } + cube->trans = dmnsn_matrix_inverse( dmnsn_rotation_matrix(dmnsn_vector_construct(0.75, 0.0, 0.0)) ); dmnsn_array_push(scene->objects, &cube); progress = dmnsn_raytrace_scene_async(scene); + if (!progress) { + dmnsn_delete_cube(cube); + dmnsn_delete_sphere(sphere); + dmnsn_delete_perspective_camera(scene->camera); + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Couldn't start raytracing worker thread! ---\n"); + return EXIT_FAILURE; + } + progressbar("Raytracing scene: ", progress); - dmnsn_finish_progress(progress); + + if (dmnsn_finish_progress(progress) != 0) { + dmnsn_delete_cube(cube); + dmnsn_delete_sphere(sphere); + dmnsn_delete_perspective_camera(scene->camera); + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Raytracing failed! ---\n"); + return EXIT_FAILURE; + } file = fopen("raytrace.png", "wb"); + if (!file) { + dmnsn_delete_cube(cube); + dmnsn_delete_sphere(sphere); + dmnsn_delete_perspective_camera(scene->camera); + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Couldn't open 'raytrace.png' for writing! ---\n"); + return EXIT_FAILURE; + } + progress = dmnsn_png_write_canvas_async(scene->canvas, file); + if (!progress) { + fclose(file); + dmnsn_delete_cube(cube); + dmnsn_delete_sphere(sphere); + dmnsn_delete_perspective_camera(scene->camera); + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Couldn't start PNG writing worker thread! ---\n"); + return EXIT_FAILURE; + } + progressbar("Writing PNG file: ", progress); - dmnsn_finish_progress(progress); - fclose(file); + if (dmnsn_finish_progress(progress) != 0) { + fclose(file); + dmnsn_delete_cube(cube); + dmnsn_delete_sphere(sphere); + dmnsn_delete_perspective_camera(scene->camera); + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); + fprintf(stderr, "--- Writing canvas to PNG failed! ---\n"); + return EXIT_FAILURE; + } + + fclose(file); dmnsn_delete_cube(cube); dmnsn_delete_sphere(sphere); dmnsn_delete_perspective_camera(scene->camera); dmnsn_delete_canvas(scene->canvas); dmnsn_delete_scene(scene); - return EXIT_SUCCESS; } |