source: GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/src/LBBCManager.cpp @ 861

Revision 861, 26.8 KB checked in by igarcia, 18 years ago (diff)
Line 
1
2#include "LBBCManager.h"
3
4namespace LBBC {
5
6LBBCManager::LBBCManager()
7        : BBC::BBCManager()
8{
9        mBillboardCloudSerializer = new KMeansClusterSerializer();
10        mLeafDistributionSerializer = new LeafDistributionSerializer();
11        mLeafDistributionGenerator = new LeafDistributionGenerator();
12        mBillboardCloudGenerator = new KMeansClusterGenerator();
13        mBillboardCloudUVMapper = new BBC::BillboardCloudUVMapper();
14        mOgreMeshSerializer = new BBC::OgreMeshSerializer();
15}
16
17LBBCManager::~LBBCManager()
18{
19        if (mOgreMeshSerializer)
20        {
21                delete mOgreMeshSerializer;
22        }
23        // Gametools -- BUG: 06/04/2006
24        //if (mSampleConfigFile)
25        //{
26        //      delete mSampleConfigFile;
27        //}
28        if (mLeafDistributionSerializer)
29        {
30                delete mLeafDistributionSerializer;
31        }
32        if (mLeafDistributionGenerator)
33        {
34                delete mLeafDistributionGenerator;
35        }
36        if (mBillboardCloudGenerator)
37        {
38                delete mBillboardCloudGenerator;
39        }
40        if (mBillboardCloudUVMapper)
41        {
42                delete mBillboardCloudUVMapper;
43        }
44        if (mBillboardCloudSerializer)
45        {
46                delete mBillboardCloudSerializer;
47        }
48        if (mLeaves)
49        {
50                delete mLeaves;
51        }
52
53}
54
55SampleConfigFile* LBBCManager::getSampleConfigFile()
56{
57        return mSampleConfigFile;
58}
59
60void LBBCManager::setSampleConfigFile(SampleConfigFile *sampleConfigFile)
61{
62        mSampleConfigFile = sampleConfigFile;
63}
64
65void LBBCManager::loadSampleConfigFile(Ogre::String sampleConfigFile)
66{
67        mSampleConfigFile = new SampleConfigFile();
68        mSampleConfigFile->load(sampleConfigFile);
69}
70
71void LBBCManager::initialize()
72{
73        mLeaves = new Leaves();
74        BBC::EntityPtr entityLeaves(new BBC::Entity);
75        BBC::MeshPtr meshLeaves(new BBC::Mesh(this->loadMesh(mSampleConfigFile->getEntitiesFolder(), mSampleConfigFile->getEntitiesMeshName())) );
76        entityLeaves->setMesh(meshLeaves);     
77        mLeaves->setEntity(entityLeaves);
78        mLeaves->getEntity()->setMesh(meshLeaves);
79}
80
81void LBBCManager::createEntityDistribution()
82{
83        mLeafDistributionGenerator->setDistribution(mLeaves->getDistribution());
84        mLeafDistributionGenerator->getEntity()->setMesh(mLeaves->getEntity()->getMesh());     
85        mLeafDistributionGenerator->generate();
86}
87
88void LBBCManager::saveEntityDistributionSplitted()
89{
90        BBC::EntityPtr entity;
91        entity = BBC::EntityPtr(new BBC::Entity());
92
93        if (mSampleConfigFile->getEntityDistributionSplitted() || mSampleConfigFile->getEntityDistributionMerged())
94        {
95                BBC::EntityDistribution *entityDistribution;           
96                unsigned int numSerializedEntities = 0;
97               
98                entityDistribution = mLeaves->getDistribution();
99                for (unsigned int iEntity = 0; iEntity < entityDistribution->getNumEntities(); iEntity++)
100                {                               
101                                BBC::SubEntityPtr subEntity = entityDistribution->getEntity(iEntity)->getSubEntity(0);
102
103                                if (iEntity == 0)
104                                {
105                                        // delete the default constructed subentity...
106                                        entity->removeSubEntity(0);
107
108                                        // Add our first subentity...
109                                        entity->addSubEntity(subEntity);                                       
110                                }
111                                else
112                                {
113                                        entity->addSubEntity(subEntity);
114                                }
115
116                                entity->getSubEntity(numSerializedEntities)->setMaterialName(mSampleConfigFile->getEntityDistributionMergedMaterialName());
117                                numSerializedEntities++;                       
118                }               
119
120                entity->setSubEntitiesDistinctVertexColours();
121               
122                if (mSampleConfigFile->getEntityDistributionSplitted())
123                {
124                        mOgreMeshSerializer->setEntity(entity);
125                        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getEntityClustersFolder() +
126                                mSampleConfigFile->getEntityClustersSplittedMeshName(), false, false);
127                       
128                        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entity->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getEntityDistributionSplittedMeshName());
129                        //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entity->getMesh().get(), mSampleConfigFile->getEntityClustersFolder() + mSampleConfigFile->getEntitiesMeshPrefixName() + "Splitted.mesh" + ".xml");                 
130                }
131        }
132
133        if (mSampleConfigFile->getEntityDistributionMerged())
134        {
135                entity->mergeSubEntities();
136                entity->getSubEntity(0)->setMaterialName(mSampleConfigFile->getEntityDistributionMergedMaterialName());
137       
138                mOgreMeshSerializer->setEntity(entity);
139                mOgreMeshSerializer->exportMesh(mSampleConfigFile->getEntityClustersFolder() +
140                        mSampleConfigFile->getEntityClustersGroupedMeshName(), false, false);
141               
142                OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh((Ogre::Mesh*)entity->getMesh().get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getEntityClustersGroupedMeshName());
143                //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entity->getMesh(), mSampleConfigFile->getEntityClustersFolder() + mSampleConfigFile->getEntitiesMeshPrefixName() + "Merged.mesh" + ".xml");                         
144        }
145}
146
147void LBBCManager::saveEntityDistributionXML()
148{
149        TiXmlDocument *document = mLeafDistributionSerializer->create(
150                                                                        mSampleConfigFile->getEntityDistributionFolder() +
151                                                                        mSampleConfigFile->getEntityDistributionXMLName());
152        mLeafDistributionSerializer->setLeafDistribution(mLeaves->getDistribution());
153        mLeafDistributionSerializer->writeLeafDistribution(document);   
154        mLeafDistributionSerializer->save();
155}
156
157void LBBCManager::loadEntityDistribution()
158{
159        TiXmlDocument *document = mLeafDistributionSerializer->load(
160                                                                        mSampleConfigFile->getEntityDistributionFolder() +
161                                                                        mSampleConfigFile->getEntityDistributionXMLName());
162        mLeafDistributionSerializer->setLeafDistribution(mLeaves->getDistribution());
163        mLeafDistributionSerializer->getEntity()->setMesh(mLeaves->getEntity()->getMesh());
164        mLeafDistributionSerializer->readLeafDistribution(document);
165
166        BBC::EntityPtr entity;
167        BBC::EntityDistribution *entityDistribution;
168
169        BBC::MeshPtr pMeshLeavesSplitted(new BBC::Mesh(this->loadMesh(mSampleConfigFile->getEntitiesFolder(), mSampleConfigFile->getEntityDistributionSplittedMeshName())));
170        entity = BBC::EntityPtr(new BBC::Entity());
171        entity->setMesh(pMeshLeavesSplitted);
172
173        entity->loadMesh(false);
174        entityDistribution = mLeaves->getDistribution();
175
176        for (unsigned int iSubEntity = 0; iSubEntity < entity->getNumSubEntities(); iSubEntity++)
177        {       
178                BBC::EntityPtr entitySample;
179                BBC::SubEntityPtr subEntity;
180                BBC::SubEntityPtr subEntitySample;
181                       
182                subEntity = entity->getSubEntity(iSubEntity);
183                entitySample = entityDistribution->getEntity(iSubEntity);
184                subEntitySample = entitySample->getSubEntity(0);
185                entitySample->removeSubEntity(0);                               
186
187                // Add our first subentity...
188                entitySample->addSubEntity(subEntity); 
189        }
190}
191
192void LBBCManager::generateEntityDistribution()
193{
194        createEntityDistribution();
195        saveEntityDistributionSplitted();
196        saveEntityDistributionXML();
197}
198
199void LBBCManager::saveBillboardCloudGrouped()
200{
201        for (unsigned int iSubEntity = 0; iSubEntity < mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities(); iSubEntity++)
202        {
203                BBC::SubEntityPtr subEntity = mLeaves->getBillboardCloud()->getEntity()->getSubEntity(iSubEntity);
204                subEntity->setMaterialName(mSampleConfigFile->getBillboardCloudGroupedMaterialName() + Ogre::StringConverter::toString(iSubEntity));
205        }
206        mOgreMeshSerializer->setEntity(mLeaves->getBillboardCloud()->getEntity());
207   
208        Ogre::LogManager::getSingleton().logMessage("Num.SubEntities:" + Ogre::StringConverter::toString(mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities()));
209        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getBillboardCloudFolder() +
210                                mSampleConfigFile->getBillboardCloudGroupedMeshName(),false, false);
211        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudGroupedMeshName());
212        OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudGroupedMeshName() + ".xml");
213}
214
215
216void LBBCManager::saveBillboardCloudSplitted()
217{       
218        for (unsigned int iSubEntity = 0; iSubEntity < mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities(); iSubEntity++)
219        {
220                BBC::SubEntityPtr subEntity = mLeaves->getBillboardCloud()->getEntity()->getSubEntity(iSubEntity);
221                subEntity->setMaterialName(mSampleConfigFile->getBillboardCloudSplittedMaterialName());
222        }
223
224        mOgreMeshSerializer->setEntity(mLeaves->getBillboardCloud()->getEntity());
225
226        Ogre::LogManager::getSingleton().logMessage("Num.SubEntities:" + Ogre::StringConverter::toString(mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities()));
227
228        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getBillboardCloudFolder() +
229                                mSampleConfigFile->getBillboardCloudSplittedMeshName(),false, false);
230
231        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudSplittedMeshName());
232        //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudSplittedMeshName() + ".xml");
233}
234
235void LBBCManager::saveBillboardCloudMerged()
236{       
237        for (unsigned int iSubEntity = 0; iSubEntity < mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities(); iSubEntity++)
238        {
239                BBC::SubEntityPtr subEntity = mLeaves->getBillboardCloud()->getEntity()->getSubEntity(iSubEntity);
240                subEntity->setMaterialName(mSampleConfigFile->getBillboardCloudMergedMaterialName());
241        }
242        mOgreMeshSerializer->setEntity(mLeaves->getBillboardCloud()->getEntity());
243   
244        Ogre::LogManager::getSingleton().logMessage("Num.SubEntities:" + Ogre::StringConverter::toString(mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities()));
245        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getBillboardCloudFolder() +
246                                mSampleConfigFile->getBillboardCloudMergedMeshName(),false, false);
247        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudMergedMeshName());       
248        OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudMergedMeshName() + ".xml");   
249}
250
251void LBBCManager::saveBillboardCloudXML()
252{
253        TiXmlDocument *document2 = mBillboardCloudSerializer->create(
254                                                                        mSampleConfigFile->getBillboardCloudFolder() +
255                                                                        mSampleConfigFile->getBillboardCloudSplittedXMLName());
256        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
257        mBillboardCloudSerializer->writeBillboardCloud(document2, false);       
258        mBillboardCloudSerializer->save();
259}
260
261void LBBCManager::saveBillboardCloudGroupedXML()
262{
263        TiXmlDocument *document2 = mBillboardCloudSerializer->create(
264                                                                        mSampleConfigFile->getBillboardCloudFolder() +
265                                                                        mSampleConfigFile->getBillboardCloudGroupedXMLName());
266        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
267        mBillboardCloudSerializer->writeBillboardCloud(document2, true);       
268        mBillboardCloudSerializer->save();
269}
270
271void LBBCManager::saveBillboardCloudMergedXML()
272{
273        TiXmlDocument *document2 = mBillboardCloudSerializer->create(
274                                                                        mSampleConfigFile->getBillboardCloudFolder() +
275                                                                        mSampleConfigFile->getBillboardCloudMergedXMLName());
276        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
277        mBillboardCloudSerializer->writeBillboardCloud(document2, true);       
278        mBillboardCloudSerializer->save();
279}
280
281void LBBCManager::loadBillboardCloudXML()
282{
283        TiXmlDocument *document = mBillboardCloudSerializer->load(
284                                                                        mSampleConfigFile->getBillboardCloudFolder() +
285                                                                        mSampleConfigFile->getBillboardCloudSplittedXMLName());
286
287        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
288        mBillboardCloudSerializer->readBillboardCloud(document, false);
289}
290
291void LBBCManager::loadBillboardCloudGroupedXML()
292{
293        TiXmlDocument *document = mBillboardCloudSerializer->load(
294                                                                        mSampleConfigFile->getBillboardCloudFolder() +
295                                                                        mSampleConfigFile->getBillboardCloudGroupedXMLName());
296       
297        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
298        mBillboardCloudSerializer->readBillboardCloud(document, true);
299}
300
301void LBBCManager::loadBillboardCloudMergedXML()
302{
303        TiXmlDocument *document = mBillboardCloudSerializer->load(
304                                                                        mSampleConfigFile->getBillboardCloudFolder() +
305                                                                        mSampleConfigFile->getBillboardCloudMergedXMLName());
306
307        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
308        mBillboardCloudSerializer->readBillboardCloud(document, true);
309}
310
311void LBBCManager::saveEntityClusters()
312{
313        BBC::BillboardClusterDataPtr billboardClusterData;
314        BBC::EntityClusterPtr entityCluster;
315        unsigned int numSerializedBillboards = 0;       
316
317        if (mSampleConfigFile->getEntityClustersSplittedClusters())
318        {
319
320                for (unsigned int iBillboard = 0; iBillboard < mLeaves->getBillboardCloud()->getNumBillboards(); iBillboard++)
321                {
322                        billboardClusterData = mLeaves->getBillboardCloud()->getBillboard(iBillboard)->getBillboardClusterData();
323                        entityCluster = billboardClusterData->getEntityCluster();
324                        Ogre::LogManager::getSingleton().logMessage("iBillboard: " + Ogre::StringConverter::toString(iBillboard));
325                        if (entityCluster->getNumEntitiesClusterData() > 0)
326                        {                                       
327                                BBC::EntityPtr entityClusterized = entityCluster->getEntity();
328                                entityClusterized->getSubEntity(0)->setMaterialName(mSampleConfigFile->getEntityClustersSplittedMaterialName());
329                                mOgreMeshSerializer->setEntity(entityClusterized);
330                                mOgreMeshSerializer->exportMesh(mSampleConfigFile->getEntityDistributionFolder() +
331                                        mSampleConfigFile->getEntityClustersSplittedMeshName() +
332                                        Ogre::StringConverter::toString(numSerializedBillboards) + ".mesh", !(mSampleConfigFile->getEntityClustersSplittedClusters()), false);
333                                OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entityClusterized->getMesh()->get(),
334                                        mSampleConfigFile->getEntityClustersFolder() +
335                                        mSampleConfigFile->getEntityClustersSplittedMeshName() +
336                                        Ogre::StringConverter::toString(numSerializedBillboards) + ".mesh");
337                                //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entityClusterized->getMesh(), entityClusterized->getMesh()->getName() + ".xml");
338
339                                numSerializedBillboards++;
340                        }
341                }
342        }
343        numSerializedBillboards = 0;
344
345        if (mSampleConfigFile->getEntityClustersGroupedClusters())
346        {
347                BBC::EntityPtr entity;
348                entity = BBC::EntityPtr(new BBC::Entity());
349
350                for (unsigned int iBillboard = 0; iBillboard < mLeaves->getBillboardCloud()->getNumBillboards(); iBillboard++)
351                {
352                        billboardClusterData = mLeaves->getBillboardCloud()->getBillboard(iBillboard)->getBillboardClusterData();
353                        entityCluster = billboardClusterData->getEntityCluster();
354
355                        if (entityCluster->getNumEntitiesClusterData() > 0)
356                        {                       
357                                BBC::EntityPtr entityClusterized = entityCluster->getEntity();
358                                entityClusterized->getSubEntity(0)->setMaterialName(mSampleConfigFile->getEntityClustersGroupedMaterialName());
359                                BBC::SubEntityPtr subEntity = entityClusterized->getSubEntity(0);
360
361                                if (numSerializedBillboards == 0)
362                                {
363                                        // delete the default constructed subentity...
364                                        entity->removeSubEntity(0);
365
366                                        // Add our first subentity...
367                                        entity->addSubEntity(subEntity);
368                                }
369                                else
370                                {
371                                        entity->addSubEntity(subEntity);
372                                }
373
374                                numSerializedBillboards++;
375                        }
376                }
377               
378                Ogre::LogManager::getSingleton().logMessage(" Mesh Generation --" + Ogre::StringConverter::toString(numSerializedBillboards));
379               
380                mOgreMeshSerializer->setEntity(entity);
381                mOgreMeshSerializer->exportMesh(mSampleConfigFile->getEntityClustersFolder() +
382                        mSampleConfigFile->getEntityClustersGroupedMeshName(), false, false);
383               
384                OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entity->getMesh()->get(), mSampleConfigFile->getEntityClustersFolder() + mSampleConfigFile->getEntityClustersGroupedMeshName());
385                //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entity->getMesh(), mSampleConfigFile->getEntityClustersFolder() + mSampleConfigFile->getEntityClustersMeshPrefixName() + "Merged.mesh" + ".xml");
386        }
387}
388
389void LBBCManager::createEntityClusters()
390{
391        mBillboardCloudGenerator->setDistribution(mLeaves->getDistribution());
392        mBillboardCloudGenerator->setBillboardCloud(mLeaves->getBillboardCloud());
393        mBillboardCloudGenerator->setMaxNumBillboards(mSampleConfigFile->getEntityClustersMaxClusters());
394        ((KMeansClusterGenerator*)mBillboardCloudGenerator)->setAlpha(mSampleConfigFile->getEntityClustersAlpha());
395        ((KMeansClusterGenerator*)mBillboardCloudGenerator)->setNumIterations(mSampleConfigFile->getEntityClustersNumIterations());
396        ((KMeansClusterGenerator*)mBillboardCloudGenerator)->generate();
397}
398
399void LBBCManager::saveSingleEntity()
400{
401        BBC::EntityPtr entityLeaf = mLeaves->getDistribution()->getEntity(2);
402        entityLeaf->getSubEntity(0)->setMaterialName(mSampleConfigFile->getEntitySampleMaterialName());
403        mOgreMeshSerializer->setEntity(entityLeaf);
404        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getEntityDistributionFolder() +
405                mSampleConfigFile->getEntitySampleMeshName(), false, false);
406        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entityLeaf->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getEntitySampleMeshName());
407        //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entityLeaf->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getEntitySampleMeshName() + ".xml");     
408}
409
410void LBBCManager::generateEntityClusters()
411{
412        createEntityClusters();
413        saveEntityClusters();   
414}
415
416void LBBCManager::generateBillboardCloud()
417{
418        if (mSampleConfigFile->getBillboardCloudGroupedBillboards())
419        {                               
420                mLeaves->getBillboardCloud()->generateBillboardCloud(false);
421                mLeaves->getBillboardCloud()->initializeBillboardCloudGroups(mSampleConfigFile->getBillboardCloudGroups());
422               
423                mBillboardCloudUVMapper->shutdown();
424                mBillboardCloudUVMapper->setBillboardCloud(mLeaves->getBillboardCloud());
425                mBillboardCloudUVMapper->setTextureWidth(mSampleConfigFile->getBillboardCloudDiffuseColorGroupedBillboardsTextureSize());
426                mBillboardCloudUVMapper->setTextureHeight(mSampleConfigFile->getBillboardCloudDiffuseColorGroupedBillboardsTextureSize());
427                mBillboardCloudUVMapper->setTextureAtlasWidth(mSampleConfigFile->getBillboardCloudDiffuseColorGroupedBillboardsTextureAtlasSize());
428                mBillboardCloudUVMapper->setTextureAtlasHeight(mSampleConfigFile->getBillboardCloudDiffuseColorGroupedBillboardsTextureAtlasSize());
429                mBillboardCloudUVMapper->initialize();                 
430                mBillboardCloudUVMapper->generateTextureAtlasTextureCoords(false, mSampleConfigFile->getBillboardCloudGroupedBillboards(), mSampleConfigFile->getBillboardCloudGroups());
431               
432                mLeaves->getBillboardCloud()->generateBillboardCloudGroups();
433                saveBillboardCloudGrouped();
434                saveBillboardCloudGroupedXML();         
435        }
436
437        if (mSampleConfigFile->getBillboardCloudMergedBillboards())
438        {
439                mLeaves->getBillboardCloud()->generateBillboardCloud(false);
440
441                mLeaves->getBillboardCloud()->initializeBillboardCloudGroups(1);
442
443                mBillboardCloudUVMapper->shutdown();
444                mBillboardCloudUVMapper->setBillboardCloud(mLeaves->getBillboardCloud());
445                mBillboardCloudUVMapper->setTextureWidth(mSampleConfigFile->getBillboardCloudDiffuseColorMergedBillboardsTextureSize());
446                mBillboardCloudUVMapper->setTextureHeight(mSampleConfigFile->getBillboardCloudDiffuseColorMergedBillboardsTextureSize());
447                mBillboardCloudUVMapper->setTextureAtlasWidth(mSampleConfigFile->getBillboardCloudDiffuseColorMergedBillboardsTextureAtlasSize());
448                mBillboardCloudUVMapper->setTextureAtlasHeight(mSampleConfigFile->getBillboardCloudDiffuseColorMergedBillboardsTextureAtlasSize());
449                mBillboardCloudUVMapper->initialize();
450                mBillboardCloudUVMapper->generateTextureAtlasTextureCoords(false, mSampleConfigFile->getBillboardCloudGroupedBillboards(), 1);
451
452                mLeaves->getBillboardCloud()->generateBillboardCloudGroups();
453                saveBillboardCloudMerged();
454                saveBillboardCloudMergedXML();
455        }
456
457        if (mSampleConfigFile->getBillboardCloudSplittedBillboards())
458        {               
459                mLeaves->getBillboardCloud()->generateBillboardCloud(false);
460                //if (mSampleConfigFile->getBillboardCloudDiffuseColorTextureAtlasGeneration())
461                //{
462                //      mBillboardCloudUVMapper->shutdown();
463                //      mBillboardCloudUVMapper->setBillboardCloud(mLeaves->getBillboardCloud());
464                //      mBillboardCloudUVMapper->setTextureWidth(mSampleConfigFile->getBillboardCloudDiffuseColorTextureSize());
465                //      mBillboardCloudUVMapper->setTextureHeight(mSampleConfigFile->getBillboardCloudDiffuseColorTextureSize());
466                //      mBillboardCloudUVMapper->setTextureAtlasWidth(mSampleConfigFile->getBillboardCloudDiffuseColorTextureAtlasSize());
467                //      mBillboardCloudUVMapper->setTextureAtlasHeight(mSampleConfigFile->getBillboardCloudDiffuseColorTextureAtlasSize());
468                //      mBillboardCloudUVMapper->initialize();
469                //      mBillboardCloudUVMapper->generateTextureAtlasTextureCoords(!mSampleConfigFile->getBillboardCloudSplittedBillboards(),false);
470                //}
471                saveBillboardCloudSplitted();
472                saveBillboardCloudXML();
473        }
474
475        saveBillboardCloudIndirectSplittedPointMeshName();
476}
477
478void LBBCManager::saveBillboardCloudIndirectSplittedPointMeshName()
479{
480        BBC::EntityPtr entity;
481        unsigned int numSubEntities = 0;
482
483        entity = BBC::EntityPtr(new BBC::Entity());
484        entity->removeSubEntity(0);
485       
486        for (unsigned int iBillboard = 0; iBillboard < getLeaves()->getBillboardCloud()->getNumBillboards(); iBillboard++)
487        {
488                BBC::BillboardPtr billboard = getLeaves()->getBillboardCloud()->getBillboard(iBillboard);               
489                BBC::EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
490
491                if (entityCluster->getNumEntitiesClusterData() > 0)
492                {                                       
493                        entity->createSubEntity();
494                        entity->getSubEntity(numSubEntities)->setMaterialName(mSampleConfigFile->getBillboardCloudIndirectPointMaterialName());
495                        entity->getSubEntity(numSubEntities)->enableNormals(false);
496                        entity->getSubEntity(numSubEntities)->enableTextureCoords(true);
497                        entity->getSubEntity(numSubEntities)->addTextureCoordSet(2);
498                        entity->getSubEntity(numSubEntities)->enableVertexColours(true);
499
500                        Ogre::Vector3 p1, p2, p3, p4, pa, pb;
501                        Ogre::Real mua, mub;
502                        Ogre::Real height, width;
503                        Ogre::Real hDistance, wDistance;
504
505                        height = Ogre::Vector3(billboard->getBillboardClusterData()->getQuadTopLeftCorner() - billboard->getBillboardClusterData()->getQuadBottomLeftCorner()).length();
506                        width = Ogre::Vector3(billboard->getBillboardClusterData()->getQuadTopLeftCorner() - billboard->getBillboardClusterData()->getQuadTopRightCorner()).length();
507
508                        for (unsigned int iLeaf = 0; iLeaf < entityCluster->getNumEntitiesClusterData(); iLeaf++)
509                        {
510                                BBC::UniqueVertex vertex;
511
512                                LeafKMeansClusterData *leafKMeansClusterData = (LeafKMeansClusterData*)entityCluster->getEntityClusterData(iLeaf).get();
513                                Leaf *leaf = (Leaf*)leafKMeansClusterData->getEntity().get();
514                                vertex.position = leaf->getPosition();
515
516                                hDistance = 0.0;
517                                wDistance = 0.0;
518
519                                p1 = billboard->getBillboardClusterData()->getQuadTopRightCorner();
520                                p2 = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
521                                p3 = leaf->getPosition();
522                                p4 = leaf->getPosition() + billboard->getBillboardClusterData()->getAxisY();
523
524                                if (BBC::Util::lineLineIntersect(p1, p2, p3, p4, &pa, &pb, &mua, &mub))
525                                {
526                                        hDistance = Ogre::Vector3(pa - p1).length();
527                                }
528                                else
529                                {
530                                        Ogre::LogManager::getSingleton().logMessage("Error with intersection: no solution exists.");
531                                }
532
533                                p1 = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
534                                p2 = billboard->getBillboardClusterData()->getQuadTopRightCorner();
535                                p3 = leaf->getPosition();
536                                p4 = leaf->getPosition() + billboard->getBillboardClusterData()->getAxisX();
537
538                                if (BBC::Util::lineLineIntersect(p1, p2, p3, p4, &pa, &pb, &mua, &mub))
539                                {
540                                        wDistance = Ogre::Vector3(pa - p2).length();
541                                }
542                                else
543                                {
544                                        Ogre::LogManager::getSingleton().logMessage("Error with intersection: no solution exists.");
545                                }
546
547                                //Ogre::LogManager::getSingleton().logMessage("W:" + Ogre::StringConverter::toString(width) + " UW:" + Ogre::StringConverter::toString(wDistance));
548                                //Ogre::LogManager::getSingleton().logMessage("H:" + Ogre::StringConverter::toString(height) + " UH:" + Ogre::StringConverter::toString(hDistance));
549
550                                //vertex.uv[0] = Ogre::Vector3(wDistance / width, hDistance / height, 0.0);
551                                //vertex.uv[0] = Ogre::Vector3(1.0 - (hDistance / height), 1.0 - (wDistance / width), 0.0);
552                                Ogre::Real numSamples = mSampleConfigFile->getBillboardCloudDiffuseColorEntityTextureAtlasNumSamples();
553                                Ogre::Real randomInt = Ogre::Math::Ceil(Ogre::Math::RangeRandom(0.5,numSamples));
554
555                                Ogre::Vector2 topLeftCorner[16];
556                                topLeftCorner[0] = Ogre::Vector2(0.0,  0.0);
557                                topLeftCorner[1] = Ogre::Vector2(0.25, 0.0);
558                                topLeftCorner[2] = Ogre::Vector2(0.5,  0.0);
559                                topLeftCorner[3] = Ogre::Vector2(0.75, 0.0);
560                                topLeftCorner[4] = Ogre::Vector2(0.0,  0.25);
561                                topLeftCorner[5] = Ogre::Vector2(0.25, 0.25);
562                                topLeftCorner[6] = Ogre::Vector2(0.5,  0.25);
563                                topLeftCorner[7] = Ogre::Vector2(0.75, 0.25);
564                                topLeftCorner[8] = Ogre::Vector2(0.0,  0.5);
565                                topLeftCorner[9] = Ogre::Vector2(0.25, 0.5);
566                                topLeftCorner[10] = Ogre::Vector2(0.5,  0.5);
567                                topLeftCorner[11] = Ogre::Vector2(0.75, 0.5);
568                                topLeftCorner[12] = Ogre::Vector2(0.0,  0.75);
569                                topLeftCorner[13] = Ogre::Vector2(0.25, 0.75);
570                                topLeftCorner[14] = Ogre::Vector2(0.5,  0.75);
571                                topLeftCorner[15] = Ogre::Vector2(0.75, 0.75);
572
573                                //vertex.uv[0] = Ogre::Vector3(randomInt / numSamples, 0.0, 0.0);
574                               
575                                vertex.uv[0] = Ogre::Vector3(1.0 - topLeftCorner[(unsigned int)randomInt-1][0], 1.0 - topLeftCorner[(unsigned int)randomInt-1][1], 0.0);
576                                vertex.colour = Ogre::ColourValue(Ogre::Math::RangeRandom(0.0, 1.0), Ogre::Math::RangeRandom(0.0, 1.0), Ogre::Math::RangeRandom(0.0, 1.0), 1.0).getAsRGBA();
577                                entity->getSubEntity(numSubEntities)->addUniqueVertex(vertex);
578                        }
579
580                        unsigned int iVertexFace = 0;
581                        Ogre::Vector3 faceVertexIndices = Ogre::Vector3::ZERO;
582
583                        for (unsigned int iVertex = 0; iVertex < entity->getSubEntity(numSubEntities)->getNumVertices(); iVertex++)
584                        {
585                                faceVertexIndices[iVertexFace] = iVertex;
586                                iVertexFace++;
587                               
588                                if ((iVertex + 1) != entity->getSubEntity(numSubEntities)->getNumVertices())
589                                {
590                                        if (iVertexFace == 3)
591                                        {
592                                                entity->getSubEntity(numSubEntities)->addFaceVerticesIDs(faceVertexIndices);
593                                                iVertexFace = 0;
594                                                faceVertexIndices = Ogre::Vector3::ZERO;
595                                        }
596                                }
597                                else
598                                {
599                                        entity->getSubEntity(numSubEntities)->addFaceVerticesIDs(faceVertexIndices);
600                                }                               
601                        }
602
603                        numSubEntities++;
604                }
605        }
606       
607        mOgreMeshSerializer->setEntity(entity);
608        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudIndirectPointMeshName(), false, false);
609        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entity->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getBillboardCloudIndirectPointMeshName());
610        OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entity->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getBillboardCloudIndirectPointMeshName() + ".xml");   
611
612}
613
614Leaves* LBBCManager::getLeaves()
615{
616        return mLeaves;
617}
618
619}
Note: See TracBrowser for help on using the repository browser.