diff --git a/src/RayTracer.cc b/src/RayTracer.cc index 2cb39a1..b6d91af 100644 --- a/src/RayTracer.cc +++ b/src/RayTracer.cc @@ -2,10 +2,10 @@ #include "../external/simpleppm.h" #include "Parser.h" +#include +#include #include -using std::vector; - void RayTracer::parse() { for (auto i = json["output"].begin(); i != json["output"].end(); ++i) scenes.push_back(Parser::getScene(*i)); @@ -17,19 +17,41 @@ void RayTracer::parse() { lights.push_back(Parser::getLight(*i)); } -void RayTracer::render() {} +void RayTracer::render(Scene *scene) { + int width = scene->getWidth(); + int height = scene->getHeight(); + Buffer buffer(width * height); + Task *task = new Task(scene, buffer); + tasks.push_back(task); +} -void RayTracer::output() { - for (auto scene : scenes) { - int width = scene->getWidth(); - int height = scene->getHeight(); - vector buffer(3 * width * height); - save_ppm(scene->getName(), buffer, width, height); - } +void RayTracer::output(Task *task) { + string path = task->first->getName(); + int width = task->first->getWidth(); + int height = task->first->getHeight(); + + std::ofstream fout(path, std::ios_base::out | std::ios_base::binary); + fout << "P6" << std::endl + << width << ' ' << height << std::endl + << "255" << std::endl; + + Buffer buffer = task->second; + for (int i = 0; i < height; ++i) + for (int j = 0; j < width; ++j) + fout << 255.0 * buffer[i * width + j].transpose() << ' '; + + fout.close(); } void RayTracer::run() { parse(); - render(); - output(); + + for (auto scene : scenes) + render(scene); + + for (auto task : tasks) + output(task); + + Vector3f test(1, 2, 3); + std::cout << test.transpose() << std::endl; } diff --git a/src/RayTracer.h b/src/RayTracer.h index 1c18f19..1ac2649 100644 --- a/src/RayTracer.h +++ b/src/RayTracer.h @@ -6,8 +6,12 @@ #include "Light.h" #include "Scene.h" +#include #include +using Buffer = std::vector; +using Task = std::pair; + class RayTracer { public: RayTracer(const nlohmann::json &j) : json(j) {} @@ -19,9 +23,11 @@ private: std::vector lights; std::vector geometries; + std::vector tasks; + void parse(); - void render(); - void output(); + void render(Scene *); + void output(Task *); }; #endif // !RAY_TRACER_H_