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

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