#include "LBBCKMeansClusterSerializer.h" namespace LBBC { KMeansClusterSerializer::KMeansClusterSerializer() { } KMeansClusterSerializer::~KMeansClusterSerializer() { } void KMeansClusterSerializer::readBillboardCloud(TiXmlDocument *document, bool groupedBillboards) { TiXmlNode *billboardCloudNode = document->FirstChild("billboardCloud"); TiXmlNode *billboardGroupsNode = billboardCloudNode->FirstChild("billboardGroups"); unsigned int numBillboardGroups = Ogre::StringConverter::parseInt(billboardGroupsNode->ToElement()->Attribute("count")); unsigned int iBillboardGroup = 0; for (TiXmlNode *billboardGroupNode = billboardGroupsNode->FirstChild("billboardGroup"); billboardGroupNode; billboardGroupNode = billboardGroupNode->NextSibling() ) { unsigned int numBillboards = Ogre::StringConverter::parseInt(billboardGroupNode->ToElement()->Attribute("count")); if (!groupedBillboards) { for (TiXmlNode *billboardNode = billboardGroupNode->FirstChild("billboard"); billboardNode; billboardNode = billboardNode->NextSibling() ) { BBC::BillboardPtr billboard = BBC::BillboardPtr( new BBC::Billboard() ); BBC::BillboardClusterDataPtr billboardClusterData = BBC::BillboardClusterDataPtr( new BillboardKMeansClusterData() ); mBillboardCloud->addBillboard(billboard); billboard->setBillboardClusterData(billboardClusterData); billboard->getBillboardClusterData()->readBillboardClusterData(billboardNode, -1); } } else { BBC::BillboardGroupPtr billboardGroup = BBC::BillboardGroupPtr( new BBC::BillboardGroup() ); mBillboardCloud->addBillboardGroup(billboardGroup); for (TiXmlNode *billboardNode = billboardGroupNode->FirstChild("billboard"); billboardNode; billboardNode = billboardNode->NextSibling() ) { BBC::BillboardPtr billboard = BBC::BillboardPtr( new BBC::Billboard() ); BBC::BillboardClusterDataPtr billboardClusterData = BBC::BillboardClusterDataPtr( new BillboardKMeansClusterData() ); mBillboardCloud->addBillboard(billboard); billboard->setBillboardClusterData(billboardClusterData); billboard->getBillboardClusterData()->readBillboardClusterData(billboardNode, iBillboardGroup); billboardGroup->addBillboardHandle(billboard->getBillboardHandle()); } } iBillboardGroup++; } } void KMeansClusterSerializer::writeBillboardCloud(TiXmlDocument *document, bool groupedBillboards) { TiXmlNode *billboardCloudNode = document->InsertEndChild(TiXmlElement("billboardCloud"))->ToElement(); TiXmlNode *billboardGroupsNode = billboardCloudNode->InsertEndChild(TiXmlElement("billboardGroups"))->ToElement(); if (!groupedBillboards) { billboardGroupsNode->ToElement()->SetAttribute("count",Ogre::StringConverter::toString(1)); TiXmlNode *billboardGroupNode = billboardGroupsNode->InsertEndChild(TiXmlElement("billboardGroup"))->ToElement(); unsigned int numSerializedBillboards = 0; unsigned int numSerializedEntities = 0; for (unsigned int iBillboard = 0; iBillboard < mBillboardCloud->getNumBillboards(); iBillboard++) { BBC::BillboardPtr billboard = mBillboardCloud->getBillboard(iBillboard); BBC::EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster(); // If the Billboard has Entities... if (entityCluster->getNumEntitiesClusterData() > 0) { BillboardKMeansClusterData *billboardKMeansClusterData = (BillboardKMeansClusterData*)billboard->getBillboardClusterData().get(); billboardKMeansClusterData->writeBillboardClusterData(billboardGroupNode, -1); numSerializedBillboards++; numSerializedEntities = numSerializedEntities + entityCluster->getNumEntitiesClusterData(); } } billboardGroupNode->ToElement()->SetAttribute("count",Ogre::StringConverter::toString(numSerializedBillboards)); Ogre::LogManager::getSingleton().logMessage("Num.Serialized Billboards:" + Ogre::StringConverter::toString(numSerializedBillboards) + " with " + Ogre::StringConverter::toString(numSerializedEntities) + " Entities"); } else { billboardGroupsNode->ToElement()->SetAttribute("count",Ogre::StringConverter::toString(mBillboardCloud->getNumBillboardGroups())); unsigned int numSerializedBillboards = 0; unsigned int numSerializedEntities = 0; for (unsigned int iBillboardGroup = 0; iBillboardGroup < mBillboardCloud->getNumBillboardGroups(); iBillboardGroup++) { TiXmlNode *billboardGroupNode = billboardGroupsNode->InsertEndChild(TiXmlElement("billboardGroup"))->ToElement(); for (unsigned int iBillboard = 0; iBillboard < mBillboardCloud->getBillboardGroup(iBillboardGroup)->getNumBillboards(); iBillboard++) { BBC::BillboardPtr billboard = mBillboardCloud->getBillboard(mBillboardCloud->getBillboardGroup(iBillboardGroup)->getBillboardHandle(iBillboard)); BBC::EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster(); // If the Billboard has Entities... if (entityCluster->getNumEntitiesClusterData() > 0) { BillboardKMeansClusterData *billboardKMeansClusterData = (BillboardKMeansClusterData*)billboard->getBillboardClusterData().get(); billboardKMeansClusterData->writeBillboardClusterData(billboardGroupNode, iBillboardGroup); numSerializedBillboards++; numSerializedEntities = numSerializedEntities + entityCluster->getNumEntitiesClusterData(); } } billboardGroupNode->ToElement()->SetAttribute("count",Ogre::StringConverter::toString(mBillboardCloud->getBillboardGroup(iBillboardGroup)->getNumBillboards())); } Ogre::LogManager::getSingleton().logMessage("Num.Serialized Billboards:" + Ogre::StringConverter::toString(numSerializedBillboards) + " with " + Ogre::StringConverter::toString(numSerializedEntities) + " Entities"); } } }