#include <stdio.h>
-#include "pixmap.h"
+#include "raster.h"
#include "scene.h"
+#ifndef EXPORT_PPM
+#define EXPORT_PPM 1
+#endif
+#ifndef EXPORT_BMP
+#define EXPORT_BMP 1
+#endif
+
+
/*
- * Read a scene file, construct the scene object, draw the scene to a pixmap,
- * and export the pixmap in PPM and BMP formats.
+ * Load a scene from a file.
*/
-int main(int argc, char* argv[])
+static int load(scene_t** scene, const char* filename)
{
- scene_t* scene = scene_alloc("scene.u2d");
- if (scene == NULL) {
- fprintf(stderr, "An error prevented the scene from loading. Aborting!\n");
+ *scene = scene_alloc(filename);
+ if (*scene == NULL) {
return 1;
}
+ return 0;
+}
+
+/*
+ * Load a scene file, render it, and export it to PPM and BMP formats.
+ */
+static void draw(const char* filename)
+{
+ char* u3d;
+ if (strcmp(filename, "-") == 0) {
+ u3d = mem_strdup("stdin");
+ }
+ else {
+ u3d = mem_strdup(filename);
+ }
- pixmap_t* raster = scene_render(scene);
+ scene_t* scene;
+ TRY_DO("Loading %s", load(&scene, filename), u3d);
+
+ raster_t* raster = scene_render(scene);
scene_destroy(scene);
+ raster_printstats(raster);
- pixmap_export_ppm(raster, "scene.ppm");
- pixmap_export_bmp(raster, "scene.bmp");
+ strcut(u3d, '.');
+#if EXPORT_PPM
+ char* ppm = mem_strcat(u3d, ".ppm");
+ TRY_DO("Exporting to %s", raster_export_ppm(raster, ppm), ppm);
+ mem_free(ppm);
+#endif
+#if EXPORT_BMP
+ char* bmp = mem_strcat(u3d, ".bmp");
+ TRY_DO("Exporting to %s", raster_export_bmp(raster, bmp), bmp);
+ mem_free(bmp);
+#endif
- pixmap_destroy(raster);
+ mem_free(u3d);
+ raster_destroy(raster);
+}
-#ifndef NDEBUG
+/*
+ * Render one or more scenes from 3D scene files.
+ */
+int main(int argc, char* argv[])
+{
+ if (argc <= 1) {
+ draw("scene.u3d");
+ }
+ else {
+ for (int i = 1; i < argc; ++i) {
+ draw(argv[i]);
+ }
+ }
+
+#if !NDEBUG
int _blocks = mem_blocks();
if (_blocks != 0) {
fprintf(stderr, " *** Leaked %d blocks of memory! ***\n", _blocks);
- return 1;
+ return EXIT_FAILURE;
}
#endif
- return 0;
+ return EXIT_SUCCESS;
}