summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/raytrace.c97
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;
}