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

Revision 821, 13.0 KB checked in by igarcia, 18 years ago (diff)
Line 
1
2#include "BBCBillboardCloud.h"
3
4namespace BBC {
5
6BillboardCloud::BillboardCloud()
7{
8        //mEntity = new Entity();
9        mEntity = 0;
10}
11
12BillboardCloud::~BillboardCloud()
13{
14
15}
16
17std::vector<BillboardPtr>* BillboardCloud::getBillboardList()
18{
19        return &mBillboardList;
20}
21
22void BillboardCloud::setBillboardList(std::vector<BillboardPtr> &value)
23{
24        mBillboardList = value;
25}
26
27unsigned int BillboardCloud::getNumBillboards()
28{
29        return (unsigned int)(mBillboardList.size());
30}
31
32void BillboardCloud::addBillboard(BillboardPtr value)
33{
34        value->setBillboardHandle((unsigned int)(mBillboardList.size()));       
35        mBillboardList.push_back(value);
36}
37
38void BillboardCloud::removeBillboard(unsigned int value)
39{
40        BillboardPtr billboard = mBillboardList[value];
41        mBillboardList.erase(mBillboardList.begin() + value);
42}
43
44BillboardPtr BillboardCloud::getBillboard(unsigned int value)
45{
46        return mBillboardList[value];
47}
48
49EntityPtr BillboardCloud::getEntity()
50{
51        return mEntity;
52}
53
54void BillboardCloud::setEntity(EntityPtr value)
55{
56        mEntity = value;
57}
58
59void BillboardCloud::generateBillboardCloud(bool mergeBillboards)
60{
61        mEntity = EntityPtr(new Entity());
62
63        unsigned int numGeneratedBillboardClouds = 0;
64        bool mergeBillboardCloudTexCoordGenerated = false;
65
66        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
67        {
68                BillboardPtr billboard = this->getBillboard(iBillboard);               
69                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
70
71                if (entityCluster->getNumEntitiesClusterData() > 0)
72                {               
73                        SubEntityPtr subEntity;                 
74                        if (mergeBillboards)
75                        {
76                                subEntity = mEntity->getSubEntity(0);
77
78                                if (!mergeBillboardCloudTexCoordGenerated)
79                                {
80                                        subEntity->enableVertexColours(true);
81
82                                        mergeBillboardCloudTexCoordGenerated = true;
83                                }
84
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);
102       
103                                subEntity->enableVertexColours(true);
104
105                                //Ogre::LogManager::getSingleton().logMessage("BBC-SubEntity(" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + ") - Num.Tex.Coord.Sets:" + Ogre::StringConverter::toString(subEntity->getNumTexCoordSets()));
106
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();
114                        vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
115                        vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
116
117                        vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
118                        vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
119                        vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
120
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
125                        // Face B of the billboard quad
126                        UniqueVertex vFaceB1,vFaceB2,vFaceB3;
127                        vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
128                        vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
129                        vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
130
131                        vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
132                        vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
133                        vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
134
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
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
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        {
157                BillboardGroupPtr billboardGroup = getBillboardGroup(getNumBillboardGroups()-1);
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        {
166                BillboardGroupPtr billboardGroup = BillboardGroupPtr( new BillboardGroup() );
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        {
175                BillboardPtr billboard = this->getBillboard(iBillboard);               
176                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
177
178                if (entityCluster->getNumEntitiesClusterData() > 0)
179                {
180                        for (unsigned int iBillboardGroup = 0; iBillboardGroup < billboard->getBillboardClusterData()->getNumUVMapGroups(); iBillboardGroup++)
181                        {
182                                billboard->getBillboardClusterData()->removeBillboardUVMapMax(iBillboardGroup);
183                        }
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        {
199                BillboardPtr billboard = this->getBillboard(iBillboard);               
200                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
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        }
227}
228
229void BillboardCloud::generateBillboardCloudGroups()
230{
231        SubEntityPtr subEntityGroup;
232        SubEntityPtr subEntity;
233        EntityPtr entity = EntityPtr(new Entity());
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
246                BillboardGroupPtr billboardGroup = this->getBillboardGroup(iBillboardGroup);
247
248                //Ogre::LogManager::getSingleton().logMessage("BBCG-Num.Billboards:" + Ogre::StringConverter::toString(billboardGroup->getNumBillboards()));
249
250                for (unsigned int iBillboard = 0; iBillboard < billboardGroup->getNumBillboards(); iBillboard++)
251                {
252                        unsigned int billboardHandle = billboardGroup->getBillboardHandle(iBillboard);
253                        BillboardPtr billboard = this->getBillboard(billboardHandle);
254
255                        BillboardClusterData *billboardClusterData = billboard->getBillboardClusterData().get();
256
257                        if (billboardClusterData != NULL)
258                        {                               
259                                EntityClusterPtr entityCluster = billboardClusterData->getEntityCluster();
260
261                                if (entityCluster->getNumEntitiesClusterData() > 0)
262                                {
263                                        subEntity = mEntity->getSubEntity(numGeneratedBillboardClouds);
264
265                                        while (subEntityGroup->getNumTexCoordSets() < subEntity->getNumTexCoordSets())
266                                        {
267                                                subEntityGroup->addTextureCoordSet(subEntity->getTexCoordDimensions(subEntityGroup->getNumTexCoordSets()));
268                                        }
269
270                                        subEntityGroup->enableVertexColours(subEntity->hasVertexColours());
271
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);
278
279                                        UniqueVertex vFaceA1,vFaceA2,vFaceA3;
280
281                                        // Face A of the billboard quad
282                                        vFaceA1.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
283                                        vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
284                                        vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
285
286                                        vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
287                                        vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
288                                        vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
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                                        }
296                                       
297                                        UniqueVertex vFaceB1,vFaceB2,vFaceB3;
298
299                                        // Face B of the billboard quad
300                                        vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
301                                        vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
302                                        vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
303
304                                        vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
305                                        vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
306                                        vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
307                                       
308                                        if (subEntity->hasVertexColours())
309                                        {
310                                                vFaceB1.colour = subEntity->getVertexColour(3);
311                                                vFaceB2.colour = subEntity->getVertexColour(4);
312                                                vFaceB3.colour = subEntity->getVertexColour(5);
313                                        }
314
315                                        //Ogre::LogManager::getSingleton().logMessage("BBCG-SubEntity(" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + ") - Num.Tex.Coord.Sets:"+ Ogre::StringConverter::toString(subEntity->getNumTexCoordSets()));
316
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                                        }
326
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                                }
336                        }
337                }
338        }       
339
340        mEntity = entity;
341}
342
343unsigned int BillboardCloud::getNumBillboardGroups()
344{
345        return mBillboardGroupList.size();
346}
347
348BillboardGroupPtr BillboardCloud::getBillboardGroup(unsigned int iBillboardGroup)
349{
350        return mBillboardGroupList[iBillboardGroup];
351}
352
353void BillboardCloud::addBillboardGroup(BillboardGroupPtr value)
354{
355        mBillboardGroupList.push_back(value);
356}
357
358void BillboardCloud::removeBillboardGroup(unsigned int value)
359{
360        BillboardGroupPtr billboardGroup = mBillboardGroupList[value];
361        mBillboardGroupList.erase(mBillboardGroupList.begin() + value);
362}
363
364}
Note: See TracBrowser for help on using the repository browser.