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

Revision 721, 11.7 KB checked in by igarcia, 19 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
139        Ogre::LogManager::getSingleton().logMessage("Ini.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
140
141        while (getNumBillboardGroups() > 0)
142        {
143                BillboardGroupPtr billboardGroup = getBillboardGroup(getNumBillboardGroups()-1);
144                removeBillboardGroup(getNumBillboardGroups()-1);
145        }
146
147        Ogre::LogManager::getSingleton().logMessage("Clear.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
148
149        unsigned int iBillboardGroup;
150        for (iBillboardGroup = 0; iBillboardGroup < numberGroups; iBillboardGroup++)
151        {
152                BillboardGroupPtr billboardGroup = BillboardGroupPtr( new BillboardGroup() );
153                addBillboardGroup(billboardGroup);
154        }
155
156        Ogre::LogManager::getSingleton().logMessage("New.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
157
158        unsigned int numGeneratedBillboardClouds = 0;
159        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
160        {
161                BillboardPtr billboard = this->getBillboard(iBillboard);               
162                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
163
164                if (entityCluster->getNumEntitiesClusterData() > 0)
165                {
166                        numGeneratedBillboardClouds++;
167                }
168        }
169
170        unsigned int numberBillboardsEachGroup = numGeneratedBillboardClouds / numberGroups;
171        unsigned int numberBillboardsAddedFirstGroup = numGeneratedBillboardClouds % numberGroups;
172
173        Ogre::LogManager::getSingleton().logMessage("Num.Billboards:" + Ogre::StringConverter::toString(numGeneratedBillboardClouds));
174        Ogre::LogManager::getSingleton().logMessage("Num.Billboards Each Group:" + Ogre::StringConverter::toString(numberBillboardsEachGroup));
175        Ogre::LogManager::getSingleton().logMessage("Num.Billboards Added First Group:" + Ogre::StringConverter::toString(numberBillboardsAddedFirstGroup));
176       
177        iBillboardGroup = 0;
178        unsigned int iBillboardsInGroup = 0;
179        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
180        {
181                BillboardPtr billboard = this->getBillboard(iBillboard);               
182                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
183
184                if (entityCluster->getNumEntitiesClusterData() > 0)
185                {                       
186                        if ((iBillboardGroup == 0) && (iBillboardsInGroup < (numberBillboardsEachGroup + numberBillboardsAddedFirstGroup)))
187                        {
188                                getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
189                                iBillboardsInGroup++;
190                        }
191                        else
192                        {
193                                if ((iBillboardGroup > 0) && (iBillboardsInGroup < numberBillboardsEachGroup))
194                                {
195                                        getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
196                                        iBillboardsInGroup++;
197                                }
198                                else
199                                {
200                                        iBillboardGroup++;
201                                        iBillboardsInGroup = 0;
202
203                                        getBillboardGroup(iBillboardGroup)->addBillboardHandle(billboard->getBillboardHandle());
204                                        iBillboardsInGroup++;
205                                }
206                        }
207                }
208        }
209}
210
211void BillboardCloud::generateBillboardCloudGroups()
212{
213        SubEntityPtr subEntityGroup;
214        SubEntityPtr subEntity;
215        EntityPtr entity = EntityPtr(new Entity());
216        unsigned int numGeneratedBillboardClouds = 0;
217
218        for (unsigned int iBillboardGroup = 0; iBillboardGroup < this->getNumBillboardGroups(); iBillboardGroup++)
219        {
220                if (iBillboardGroup > 0)
221                {
222                        entity->createSubEntity();
223                        Ogre::LogManager::getSingleton().logMessage("BillboardGroup:" + Ogre::StringConverter::toString(iBillboardGroup) + "--" + Ogre::StringConverter::toString(getBillboardGroup(iBillboardGroup)->getNumBillboards()));
224                }
225               
226                subEntityGroup = entity->getSubEntity(iBillboardGroup);
227
228                BillboardGroupPtr billboardGroup = this->getBillboardGroup(iBillboardGroup);
229
230                Ogre::LogManager::getSingleton().logMessage("BBCG-Num.Billboards:" + Ogre::StringConverter::toString(billboardGroup->getNumBillboards()));
231
232                for (unsigned int iBillboard = 0; iBillboard < billboardGroup->getNumBillboards(); iBillboard++)
233                {
234                        unsigned int billboardHandle = billboardGroup->getBillboardHandle(iBillboard);
235                        BillboardPtr billboard = this->getBillboard(billboardHandle);
236                        EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
237
238                        if (entityCluster->getNumEntitiesClusterData() > 0)
239                        {
240                                subEntity = mEntity->getSubEntity(numGeneratedBillboardClouds);
241
242                                while (subEntityGroup->getNumTexCoordSets() < subEntity->getNumTexCoordSets())
243                                {
244                                        subEntityGroup->addTextureCoordSet(subEntity->getTexCoordDimensions(subEntityGroup->getNumTexCoordSets()));
245                                }
246
247                                unsigned int offset = subEntityGroup->getNumFaces() * 3;
248                                Ogre::Vector3 indicesA = Ogre::Vector3(offset, offset + 1, offset + 2);
249                                subEntityGroup->addFaceVerticesIDs(indicesA);
250                                offset = subEntityGroup->getNumFaces()*3;
251                                Ogre::Vector3 indicesB = Ogre::Vector3(offset, offset + 1, offset + 2);
252                                subEntityGroup->addFaceVerticesIDs(indicesB);
253
254                                UniqueVertex vFaceA1,vFaceA2,vFaceA3;
255                                // Face A of the billboard quad
256                                vFaceA1.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
257                                vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
258
259                                vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
260                                vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
261                               
262                                vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
263                                vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
264                               
265                                // Face B of the billboard quad
266                                UniqueVertex vFaceB1,vFaceB2,vFaceB3;
267                                vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
268                                vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
269                               
270                                vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
271                                vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
272                               
273                                vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
274                                vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
275                               
276                                Ogre::LogManager::getSingleton().logMessage("BBCG-SubEntity(" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + ") - Num.Tex.Coord.Sets:"+ Ogre::StringConverter::toString(subEntity->getNumTexCoordSets()));
277
278                                for (unsigned int iTexCoordSet = 0; iTexCoordSet < subEntityGroup->getNumTexCoordSets(); iTexCoordSet++)
279                                {                                       
280                                        vFaceA1.uv[iTexCoordSet] = subEntity->getUniqueVertex(0).uv[iTexCoordSet];
281                                        vFaceA2.uv[iTexCoordSet] = subEntity->getUniqueVertex(1).uv[iTexCoordSet];
282                                        vFaceA3.uv[iTexCoordSet] = subEntity->getUniqueVertex(2).uv[iTexCoordSet];
283                                        vFaceB1.uv[iTexCoordSet] = subEntity->getUniqueVertex(3).uv[iTexCoordSet];
284                                        vFaceB2.uv[iTexCoordSet] = subEntity->getUniqueVertex(4).uv[iTexCoordSet];
285                                        vFaceB3.uv[iTexCoordSet] = subEntity->getUniqueVertex(5).uv[iTexCoordSet];
286                                }
287
288                                subEntityGroup->addUniqueVertex(vFaceA1);
289                                subEntityGroup->addUniqueVertex(vFaceA2);
290                                subEntityGroup->addUniqueVertex(vFaceA3);
291                                subEntityGroup->addUniqueVertex(vFaceB1);
292                                subEntityGroup->addUniqueVertex(vFaceB2);
293                                subEntityGroup->addUniqueVertex(vFaceB3);
294
295                                numGeneratedBillboardClouds++;
296                        }
297                }
298        }       
299
300        mEntity = entity;
301        entity->setSubEntitiesDistinctVertexColours();
302}
303
304unsigned int BillboardCloud::getNumBillboardGroups()
305{
306        return mBillboardGroupList.size();
307}
308
309BillboardGroupPtr BillboardCloud::getBillboardGroup(unsigned int iBillboardGroup)
310{
311        return mBillboardGroupList[iBillboardGroup];
312}
313
314void BillboardCloud::addBillboardGroup(BillboardGroupPtr value)
315{
316        mBillboardGroupList.push_back(value);
317}
318
319void BillboardCloud::removeBillboardGroup(unsigned int value)
320{
321        BillboardGroupPtr billboardGroup = mBillboardGroupList[value];
322        mBillboardGroupList.erase(mBillboardGroupList.begin() + value);
323}
324
325}
Note: See TracBrowser for help on using the repository browser.