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

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