#ifndef SHAPE_H #define SHAPE_H #include "vec.h" /* * Generic abstract shape class */ class Shape { protected: // Colour of this shape Vec3D col; double ref; double **tex; int texSize; public: Shape() { tex = NULL; } ~Shape() { if (tex) delete tex; } // Returns true if the given ray intersects this shape // maybe add a distance threshold here? virtual Vec3D* rayIntersectsMe(const Ray& ray) = 0; virtual Vec3D normalAt( const Vec3D p ) const = 0; virtual double intensityAt( const Vec3D p ) const = 0; double getReflect() { return ref; } Vec3D getColVec() { return col; } void setTexture(int n, double **data) { if (tex) delete tex; texSize = n; tex = data; } bool textured() { return tex != NULL; } static int rgbToInt( const Vec3D v ); }; class Sphere : public Shape { private: Vec3D c; double radius; public: Sphere(); Sphere(double _cx, double _cy, double _cz, double _radius); Sphere(double _cx, double _cy, double _cz, double _radius, double _r, double _g, double _b); void print(); Vec3D* rayIntersectsMe(const Ray& ray); Vec3D getCenter() const { return c; } Vec3D normalAt( const Vec3D p ) const { return p-c; } double intensityAt( const Vec3D p ) const; }; class Plane : public Shape { private: // one point and 2 vectors on plane Vec3D p1, p2, p3, p4; public: Plane(); Plane::Plane(Vec3D _p1, Vec3D _p2, Vec3D _p3, Vec3D _p4); Plane::Plane(Vec3D _p1, Vec3D _p2, Vec3D _p3, Vec3D _p4, double _r, double _g, double _b); void print(); Vec3D normalAt(const Vec3D p) const { return ((p2 - p1).cross(p3 - p1))*-1; } Vec3D* rayIntersectsMe(const Ray& ray); double intensityAt( const Vec3D p ) const { return 0; } }; class Cylinder : public Shape { private: double z, radius; // z = axis, always up and down double uy, ly; // upper/lower faces public: Cylinder(); Cylinder(double _z, double _radius, double _uy, double _ly); Cylinder(double _z, double _radius, double _uy, double _ly, double _r, double _g, double _b); void print(); Vec3D normalAt(const Vec3D p) const { return (p - Vec3D(0, p.getV1(), z)); } Vec3D* rayIntersectsMe(const Ray& ray); double intensityAt( const Vec3D p ) const { return 0; } }; #endif