Update object.cc for C++

This commit is contained in:
Eryn Wells 2013-09-10 09:18:05 -07:00
parent 6ad2f16acd
commit a02e31952e
2 changed files with 33 additions and 151 deletions

View file

@ -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 --
*

View file

@ -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 <eryn@erynwells.me>
*/
#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