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

Revision 864, 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
153        mLeafDistributionSerializer->setLeafDistribution(mLeaves->getDistribution());
154        mLeafDistributionSerializer->writeLeafDistribution(document);   
155        mLeafDistributionSerializer->save();
156}
157
158void LBBCManager::loadEntityDistribution()
159{
160        TiXmlDocument *document = mLeafDistributionSerializer->load(
161                                                                        mSampleConfigFile->getEntityDistributionFolder() +
162                                                                        mSampleConfigFile->getEntityDistributionXMLName());
163        mLeafDistributionSerializer->setLeafDistribution(mLeaves->getDistribution());
164        mLeafDistributionSerializer->getEntity()->setMesh(mLeaves->getEntity()->getMesh());
165        mLeafDistributionSerializer->readLeafDistribution(document);
166
167        BBC::EntityPtr entity;
168        BBC::EntityDistribution *entityDistribution;
169
170        BBC::MeshPtr pMeshLeavesSplitted(new BBC::Mesh(this->loadMesh(mSampleConfigFile->getEntitiesFolder(), mSampleConfigFile->getEntityDistributionSplittedMeshName())));
171        entity = BBC::EntityPtr(new BBC::Entity());
172        entity->setMesh(pMeshLeavesSplitted);
173
174        entity->loadMesh(false);
175        entityDistribution = mLeaves->getDistribution();
176
177        for (unsigned int iSubEntity = 0; iSubEntity < entity->getNumSubEntities(); iSubEntity++)
178        {       
179                BBC::EntityPtr entitySample;
180                BBC::SubEntityPtr subEntity;
181                BBC::SubEntityPtr subEntitySample;
182                       
183                subEntity = entity->getSubEntity(iSubEntity);
184                entitySample = entityDistribution->getEntity(iSubEntity);
185                subEntitySample = entitySample->getSubEntity(0);
186                entitySample->removeSubEntity(0);                               
187
188                // Add our first subentity...
189                entitySample->addSubEntity(subEntity); 
190        }
191}
192
193void LBBCManager::generateEntityDistribution()
194{
195        createEntityDistribution();
196    saveEntityDistributionXML();
197        saveEntityDistributionSplitted();
198}
199
200void LBBCManager::saveBillboardCloudGrouped()
201{
202        for (unsigned int iSubEntity = 0; iSubEntity < mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities(); iSubEntity++)
203        {
204                BBC::SubEntityPtr subEntity = mLeaves->getBillboardCloud()->getEntity()->getSubEntity(iSubEntity);
205                subEntity->setMaterialName(mSampleConfigFile->getBillboardCloudGroupedMaterialName() + Ogre::StringConverter::toString(iSubEntity));
206        }
207        mOgreMeshSerializer->setEntity(mLeaves->getBillboardCloud()->getEntity());
208   
209        Ogre::LogManager::getSingleton().logMessage("Num.SubEntities:" + Ogre::StringConverter::toString(mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities()));
210        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getBillboardCloudFolder() +
211                                mSampleConfigFile->getBillboardCloudGroupedMeshName(),false, false);
212        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudGroupedMeshName());
213        OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudGroupedMeshName() + ".xml");
214}
215
216
217void LBBCManager::saveBillboardCloudSplitted()
218{       
219        for (unsigned int iSubEntity = 0; iSubEntity < mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities(); iSubEntity++)
220        {
221                BBC::SubEntityPtr subEntity = mLeaves->getBillboardCloud()->getEntity()->getSubEntity(iSubEntity);
222                subEntity->setMaterialName(mSampleConfigFile->getBillboardCloudSplittedMaterialName());
223        }
224
225        mOgreMeshSerializer->setEntity(mLeaves->getBillboardCloud()->getEntity());
226
227        Ogre::LogManager::getSingleton().logMessage("Num.SubEntities:" + Ogre::StringConverter::toString(mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities()));
228
229        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getBillboardCloudFolder() +
230                                mSampleConfigFile->getBillboardCloudSplittedMeshName(),false, false);
231
232        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudSplittedMeshName());
233        //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudSplittedMeshName() + ".xml");
234}
235
236void LBBCManager::saveBillboardCloudMerged()
237{       
238        for (unsigned int iSubEntity = 0; iSubEntity < mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities(); iSubEntity++)
239        {
240                BBC::SubEntityPtr subEntity = mLeaves->getBillboardCloud()->getEntity()->getSubEntity(iSubEntity);
241                subEntity->setMaterialName(mSampleConfigFile->getBillboardCloudMergedMaterialName());
242        }
243        mOgreMeshSerializer->setEntity(mLeaves->getBillboardCloud()->getEntity());
244   
245        Ogre::LogManager::getSingleton().logMessage("Num.SubEntities:" + Ogre::StringConverter::toString(mLeaves->getBillboardCloud()->getEntity()->getNumSubEntities()));
246        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getBillboardCloudFolder() +
247                                mSampleConfigFile->getBillboardCloudMergedMeshName(),false, false);
248        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudMergedMeshName());       
249        OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(mLeaves->getBillboardCloud()->getEntity()->getMesh()->get(), mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudMergedMeshName() + ".xml");   
250}
251
252void LBBCManager::saveBillboardCloudXML()
253{
254        TiXmlDocument *document2 = mBillboardCloudSerializer->create(
255                                                                        mSampleConfigFile->getBillboardCloudFolder() +
256                                                                        mSampleConfigFile->getBillboardCloudSplittedXMLName());
257        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
258        mBillboardCloudSerializer->writeBillboardCloud(document2, false);       
259        mBillboardCloudSerializer->save();
260}
261
262void LBBCManager::saveBillboardCloudGroupedXML()
263{
264        TiXmlDocument *document2 = mBillboardCloudSerializer->create(
265                                                                        mSampleConfigFile->getBillboardCloudFolder() +
266                                                                        mSampleConfigFile->getBillboardCloudGroupedXMLName());
267        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
268        mBillboardCloudSerializer->writeBillboardCloud(document2, true);       
269        mBillboardCloudSerializer->save();
270}
271
272void LBBCManager::saveBillboardCloudMergedXML()
273{
274        TiXmlDocument *document2 = mBillboardCloudSerializer->create(
275                                                                        mSampleConfigFile->getBillboardCloudFolder() +
276                                                                        mSampleConfigFile->getBillboardCloudMergedXMLName());
277        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
278        mBillboardCloudSerializer->writeBillboardCloud(document2, true);       
279        mBillboardCloudSerializer->save();
280}
281
282void LBBCManager::loadBillboardCloudXML()
283{
284        TiXmlDocument *document = mBillboardCloudSerializer->load(
285                                                                        mSampleConfigFile->getBillboardCloudFolder() +
286                                                                        mSampleConfigFile->getBillboardCloudSplittedXMLName());
287
288        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
289        mBillboardCloudSerializer->readBillboardCloud(document, false);
290}
291
292void LBBCManager::loadBillboardCloudGroupedXML()
293{
294        TiXmlDocument *document = mBillboardCloudSerializer->load(
295                                                                        mSampleConfigFile->getBillboardCloudFolder() +
296                                                                        mSampleConfigFile->getBillboardCloudGroupedXMLName());
297       
298        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
299        mBillboardCloudSerializer->readBillboardCloud(document, true);
300}
301
302void LBBCManager::loadBillboardCloudMergedXML()
303{
304        TiXmlDocument *document = mBillboardCloudSerializer->load(
305                                                                        mSampleConfigFile->getBillboardCloudFolder() +
306                                                                        mSampleConfigFile->getBillboardCloudMergedXMLName());
307
308        mBillboardCloudSerializer->setBillboardCloud(mLeaves->getBillboardCloud());
309        mBillboardCloudSerializer->readBillboardCloud(document, true);
310}
311
312void LBBCManager::saveEntityClusters()
313{
314        BBC::BillboardClusterDataPtr billboardClusterData;
315        BBC::EntityClusterPtr entityCluster;
316        unsigned int numSerializedBillboards = 0;       
317
318        if (mSampleConfigFile->getEntityClustersSplittedClusters())
319        {
320
321                for (unsigned int iBillboard = 0; iBillboard < mLeaves->getBillboardCloud()->getNumBillboards(); iBillboard++)
322                {
323                        billboardClusterData = mLeaves->getBillboardCloud()->getBillboard(iBillboard)->getBillboardClusterData();
324                        entityCluster = billboardClusterData->getEntityCluster();
325                        Ogre::LogManager::getSingleton().logMessage("iBillboard: " + Ogre::StringConverter::toString(iBillboard));
326                        if (entityCluster->getNumEntitiesClusterData() > 0)
327                        {                                       
328                                BBC::EntityPtr entityClusterized = entityCluster->getEntity();
329                                entityClusterized->getSubEntity(0)->setMaterialName(mSampleConfigFile->getEntityClustersSplittedMaterialName());
330                                mOgreMeshSerializer->setEntity(entityClusterized);
331                                mOgreMeshSerializer->exportMesh(mSampleConfigFile->getEntityDistributionFolder() +
332                                        mSampleConfigFile->getEntityClustersSplittedMeshName() +
333                                        Ogre::StringConverter::toString(numSerializedBillboards) + ".mesh", !(mSampleConfigFile->getEntityClustersSplittedClusters()), false);
334                                OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entityClusterized->getMesh()->get(),
335                                        mSampleConfigFile->getEntityClustersFolder() +
336                                        mSampleConfigFile->getEntityClustersSplittedMeshName() +
337                                        Ogre::StringConverter::toString(numSerializedBillboards) + ".mesh");
338                                //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entityClusterized->getMesh(), entityClusterized->getMesh()->getName() + ".xml");
339
340                                numSerializedBillboards++;
341                        }
342                }
343        }
344        numSerializedBillboards = 0;
345
346        if (mSampleConfigFile->getEntityClustersGroupedClusters())
347        {
348                BBC::EntityPtr entity;
349                entity = BBC::EntityPtr(new BBC::Entity());
350
351                for (unsigned int iBillboard = 0; iBillboard < mLeaves->getBillboardCloud()->getNumBillboards(); iBillboard++)
352                {
353                        billboardClusterData = mLeaves->getBillboardCloud()->getBillboard(iBillboard)->getBillboardClusterData();
354                        entityCluster = billboardClusterData->getEntityCluster();
355
356                        if (entityCluster->getNumEntitiesClusterData() > 0)
357                        {                       
358                                BBC::EntityPtr entityClusterized = entityCluster->getEntity();
359                                entityClusterized->getSubEntity(0)->setMaterialName(mSampleConfigFile->getEntityClustersGroupedMaterialName());
360                                BBC::SubEntityPtr subEntity = entityClusterized->getSubEntity(0);
361
362                                if (numSerializedBillboards == 0)
363                                {
364                                        // delete the default constructed subentity...
365                                        entity->removeSubEntity(0);
366
367                                        // Add our first subentity...
368                                        entity->addSubEntity(subEntity);
369                                }
370                                else
371                                {
372                                        entity->addSubEntity(subEntity);
373                                }
374
375                                numSerializedBillboards++;
376                        }
377                }
378               
379                Ogre::LogManager::getSingleton().logMessage(" Mesh Generation --" + Ogre::StringConverter::toString(numSerializedBillboards));
380               
381                mOgreMeshSerializer->setEntity(entity);
382                mOgreMeshSerializer->exportMesh(mSampleConfigFile->getEntityClustersFolder() +
383                        mSampleConfigFile->getEntityClustersGroupedMeshName(), false, false);
384               
385                OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entity->getMesh()->get(), mSampleConfigFile->getEntityClustersFolder() + mSampleConfigFile->getEntityClustersGroupedMeshName());
386                //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entity->getMesh(), mSampleConfigFile->getEntityClustersFolder() + mSampleConfigFile->getEntityClustersMeshPrefixName() + "Merged.mesh" + ".xml");
387        }
388}
389
390void LBBCManager::createEntityClusters()
391{
392        mBillboardCloudGenerator->setDistribution(mLeaves->getDistribution());
393        mBillboardCloudGenerator->setBillboardCloud(mLeaves->getBillboardCloud());
394        mBillboardCloudGenerator->setMaxNumBillboards(mSampleConfigFile->getEntityClustersMaxClusters());
395        ((KMeansClusterGenerator*)mBillboardCloudGenerator)->setAlpha(mSampleConfigFile->getEntityClustersAlpha());
396        ((KMeansClusterGenerator*)mBillboardCloudGenerator)->setNumIterations(mSampleConfigFile->getEntityClustersNumIterations());
397        ((KMeansClusterGenerator*)mBillboardCloudGenerator)->generate();
398}
399
400void LBBCManager::saveSingleEntity()
401{
402        BBC::EntityPtr entityLeaf = mLeaves->getDistribution()->getEntity(2);
403        entityLeaf->getSubEntity(0)->setMaterialName(mSampleConfigFile->getEntitySampleMaterialName());
404        mOgreMeshSerializer->setEntity(entityLeaf);
405        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getEntityDistributionFolder() +
406                mSampleConfigFile->getEntitySampleMeshName(), false, false);
407        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entityLeaf->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getEntitySampleMeshName());
408        //OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entityLeaf->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getEntitySampleMeshName() + ".xml");     
409}
410
411void LBBCManager::generateEntityClusters()
412{
413        createEntityClusters();
414        saveEntityClusters();   
415}
416
417void LBBCManager::generateBillboardCloud()
418{
419        if (mSampleConfigFile->getBillboardCloudGroupedBillboards())
420        {                               
421                mLeaves->getBillboardCloud()->generateBillboardCloud(false);
422                mLeaves->getBillboardCloud()->initializeBillboardCloudGroups(mSampleConfigFile->getBillboardCloudGroups());
423               
424                mBillboardCloudUVMapper->shutdown();
425                mBillboardCloudUVMapper->setBillboardCloud(mLeaves->getBillboardCloud());
426                mBillboardCloudUVMapper->setTextureWidth(mSampleConfigFile->getBillboardCloudDiffuseColorGroupedBillboardsTextureSize());
427                mBillboardCloudUVMapper->setTextureHeight(mSampleConfigFile->getBillboardCloudDiffuseColorGroupedBillboardsTextureSize());
428                mBillboardCloudUVMapper->setTextureAtlasWidth(mSampleConfigFile->getBillboardCloudDiffuseColorGroupedBillboardsTextureAtlasSize());
429                mBillboardCloudUVMapper->setTextureAtlasHeight(mSampleConfigFile->getBillboardCloudDiffuseColorGroupedBillboardsTextureAtlasSize());
430                mBillboardCloudUVMapper->initialize();                 
431                mBillboardCloudUVMapper->generateTextureAtlasTextureCoords(false, mSampleConfigFile->getBillboardCloudGroupedBillboards(), mSampleConfigFile->getBillboardCloudGroups());
432               
433                mLeaves->getBillboardCloud()->generateBillboardCloudGroups();
434                saveBillboardCloudGrouped();
435                saveBillboardCloudGroupedXML();         
436        }
437
438        if (mSampleConfigFile->getBillboardCloudMergedBillboards())
439        {
440                mLeaves->getBillboardCloud()->generateBillboardCloud(false);
441
442                mLeaves->getBillboardCloud()->initializeBillboardCloudGroups(1);
443
444                mBillboardCloudUVMapper->shutdown();
445                mBillboardCloudUVMapper->setBillboardCloud(mLeaves->getBillboardCloud());
446                mBillboardCloudUVMapper->setTextureWidth(mSampleConfigFile->getBillboardCloudDiffuseColorMergedBillboardsTextureSize());
447                mBillboardCloudUVMapper->setTextureHeight(mSampleConfigFile->getBillboardCloudDiffuseColorMergedBillboardsTextureSize());
448                mBillboardCloudUVMapper->setTextureAtlasWidth(mSampleConfigFile->getBillboardCloudDiffuseColorMergedBillboardsTextureAtlasSize());
449                mBillboardCloudUVMapper->setTextureAtlasHeight(mSampleConfigFile->getBillboardCloudDiffuseColorMergedBillboardsTextureAtlasSize());
450                mBillboardCloudUVMapper->initialize();
451                mBillboardCloudUVMapper->generateTextureAtlasTextureCoords(false, mSampleConfigFile->getBillboardCloudGroupedBillboards(), 1);
452
453                mLeaves->getBillboardCloud()->generateBillboardCloudGroups();
454                saveBillboardCloudMerged();
455                saveBillboardCloudMergedXML();
456        }
457
458        if (mSampleConfigFile->getBillboardCloudSplittedBillboards())
459        {               
460                mLeaves->getBillboardCloud()->generateBillboardCloud(false);
461                //if (mSampleConfigFile->getBillboardCloudDiffuseColorTextureAtlasGeneration())
462                //{
463                //      mBillboardCloudUVMapper->shutdown();
464                //      mBillboardCloudUVMapper->setBillboardCloud(mLeaves->getBillboardCloud());
465                //      mBillboardCloudUVMapper->setTextureWidth(mSampleConfigFile->getBillboardCloudDiffuseColorTextureSize());
466                //      mBillboardCloudUVMapper->setTextureHeight(mSampleConfigFile->getBillboardCloudDiffuseColorTextureSize());
467                //      mBillboardCloudUVMapper->setTextureAtlasWidth(mSampleConfigFile->getBillboardCloudDiffuseColorTextureAtlasSize());
468                //      mBillboardCloudUVMapper->setTextureAtlasHeight(mSampleConfigFile->getBillboardCloudDiffuseColorTextureAtlasSize());
469                //      mBillboardCloudUVMapper->initialize();
470                //      mBillboardCloudUVMapper->generateTextureAtlasTextureCoords(!mSampleConfigFile->getBillboardCloudSplittedBillboards(),false);
471                //}
472                saveBillboardCloudSplitted();
473                saveBillboardCloudXML();
474        }
475
476        saveBillboardCloudIndirectSplittedPointMeshName();
477}
478
479void LBBCManager::saveBillboardCloudIndirectSplittedPointMeshName()
480{
481        BBC::EntityPtr entity;
482        unsigned int numSubEntities = 0;
483
484        entity = BBC::EntityPtr(new BBC::Entity());
485        entity->removeSubEntity(0);
486       
487        for (unsigned int iBillboard = 0; iBillboard < getLeaves()->getBillboardCloud()->getNumBillboards(); iBillboard++)
488        {
489                BBC::BillboardPtr billboard = getLeaves()->getBillboardCloud()->getBillboard(iBillboard);               
490                BBC::EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
491
492                if (entityCluster->getNumEntitiesClusterData() > 0)
493                {                                       
494                        entity->createSubEntity();
495                        entity->getSubEntity(numSubEntities)->setMaterialName(mSampleConfigFile->getBillboardCloudIndirectPointMaterialName());
496                        entity->getSubEntity(numSubEntities)->enableNormals(false);
497                        entity->getSubEntity(numSubEntities)->enableTextureCoords(true);
498                        entity->getSubEntity(numSubEntities)->addTextureCoordSet(2);
499                        entity->getSubEntity(numSubEntities)->enableVertexColours(true);
500
501                        Ogre::Vector3 p1, p2, p3, p4, pa, pb;
502                        Ogre::Real mua, mub;
503                        Ogre::Real height, width;
504                        Ogre::Real hDistance, wDistance;
505
506                        height = Ogre::Vector3(billboard->getBillboardClusterData()->getQuadTopLeftCorner() - billboard->getBillboardClusterData()->getQuadBottomLeftCorner()).length();
507                        width = Ogre::Vector3(billboard->getBillboardClusterData()->getQuadTopLeftCorner() - billboard->getBillboardClusterData()->getQuadTopRightCorner()).length();
508
509                        for (unsigned int iLeaf = 0; iLeaf < entityCluster->getNumEntitiesClusterData(); iLeaf++)
510                        {
511                                BBC::UniqueVertex vertex;
512
513                                LeafKMeansClusterData *leafKMeansClusterData = (LeafKMeansClusterData*)entityCluster->getEntityClusterData(iLeaf).get();
514                                Leaf *leaf = (Leaf*)leafKMeansClusterData->getEntity().get();
515                                vertex.position = leaf->getPosition();
516
517                                hDistance = 0.0;
518                                wDistance = 0.0;
519
520                                p1 = billboard->getBillboardClusterData()->getQuadTopRightCorner();
521                                p2 = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
522                                p3 = leaf->getPosition();
523                                p4 = leaf->getPosition() + billboard->getBillboardClusterData()->getAxisY();
524
525                                if (BBC::Util::lineLineIntersect(p1, p2, p3, p4, &pa, &pb, &mua, &mub))
526                                {
527                                        hDistance = Ogre::Vector3(pa - p1).length();
528                                }
529                                else
530                                {
531                                        Ogre::LogManager::getSingleton().logMessage("Error with intersection: no solution exists.");
532                                }
533
534                                p1 = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
535                                p2 = billboard->getBillboardClusterData()->getQuadTopRightCorner();
536                                p3 = leaf->getPosition();
537                                p4 = leaf->getPosition() + billboard->getBillboardClusterData()->getAxisX();
538
539                                if (BBC::Util::lineLineIntersect(p1, p2, p3, p4, &pa, &pb, &mua, &mub))
540                                {
541                                        wDistance = Ogre::Vector3(pa - p2).length();
542                                }
543                                else
544                                {
545                                        Ogre::LogManager::getSingleton().logMessage("Error with intersection: no solution exists.");
546                                }
547
548                                //Ogre::LogManager::getSingleton().logMessage("W:" + Ogre::StringConverter::toString(width) + " UW:" + Ogre::StringConverter::toString(wDistance));
549                                //Ogre::LogManager::getSingleton().logMessage("H:" + Ogre::StringConverter::toString(height) + " UH:" + Ogre::StringConverter::toString(hDistance));
550
551                                //vertex.uv[0] = Ogre::Vector3(wDistance / width, hDistance / height, 0.0);
552                                //vertex.uv[0] = Ogre::Vector3(1.0 - (hDistance / height), 1.0 - (wDistance / width), 0.0);
553                                Ogre::Real numSamples = mSampleConfigFile->getBillboardCloudDiffuseColorEntityTextureAtlasNumSamples();
554                                Ogre::Real randomInt = Ogre::Math::Ceil(Ogre::Math::RangeRandom(0.5,numSamples));
555
556                                Ogre::Vector2 topLeftCorner[16];
557                                topLeftCorner[0] = Ogre::Vector2(0.0,  0.0);
558                                topLeftCorner[1] = Ogre::Vector2(0.25, 0.0);
559                                topLeftCorner[2] = Ogre::Vector2(0.5,  0.0);
560                                topLeftCorner[3] = Ogre::Vector2(0.75, 0.0);
561                                topLeftCorner[4] = Ogre::Vector2(0.0,  0.25);
562                                topLeftCorner[5] = Ogre::Vector2(0.25, 0.25);
563                                topLeftCorner[6] = Ogre::Vector2(0.5,  0.25);
564                                topLeftCorner[7] = Ogre::Vector2(0.75, 0.25);
565                                topLeftCorner[8] = Ogre::Vector2(0.0,  0.5);
566                                topLeftCorner[9] = Ogre::Vector2(0.25, 0.5);
567                                topLeftCorner[10] = Ogre::Vector2(0.5,  0.5);
568                                topLeftCorner[11] = Ogre::Vector2(0.75, 0.5);
569                                topLeftCorner[12] = Ogre::Vector2(0.0,  0.75);
570                                topLeftCorner[13] = Ogre::Vector2(0.25, 0.75);
571                                topLeftCorner[14] = Ogre::Vector2(0.5,  0.75);
572                                topLeftCorner[15] = Ogre::Vector2(0.75, 0.75);
573
574                                //vertex.uv[0] = Ogre::Vector3(randomInt / numSamples, 0.0, 0.0);
575                               
576                                vertex.uv[0] = Ogre::Vector3(1.0 - topLeftCorner[(unsigned int)randomInt-1][0], 1.0 - topLeftCorner[(unsigned int)randomInt-1][1], 0.0);
577                                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();
578                                entity->getSubEntity(numSubEntities)->addUniqueVertex(vertex);
579                        }
580
581                        unsigned int iVertexFace = 0;
582                        Ogre::Vector3 faceVertexIndices = Ogre::Vector3::ZERO;
583
584                        for (unsigned int iVertex = 0; iVertex < entity->getSubEntity(numSubEntities)->getNumVertices(); iVertex++)
585                        {
586                                faceVertexIndices[iVertexFace] = iVertex;
587                                iVertexFace++;
588                               
589                                if ((iVertex + 1) != entity->getSubEntity(numSubEntities)->getNumVertices())
590                                {
591                                        if (iVertexFace == 3)
592                                        {
593                                                entity->getSubEntity(numSubEntities)->addFaceVerticesIDs(faceVertexIndices);
594                                                iVertexFace = 0;
595                                                faceVertexIndices = Ogre::Vector3::ZERO;
596                                        }
597                                }
598                                else
599                                {
600                                        entity->getSubEntity(numSubEntities)->addFaceVerticesIDs(faceVertexIndices);
601                                }                               
602                        }
603
604                        numSubEntities++;
605                }
606        }
607       
608        mOgreMeshSerializer->setEntity(entity);
609        mOgreMeshSerializer->exportMesh(mSampleConfigFile->getBillboardCloudFolder() + mSampleConfigFile->getBillboardCloudIndirectPointMeshName(), false, false);
610        OBA::OgreBase::getSingleton().getMeshSerializer()->exportMesh(entity->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getBillboardCloudIndirectPointMeshName());
611        OBA::OgreBase::getSingleton().getXMLMeshSerializer()->exportMesh(entity->getMesh()->get(), mSampleConfigFile->getEntityDistributionFolder() + mSampleConfigFile->getBillboardCloudIndirectPointMeshName() + ".xml");   
612
613}
614
615Leaves* LBBCManager::getLeaves()
616{
617        return mLeaves;
618}
619
620}
Note: See TracBrowser for help on using the repository browser.