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

Revision 751, 12.1 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        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
65        {
66                BillboardPtr billboard = this->getBillboard(iBillboard);               
67                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
68
69                if (entityCluster->getNumEntitiesClusterData() > 0)
70                {               
71                        SubEntityPtr subEntity;                 
72                        if (mergeBillboards)
73                        {
74                                subEntity = mEntity->getSubEntity(0);
75                                unsigned int offset = subEntity->getNumFaces() * 3;
76                                Ogre::Vector3 indicesA = Ogre::Vector3(offset, offset + 1, offset + 2);
77                                subEntity->addFaceVerticesIDs(indicesA);
78                                offset = subEntity->getNumFaces()*3;
79                                Ogre::Vector3 indicesB = Ogre::Vector3(offset, offset + 1, offset + 2);
80                                subEntity->addFaceVerticesIDs(indicesB);
81                        }
82                        else
83                        {                               
84                                // The entity has by default one subentity, if we need more
85                                // we have to create them.
86                                if (numGeneratedBillboardClouds > 0)
87                                {
88                                        mEntity->createSubEntity();
89                                }
90                                Ogre::Vector3 indices = Ogre::Vector3(0,1,2);
91                                subEntity = mEntity->getSubEntity(numGeneratedBillboardClouds);
92                                subEntity->addTextureCoordSet(2);
93
94                                Ogre::LogManager::getSingleton().logMessage("BBC-SubEntity(" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + ") - Num.Tex.Coord.Sets:" + Ogre::StringConverter::toString(subEntity->getNumTexCoordSets()));
95
96                                subEntity->addFaceVerticesIDs(indices);
97                                subEntity->addFaceVerticesIDs(indices + Ogre::Vector3(3,3,3));
98                        }
99                       
100                        UniqueVertex vFaceA1,vFaceA2,vFaceA3;
101                        // Face A of the billboard quad
102                        vFaceA1.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
103                        vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
104                        vFaceA1.uv[0] = Ogre::Vector3(0,0,0);
105                        vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
106                        vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
107                        vFaceA2.uv[0] = Ogre::Vector3(1,0,0);
108                        vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
109                        vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
110                        vFaceA3.uv[0] = Ogre::Vector3(1,1,0);
111
112                        // Face B of the billboard quad
113                        UniqueVertex vFaceB1,vFaceB2,vFaceB3;
114                        vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
115                        vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
116                        vFaceB1.uv[0] = Ogre::Vector3(1,1,0);
117                        vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
118                        vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
119                        vFaceB2.uv[0] = Ogre::Vector3(0,1,0);
120                        vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
121                        vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
122                        vFaceB3.uv[0] = Ogre::Vector3(0,0,0);
123
124                        subEntity->addUniqueVertex(vFaceA1);
125                        subEntity->addUniqueVertex(vFaceA2);
126                        subEntity->addUniqueVertex(vFaceA3);
127                        subEntity->addUniqueVertex(vFaceB1);
128                        subEntity->addUniqueVertex(vFaceB2);
129                        subEntity->addUniqueVertex(vFaceB3);
130
131                        numGeneratedBillboardClouds++;
132                }
133        }
134}
135
136void BillboardCloud::initializeBillboardCloudGroups(unsigned int numberGroups)
137{
138        Ogre::LogManager::getSingleton().logMessage("Ini.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
139
140        while (getNumBillboardGroups() > 0)
141        {
142                BillboardGroupPtr billboardGroup = getBillboardGroup(getNumBillboardGroups()-1);
143                removeBillboardGroup(getNumBillboardGroups()-1);
144        }
145
146        Ogre::LogManager::getSingleton().logMessage("Clear.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
147
148        unsigned int iBillboardGroup;
149        for (iBillboardGroup = 0; iBillboardGroup < numberGroups; iBillboardGroup++)
150        {
151                BillboardGroupPtr billboardGroup = BillboardGroupPtr( new BillboardGroup() );
152                addBillboardGroup(billboardGroup);
153        }
154
155        Ogre::LogManager::getSingleton().logMessage("New.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
156
157        unsigned int numGeneratedBillboardClouds = 0;
158        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
159        {
160                BillboardPtr billboard = this->getBillboard(iBillboard);               
161                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
162
163                if (entityCluster->getNumEntitiesClusterData() > 0)
164                {
165                        for (unsigned int iBillboardGroup = 0; iBillboardGroup < billboard->getBillboardClusterData()->getNumUVMapGroups(); iBillboardGroup++)
166                        {
167                                billboard->getBillboardClusterData()->removeBillboardUVMapMax(iBillboardGroup);
168                        }
169                        numGeneratedBillboardClouds++;
170                }
171        }
172
173        unsigned int numberBillboardsEachGroup = numGeneratedBillboardClouds / numberGroups;
174        unsigned int numberBillboardsAddedFirstGroup = numGeneratedBillboardClouds % numberGroups;
175
176        Ogre::LogManager::getSingleton().logMessage("Num.Billboards:" + Ogre::StringConverter::toString(numGeneratedBillboardClouds));
177        Ogre::LogManager::getSingleton().logMessage("Num.Billboards Each Group:" + Ogre::StringConverter::toString(numberBillboardsEachGroup));
178        Ogre::LogManager::getSingleton().logMessage("Num.Billboards Added First Group:" + Ogre::StringConverter::toString(numberBillboardsAddedFirstGroup));
179       
180        iBillboardGroup = 0;
181        unsigned int iBillboardsInGroup = 0;
182        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
183        {
184                BillboardPtr billboard = this->getBillboard(iBillboard);               
185                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
186
187                if (entityCluster->getNumEntitiesClusterData() > 0)
188                {                       
189                        if ((iBillboardGroup == 0) && (iBillboardsInGroup < (numberBillboardsEachGroup + numberBillboardsAddedFirstGroup)))
190                        {
191                                getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
192                                iBillboardsInGroup++;
193                        }
194                        else
195                        {
196                                if ((iBillboardGroup > 0) && (iBillboardsInGroup < numberBillboardsEachGroup))
197                                {
198                                        getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
199                                        iBillboardsInGroup++;
200                                }
201                                else
202                                {
203                                        iBillboardGroup++;
204                                        iBillboardsInGroup = 0;
205
206                                        getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
207                                        iBillboardsInGroup++;
208                                }
209                        }
210                }
211        }
212}
213
214void BillboardCloud::generateBillboardCloudGroups()
215{
216        SubEntityPtr subEntityGroup;
217        SubEntityPtr subEntity;
218        EntityPtr entity = EntityPtr(new Entity());
219        unsigned int numGeneratedBillboardClouds = 0;
220
221        for (unsigned int iBillboardGroup = 0; iBillboardGroup < this->getNumBillboardGroups(); iBillboardGroup++)
222        {
223                if (iBillboardGroup > 0)
224                {
225                        entity->createSubEntity();
226                        Ogre::LogManager::getSingleton().logMessage("BillboardGroup:" + Ogre::StringConverter::toString(iBillboardGroup) + "--" + Ogre::StringConverter::toString(getBillboardGroup(iBillboardGroup)->getNumBillboards()));
227                }
228               
229                subEntityGroup = entity->getSubEntity(iBillboardGroup);
230
231                BillboardGroupPtr billboardGroup = this->getBillboardGroup(iBillboardGroup);
232
233                Ogre::LogManager::getSingleton().logMessage("BBCG-Num.Billboards:" + Ogre::StringConverter::toString(billboardGroup->getNumBillboards()));
234
235                for (unsigned int iBillboard = 0; iBillboard < billboardGroup->getNumBillboards(); iBillboard++)
236                {
237                        unsigned int billboardHandle = billboardGroup->getBillboardHandle(iBillboard);
238                        BillboardPtr billboard = this->getBillboard(billboardHandle);
239
240                        BillboardClusterData *billboardClusterData = billboard->getBillboardClusterData().get();
241
242                        if (billboardClusterData != NULL)
243                        {                               
244                                EntityClusterPtr entityCluster = billboardClusterData->getEntityCluster();
245
246                                if (entityCluster->getNumEntitiesClusterData() > 0)
247                                {
248                                        subEntity = mEntity->getSubEntity(numGeneratedBillboardClouds);
249
250                                        while (subEntityGroup->getNumTexCoordSets() < subEntity->getNumTexCoordSets())
251                                        {
252                                                subEntityGroup->addTextureCoordSet(subEntity->getTexCoordDimensions(subEntityGroup->getNumTexCoordSets()));
253                                        }
254
255                                        unsigned int offset = subEntityGroup->getNumFaces() * 3;
256                                        Ogre::Vector3 indicesA = Ogre::Vector3(offset, offset + 1, offset + 2);
257                                        subEntityGroup->addFaceVerticesIDs(indicesA);
258                                        offset = subEntityGroup->getNumFaces()*3;
259                                        Ogre::Vector3 indicesB = Ogre::Vector3(offset, offset + 1, offset + 2);
260                                        subEntityGroup->addFaceVerticesIDs(indicesB);
261
262                                        UniqueVertex vFaceA1,vFaceA2,vFaceA3;
263                                        // Face A of the billboard quad
264                                        vFaceA1.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
265                                        vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
266
267                                        vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
268                                        vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
269                                       
270                                        vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
271                                        vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
272                                       
273                                        // Face B of the billboard quad
274                                        UniqueVertex vFaceB1,vFaceB2,vFaceB3;
275                                        vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
276                                        vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
277                                       
278                                        vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
279                                        vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
280                                       
281                                        vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
282                                        vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
283                                       
284                                        Ogre::LogManager::getSingleton().logMessage("BBCG-SubEntity(" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + ") - Num.Tex.Coord.Sets:"+ Ogre::StringConverter::toString(subEntity->getNumTexCoordSets()));
285
286                                        for (unsigned int iTexCoordSet = 0; iTexCoordSet < subEntityGroup->getNumTexCoordSets(); iTexCoordSet++)
287                                        {                                       
288                                                vFaceA1.uv[iTexCoordSet] = subEntity->getUniqueVertex(0).uv[iTexCoordSet];
289                                                vFaceA2.uv[iTexCoordSet] = subEntity->getUniqueVertex(1).uv[iTexCoordSet];
290                                                vFaceA3.uv[iTexCoordSet] = subEntity->getUniqueVertex(2).uv[iTexCoordSet];
291                                                vFaceB1.uv[iTexCoordSet] = subEntity->getUniqueVertex(3).uv[iTexCoordSet];
292                                                vFaceB2.uv[iTexCoordSet] = subEntity->getUniqueVertex(4).uv[iTexCoordSet];
293                                                vFaceB3.uv[iTexCoordSet] = subEntity->getUniqueVertex(5).uv[iTexCoordSet];
294                                        }
295
296                                        subEntityGroup->addUniqueVertex(vFaceA1);
297                                        subEntityGroup->addUniqueVertex(vFaceA2);
298                                        subEntityGroup->addUniqueVertex(vFaceA3);
299                                        subEntityGroup->addUniqueVertex(vFaceB1);
300                                        subEntityGroup->addUniqueVertex(vFaceB2);
301                                        subEntityGroup->addUniqueVertex(vFaceB3);
302
303                                        numGeneratedBillboardClouds++;
304                                }
305                        }
306                }
307        }       
308
309        mEntity = entity;
310        entity->setSubEntitiesDistinctVertexColours();
311}
312
313unsigned int BillboardCloud::getNumBillboardGroups()
314{
315        return mBillboardGroupList.size();
316}
317
318BillboardGroupPtr BillboardCloud::getBillboardGroup(unsigned int iBillboardGroup)
319{
320        return mBillboardGroupList[iBillboardGroup];
321}
322
323void BillboardCloud::addBillboardGroup(BillboardGroupPtr value)
324{
325        mBillboardGroupList.push_back(value);
326}
327
328void BillboardCloud::removeBillboardGroup(unsigned int value)
329{
330        BillboardGroupPtr billboardGroup = mBillboardGroupList[value];
331        mBillboardGroupList.erase(mBillboardGroupList.begin() + value);
332}
333
334}
Note: See TracBrowser for help on using the repository browser.