source: GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/src/LBBCKMeansClusterSerializer.cpp @ 745

Revision 745, 5.6 KB checked in by igarcia, 18 years ago (diff)
Line 
1
2#include "LBBCKMeansClusterSerializer.h"
3
4namespace LBBC {
5
6KMeansClusterSerializer::KMeansClusterSerializer() {
7}
8
9KMeansClusterSerializer::~KMeansClusterSerializer() {
10}
11
12void KMeansClusterSerializer::readBillboardCloud(TiXmlDocument *document, bool groupedBillboards)
13{
14        TiXmlNode *billboardCloudNode = document->FirstChild("billboardCloud");
15        TiXmlNode *billboardGroupsNode = billboardCloudNode->FirstChild("billboardGroups");
16
17        unsigned int numBillboardGroups = Ogre::StringConverter::parseInt(billboardGroupsNode->ToElement()->Attribute("count"));
18       
19        for (unsigned int iBillboardGroup = 0; iBillboardGroup < numBillboardGroups; iBillboardGroup++)
20        {
21                TiXmlNode *billboardGroupNode = billboardGroupsNode->FirstChild("billboardGroup");
22
23                unsigned int numBillboards = Ogre::StringConverter::parseInt(billboardGroupNode->ToElement()->Attribute("count"));
24
25                if (!groupedBillboards)
26                {
27                        for (TiXmlNode *billboardNode = billboardGroupNode->FirstChild("billboard"); billboardNode; billboardNode = billboardNode->NextSibling() )
28                        {
29                                BBC::BillboardPtr billboard = BBC::BillboardPtr( new BBC::Billboard() );
30                                BBC::BillboardClusterDataPtr billboardClusterData = BBC::BillboardClusterDataPtr( new BillboardKMeansClusterData() );
31                                mBillboardCloud->addBillboard(billboard);
32                                billboard->setBillboardClusterData(billboardClusterData);
33                                billboard->getBillboardClusterData()->readBillboardClusterData(billboardNode, -1);
34                        }
35                }
36                else
37                {
38                        BBC::BillboardGroupPtr billboardGroup = BBC::BillboardGroupPtr( new BBC::BillboardGroup() );
39                        mBillboardCloud->addBillboardGroup(billboardGroup);
40
41                        for (TiXmlNode *billboardNode = billboardGroupNode->FirstChild("billboard"); billboardNode; billboardNode = billboardNode->NextSibling() )
42                        {
43                                BBC::BillboardPtr billboard = BBC::BillboardPtr( new BBC::Billboard() );
44                                BBC::BillboardClusterDataPtr billboardClusterData = BBC::BillboardClusterDataPtr( new BillboardKMeansClusterData() );
45                                mBillboardCloud->addBillboard(billboard);
46                                billboard->setBillboardClusterData(billboardClusterData);
47                                billboard->getBillboardClusterData()->readBillboardClusterData(billboardNode, iBillboardGroup);
48                                billboardGroup->addBillboardHandle(billboard->getBillboardHandle());
49                        }
50                }
51        }
52}
53
54void KMeansClusterSerializer::writeBillboardCloud(TiXmlDocument *document, bool groupedBillboards)
55{
56        TiXmlNode *billboardCloudNode = document->InsertEndChild(TiXmlElement("billboardCloud"))->ToElement();
57
58        TiXmlNode *billboardGroupsNode = billboardCloudNode->InsertEndChild(TiXmlElement("billboardGroups"))->ToElement();     
59
60        if (!groupedBillboards)
61        {
62                billboardGroupsNode->ToElement()->SetAttribute("count",Ogre::StringConverter::toString(1));
63                TiXmlNode *billboardGroupNode = billboardGroupsNode->InsertEndChild(TiXmlElement("billboardGroup"))->ToElement();
64
65                unsigned int numSerializedBillboards = 0;
66                unsigned int numSerializedEntities = 0;
67                for (unsigned int iBillboard = 0; iBillboard < mBillboardCloud->getNumBillboards(); iBillboard++)
68                {
69                        BBC::BillboardPtr billboard = mBillboardCloud->getBillboard(iBillboard);
70                        BBC::EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
71
72                        // If the Billboard has Entities...
73                        if (entityCluster->getNumEntitiesClusterData() > 0)
74                        {
75                                BillboardKMeansClusterData *billboardKMeansClusterData = (BillboardKMeansClusterData*)billboard->getBillboardClusterData().get();
76                                billboardKMeansClusterData->writeBillboardClusterData(billboardGroupNode, -1); 
77                                numSerializedBillboards++;
78                                numSerializedEntities = numSerializedEntities + entityCluster->getNumEntitiesClusterData();
79                        }
80                }
81                billboardGroupNode->ToElement()->SetAttribute("count",Ogre::StringConverter::toString(numSerializedBillboards));
82                Ogre::LogManager::getSingleton().logMessage("Num.Serialized Billboards:" + Ogre::StringConverter::toString(numSerializedBillboards) + " with " + Ogre::StringConverter::toString(numSerializedEntities) + " Entities");
83        }
84        else
85        {
86                billboardGroupsNode->ToElement()->SetAttribute("count",Ogre::StringConverter::toString(mBillboardCloud->getNumBillboardGroups()));
87
88                unsigned int numSerializedBillboards = 0;
89                unsigned int numSerializedEntities = 0;
90
91                for (unsigned int iBillboardGroup = 0; iBillboardGroup < mBillboardCloud->getNumBillboardGroups(); iBillboardGroup++)
92                {
93                        TiXmlNode *billboardGroupNode = billboardGroupsNode->InsertEndChild(TiXmlElement("billboardGroup"))->ToElement();
94
95                        for (unsigned int iBillboard = 0; iBillboard < mBillboardCloud->getBillboardGroup(iBillboardGroup)->getNumBillboards(); iBillboard++)
96                        {
97                                BBC::BillboardPtr billboard = mBillboardCloud->getBillboard(mBillboardCloud->getBillboardGroup(iBillboardGroup)->getBillboardHandle(iBillboard));
98                                BBC::EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
99
100                                // If the Billboard has Entities...
101                                if (entityCluster->getNumEntitiesClusterData() > 0)
102                                {
103                                        BillboardKMeansClusterData *billboardKMeansClusterData = (BillboardKMeansClusterData*)billboard->getBillboardClusterData().get();
104                                        billboardKMeansClusterData->writeBillboardClusterData(billboardGroupNode, iBillboardGroup);     
105                                        numSerializedBillboards++;
106                                        numSerializedEntities = numSerializedEntities + entityCluster->getNumEntitiesClusterData();
107                                }
108                        }
109                        billboardGroupNode->ToElement()->SetAttribute("count",Ogre::StringConverter::toString(mBillboardCloud->getBillboardGroup(iBillboardGroup)->getNumBillboards()));
110                }
111
112                Ogre::LogManager::getSingleton().logMessage("Num.Serialized Billboards:" + Ogre::StringConverter::toString(numSerializedBillboards) + " with " + Ogre::StringConverter::toString(numSerializedEntities) + " Entities");
113        }
114}
115
116}
Note: See TracBrowser for help on using the repository browser.