diff -r 2a853d284a6a -r 64638385798a include/scene.h --- a/include/scene.h Thu May 15 19:15:57 2008 +0200 +++ b/include/scene.h Mon May 19 22:59:04 2008 +0200 @@ -76,7 +76,7 @@ #endif /** - * General camera + * Standard ray tracing camera */ class Camera { @@ -84,8 +84,12 @@ Float F; public: Camera(): eye(0,0,10), p(0,0,-1), u(-1,0,0), v(0,1,0), F(2*tan(PI/8)) {}; + + /** Position + p,u,v constructor */ Camera(const Vector &C, const Vector &ap, const Vector &au, const Vector &av): eye(C), p(ap), u(au), v(av), F(2*tan(PI/8)) {}; + + /** Look-at constructor */ Camera(const Vector &from, const Vector &lookat, const Vector &up): eye(from), F(2*tan(PI/8)) { @@ -104,21 +108,37 @@ const Vector &getu() const { return u; }; const Vector &getv() const { return v; }; const Float &getF() const { return F; }; + void setEye(const Vector &aeye) { eye = aeye; }; void setp(const Vector &ap) { p = ap; }; void setu(const Vector &au) { u = au; }; void setv(const Vector &av) { v = av; }; + + /** set "screen plane" size + * @param[in] F height of the screen plane */ void setF(const Float &aF) { F = aF; }; + + /** set camera's angle of view (in radians) */ void setAngle(const Float angle) { F = 2*tan(angle/2); }; + + /** rotate camera using a quaternion */ void rotate(const Quaternion &q); + + /** translate the camera in its direction + * @param[in] fw size of forward step + * @param[in] left size of left step + * @param[in] up size of up step + */ void move(const Float fw, const Float left, const Float up); + /** make the ray from screen sample according the camera's parameters */ const Ray makeRay(const Sample &samp) const { Vector dir = normalize(p - (u*samp.x + v*samp.y)*F); return Ray(eye, dir); }; + /** same as makeRay but for ray packet */ #ifndef NO_SIMD void makeRayPacket(const Sample *samples, RayPacket &rays) const { @@ -188,6 +208,8 @@ pos(Vector(0,0,0)), colour(Colour(1,1,1)), cast_shadows(true) {}; Light(const Vector &position, const Colour &acolour): pos(position), colour(acolour), cast_shadows(true) {}; + + /** allow shadows from this light */ void castShadows(int cast) { cast_shadows = cast; }; }; @@ -206,7 +228,17 @@ Float w() const { return H.x-L.x; }; Float h() const { return H.y-L.y; }; Float d() const { return H.z-L.z; }; + + /** + * intersect ray with the bounding box + * @param[in] ray the ray + * @param[out] a distance of first intersection + * @param[out] b distance of second intersection + * @return true if ray intersects bbox + */ bool intersect(const Ray &ray, Float &a, Float &b) const; + + /** same as intersect() but for ray packets */ #ifndef NO_SIMD mfloat4 intersect_packet(const RayPacket &rays, mfloat4 &a, mfloat4 &b) const; #endif