#ifndef __INTERSECTABLE_H #define __INTERSECTABLE_H #include "AxisAlignedBox3.h" #include "Pvs.h" #include namespace GtpVisibilityPreprocessor { struct VssRayContainer; class KdLeaf; 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; ViewCellPvs mViewCellPvs; /// kd leaves that this intersectable belongs to set mKdLeaves; enum { MESH_INSTANCE, TRANSFORMED_MESH_INSTANCE, SPHERE, VIEW_CELL, OGRE_MESH_INSTANCE }; 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() const = 0; virtual int CastRay(GtpVisibilityPreprocessor::Ray &ray) = 0; virtual bool IsConvex() const = 0; virtual bool IsWatertight() const = 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