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

Revision 709, 12.2 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}
10
11BillboardCloud::~BillboardCloud()
12{
13        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
14        {
15                Billboard *billboard = getBillboard(iBillboard);
16                delete billboard;
17        }
18
19        for (unsigned int iBillboardGroup = 0; iBillboardGroup < getNumBillboardGroups(); iBillboardGroup++)
20        {
21                BillboardGroup *billboardGroup = getBillboardGroup(iBillboardGroup);
22                delete billboardGroup;
23        }
24
25        delete mEntity;
26}
27
28std::vector<Billboard*>* BillboardCloud::getBillboardList()
29{
30        return &mBillboardList;
31}
32
33void BillboardCloud::setBillboardList(std::vector<Billboard*> &value)
34{
35        mBillboardList = value;
36}
37
38unsigned int BillboardCloud::getNumBillboards()
39{
40        return (unsigned int)(mBillboardList.size());
41}
42
43void BillboardCloud::addBillboard(Billboard *value)
44{
45        value->setBillboardHandle((unsigned int)(mBillboardList.size()));       
46        mBillboardList.push_back(value);
47}
48
49void BillboardCloud::removeBillboard(unsigned int value)
50{
51        Billboard *billboard = mBillboardList[value];
52        mBillboardList.erase(mBillboardList.begin() + value);
53        delete billboard;
54}
55
56Billboard* BillboardCloud::getBillboard(unsigned int value)
57{
58        return mBillboardList[value];
59}
60
61Entity* BillboardCloud::getEntity()
62{
63        return mEntity;
64}
65
66void BillboardCloud::setEntity(Entity *value)
67{
68        mEntity = value;
69}
70
71void BillboardCloud::generateBillboardCloud(bool mergeBillboards)
72{
73        if (mEntity != NULL)
74        {
75                delete mEntity;
76                mEntity = new Entity();
77        }
78
79        unsigned int numGeneratedBillboardClouds = 0;
80        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
81        {
82                Billboard *billboard = this->getBillboard(iBillboard);         
83                EntityCluster *entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
84
85                if (entityCluster->getNumEntitiesClusterData() > 0)
86                {               
87                        SubEntity *subEntity;                   
88                        if (mergeBillboards)
89                        {
90                                subEntity = mEntity->getSubEntity(0);
91                                unsigned int offset = subEntity->getNumFaces() * 3;
92                                Ogre::Vector3 indicesA = Ogre::Vector3(offset, offset + 1, offset + 2);
93                                subEntity->addFaceVerticesIDs(indicesA);
94                                offset = subEntity->getNumFaces()*3;
95                                Ogre::Vector3 indicesB = Ogre::Vector3(offset, offset + 1, offset + 2);
96                                subEntity->addFaceVerticesIDs(indicesB);
97                        }
98                        else
99                        {                               
100                                // The entity has by default one subentity, if we need more
101                                // we have to create them.
102                                if (numGeneratedBillboardClouds > 0)
103                                {
104                                        mEntity->createSubEntity();
105                                }
106                                Ogre::Vector3 indices = Ogre::Vector3(0,1,2);
107                                subEntity = mEntity->getSubEntity(numGeneratedBillboardClouds);
108                                subEntity->addTextureCoordSet(2);
109
110                                Ogre::LogManager::getSingleton().logMessage("BBC-SubEntity(" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + ") - Num.Tex.Coord.Sets:" + Ogre::StringConverter::toString(subEntity->getNumTexCoordSets()));
111
112                                subEntity->addFaceVerticesIDs(indices);
113                                subEntity->addFaceVerticesIDs(indices + Ogre::Vector3(3,3,3));
114                        }
115                       
116                        UniqueVertex vFaceA1,vFaceA2,vFaceA3;
117                        // Face A of the billboard quad
118                        vFaceA1.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
119                        vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
120                        vFaceA1.uv[0] = Ogre::Vector3(0,0,0);
121                        vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
122                        vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
123                        vFaceA2.uv[0] = Ogre::Vector3(1,0,0);
124                        vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
125                        vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
126                        vFaceA3.uv[0] = Ogre::Vector3(1,1,0);
127
128                        // Face B of the billboard quad
129                        UniqueVertex vFaceB1,vFaceB2,vFaceB3;
130                        vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
131                        vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
132                        vFaceB1.uv[0] = Ogre::Vector3(1,1,0);
133                        vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
134                        vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
135                        vFaceB2.uv[0] = Ogre::Vector3(0,1,0);
136                        vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
137                        vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
138                        vFaceB3.uv[0] = Ogre::Vector3(0,0,0);
139
140                        subEntity->addUniqueVertex(vFaceA1);
141                        subEntity->addUniqueVertex(vFaceA2);
142                        subEntity->addUniqueVertex(vFaceA3);
143                        subEntity->addUniqueVertex(vFaceB1);
144                        subEntity->addUniqueVertex(vFaceB2);
145                        subEntity->addUniqueVertex(vFaceB3);
146
147                        numGeneratedBillboardClouds++;
148                }
149        }
150}
151
152void BillboardCloud::initializeBillboardCloudGroups(unsigned int numberGroups)
153{
154
155        Ogre::LogManager::getSingleton().logMessage("Ini.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
156
157        while (getNumBillboardGroups() > 0)
158        {
159                BillboardGroup *billboardGroup = getBillboardGroup(getNumBillboardGroups()-1);
160                removeBillboardGroup(getNumBillboardGroups()-1);
161        }
162
163        Ogre::LogManager::getSingleton().logMessage("Clear.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
164
165        unsigned int iBillboardGroup;
166        for (iBillboardGroup = 0; iBillboardGroup < numberGroups; iBillboardGroup++)
167        {
168                BillboardGroup *billboardGroup = new BillboardGroup();
169                addBillboardGroup(billboardGroup);
170        }
171
172        Ogre::LogManager::getSingleton().logMessage("New.Num.Billboard Groups:" + Ogre::StringConverter::toString(getNumBillboardGroups()));
173        std::cin.get();
174        std::cin.get();
175
176        unsigned int numGeneratedBillboardClouds = 0;
177        for (unsigned int iBillboard = 0; iBillboard < getNumBillboards(); iBillboard++)
178        {
179                Billboard *billboard = this->getBillboard(iBillboard);         
180                EntityCluster *entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
181
182                if (entityCluster->getNumEntitiesClusterData() > 0)
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                Billboard *billboard = this->getBillboard(iBillboard);         
200                EntityCluster *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        SubEntity *subEntityGroup;
232        SubEntity *subEntity;
233        Entity *entity = 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                BillboardGroup *billboardGroup = this->getBillboardGroup(iBillboardGroup);
247
248                Ogre::LogManager::getSingleton().logMessage("BBCG-Num.Billboards:" + Ogre::StringConverter::toString(billboardGroup->getNumBillboards()));
249                std::cin.get();
250                std::cin.get();
251
252                for (unsigned int iBillboard = 0; iBillboard < billboardGroup->getNumBillboards(); iBillboard++)
253                {
254                        unsigned int billboardHandle = billboardGroup->getBillboardHandle(iBillboard);
255                        Billboard *billboard = this->getBillboard(billboardHandle);
256                        EntityCluster *entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
257
258                        if (entityCluster->getNumEntitiesClusterData() > 0)
259                        {
260                                subEntity = mEntity->getSubEntity(numGeneratedBillboardClouds);
261
262                                while (subEntityGroup->getNumTexCoordSets() < subEntity->getNumTexCoordSets())
263                                {
264                                        subEntityGroup->addTextureCoordSet(subEntity->getTexCoordDimensions(subEntityGroup->getNumTexCoordSets()));
265                                }
266
267                                unsigned int offset = subEntityGroup->getNumFaces() * 3;
268                                Ogre::Vector3 indicesA = Ogre::Vector3(offset, offset + 1, offset + 2);
269                                subEntityGroup->addFaceVerticesIDs(indicesA);
270                                offset = subEntityGroup->getNumFaces()*3;
271                                Ogre::Vector3 indicesB = Ogre::Vector3(offset, offset + 1, offset + 2);
272                                subEntityGroup->addFaceVerticesIDs(indicesB);
273
274                                UniqueVertex vFaceA1,vFaceA2,vFaceA3;
275                                // Face A of the billboard quad
276                                vFaceA1.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
277                                vFaceA1.normal = billboard->getBillboardClusterData()->getNormal();
278
279                                vFaceA2.position = billboard->getBillboardClusterData()->getQuadTopRightCorner();
280                                vFaceA2.normal = billboard->getBillboardClusterData()->getNormal();
281                               
282                                vFaceA3.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
283                                vFaceA3.normal = billboard->getBillboardClusterData()->getNormal();
284                               
285                                // Face B of the billboard quad
286                                UniqueVertex vFaceB1,vFaceB2,vFaceB3;
287                                vFaceB1.position = billboard->getBillboardClusterData()->getQuadBottomRightCorner();
288                                vFaceB1.normal = billboard->getBillboardClusterData()->getNormal();
289                               
290                                vFaceB2.position = billboard->getBillboardClusterData()->getQuadBottomLeftCorner();
291                                vFaceB2.normal = billboard->getBillboardClusterData()->getNormal();
292                               
293                                vFaceB3.position = billboard->getBillboardClusterData()->getQuadTopLeftCorner();
294                                vFaceB3.normal = billboard->getBillboardClusterData()->getNormal();
295                               
296                                Ogre::LogManager::getSingleton().logMessage("BBCG-SubEntity(" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + ") - Num.Tex.Coord.Sets:"+ Ogre::StringConverter::toString(subEntity->getNumTexCoordSets()));
297
298                                for (unsigned int iTexCoordSet = 0; iTexCoordSet < subEntityGroup->getNumTexCoordSets(); iTexCoordSet++)
299                                {                                       
300                                        vFaceA1.uv[iTexCoordSet] = subEntity->getUniqueVertex(0).uv[iTexCoordSet];
301                                        vFaceA2.uv[iTexCoordSet] = subEntity->getUniqueVertex(1).uv[iTexCoordSet];
302                                        vFaceA3.uv[iTexCoordSet] = subEntity->getUniqueVertex(2).uv[iTexCoordSet];
303                                        vFaceB1.uv[iTexCoordSet] = subEntity->getUniqueVertex(3).uv[iTexCoordSet];
304                                        vFaceB2.uv[iTexCoordSet] = subEntity->getUniqueVertex(4).uv[iTexCoordSet];
305                                        vFaceB3.uv[iTexCoordSet] = subEntity->getUniqueVertex(5).uv[iTexCoordSet];
306                                }
307
308                                subEntityGroup->addUniqueVertex(vFaceA1);
309                                subEntityGroup->addUniqueVertex(vFaceA2);
310                                subEntityGroup->addUniqueVertex(vFaceA3);
311                                subEntityGroup->addUniqueVertex(vFaceB1);
312                                subEntityGroup->addUniqueVertex(vFaceB2);
313                                subEntityGroup->addUniqueVertex(vFaceB3);
314
315                                numGeneratedBillboardClouds++;
316                        }
317                }
318        }       
319
320        delete mEntity;
321        mEntity = entity;
322        entity->setSubEntitiesDistinctVertexColours();
323}
324
325unsigned int BillboardCloud::getNumBillboardGroups()
326{
327        return mBillboardGroupList.size();
328}
329
330BillboardGroup* BillboardCloud::getBillboardGroup(unsigned int iBillboardGroup)
331{
332        return mBillboardGroupList[iBillboardGroup];
333}
334
335void BillboardCloud::addBillboardGroup(BillboardGroup *value)
336{
337        mBillboardGroupList.push_back(value);
338}
339
340void BillboardCloud::removeBillboardGroup(unsigned int value)
341{
342        BillboardGroup *billboardGroup = mBillboardGroupList[value];
343        mBillboardGroupList.erase(mBillboardGroupList.begin() + value);
344        delete billboardGroup;
345}
346
347}
Note: See TracBrowser for help on using the repository browser.