--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scene.h Thu Oct 25 16:40:22 2007 +0200
@@ -0,0 +1,135 @@
+/*
+ * C++ RayTracer
+ * file: scene.h
+ *
+ * Radek Brich, 2006
+ */
+
+#ifndef SCENE_H
+#define SCENE_H
+
+#include <vector>
+
+#include "noise.h"
+
+#include "vector.h"
+
+using namespace std;
+
+class Ray
+{
+public:
+ Vector3 a, dir;
+ Ray(const Vector3 &aa, const Vector3 &adir):
+ a(aa), dir(adir) {};
+};
+
+class Light
+{
+public:
+ Vector3 pos;
+ Colour colour;
+ int shadows;
+
+ Light(const Vector3 &position, const Colour &acolour):
+ pos(position), colour(acolour), shadows(1) {};
+ void castshadows(bool ashadows) { shadows = ashadows; };
+};
+
+class Texture
+{
+public:
+ Colour colour;
+ Colour evaluate(Vector3 point)
+ {
+ float sum = 0.0;
+ for (int i = 1; i < 5; i++)
+ sum += fabsf(perlin(point.x*i, point.y*i, point.z*i))/i;
+ float value = sinf(point.x + sum)/2 + 0.5;
+ return Colour(value*colour.r, value*colour.g, value*colour.b);
+ };
+};
+
+class Material
+{
+public:
+ float ambient, diffuse, specular, shininess; // Phong constants
+ float reflection; // how much reflectife is the surface
+ float refraction; // refraction index
+ float transmitivity;
+ Texture texture;
+
+ Material(const Colour &acolour) {
+ texture.colour = acolour;
+ ambient = 0.1;
+ diffuse = 0.5;
+ specular = 1.0;
+ shininess = 20.0;
+ reflection = 0.5;
+ }
+};
+
+class Shape
+{
+public:
+ Material *material;
+ Shape() {};
+ virtual ~Shape() {};
+
+ // first intersection point
+ virtual bool intersect(const Ray &ray, float &dist) = 0;
+
+ // all intersections (only for CSG)
+ virtual bool intersect_all(const Ray &ray, float dist, vector<float> &allts) = 0;
+
+ // normal at point P
+ virtual Vector3 normal(Vector3 &P) = 0;
+};
+
+class Sphere: public Shape
+{
+ float sqr_radius;
+ float inv_radius;
+public:
+ Vector3 center;
+ float radius;
+
+ Sphere(const Vector3 &acenter, const float aradius, Material *amaterial):
+ sqr_radius(aradius*aradius), inv_radius(1.0f/aradius),
+ center(acenter), radius(aradius) { material = amaterial; }
+ bool intersect(const Ray &ray, float &dist);
+ bool intersect_all(const Ray &ray, float dist, vector<float> &allts);
+ Vector3 normal(Vector3 &P) { return (P - center) * inv_radius; };
+};
+
+class Plane: public Shape
+{
+public:
+ Vector3 N;
+ float d;
+
+ Plane(const Vector3 &normal, const float ad, Material *amaterial):
+ N(normal), d(ad) { material = amaterial; };
+ Plane(const Vector3 &normal, const Vector3 &point):
+ N(normal), d(0) { /*TODO*/};
+ bool intersect(const Ray &ray, float &dist);
+ bool intersect_all(const Ray &ray, float dist, vector<float> &allts) {return false;};
+ Vector3 normal(Vector3 &) { return N; };
+};
+
+class Triangle: public Shape
+{
+ int k; // dominant axis
+ float nu, nv, nd;
+ float bnu, bnv;
+ float cnu, cnv;
+public:
+ Vector3 A, B, C, N;
+
+ Triangle(const Vector3 &aA, const Vector3 &aB, const Vector3 &aC, Material *amaterial);
+ bool intersect(const Ray &ray, float &dist);
+ bool intersect_all(const Ray &ray, float dist, vector<float> &allts) {return false;};
+ Vector3 normal(Vector3 &) { return N; };
+};
+
+#endif