#ifndef _BBCENTITYCLUSTER_H #define _BBCENTITYCLUSTER_H #include #include #include #include #include namespace BBC { // Forward declarations class EntityCluster; namespace boost { void intrusive_ptr_add_ref(EntityCluster * p); void intrusive_ptr_release(EntityCluster * p); }; class _BBCExport EntityCluster { private: long references; friend void boost::intrusive_ptr_add_ref(EntityCluster * p); friend void boost::intrusive_ptr_release(EntityCluster * p); public: EntityCluster(); virtual ~EntityCluster(); void removeEntityClusterData(unsigned int value); EntityClusterDataPtr getEntityClusterData(unsigned int value); void addEntityClusterData(EntityClusterDataPtr value); void removeEntitClusterData(unsigned int value); EntityDistributionPtr getEntityDistribution(); void setEntityDistribution(EntityDistributionPtr value); protected: EntityDistributionPtr mEntityDistribution; std::vector mEntityClusterDataList; std::vector mBillboarHandle; EntityPtr mEntity; unsigned int mBillboardHandle; public: EntityPtr getEntity(); void setEntity(EntityPtr value); unsigned int getNumEntitiesClusterData(); unsigned int getBillboardHandle(); void setBillboardHandle(unsigned int value); void generateEntityCluster(); }; // 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(EntityCluster * p) { // increment reference count of object *p ++(p->references); } inline void intrusive_ptr_release(EntityCluster * p) { // decrement reference count, and delete object when reference count reaches 0 if (--(p->references) == 0) delete p; } } // namespace boost typedef ::boost::intrusive_ptr EntityClusterPtr; } #endif