summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/gl.c110
-rw-r--r--tests/raytrace.c111
-rw-r--r--tests/tests.c99
-rw-r--r--tests/tests.h15
4 files changed, 132 insertions, 203 deletions
diff --git a/tests/gl.c b/tests/gl.c
index ca6950e..5b291f6 100644
--- a/tests/gl.c
+++ b/tests/gl.c
@@ -28,99 +28,25 @@ main() {
dmnsn_progress *progress;
dmnsn_scene *scene;
dmnsn_object *sphere, *cube;
- dmnsn_sRGB sRGB;
- dmnsn_color color;
dmnsn_matrix trans;
unsigned int i;
/* Set the resilience low for tests */
dmnsn_set_resilience(DMNSN_SEVERITY_LOW);
- /* Allocate our new scene */
- scene = dmnsn_new_scene();
+ scene = dmnsn_new_default_scene();
if (!scene) {
- fprintf(stderr, "--- Allocation of scene failed! ---\n");
+ fprintf(stderr, "--- Couldn't create default scene! ---\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 canvas 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
- )
- );
- trans = dmnsn_matrix_mul(
- dmnsn_translation_matrix(dmnsn_vector_construct(0.0, 0.0, -4.0)),
- trans
- );
- trans = dmnsn_matrix_mul(
- dmnsn_rotation_matrix(dmnsn_vector_construct(0.0, 1.0, 0.0)),
- 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 camera failed! ---\n");
- return EXIT_FAILURE;
- }
-
- /* Background color */
- sRGB.R = 0.0;
- sRGB.G = 0.0;
- sRGB.B = 0.1;
- color = dmnsn_color_from_sRGB(sRGB);
- 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 cube 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);
+ dmnsn_array_get(scene->objects, 0, &sphere);
+ dmnsn_array_get(scene->objects, 1, &cube);
+ trans = dmnsn_get_perspective_camera_trans(scene->camera);
display = dmnsn_new_glX_display(scene->canvas);
if (!display) {
- dmnsn_delete_cube(cube);
- dmnsn_delete_sphere(sphere);
- dmnsn_delete_perspective_camera(scene->camera);
- dmnsn_delete_canvas(scene->canvas);
- dmnsn_delete_scene(scene);
+ dmnsn_delete_default_scene(scene);
fprintf(stderr, "--- Couldn't initialize X or glX! ---\n");
return EXIT_FAILURE;
}
@@ -129,11 +55,7 @@ main() {
progress = dmnsn_raytrace_scene_async(scene);
if (!progress) {
dmnsn_delete_display(display);
- dmnsn_delete_cube(cube);
- dmnsn_delete_sphere(sphere);
- dmnsn_delete_perspective_camera(scene->camera);
- dmnsn_delete_canvas(scene->canvas);
- dmnsn_delete_scene(scene);
+ dmnsn_delete_default_scene(scene);
fprintf(stderr, "--- Couldn't start raytracing worker thread! ---\n");
return EXIT_FAILURE;
}
@@ -142,22 +64,14 @@ main() {
if (dmnsn_finish_progress(progress) != 0) {
dmnsn_delete_display(display);
- dmnsn_delete_cube(cube);
- dmnsn_delete_sphere(sphere);
- dmnsn_delete_perspective_camera(scene->camera);
- dmnsn_delete_canvas(scene->canvas);
- dmnsn_delete_scene(scene);
+ dmnsn_delete_default_scene(scene);
fprintf(stderr, "--- Raytracing failed! ---\n");
return EXIT_FAILURE;
}
if (dmnsn_gl_write_canvas(scene->canvas) != 0) {
dmnsn_delete_display(display);
- dmnsn_delete_cube(cube);
- dmnsn_delete_sphere(sphere);
- dmnsn_delete_perspective_camera(scene->camera);
- dmnsn_delete_canvas(scene->canvas);
- dmnsn_delete_scene(scene);
+ dmnsn_delete_default_scene(scene);
fprintf(stderr, "--- Drawing to openGL failed! ---\n");
return EXIT_FAILURE;
}
@@ -180,10 +94,6 @@ main() {
}
dmnsn_delete_display(display);
- dmnsn_delete_cube(cube);
- dmnsn_delete_sphere(sphere);
- dmnsn_delete_perspective_camera(scene->camera);
- dmnsn_delete_canvas(scene->canvas);
- dmnsn_delete_scene(scene);
+ dmnsn_delete_default_scene(scene);
return EXIT_SUCCESS;
}
diff --git a/tests/raytrace.c b/tests/raytrace.c
index 2c8419f..d045df5 100644
--- a/tests/raytrace.c
+++ b/tests/raytrace.c
@@ -36,90 +36,15 @@ main() {
dmnsn_set_resilience(DMNSN_SEVERITY_LOW);
/* Allocate our new scene */
- scene = dmnsn_new_scene();
+ scene = dmnsn_new_default_scene();
if (!scene) {
- fprintf(stderr, "--- Allocation of scene failed! ---\n");
+ fprintf(stderr, "--- Allocation of default 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
- )
- );
- trans = dmnsn_matrix_mul(
- dmnsn_translation_matrix(dmnsn_vector_construct(0.0, 0.0, -4.0)),
- trans
- );
- trans = dmnsn_matrix_mul(
- dmnsn_rotation_matrix(dmnsn_vector_construct(0.0, 1.0, 0.0)),
- 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;
- color = dmnsn_color_from_sRGB(sRGB);
- 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);
+ dmnsn_delete_default_scene(scene);
fprintf(stderr, "--- Couldn't start raytracing worker thread! ---\n");
return EXIT_FAILURE;
}
@@ -127,22 +52,14 @@ main() {
progressbar("Raytracing scene: ", 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);
+ dmnsn_delete_default_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);
+ dmnsn_delete_default_scene(scene);
fprintf(stderr, "--- Couldn't open 'raytrace.png' for writing! ---\n");
return EXIT_FAILURE;
}
@@ -150,11 +67,7 @@ main() {
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);
+ dmnsn_delete_default_scene(scene);
fprintf(stderr, "--- Couldn't start PNG writing worker thread! ---\n");
return EXIT_FAILURE;
}
@@ -163,20 +76,12 @@ main() {
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);
+ dmnsn_delete_default_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);
+ dmnsn_delete_default_scene(scene);
return EXIT_SUCCESS;
}
diff --git a/tests/tests.c b/tests/tests.c
index 0816c5d..4469666 100644
--- a/tests/tests.c
+++ b/tests/tests.c
@@ -20,6 +20,105 @@
#include "tests.h"
+dmnsn_scene *
+dmnsn_new_default_scene()
+{
+ dmnsn_scene *scene;
+ dmnsn_object *sphere, *cube;
+ dmnsn_matrix trans;
+ dmnsn_sRGB sRGB;
+ dmnsn_color color;
+
+ /* Allocate our new scene */
+ scene = dmnsn_new_scene();
+ if (!scene) {
+ return NULL;
+ }
+
+ /* Background color */
+ sRGB.R = 0.0;
+ sRGB.G = 0.0;
+ sRGB.B = 0.1;
+ color = dmnsn_color_from_sRGB(sRGB);
+ color.filter = 0.1;
+ scene->background = color;
+
+ /* Allocate a canvas */
+ scene->canvas = dmnsn_new_canvas(768, 480);
+ if (!scene->canvas) {
+ dmnsn_delete_scene(scene);
+ return NULL;
+ }
+
+ /* 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
+ )
+ );
+ trans = dmnsn_matrix_mul(
+ dmnsn_translation_matrix(dmnsn_vector_construct(0.0, 0.0, -4.0)),
+ trans
+ );
+ trans = dmnsn_matrix_mul(
+ dmnsn_rotation_matrix(dmnsn_vector_construct(0.0, 1.0, 0.0)),
+ trans
+ );
+
+ /* Create a perspective camera */
+ scene->camera = dmnsn_new_perspective_camera(trans);
+ if (!scene->camera) {
+ dmnsn_delete_canvas(scene->canvas);
+ dmnsn_delete_scene(scene);
+ return NULL;
+ }
+
+ /* 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);
+ return NULL;
+ }
+
+ 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);
+ return NULL;
+ }
+
+ cube->trans = dmnsn_matrix_inverse(
+ dmnsn_rotation_matrix(dmnsn_vector_construct(0.75, 0.0, 0.0))
+ );
+ dmnsn_array_push(scene->objects, &cube);
+
+ return scene;
+}
+
+void
+dmnsn_delete_default_scene(dmnsn_scene *scene)
+{
+ dmnsn_object *sphere, *cube;
+ dmnsn_array_get(scene->objects, 0, &sphere);
+ dmnsn_array_get(scene->objects, 1, &cube);
+
+ dmnsn_delete_cube(cube);
+ dmnsn_delete_sphere(sphere);
+ dmnsn_delete_perspective_camera(scene->camera);
+ dmnsn_delete_canvas(scene->canvas);
+ dmnsn_delete_scene(scene);
+}
+
/* XIfEvent callback */
static Bool
WaitForNotify(Display *d, XEvent *e, char *arg)
diff --git a/tests/tests.h b/tests/tests.h
index fa088fc..288f339 100644
--- a/tests/tests.h
+++ b/tests/tests.h
@@ -23,6 +23,17 @@
#include <GL/gl.h>
#include <stdio.h>
+/*
+ * Convenience
+ */
+
+dmnsn_scene *dmnsn_new_default_scene();
+void dmnsn_delete_default_scene(dmnsn_scene *scene);
+
+/*
+ * Windowing
+ */
+
typedef struct {
Display *dpy;
Window win;
@@ -40,5 +51,9 @@ void dmnsn_delete_display(dmnsn_display *display);
/* Flush the GL buffers */
void dmnsn_display_frame(dmnsn_display *display);
+/*
+ * Asynchronicity
+ */
+
/* Print a progress bar of the progress of `progress' */
void progressbar(const char *str, const dmnsn_progress *progress);