source: GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/src/BBCBillboardCloud.cpp @ 900

Revision 900, 12.9 KB checked in by igarcia, 18 years ago (diff)
RevLine 
[699]1
2#include "BBCBillboardCloud.h"
3
4namespace BBC {
5
6BillboardCloud::BillboardCloud()
7{
[721]8        //mEntity = new Entity();
9        mEntity = 0;
[699]10}
11
12BillboardCloud::~BillboardCloud()
13{
14
15}
16
[900]17void BillboardCloud::clearBillboardCloud()
18{
19        Ogre::LogManager::getSingleton().logMessage("Before Num.Billboards:" + Ogre::StringConverter::toString(this->getNumBillboards()));
20        while (this->getNumBillboardGroups() > 0)
21        {
22                this->removeBillboardGroup(this->getNumBillboardGroups()-1);
23        }
24
25        while (this->getNumBillboards() > 0)
26        {
27                this->removeBillboard(this->getNumBillboards()-1);
28        }
29        Ogre::LogManager::getSingleton().logMessage("After Num.Billboards:" + Ogre::StringConverter::toString(this->getNumBillboards()));
30}
31
[721]32std::vector<BillboardPtr>* BillboardCloud::getBillboardList()
[709]33{
34        return &mBillboardList;
[699]35}
[709]36
[721]37void BillboardCloud::setBillboardList(std::vector<BillboardPtr> &value)
[709]38{
39        mBillboardList = value;
[699]40}
41
42unsigned int BillboardCloud::getNumBillboards()
43{
44        return (unsigned int)(mBillboardList.size());
45}
46
[721]47void BillboardCloud::addBillboard(BillboardPtr value)
[699]48{
49        value->setBillboardHandle((unsigned int)(mBillboardList.size()));       
50        mBillboardList.push_back(value);
51}
52
53void BillboardCloud::removeBillboard(unsigned int value)
54{
[721]55        BillboardPtr billboard = mBillboardList[value];
[699]56        mBillboardList.erase(mBillboardList.begin() + value);
57}
58
[721]59BillboardPtr BillboardCloud::getBillboard(unsigned int value)
[699]60{
61        return mBillboardList[value];
62}
63
[721]64EntityPtr BillboardCloud::getEntity()
[699]65{
66        return mEntity;
67}
68
[900]69EntityPtr BillboardCloud::getEntityGrouped()
70{
71        return mEntityGrouped;
72}
73
74void BillboardCloud::setEntityGrouped(EntityPtr value)
75{
76        mEntityGrouped = value;
77}
78
[721]79void BillboardCloud::setEntity(EntityPtr value)
[699]80{
81        mEntity = value;
82}
83
84void BillboardCloud::generateBillboardCloud(bool mergeBillboards)
85{
[721]86        mEntity = EntityPtr(new Entity());
[709]87
[699]88        unsigned int numGeneratedBillboardClouds = 0;
[821]89        bool mergeBillboardCloudTexCoordGenerated = false;
90
[699]91        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
92        {
[721]93                BillboardPtr billboard = this->getBillboard(iBillboard);               
94                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
[699]95
96                if (entityCluster->getNumEntitiesClusterData() > 0)
97                {               
[721]98                        SubEntityPtr subEntity;                 
[699]99                        if (mergeBillboards)
100                        {
101                                subEntity = mEntity->getSubEntity(0);
[821]102
103                                if (!mergeBillboardCloudTexCoordGenerated)
104                                {
105                                        subEntity->enableVertexColours(true);
106
107                                        mergeBillboardCloudTexCoordGenerated = true;
108                                }
109
[699]110                                unsigned int offset = subEntity->getNumFaces() * 3;
111                                Ogre::Vector3 indicesA = Ogre::Vector3(offset, offset + 1, offset + 2);
112                                subEntity->addFaceVerticesIDs(indicesA);
113                                offset = subEntity->getNumFaces()*3;
114                                Ogre::Vector3 indicesB = Ogre::Vector3(offset, offset + 1, offset + 2);
115                                subEntity->addFaceVerticesIDs(indicesB);
116                        }
117                        else
118                        {                               
119                                // The entity has by default one subentity, if we need more
120                                // we have to create them.
121                                if (numGeneratedBillboardClouds > 0)
122                                {
123                                        mEntity->createSubEntity();
124                                }
125                                Ogre::Vector3 indices = Ogre::Vector3(0,1,2);
126                                subEntity = mEntity->getSubEntity(numGeneratedBillboardClouds);
[821]127       
128                                subEntity->enableVertexColours(true);
[709]129
[821]130                                //Ogre::LogManager::getSingleton().logMessage("BBC-SubEntity(" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + ") - Num.Tex.Coord.Sets:" + Ogre::StringConverter::toString(subEntity->getNumTexCoordSets()));
[709]131
[699]132                                subEntity->addFaceVerticesIDs(indices);
133                                subEntity->addFaceVerticesIDs(indices + Ogre::Vector3(3,3,3));
134                        }
135                       
136                        UniqueVertex vFaceA1,vFaceA2,vFaceA3;
137                        // Face A of the billboard quad
138                        vFaceA1.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
[821]139                        vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
140                        vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
141
[699]142                        vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
143                        vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
144                        vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
145
[821]146                        vFaceA1.colour = Ogre::ColourValue(1.0 , 0.0, 0.0, 0.0).getAsARGB();
147                        vFaceA2.colour = Ogre::ColourValue(0.0, 0.0, 0.0, 0.0).getAsARGB();
148                        vFaceA3.colour = Ogre::ColourValue(0.0, 1.0 ,0.0, 0.0).getAsARGB();
149
[699]150                        // Face B of the billboard quad
151                        UniqueVertex vFaceB1,vFaceB2,vFaceB3;
152                        vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
[821]153                        vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
154                        vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
155
[699]156                        vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
157                        vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
158                        vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
159
[821]160                        vFaceB1.colour = Ogre::ColourValue(0.0, 1.0 ,0.0, 0.0).getAsARGB();
161                        vFaceB2.colour = Ogre::ColourValue(1.0, 1.0, 0.0, 0.0).getAsARGB();
162                        vFaceB3.colour = Ogre::ColourValue(1.0, 0.0, 0.0, 0.0).getAsARGB();
163
[699]164                        subEntity->addUniqueVertex(vFaceA1);
165                        subEntity->addUniqueVertex(vFaceA2);
166                        subEntity->addUniqueVertex(vFaceA3);
167                        subEntity->addUniqueVertex(vFaceB1);
168                        subEntity->addUniqueVertex(vFaceB2);
169                        subEntity->addUniqueVertex(vFaceB3);
170
171                        numGeneratedBillboardClouds++;
172                }
173        }
174}
175
[709]176void BillboardCloud::initializeBillboardCloudGroups(unsigned int numberGroups)
177{
[900]178        for (unsigned int iSubEntity = 0; iSubEntity < mEntity->getNumSubEntities(); iSubEntity++)
179        {
180                mEntity->getSubEntity(iSubEntity)->removeTextureCoordSet();
181        }
[709]182
183        while (getNumBillboardGroups() > 0)
184        {
[721]185                BillboardGroupPtr billboardGroup = getBillboardGroup(getNumBillboardGroups()-1);
[709]186                removeBillboardGroup(getNumBillboardGroups()-1);
187        }
188
189        unsigned int iBillboardGroup;
190        for (iBillboardGroup = 0; iBillboardGroup < numberGroups; iBillboardGroup++)
191        {
[721]192                BillboardGroupPtr billboardGroup = BillboardGroupPtr( new BillboardGroup() );
[709]193                addBillboardGroup(billboardGroup);
194        }
195
196        unsigned int numGeneratedBillboardClouds = 0;
197        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
198        {
[721]199                BillboardPtr billboard = this->getBillboard(iBillboard);               
200                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
[709]201
202                if (entityCluster->getNumEntitiesClusterData() > 0)
203                {
[745]204                        for (unsigned int iBillboardGroup = 0; iBillboardGroup < billboard->getBillboardClusterData()->getNumUVMapGroups(); iBillboardGroup++)
205                        {
206                                billboard->getBillboardClusterData()->removeBillboardUVMapMax(iBillboardGroup);
[900]207                                billboard->getBillboardClusterData()->removeBillboardUVMapMin(iBillboardGroup);
[745]208                        }
[709]209                        numGeneratedBillboardClouds++;
210                }
211        }
212
213        unsigned int numberBillboardsEachGroup = numGeneratedBillboardClouds / numberGroups;
214        unsigned int numberBillboardsAddedFirstGroup = numGeneratedBillboardClouds % numberGroups;
215
[900]216        //Ogre::LogManager::getSingleton().logMessage("Num.Billboards:" + Ogre::StringConverter::toString(numGeneratedBillboardClouds));
217        //Ogre::LogManager::getSingleton().logMessage("Num.Billboards Each Group:" + Ogre::StringConverter::toString(numberBillboardsEachGroup));
218        //Ogre::LogManager::getSingleton().logMessage("Num.Billboards Added First Group:" + Ogre::StringConverter::toString(numberBillboardsAddedFirstGroup));
[709]219       
220        iBillboardGroup = 0;
221        unsigned int iBillboardsInGroup = 0;
222        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
223        {
[721]224                BillboardPtr billboard = this->getBillboard(iBillboard);               
225                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
[709]226
227                if (entityCluster->getNumEntitiesClusterData() > 0)
228                {                       
229                        if ((iBillboardGroup == 0) && (iBillboardsInGroup < (numberBillboardsEachGroup + numberBillboardsAddedFirstGroup)))
230                        {
231                                getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
232                                iBillboardsInGroup++;
233                        }
234                        else
235                        {
236                                if ((iBillboardGroup > 0) && (iBillboardsInGroup < numberBillboardsEachGroup))
237                                {
238                                        getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
239                                        iBillboardsInGroup++;
240                                }
241                                else
242                                {
243                                        iBillboardGroup++;
244                                        iBillboardsInGroup = 0;
245
246                                        getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
247                                        iBillboardsInGroup++;
248                                }
249                        }
250                }
251        }
[699]252}
[709]253
254void BillboardCloud::generateBillboardCloudGroups()
255{
[721]256        SubEntityPtr subEntityGroup;
257        SubEntityPtr subEntity;
258        EntityPtr entity = EntityPtr(new Entity());
[709]259        unsigned int numGeneratedBillboardClouds = 0;
260
261        for (unsigned int iBillboardGroup = 0; iBillboardGroup < this->getNumBillboardGroups(); iBillboardGroup++)
262        {
263                if (iBillboardGroup > 0)
264                {
[900]265                        entity->createSubEntity();                     
[709]266                }
267               
268                subEntityGroup = entity->getSubEntity(iBillboardGroup);
269
[721]270                BillboardGroupPtr billboardGroup = this->getBillboardGroup(iBillboardGroup);
[709]271
272                for (unsigned int iBillboard = 0; iBillboard < billboardGroup->getNumBillboards(); iBillboard++)
273                {
274                        unsigned int billboardHandle = billboardGroup->getBillboardHandle(iBillboard);
[721]275                        BillboardPtr billboard = this->getBillboard(billboardHandle);
[709]276
[751]277                        BillboardClusterData *billboardClusterData = billboard->getBillboardClusterData().get();
[709]278
[751]279                        if (billboardClusterData != NULL)
280                        {                               
281                                EntityClusterPtr entityCluster = billboardClusterData->getEntityCluster();
282
283                                if (entityCluster->getNumEntitiesClusterData() > 0)
[709]284                                {
[751]285                                        subEntity = mEntity->getSubEntity(numGeneratedBillboardClouds);
[709]286
[751]287                                        while (subEntityGroup->getNumTexCoordSets() < subEntity->getNumTexCoordSets())
288                                        {
289                                                subEntityGroup->addTextureCoordSet(subEntity->getTexCoordDimensions(subEntityGroup->getNumTexCoordSets()));
290                                        }
[709]291
[821]292                                        subEntityGroup->enableVertexColours(subEntity->hasVertexColours());
293
[751]294                                        unsigned int offset = subEntityGroup->getNumFaces() * 3;
295                                        Ogre::Vector3 indicesA = Ogre::Vector3(offset, offset + 1, offset + 2);
296                                        subEntityGroup->addFaceVerticesIDs(indicesA);
297                                        offset = subEntityGroup->getNumFaces()*3;
298                                        Ogre::Vector3 indicesB = Ogre::Vector3(offset, offset + 1, offset + 2);
299                                        subEntityGroup->addFaceVerticesIDs(indicesB);
[709]300
[751]301                                        UniqueVertex vFaceA1,vFaceA2,vFaceA3;
[821]302
[751]303                                        // Face A of the billboard quad
304                                        vFaceA1.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
[821]305                                        vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
306                                        vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
307
[751]308                                        vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
309                                        vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
310                                        vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
[821]311
312                                        if (subEntity->hasVertexColours())
313                                        {
314                                                vFaceA1.colour = subEntity->getVertexColour(0);
315                                                vFaceA2.colour = subEntity->getVertexColour(1);
316                                                vFaceA3.colour = subEntity->getVertexColour(2);
317                                        }
[751]318                                       
[821]319                                        UniqueVertex vFaceB1,vFaceB2,vFaceB3;
320
[751]321                                        // Face B of the billboard quad
322                                        vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
[821]323                                        vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
324                                        vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
325
[751]326                                        vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
327                                        vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
328                                        vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
329                                       
[821]330                                        if (subEntity->hasVertexColours())
331                                        {
332                                                vFaceB1.colour = subEntity->getVertexColour(3);
333                                                vFaceB2.colour = subEntity->getVertexColour(4);
334                                                vFaceB3.colour = subEntity->getVertexColour(5);
335                                        }
[709]336
[751]337                                        for (unsigned int iTexCoordSet = 0; iTexCoordSet < subEntityGroup->getNumTexCoordSets(); iTexCoordSet++)
338                                        {                                       
339                                                vFaceA1.uv[iTexCoordSet] = subEntity->getUniqueVertex(0).uv[iTexCoordSet];
340                                                vFaceA2.uv[iTexCoordSet] = subEntity->getUniqueVertex(1).uv[iTexCoordSet];
341                                                vFaceA3.uv[iTexCoordSet] = subEntity->getUniqueVertex(2).uv[iTexCoordSet];
342                                                vFaceB1.uv[iTexCoordSet] = subEntity->getUniqueVertex(3).uv[iTexCoordSet];
343                                                vFaceB2.uv[iTexCoordSet] = subEntity->getUniqueVertex(4).uv[iTexCoordSet];
344                                                vFaceB3.uv[iTexCoordSet] = subEntity->getUniqueVertex(5).uv[iTexCoordSet];
345                                        }
[709]346
[751]347                                        subEntityGroup->addUniqueVertex(vFaceA1);
348                                        subEntityGroup->addUniqueVertex(vFaceA2);
349                                        subEntityGroup->addUniqueVertex(vFaceA3);
350                                        subEntityGroup->addUniqueVertex(vFaceB1);
351                                        subEntityGroup->addUniqueVertex(vFaceB2);
352                                        subEntityGroup->addUniqueVertex(vFaceB3);
353
354                                        numGeneratedBillboardClouds++;
355                                }
[709]356                        }
357                }
358        }       
359
[900]360        mEntityGrouped = entity;
[709]361}
362
363unsigned int BillboardCloud::getNumBillboardGroups()
364{
365        return mBillboardGroupList.size();
366}
367
[721]368BillboardGroupPtr BillboardCloud::getBillboardGroup(unsigned int iBillboardGroup)
[709]369{
370        return mBillboardGroupList[iBillboardGroup];
371}
372
[721]373void BillboardCloud::addBillboardGroup(BillboardGroupPtr value)
[709]374{
375        mBillboardGroupList.push_back(value);
376}
377
378void BillboardCloud::removeBillboardGroup(unsigned int value)
379{
[721]380        BillboardGroupPtr billboardGroup = mBillboardGroupList[value];
[709]381        mBillboardGroupList.erase(mBillboardGroupList.begin() + value);
382}
383
384}
Note: See TracBrowser for help on using the repository browser.