diff -r e9bb83c2b8b9 -r ffe83ca074f3 include/scene.h --- a/include/scene.h Fri Dec 07 16:39:42 2007 +0100 +++ b/include/scene.h Sat Dec 08 12:37:45 2007 +0100 @@ -9,6 +9,7 @@ #define SCENE_H #include +#include #include "noise.h" #include "vector.h" @@ -156,7 +157,7 @@ virtual bool intersect_all(const Ray &ray, Float dist, vector &allts) const = 0; // normal at point P - virtual Vector3 normal(Vector3 &P) const = 0; + virtual const Vector3 normal(const Vector3 &P) const = 0; virtual BBox get_bbox() const = 0; }; @@ -178,7 +179,7 @@ center(acenter), radius(aradius) { material = amaterial; } bool intersect(const Ray &ray, Float &dist) const; bool intersect_all(const Ray &ray, Float dist, vector &allts) const; - Vector3 normal(Vector3 &P) const { return (P - center) * inv_radius; }; + const Vector3 normal(const Vector3 &P) const { return (P - center) * inv_radius; }; BBox get_bbox() const; }; @@ -196,10 +197,28 @@ }; bool intersect(const Ray &ray, Float &dist) const; bool intersect_all(const Ray &ray, Float dist, vector &allts) const { return false; }; - Vector3 normal(Vector3 &P) const; + const Vector3 normal(const Vector3 &P) const; BBox get_bbox() const { return BBox(L, H); }; }; +class Vertex +{ +public: + Vector3 P; + Vertex(const Vector3 &aP): P(aP) {}; +}; + +class NormalVertex: public Vertex +{ +public: + Vector3 N; + NormalVertex(const Vector3 &aP): Vertex(aP) {}; + NormalVertex(const Vector3 &aP, const Vector3 &aN): Vertex(aP), N(aN) {}; + const Vector3 &getNormal() { return N; }; + void setNormal(const Vector3 &aN) { N = aN; }; +}; + + class Triangle: public Shape { #ifdef TRI_BARI_PRE @@ -214,13 +233,39 @@ #ifdef TRI_PLUCKER Float pla[6], plb[6], plc[6]; #endif + Vector3 N; + bool smooth; + const Vector3 smooth_normal(const Vector3 &P) const + { +#ifdef TRI_BARI_PRE + const Vector3 &NA = static_cast(A)->N; + const Vector3 &NB = static_cast(B)->N; + const Vector3 &NC = static_cast(C)->N; + static const int modulo3[5] = {0,1,2,0,1}; + register const int ku = modulo3[k+1]; + register const int kv = modulo3[k+2]; + const Float pu = P[ku] - A->P[ku]; + const Float pv = P[kv] - A->P[kv]; + const Float u = pv * bnu + pu * bnv; + const Float v = pu * cnv + pv * cnu; + Vector3 n = NA + u * (NB - NA) + v * (NC - NA); + n.normalize(); + return n; +#else + return N; // not implemented for other algorithms +#endif + }; public: - Vector3 A, B, C, N; + Vertex *A, *B, *C; - Triangle(const Vector3 &aA, const Vector3 &aB, const Vector3 &aC, Material *amaterial); + Triangle(Vertex *aA, Vertex *aB, Vertex *aC, Material *amaterial); bool intersect(const Ray &ray, Float &dist) const; bool intersect_all(const Ray &ray, Float dist, vector &allts) const {return false;}; - Vector3 normal(Vector3 &) const { return N; }; + const Vector3 normal(const Vector3 &P) const { return (smooth ? smooth_normal(P) : N); }; + const Vector3 getNormal() const { return N; }; + void setSmooth() { smooth = true; };//(typeid(*A) == typeid(*B) == typeid(*C) == typeid(NormalVertex)); }; + void setFlat() { smooth = false; }; + bool getSmooth() const { return smooth; }; BBox get_bbox() const; };