#ifndef _BBCBILLBOARDCLUSTERDATA_H #define _BBCBILLBOARDCLUSTERDATA_H #include namespace BBC { // Fordward declaration... class BillboardClusterData; namespace boost { void intrusive_ptr_add_ref(BillboardClusterData * p); void intrusive_ptr_release(BillboardClusterData * p); }; class _BBCExport BillboardClusterData { private: long references; friend void boost::intrusive_ptr_add_ref(BillboardClusterData * p); friend void boost::intrusive_ptr_release(BillboardClusterData * p); public: BillboardClusterData(); virtual ~BillboardClusterData(); void setNormal(Ogre::Vector3 value); Ogre::Vector3 getNormal(); void setD(float value); float getD(); EntityClusterPtr getEntityCluster(); void setEntityCluster(EntityClusterPtr value); virtual void readBillboardClusterData(TiXmlNode *parentNode, int iBillboardGroup); virtual void writeBillboardClusterData(TiXmlNode *parentNode, int iBillboardGroup); virtual void generateBillboardBoundingQuad(); unsigned int getNumUVMapGroups(); Ogre::Vector3 getQuadTopLeftCorner(); Ogre::Vector3 getQuadTopRightCorner(); Ogre::Vector3 getQuadBottomLeftCorner(); Ogre::Vector3 getQuadBottomRightCorner(); void setQuadTopLeftCorner(Ogre::Vector3 topLeft); void setQuadTopRightCorner(Ogre::Vector3 topRight); void setQuadBottomLeftCorner(Ogre::Vector3 bottomLeft); void setQuadBottomRightCorner(Ogre::Vector3 bottomRight); Ogre::Vector3 getAxisX(); Ogre::Vector3 getAxisY(); Ogre::Vector3 getAxisZ(); void setAxisX(Ogre::Vector3 axisX); void setAxisY(Ogre::Vector3 axisY); void setAxisZ(Ogre::Vector3 axisZ); Ogre::Vector2 getBillboardUVMapMin(unsigned int iBillboardGroup); void addBillboardUVMapMin(Ogre::Vector2 minVec); void removeBillboardUVMapMin(unsigned int iBillboardGroup); Ogre::Vector2 getBillboardUVMapMax(unsigned int iBillboardGroup); void addBillboardUVMapMax(Ogre::Vector2 maxVec); void removeBillboardUVMapMax(unsigned int iBillboardGroup); protected: EntityClusterPtr mEntityCluster; Ogre::Vector3 mAxisX; Ogre::Vector3 mAxisY; Ogre::Vector3 mAxisZ; enum BoundingQuadVertex { QUAD_TOP_LEFT, QUAD_TOP_RIGHT, QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_LEFT }; Ogre::Vector3 mBillboardCorners[4]; Ogre::Vector3 mNormal; std::vector mGroupedBillboardUVMapMinList; std::vector mGroupedBillboardUVMapMaxList; float mD; }; // class specific addref/release implementation // the two function overloads must be in the boost namespace on most compilers: namespace boost { inline void intrusive_ptr_add_ref(BillboardClusterData * p) { // increment reference count of object *p ++(p->references); } inline void intrusive_ptr_release(BillboardClusterData * p) { // decrement reference count, and delete object when reference count reaches 0 if (--(p->references) == 0) delete p; } } // namespace boost typedef ::boost::intrusive_ptr BillboardClusterDataPtr; } #endif