From 568e3f4c559281edc6a4d2af9284d1cac42b2990 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Tue, 10 Sep 2013 16:28:32 -0700 Subject: [PATCH] Update scene module for C++ --- src/scene.cc | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/scene.h | 46 ++++++++++--------- 2 files changed, 151 insertions(+), 21 deletions(-) create mode 100644 src/scene.cc diff --git a/src/scene.cc b/src/scene.cc new file mode 100644 index 0000000..910599b --- /dev/null +++ b/src/scene.cc @@ -0,0 +1,126 @@ +/* scene.c + * + * Definition of Scene-related functions. + * + * Eryn Wells + */ + +#include +#include "basics.h" +#include "object.h" +#include "scene.h" + + +Scene::Scene() + : height(640), width(480), + pixels(NULL) +{ } + + +Scene::~Scene() +{ + if (pixels != NULL) { + delete[] pixels; + _is_rendered = false; + } +} + + +bool +Scene::is_rendered() + const +{ + return _is_rendered; +} + + +/* + * scene_load -- + * + * Load scene objects into this Scene from the given file. + */ +void +Scene::read(FILE *file) +{ } + + +/* + * scene_save -- + * + * Write a rendered scene to the given file. + */ +void +Scene::write(FILE *file) +{ } + + +/* + * Scene::render -- + * + * Render the given Scene. + */ +void +Scene::render() +{ + pixels = new Color[width * height]; + if (pixels == NULL) { + // TODO: Print an error. + return; + } + + Ray primary_ray; + Vector3 o, d; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + // Assemble a ray and trace it. + o = Vector3(x, y, -1000); + d = Vector3(0, 0, 1); + d.normalize(); + primary_ray = Ray(o, d); + pixels[y * width + x] = trace_ray(primary_ray, 0); + } + } + + _is_rendered = true; +} + + +void +Scene::add_shape(Shape *shape) +{ + shapes.push_back(shape); +} + + +Color +Scene::trace_ray(const Ray &ray, const int depth) +{ + Color out_color = Color::Black; + + // Find intersections of this ray with objects in the scene. + Shape *intersected_shape = NULL; + float *t = NULL; + float nearest_t = INFINITY; + int nints; + for (Shape *s : shapes) { + nints = s->does_intersect(ray, &t); + if (nints > 0) { + for (int i = 0; i < nints; i++) { + if (t[i] < nearest_t) { + intersected_shape = s; + nearest_t = t[i]; + } + } + delete[] t; + } + } + + // If there was no intersection, return black. + if (intersected_shape == NULL) { + return out_color; + } + + // TODO: Lighting. + + return Color::Red; +} diff --git a/src/scene.h b/src/scene.h index 158a8ec..0d59fd4 100644 --- a/src/scene.h +++ b/src/scene.h @@ -1,6 +1,9 @@ /* scene.h * - * Definition of Scene type and related functions. + * Definition of the Scene class. + * + * Scenes are the top level object in charles. Scenes contain objects, lights, a camera, + * etc. and can be rendered to pixel data and written to a file. * * Eryn Wells */ @@ -8,32 +11,33 @@ #ifndef __SCENE_H__ #define __SCENE_H__ -#include +#include -#include "camera.h" -#include "object.h" +class Shape; -typedef struct _ObjectList ObjectList; - - -typedef struct _Scene +class Scene { - int height, width; /* Pixel dimensions. */ - Camera *camera; +public: + Scene(); + ~Scene(); - ObjectList *objects; + bool is_rendered() const; - int is_rendered; + void read(FILE *f); + void write(FILE *f); + void render(); + + void add_shape(Shape *obj); + +private: + Color trace_ray(const Ray &ray, const int depth); + + int height, width; + std::list shapes; + + bool _is_rendered; Color *pixels; -} Scene; - - -Scene *scene_init(); -void scene_destroy(Scene *scene); -void scene_load(Scene *scene, FILE *scene_file); -void scene_render(Scene *scene); -void scene_add_object(Scene *scene, Object *object); - +}; #endif