diff --git a/src/object.c b/src/object.cc similarity index 60% rename from src/object.c rename to src/object.cc index 557d4ea..c56e9c4 100644 --- a/src/object.c +++ b/src/object.cc @@ -14,156 +14,39 @@ #include "object.h" -struct _Object { - ObjectType type; - Vector3 location; - Texture *texture; - void *shape; - - int (*does_intersect)(Object *obj, Ray ray, float **t); -}; - - -typedef struct _Sphere { - float radius; -} Sphere; - static int sphere_does_intersect(Object *obj, Ray ray, float **t); static int sphere_point_lies_on_surface(Object *obj, Vector3 p); static Vector3 sphere_compute_normal(Object *obj, Vector3 p); /* - * object_init --- + * Object::Object -- * - * Create a new object of the given type. + * Default constructor. Create a new Object with an origin at (0, 0, 0). */ -Object * -object_init(ObjectType type) -{ - Object *obj = malloc(sizeof(Object)); - if (obj == NULL) { - return NULL; - } - - obj->type = type; - obj->location = Vector3Zero; - obj->texture = NULL; - - switch (type) { - case ObjectTypeSphere: { - Sphere *s = malloc(sizeof(Sphere)); - if (s == NULL) { - // TODO: DANGER! WILL ROBINSON! - } - obj->shape = s; - s->radius = 0.0; - obj->does_intersect = sphere_does_intersect; - break; - } - default: - assert(0); - } - - return obj; -} +Object::Object() + : origin() +{ } /* - * object_destroy -- + * Object::get_origin -- + * Object::set_origin -- * - * Destroy the given object. - */ -void -object_destroy(Object *obj) -{ - assert(obj != NULL); - assert(obj->shape != NULL); - - free(obj->shape); - free(obj); -} - - -/* - * object_get_location -- - * object_set_location -- - * - * Get and set the location of the object. + * Get and set the Object's origin. */ Vector3 -object_get_location(Object *obj) +Object::get_origin() { - assert(obj != NULL); - return obj->location; + return origin; } void -object_set_location(Object *obj, Vector3 location) +Object::set_origin(Vector3 v) { - assert(obj != NULL); - obj->location = location; + origin = v; } - -/* - * object_get_texture -- - * object_set_texture -- - * - * Get and set the object's texture. - */ -Texture * -object_get_texture(Object *obj) -{ - assert(obj != NULL); - return obj->texture; -} - -void -object_set_texture(Object *obj, Texture *tex) -{ - assert(obj != NULL); - obj->texture = tex; -} - - -/* - * object_does_intersect -- - * - * Determine if a ray intersects with the object. - */ -int -object_does_intersect(Object *obj, Ray ray, float **t) -{ - assert(obj != NULL && obj->does_intersect != NULL); - return obj->does_intersect(obj, ray, t); -} - -/* - * Sphere functions - */ - -/* - * object_sphere_get_radius -- - * object_sphere_set_radius -- - * - * Get and set the radius of a Sphere object. - */ -float -object_sphere_get_radius(Object *obj) -{ - assert(obj != NULL && obj->type == ObjectTypeSphere); - return ((Sphere *)obj->shape)->radius; -} - -void -object_sphere_set_radius(Object *obj, float r) -{ - assert(obj != NULL && obj->type == ObjectTypeSphere); - ((Sphere *)obj->shape)->radius = r; -} - - /* * sphere_does_intersect -- * diff --git a/src/object.h b/src/object.h index 8fd7240..874958f 100644 --- a/src/object.h +++ b/src/object.h @@ -1,38 +1,37 @@ /* object.h * - * Declaration of scene Objects. + * Declaration of abstract, top-level scene objects. The Object class is the top of this hierarchy. All other scene + * objects are based on it. The Shape class defines a visible shape in the scene. * * Eryn Wells */ - -#ifndef __OBJECT_H -#define __OBJECT_H +#ifndef __OBJECT_H__ +#define __OBJECT_H__ #include "basics.h" #include "texture.h" -typedef enum { - ObjectTypeSphere = 1, -} ObjectType; +class Object +{ +public: + Object(); -typedef struct _Object Object; + Vector3 get_origin(); + void set_origin(Vector3 v); + +private: + Vector3 origin; +}; -Object *object_init(ObjectType type); -void object_destroy(Object *obj); - -Vector3 object_get_location(Object *obj); -void object_set_location(Object *obj, Vector3 location); -Texture *object_get_texture(Object *obj); -void object_set_texture(Object *obj, Texture *tex); - -int object_does_intersect(Object *obj, Ray ray, float **t); - -// Sphere methods -float object_sphere_get_radius(Object *obj); -void object_sphere_set_radius(Object *obj, float r); - +class Shape + : public Object +{ +public: + virtual int does_intersect(const Ray &ray, float **t) = 0; + virtual Vector3 compute_normal(const Vector3 &p) = 0; +}; #endif