#include #include namespace BBC { EntityCluster::EntityCluster(): references(0) // initialize references to 0 { } EntityCluster::~EntityCluster() { mEntityClusterDataList.clear(); } EntityClusterDataPtr EntityCluster::getEntityClusterData(unsigned int value) { return mEntityClusterDataList[value]; } void EntityCluster::removeEntityClusterData(unsigned int value) { mEntityClusterDataList.erase(mEntityClusterDataList.begin() + value); } unsigned int EntityCluster::getNumEntitiesClusterData() { return static_cast(mEntityClusterDataList.size()); } void EntityCluster::addEntityClusterData(EntityClusterDataPtr value) { mEntityClusterDataList.push_back(value); } void EntityCluster::removeEntitClusterData(unsigned int value) { mEntityClusterDataList.erase(mEntityClusterDataList.begin()+value); } EntityPtr EntityCluster::getEntity() { return mEntity; } void EntityCluster::setEntity(EntityPtr value) { mEntity = value; } unsigned int EntityCluster::getBillboardHandle() { return mBillboardHandle; } void EntityCluster::setBillboardHandle(unsigned int value) { mBillboardHandle = value; } void EntityCluster::setEntityDistribution(EntityDistributionPtr value) { mEntityDistribution = value; } EntityDistributionPtr EntityCluster::getEntityDistribution() { return mEntityDistribution; } void EntityCluster::generateEntityCluster() { mEntity = BBC::EntityPtr(new BBC::Entity()); mEntity->getSubEntity(0)->addTextureCoordSet(2); Ogre::Vector3 indicesOffset = Ogre::Vector3::ZERO; mEntity->getSubEntity(0)->enableVertexColors(true); float fRed = Ogre::Math::RangeRandom(0.0,1.0); float fGreen = Ogre::Math::RangeRandom(0.0,1.0); float fBlue = Ogre::Math::RangeRandom(0.0,1.0); Ogre::ColourValue subEntityColour = Ogre::ColourValue(1.0,fRed,fGreen,fBlue); unsigned int offset = 0; for (unsigned int iEntityClusterData = 0; iEntityClusterData < getNumEntitiesClusterData(); iEntityClusterData++) { EntityPtr entity = getEntityClusterData(iEntityClusterData)->getEntity(); for (unsigned int iFace = 0; iFace < entity->getSubEntity(0)->getNumFaces(); iFace++) { UniqueVertex uniqueVertex01, uniqueVertex02, uniqueVertex03; Ogre::Vector3 indices = entity->getSubEntity(0)->getFaceVerticesIDs(iFace); mEntity->getSubEntity(0)->addFaceVerticesIDs(indices + indicesOffset); mEntity->getSubEntity(0)->enableVertexColors(entity->getSubEntity(0)->hasVertexColors()); uniqueVertex01.position = entity->getSubEntity(0)->getUniqueVertex(indices[0]).position; uniqueVertex01.normal = entity->getSubEntity(0)->getUniqueVertex(indices[0]).normal; uniqueVertex01.uv[0] = entity->getSubEntity(0)->getUniqueVertex(indices[0]).uv[0]; if (mEntity->getSubEntity(0)->hasVertexColors()) { uniqueVertex01.colour = subEntityColour.getAsRGBA(); } mEntity->getSubEntity(0)->addUniqueVertex(uniqueVertex01); uniqueVertex02.position = entity->getSubEntity(0)->getUniqueVertex(indices[1]).position; uniqueVertex02.normal = entity->getSubEntity(0)->getUniqueVertex(indices[1]).normal; uniqueVertex02.uv[0] = entity->getSubEntity(0)->getUniqueVertex(indices[1]).uv[0]; if (mEntity->getSubEntity(0)->hasVertexColors()) { uniqueVertex02.colour = subEntityColour.getAsRGBA(); } mEntity->getSubEntity(0)->addUniqueVertex(uniqueVertex02); uniqueVertex03.position = entity->getSubEntity(0)->getUniqueVertex(indices[2]).position; uniqueVertex03.normal = entity->getSubEntity(0)->getUniqueVertex(indices[2]).normal; uniqueVertex03.uv[0] = entity->getSubEntity(0)->getUniqueVertex(indices[2]).uv[0]; if (mEntity->getSubEntity(0)->hasVertexColors()) { uniqueVertex03.colour = subEntityColour.getAsRGBA(); } mEntity->getSubEntity(0)->addUniqueVertex(uniqueVertex03); } offset = offset + entity->getSubEntity(0)->getNumFaces() * 3; indicesOffset = Ogre::Vector3(offset, offset, offset); } } }