X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=main.c;h=83878bf5e70e0dc29dddbfc93460d96312c20f3e;hp=ba2c5777db4f5c16009fc606f76f913752bd2ed7;hb=b0a8ea303e942930350bf85c860afc969442c7a4;hpb=0f2508a4f227523a6b7e54798487af19d06a6ce9 diff --git a/main.c b/main.c index ba2c577..83878bf 100644 --- a/main.c +++ b/main.c @@ -7,37 +7,87 @@ #include -#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; }