#include "LBBCManager.h" namespace LBBC { Manager::Manager() : BBC::Manager() { //mCf.load("lbbc.cfg"); mBillboardCloudSerializer = new KdTreeClusterSerializer(); mLeafDistributionSerializer = new LeafDistributionSerializer(); mLeafDistributionGenerator = new LeafDistributionGenerator(); mBillboardCloudGenerator = new KdTreeClusterGenerator(); mBillboardCloudUVMapper = new BBC::BillboardCloudUVMapper(); mOgreMeshSerializer = new BBC::OgreMeshSerializer(); } Manager::~Manager() { // How to manage the destruction of BBC::Manager? delete mBillboardCloudSerializer; delete mLeafDistributionSerializer; delete mLeafDistributionGenerator; delete mBillboardCloudGenerator; delete mBillboardCloudUVMapper; delete mOgreMeshSerializer; delete mLeaves; } SampleConfigFile* Manager::getSampleConfigFile() { return &mSampleCf; } void Manager::runSample(Ogre::String sampleConfigFile) { Ogre::LogManager::getSingleton().logMessage("Sample Config Filename:" + sampleConfigFile); mSampleCf.load(sampleConfigFile); mLeaves = new Leaves(); Ogre::Mesh* leavesMesh = BBC::Manager::getSingleton().loadMesh( mSampleCf.getEntitiesMeshPrefixFilename() + ".mesh"); mLeaves->setMesh(leavesMesh); if (mSampleCf.getEntityDistributionGeneration()) { generateEntityDistribution(); } else { loadEntityDistribution(); } if (mSampleCf.getEntityClustersGeneration()) { generateEntityClusters(); } if (mSampleCf.getBillboardCloudGeneration()) { generateBillboardCloud(); } } void Manager::createEntityDistribution() { mLeafDistributionGenerator->setDistribution(mLeaves->getDistribution()); mLeafDistributionGenerator->getEntity()->setMesh(mLeaves->getMesh()); mLeafDistributionGenerator->generate(); } void Manager::saveEntityDistributionSplitted() { BBC::Entity *entity; entity = new BBC::Entity(); if (mSampleCf.getEntityDistributionSplitted() || mSampleCf.getEntityDistributionMerged()) { BBC::EntityDistribution *entityDistribution; unsigned int numSerializedEntities = 0; entityDistribution = mLeaves->getDistribution(); for (unsigned int iEntity = 0; iEntity < entityDistribution->getNumEntities(); iEntity++) { BBC::SubEntity *subEntity = entityDistribution->getEntity(iEntity)->getSubEntity(0); if (iEntity == 0) { // Delete the default constructed subentity... entity->removeSubEntity(0); // Add our first subentity... entity->addSubEntity(subEntity); } else { entity->addSubEntity(subEntity); } entity->getSubEntity(numSerializedEntities)->setMaterialName(mSampleCf.getEntityDistributionMergedMaterialPrefixName()); numSerializedEntities++; } entity->setSubEntitiesDistinctVertexColours(); if (mSampleCf.getEntityDistributionSplitted()) { mOgreMeshSerializer->setEntity(entity); mOgreMeshSerializer->exportMesh(mSampleCf.getEntityClustersFolder() + mSampleCf.getEntityClustersMeshPrefixFilename() + "Splitted.mesh", false, false); mMeshSerializer->exportMesh(entity->getMesh(), mSampleCf.getEntityDistributionFolder() + mSampleCf.getEntitiesMeshPrefixFilename() + "Splitted.mesh"); //mXMLMeshSerializer->exportMesh(entity->getMesh(), mSampleCf.getEntityClustersFolder() + mSampleCf.getEntitiesMeshPrefixFilename() + "Splitted.mesh" + ".xml"); } } if (mSampleCf.getEntityDistributionMerged()) { entity->mergeSubEntities(); entity->getSubEntity(0)->setMaterialName(mSampleCf.getEntityDistributionMergedMaterialPrefixName()); mOgreMeshSerializer->setEntity(entity); mOgreMeshSerializer->exportMesh(mSampleCf.getEntityClustersFolder() + mSampleCf.getEntityClustersMeshPrefixFilename() + "Merged.mesh", false, false); mMeshSerializer->exportMesh(entity->getMesh(), mSampleCf.getEntityDistributionFolder() + mSampleCf.getEntitiesMeshPrefixFilename() + "Merged.mesh"); //mXMLMeshSerializer->exportMesh(entity->getMesh(), mSampleCf.getEntityClustersFolder() + mSampleCf.getEntitiesMeshPrefixFilename() + "Merged.mesh" + ".xml"); delete entity; } } void Manager::saveEntityDistributionXML() { TiXmlDocument *document = mLeafDistributionSerializer->create( mSampleCf.getEntityDistributionFolder() + mSampleCf.getEntityDistributionXMLPrefixFilename() + ".xml"); mLeafDistributionSerializer->setLeafDistribution(mLeaves->getDistribution()); mLeafDistributionSerializer->writeLeafDistribution(document); mLeafDistributionSerializer->save(); } void Manager::loadEntityDistribution() { TiXmlDocument *document = mLeafDistributionSerializer->load( mSampleCf.getEntityDistributionFolder() + mSampleCf.getEntityDistributionXMLPrefixFilename() + ".xml"); mLeafDistributionSerializer->setLeafDistribution(mLeaves->getDistribution()); mLeafDistributionSerializer->getEntity()->setMesh(mLeaves->getMesh()); mLeafDistributionSerializer->readLeafDistribution(document); BBC::Entity *entity; BBC::EntityDistribution *entityDistribution; Ogre::Mesh* leavesSplittedMesh = BBC::Manager::getSingleton().loadMesh(mSampleCf.getEntitiesMeshPrefixFilename() + "Splitted.mesh"); entity = new BBC::Entity(); entity->setMesh(leavesSplittedMesh); entity->loadMesh(false); entityDistribution = mLeaves->getDistribution(); for (unsigned int iSubEntity = 0; iSubEntity < entity->getNumSubEntities(); iSubEntity++) { BBC::Entity *entitySample; BBC::SubEntity *subEntity; BBC::SubEntity *subEntitySample; subEntity = entity->getSubEntity(iSubEntity); entitySample = entityDistribution->getEntity(iSubEntity); subEntitySample = entitySample->getSubEntity(0); entitySample->removeSubEntity(0); // Add our first subentity... entitySample->addSubEntity(subEntity); } } void Manager::generateEntityDistribution() { if (mSampleCf.getEntityDistributionGeneration()) { createEntityDistribution(); saveEntityDistributionSplitted(); saveEntityDistributionXML(); } } void Manager::saveBillboardCloudSplitted() { //exportBillboardCloudMesh() mOgreMeshSerializer->setEntity(mLeaves->getBillboardCloud()->getEntity()); mOgreMeshSerializer->exportMesh(mSampleCf.getBillboardCloudFolder() + mSampleCf.getBillboardCloudMeshPrefixFilename() + "Splitted.mesh",false, false); mMeshSerializer->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh(), mSampleCf.getBillboardCloudFolder() + mSampleCf.getBillboardCloudMeshPrefixFilename() + "Splitted.mesh"); } void Manager::saveBillboardCloudMerged() { mLeaves->getBillboardCloud()->getEntity()->getSubEntity(0)->setMaterialName(mSampleCf.getBillboardCloudMaterialPrefixFilename()); mOgreMeshSerializer->setEntity(mLeaves->getBillboardCloud()->getEntity()); mOgreMeshSerializer->exportMesh(mSampleCf.getBillboardCloudFolder() + mSampleCf.getBillboardCloudMeshPrefixFilename() + "Merged.mesh", mSampleCf.getBillboardCloudMergedBillboards(), false); mMeshSerializer->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh(), mSampleCf.getBillboardCloudFolder() + mSampleCf.getBillboardCloudMeshPrefixFilename() + "Merged.mesh"); } void Manager::saveBillboardCloudXML() { //saveBillboardCloud() TiXmlDocument *document2 = mBillboardCloudSerializer->create( mSampleCf.getBillboardCloudFolder() + mSampleCf.getBillboardCloudXMLPrefixFilename() + ".xml"); mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud()); mBillboardCloudSerializer->writeBillboardCloud(document2); mBillboardCloudSerializer->save(); } void Manager::saveEntityClusters() { BBC::BillboardClusterData *billboardClusterData; BBC::EntityCluster *entityCluster; unsigned int numSerializedBillboards = 0; if (mSampleCf.getEntityClustersSplittedClusters()) { for (unsigned int iBillboard = 0; iBillboard < mLeaves->getBillboardCloud()->getNumBillboards(); iBillboard++) { billboardClusterData = mLeaves->getBillboardCloud()->getBillboard(iBillboard)->getBillboardClusterData(); entityCluster = billboardClusterData->getEntityCluster(); Ogre::LogManager::getSingleton().logMessage("iBillboard: " + Ogre::StringConverter::toString(iBillboard)); if (entityCluster->getNumEntitiesClusterData() > 0) { BBC::Entity *entityClusterized = entityCluster->getEntity(); entityClusterized->getSubEntity(0)->setMaterialName(mSampleCf.getEntityClustersMaterialPrefixFilename()); mOgreMeshSerializer->setEntity(entityClusterized); mOgreMeshSerializer->exportMesh(mSampleCf.getEntityDistributionFolder() + mSampleCf.getEntityClustersMeshPrefixFilename() + Ogre::StringConverter::toString(numSerializedBillboards) + ".mesh", !(mSampleCf.getEntityClustersSplittedClusters()), false); mMeshSerializer->exportMesh(entityClusterized->getMesh(), mSampleCf.getEntityClustersFolder() + mSampleCf.getEntityClustersMeshPrefixFilename() + Ogre::StringConverter::toString(numSerializedBillboards) + ".mesh"); //mXMLMeshSerializer->exportMesh(entityClusterized->getMesh(), entityClusterized->getMesh()->getName() + ".xml"); numSerializedBillboards++; } } } numSerializedBillboards = 0; if (mSampleCf.getEntityClustersMergedClusters()) { BBC::Entity *entity; entity = new BBC::Entity(); for (unsigned int iBillboard = 0; iBillboard < mLeaves->getBillboardCloud()->getNumBillboards(); iBillboard++) { billboardClusterData = mLeaves->getBillboardCloud()->getBillboard(iBillboard)->getBillboardClusterData(); entityCluster = billboardClusterData->getEntityCluster(); if (entityCluster->getNumEntitiesClusterData() > 0) { BBC::Entity *entityClusterized = entityCluster->getEntity(); entityClusterized->getSubEntity(0)->setMaterialName(mSampleCf.getEntityClustersMaterialPrefixFilename()); BBC::SubEntity *subEntity = entityClusterized->getSubEntity(0); if (numSerializedBillboards == 0) { // Delete the default constructed subentity... entity->removeSubEntity(0); // Add our first subentity... entity->addSubEntity(subEntity); } else { entity->addSubEntity(subEntity); } numSerializedBillboards++; } } Ogre::LogManager::getSingleton().logMessage(" Mesh Generation --" + Ogre::StringConverter::toString(numSerializedBillboards)); mOgreMeshSerializer->setEntity(entity); mOgreMeshSerializer->exportMesh(mSampleCf.getEntityClustersFolder() + mSampleCf.getEntityClustersMeshPrefixFilename() + "Merged.mesh", false, false); mMeshSerializer->exportMesh(entity->getMesh(), mSampleCf.getEntityClustersFolder() + mSampleCf.getEntityClustersMeshPrefixFilename() + "Merged.mesh"); //mXMLMeshSerializer->exportMesh(entity->getMesh(), mSampleCf.getEntityClustersFolder() + mSampleCf.getEntityClustersMeshPrefixFilename() + "Merged.mesh" + ".xml"); delete entity; } } void Manager::createEntityClusters() { mBillboardCloudGenerator->setDistribution(mLeaves->getDistribution()); mBillboardCloudGenerator->setBillboardCloud(mLeaves->getBillboardCloud()); mBillboardCloudGenerator->setMaxNumBillboards(mSampleCf.getEntityClustersMaxClusters()); ((KdTreeClusterGenerator*)mBillboardCloudGenerator)->setAlpha(mSampleCf.getEntityClustersAlpha()); ((KdTreeClusterGenerator*)mBillboardCloudGenerator)->setNumIterations(mSampleCf.getEntityClustersNumIterations()); ((KdTreeClusterGenerator*)mBillboardCloudGenerator)->generate(); } void Manager::saveSingleEntity() { if (mSampleCf.getEntitySampleMeshGeneration()) { BBC::Entity *entityLeaf = mLeaves->getDistribution()->getEntity(2); entityLeaf->getSubEntity(0)->setMaterialName(mSampleCf.getEntityClustersMaterialPrefixFilename()); mOgreMeshSerializer->setEntity(entityLeaf); mOgreMeshSerializer->exportMesh(mSampleCf.getEntityDistributionFolder() + mSampleCf.getEntitySampleMeshPrefixFilename(), mSampleCf.getEntityClustersMergedClusters(), false); //mXMLMeshSerializer->exportMesh(entityLeaf->getMesh(), entityLeaf->getMesh()->getName() + ".xml"); } } void Manager::generateEntityClusters() { Ogre::LogManager::getSingleton().logMessage("EntityClustersMeshPrefixName:" + mSampleCf.getEntityClustersMeshPrefixFilename()); createEntityClusters(); saveEntityClusters(); saveSingleEntity(); } void Manager::generateBillboardCloud() { if (mSampleCf.getBillboardCloudMergedBillboards()) { mLeaves->getBillboardCloud()->generateBillboardCloud(mSampleCf.getBillboardCloudMergedBillboards()); if (mSampleCf.getBillboardCloudDiffuseColorTextureAtlasGeneration()) { mBillboardCloudUVMapper->setBillboardCloud(mLeaves->getBillboardCloud()); mBillboardCloudUVMapper->setTextureWidth(mSampleCf.getBillboardCloudDiffuseColorTextureSize()); mBillboardCloudUVMapper->setTextureHeight(mSampleCf.getBillboardCloudDiffuseColorTextureSize()); mBillboardCloudUVMapper->setTextureAtlasWidth(mSampleCf.getBillboardCloudDiffuseColorTextureAtlasSize()); mBillboardCloudUVMapper->setTextureAtlasHeight(mSampleCf.getBillboardCloudDiffuseColorTextureAtlasSize()); mBillboardCloudUVMapper->initialize(); mBillboardCloudUVMapper->generateTextureAtlasTextureCoords(mSampleCf.getBillboardCloudMergedBillboards()); } saveBillboardCloudMerged(); } if (mSampleCf.getBillboardCloudSplittedBillboards()) { mLeaves->getBillboardCloud()->generateBillboardCloud(!mSampleCf.getBillboardCloudSplittedBillboards()); if (mSampleCf.getBillboardCloudDiffuseColorTextureAtlasGeneration()) { mBillboardCloudUVMapper->setBillboardCloud(mLeaves->getBillboardCloud()); mBillboardCloudUVMapper->setTextureWidth(mSampleCf.getBillboardCloudDiffuseColorTextureSize()); mBillboardCloudUVMapper->setTextureHeight(mSampleCf.getBillboardCloudDiffuseColorTextureSize()); mBillboardCloudUVMapper->setTextureAtlasWidth(mSampleCf.getBillboardCloudDiffuseColorTextureAtlasSize()); mBillboardCloudUVMapper->setTextureAtlasHeight(mSampleCf.getBillboardCloudDiffuseColorTextureAtlasSize()); mBillboardCloudUVMapper->initialize(); mBillboardCloudUVMapper->generateTextureAtlasTextureCoords(!mSampleCf.getBillboardCloudSplittedBillboards()); } saveBillboardCloudSplitted(); } saveBillboardCloudXML(); } Leaves* Manager::getLeaves() { return mLeaves; } //exportEntities() /* BBC::Entity *entityLeaves = new BBC::Entity(); entityLeaves->setMesh(leavesMesh); entityLeaves->loadMesh(true); entityLeaves->getSubEntity(0)->setMaterialName(mSampleCf.getEntityClustersMaterialPrefixFilename() + ".material"); mOgreMeshSerializer->setEntity(entityLeaves); mOgreMeshSerializer->exportMesh(mSampleCf.getEntityDistributionFolder() + mSampleCf.getEntitySampleMeshPrefixFilename() + "New.mesh", false, false); mXMLMeshSerializer->exportMesh(entityLeaves->getMesh(), mSampleCf.getEntityDistributionFolder() + mSampleCf.getEntitySampleMeshPrefixFilename() + "New.mesh.xml"); */ }