#ifndef __INTERSECTABLE_H #define __INTERSECTABLE_H #include "AxisAlignedBox3.h" #include "Pvs.h" struct VssRayContainer; class Intersectable { public: // last mail id -> warning not thread safe! // both mailId and mailbox should be unique for each thread!!! static int sMailId; static int sReservedMailboxes; int mMailbox; // unique object Id int mId; // universal counter int mCounter; // object based pvs KdPvs mKdPvs; enum { MESH_INSTANCE, TRANSFORMED_MESH_INSTANCE, SPHERE, VIEW_CELL }; Intersectable():mMailbox(0) {} void SetId(const int id) { mId = id; } int GetId() { return mId; } static void NewMail(const int reserve = 1) { sMailId += sReservedMailboxes; sReservedMailboxes = reserve; } void Mail() { mMailbox = sMailId; } bool Mailed() const { return mMailbox == sMailId; } void Mail(const int mailbox) { mMailbox = sMailId + mailbox; } bool Mailed(const int mailbox) const { return mMailbox == sMailId + mailbox; } int IncMail() { return ++mMailbox - sMailId; } virtual AxisAlignedBox3 GetBox() = 0; virtual int CastRay(Ray &ray) = 0; virtual bool IsConvex() = 0; virtual bool IsWatertight() = 0; virtual float IntersectionComplexity() = 0; virtual int NumberOfFaces() const = 0; virtual int Type() const = 0; virtual int GetRandomSurfacePoint(Vector3 &point, Vector3 &normal) = 0; virtual int GetRandomVisibleSurfacePoint(Vector3 &point, Vector3 &normal, const Vector3 &viewpoint, const int maxTries ) = 0; virtual ostream &Describe(ostream &s) = 0; virtual int GenerateSilhouetteRays(const int nrays, const AxisAlignedBox3 &originBox, const AxisAlignedBox3 &directionBox, VssRayContainer &rays ) {return 0;} static bool GreaterCounter(const Intersectable *a, const Intersectable *b) { return a->mCounter > b->mCounter; } }; #endif