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

Revision 721, 15.8 KB checked in by igarcia, 19 years ago (diff)
Line 
1
2
3#include "BBCBillboardCloudUVMapper.h"
4#include "BBCBillboardCloud.h"
5#include "BBCEntityCluster.h"
6#include "BBCBillboardClusterData.h"
7
8namespace BBC {
9
10BillboardCloudUVMapper::BillboardCloudUVMapper()
11{
12}
13
14BillboardCloudUVMapper::~BillboardCloudUVMapper()
15{
16        shutdown();
17}
18
19void BillboardCloudUVMapper::initialize()
20{
21}
22
23void BillboardCloudUVMapper::shutdown()
24{
25        while (getNumBsp() > 0)
26        {
27                removeBsp(getNumBsp()-1);
28        }
29
30        while (getNumClusterLists() > 0)
31        {
32                removeClusterList(getNumClusterLists()-1);
33        }       
34}
35
36unsigned int BillboardCloudUVMapper::getNumClusterLists()
37{
38        return mClusterLists.size();
39}
40
41unsigned int BillboardCloudUVMapper::getNumBsp()
42{
43        return mBspList.size();
44}
45
46void BillboardCloudUVMapper::addBsp(IMG::Bsp *bsp)
47{
48        mBspList.push_back(bsp);
49}
50
51IMG::Bsp* BillboardCloudUVMapper::getBsp(unsigned int iBsp)
52{
53        return mBspList[iBsp];
54}
55
56void BillboardCloudUVMapper::removeBsp(unsigned int iBsp)
57{
58        IMG::Bsp *bsp = mBspList[iBsp];
59        mBspList.erase(mBspList.begin() + iBsp);
60        delete bsp;
61}
62
63void BillboardCloudUVMapper::addClusterList(IMG::ClusterList *clusterList)
64{
65        mClusterLists.push_back(clusterList);
66}
67
68IMG::ClusterList* BillboardCloudUVMapper::getClusterList(unsigned int iClusterList)
69{
70        return mClusterLists[iClusterList];
71}
72
73void BillboardCloudUVMapper::removeClusterList(unsigned int iClusterList)
74{
75        IMG::ClusterList *clusterList = mClusterLists[iClusterList];
76        mClusterLists.erase(mClusterLists.begin() + iClusterList);
77        delete clusterList;
78}
79
80void BillboardCloudUVMapper::setTextureWidth(unsigned short int width)
81{
82        mTextureWidth = width;
83}
84
85unsigned short int BillboardCloudUVMapper::getTextureWidth()
86{
87        return mTextureWidth;
88}
89
90void BillboardCloudUVMapper::setTextureHeight(unsigned short int height)
91{
92        mTextureHeight = height;
93}
94
95unsigned short BillboardCloudUVMapper::getTextureHeight()
96{
97        return mTextureHeight;
98}
99
100void BillboardCloudUVMapper::setTextureAtlasWidth(unsigned short int width)
101{
102        mTextureAtlasWidth = width;
103}
104
105unsigned short int BillboardCloudUVMapper::getTextureAtlasWidth()
106{
107        return mTextureAtlasWidth;
108}
109
110void BillboardCloudUVMapper::setTextureAtlasHeight(unsigned short int height)
111{
112        mTextureAtlasHeight = height;
113}
114
115unsigned short BillboardCloudUVMapper::getTextureAtlasHeight()
116{
117        return mTextureAtlasHeight;
118}
119
120void BillboardCloudUVMapper::addTextureAtlasTextureCoords(bool mergeBillboards, bool groupedBillboards, unsigned int numGeneratedBillboardClouds, unsigned int iBillboardGroup)
121{
122        unsigned int iUniqueVertex = 0;
123
124        Ogre::LogManager::getSingleton().logMessage("iBBC:" + Ogre::StringConverter::toString(numGeneratedBillboardClouds) + "-" + "iBBCG:" + Ogre::StringConverter::toString(iBillboardGroup));
125
126        Ogre::LogManager::getSingleton().logMessage("SizeCLList:" + Ogre::StringConverter::toString(getClusterList(iBillboardGroup)->GetSize()) + " -- numBBC:" + Ogre::StringConverter::toString(numGeneratedBillboardClouds));
127
128        IMG::Cluster *cluster = getClusterList(iBillboardGroup)->Get(getClusterList(iBillboardGroup)->GetSize()-1);             
129        IMG::Box2d *box = cluster->GetBspNodeBound();
130        Ogre::Vector2 max = box->GetMaximum();
131        Ogre::Vector2 min = box->GetMinimum();
132        Ogre::LogManager::getSingleton().logMessage("Max:" + Ogre::StringConverter::toString(Ogre::Vector3(max[0],max[1],0)) +
133                "\tMin:" + Ogre::StringConverter::toString(Ogre::Vector3(min[0],min[1],0)) +
134                "\tSize(" + Ogre::StringConverter::toString(max[0]-min[0]) +
135                "," + Ogre::StringConverter::toString(max[1]-min[1]) + ")");
136
137        SubEntityPtr subEntity;                                                                                         
138       
139        Ogre::Vector2 texCoords01,texCoords02,texCoords03,texCoords04;
140        texCoords01[0] = min[0] / mTextureAtlasWidth;
141        texCoords01[1] = min[1] / mTextureAtlasHeight;
142
143        texCoords02[0] = max[0] / mTextureAtlasWidth;
144        texCoords02[1] = min[1] / mTextureAtlasHeight;
145
146        texCoords03[0] = max[0] / mTextureAtlasWidth;
147        texCoords03[1] = max[1] / mTextureAtlasHeight;
148
149        texCoords04[0] = min[0] / mTextureAtlasWidth;
150        texCoords04[1] = max[1] / mTextureAtlasHeight;
151       
152        if (groupedBillboards)
153        {
154                Ogre::LogManager::getSingleton().logMessage("DontMerge");
155                subEntity = mBillboardCloud->getEntity()->getSubEntity(iBillboardGroup);                               
156               
157                // Face A
158                //(0,0,0);
159                //(1,0,0);
160                //(1,1,0);
161                subEntity->setTexCoord(iUniqueVertex, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords01[0],texCoords01[1],0));
162                subEntity->setTexCoord(iUniqueVertex+1, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords02[0],texCoords02[1],0));
163                subEntity->setTexCoord(iUniqueVertex+2, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords03[0],texCoords03[1],0));
164
165                Ogre::ColourValue subEntityColour01 = Ogre::ColourValue(0, texCoords01[0],texCoords01[1]);
166                Ogre::ColourValue subEntityColour02 = Ogre::ColourValue(0, texCoords02[0],texCoords02[1]);
167                Ogre::ColourValue subEntityColour03 = Ogre::ColourValue(0, texCoords03[0],texCoords03[1]);
168
169                subEntity->setVertexColour(iUniqueVertex, subEntityColour01.getAsRGBA());
170                subEntity->setVertexColour(iUniqueVertex+1, subEntityColour02.getAsRGBA());
171                subEntity->setVertexColour(iUniqueVertex+2, subEntityColour03.getAsRGBA());
172
173                // Face B
174                //(1,1,0);
175                //(0,1,0);
176                //(0,0,0);
177                subEntity->setTexCoord(iUniqueVertex+3, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords03[0],texCoords03[1],0));
178                subEntity->setTexCoord(iUniqueVertex+4, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords04[0],texCoords04[1],0));
179                subEntity->setTexCoord(iUniqueVertex+5, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords01[0],texCoords01[1],0));
180
181                Ogre::ColourValue subEntityColour04 = Ogre::ColourValue(0, texCoords03[0],texCoords03[1]);
182                Ogre::ColourValue subEntityColour05 = Ogre::ColourValue(0, texCoords04[0],texCoords04[1]);
183                Ogre::ColourValue subEntityColour06 = Ogre::ColourValue(0, texCoords01[0],texCoords01[1]);
184
185                subEntity->setVertexColour(iUniqueVertex+3, subEntityColour04.getAsRGBA());
186                subEntity->setVertexColour(iUniqueVertex+4, subEntityColour05.getAsRGBA());
187                subEntity->setVertexColour(iUniqueVertex+5, subEntityColour06.getAsRGBA());
188
189                iUniqueVertex = iUniqueVertex + 6;
190        }
191        else
192        {
193                if (!mergeBillboards)
194                {
195                        Ogre::LogManager::getSingleton().logMessage("DontMerge");
196
197                        subEntity = mBillboardCloud->getEntity()->getSubEntity(numGeneratedBillboardClouds);
198                        subEntity->addTextureCoordSet(2);
199                        subEntity->enableVertexColours(true);
200                        // Face A
201                        //(0,0,0);
202                        //(1,0,0);
203                        //(1,1,0);
204
205                        subEntity->setTexCoord(0, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords01[0],texCoords01[1], 0));
206                        subEntity->setTexCoord(1, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords02[0],texCoords02[1], 0));
207                        subEntity->setTexCoord(2, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords03[0],texCoords03[1], 0));
208
209                        Ogre::ColourValue subEntityColour01 = Ogre::ColourValue(0, texCoords01[0],texCoords01[1]);
210                        Ogre::ColourValue subEntityColour02 = Ogre::ColourValue(0, texCoords02[0],texCoords02[1]);
211                        Ogre::ColourValue subEntityColour03 = Ogre::ColourValue(0, texCoords03[0],texCoords03[1]);
212
213                        subEntity->setVertexColour(0, subEntityColour01.getAsRGBA());
214                        subEntity->setVertexColour(1, subEntityColour02.getAsRGBA());
215                        subEntity->setVertexColour(2, subEntityColour03.getAsRGBA());
216
217                        // Face B
218                        //(1,1,0);
219                        //(0,1,0);
220                        //(0,0,0);
221                        subEntity->setTexCoord(3, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords03[0],texCoords03[1],0));
222                        subEntity->setTexCoord(4, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords04[0],texCoords04[1],0));
223                        subEntity->setTexCoord(5, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords01[0],texCoords01[1],0));
224
225                        Ogre::ColourValue subEntityColour04 = Ogre::ColourValue(0, texCoords03[0],texCoords03[1]);
226                        Ogre::ColourValue subEntityColour05 = Ogre::ColourValue(0, texCoords04[0],texCoords04[1]);
227                        Ogre::ColourValue subEntityColour06 = Ogre::ColourValue(0, texCoords01[0],texCoords01[1]);
228
229                        subEntity->setVertexColour(3, subEntityColour04.getAsRGBA());
230                        subEntity->setVertexColour(4, subEntityColour05.getAsRGBA());
231                        subEntity->setVertexColour(5, subEntityColour06.getAsRGBA());
232
233                }
234                else
235                {
236                        Ogre::LogManager::getSingleton().logMessage("Merge");
237
238                        subEntity = mBillboardCloud->getEntity()->getSubEntity(0);                             
239                       
240                        // Face A
241                        //(0,0,0);
242                        //(1,0,0);
243                        //(1,1,0);
244                        subEntity->setTexCoord(iUniqueVertex, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords01[0],texCoords01[1],0));
245                        subEntity->setTexCoord(iUniqueVertex+1, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords02[0],texCoords02[1],0));
246                        subEntity->setTexCoord(iUniqueVertex+2, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords03[0],texCoords03[1],0));
247
248                        Ogre::ColourValue subEntityColour01 = Ogre::ColourValue(0, texCoords01[0],texCoords01[1]);
249                        Ogre::ColourValue subEntityColour02 = Ogre::ColourValue(0, texCoords02[0],texCoords02[1]);
250                        Ogre::ColourValue subEntityColour03 = Ogre::ColourValue(0, texCoords03[0],texCoords03[1]);
251
252                        subEntity->setVertexColour(iUniqueVertex, subEntityColour01.getAsRGBA());
253                        subEntity->setVertexColour(iUniqueVertex+1, subEntityColour02.getAsRGBA());
254                        subEntity->setVertexColour(iUniqueVertex+2, subEntityColour03.getAsRGBA());
255
256                        // Face B
257                        //(1,1,0);
258                        //(0,1,0);
259                        //(0,0,0);
260                        subEntity->setTexCoord(iUniqueVertex+3, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords03[0],texCoords03[1],0));
261                        subEntity->setTexCoord(iUniqueVertex+4, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords04[0],texCoords04[1],0));
262                        subEntity->setTexCoord(iUniqueVertex+5, subEntity->getNumTexCoordSets()-1, Ogre::Vector3(texCoords01[0],texCoords01[1],0));
263
264                        Ogre::ColourValue subEntityColour04 = Ogre::ColourValue(0, texCoords03[0],texCoords03[1]);
265                        Ogre::ColourValue subEntityColour05 = Ogre::ColourValue(0, texCoords04[0],texCoords04[1]);
266                        Ogre::ColourValue subEntityColour06 = Ogre::ColourValue(0, texCoords01[0],texCoords01[1]);
267
268                        subEntity->setVertexColour(iUniqueVertex+3, subEntityColour04.getAsRGBA());
269                        subEntity->setVertexColour(iUniqueVertex+4, subEntityColour05.getAsRGBA());
270                        subEntity->setVertexColour(iUniqueVertex+5, subEntityColour06.getAsRGBA());
271
272                        iUniqueVertex = iUniqueVertex + 6;
273                }
274                Ogre::LogManager::getSingleton().logMessage("EndAdd");
275        }
276}
277
278void BillboardCloudUVMapper::addTextureInBsp(unsigned int iBillboardGroup, unsigned int iBillboard)
279{
280        IMG::NodeBspPtr nodeDest;
281        IMG::Cluster cluster;
282        Ogre::LogManager::getSingleton().logMessage("w:" + Ogre::StringConverter::toString(mTextureWidth));
283        Ogre::LogManager::getSingleton().logMessage("h:" + Ogre::StringConverter::toString(mTextureHeight));
284        nodeDest = getBsp(iBillboardGroup)->Insert(mTextureWidth,mTextureHeight,iBillboard);
285       
286        cluster.SetBspNodeBound(nodeDest->GetBound());
287        //cluster.Finish();
288        getClusterList(iBillboardGroup)->Insert(&cluster);     
289}
290
291void BillboardCloudUVMapper::generateTextureAtlasTextureCoords(bool mergeBillboards, bool groupedBillboards, unsigned int numGroups)
292{       
293        unsigned int numBillboardGroups;
294        bool enabledTextureCoordSet = false;
295        unsigned int numGeneratedBillboardClouds = 0;
296
297        for (unsigned int iBillboard = 0; iBillboard < mBillboardCloud->getNumBillboards(); iBillboard++)
298        {
299                BillboardPtr billboard = mBillboardCloud->getBillboard(iBillboard);             
300                EntityClusterPtr entityCluster = billboard->getBillboardClusterData()->getEntityCluster();
301
302                if (entityCluster->getNumEntitiesClusterData() > 0)
303                {
304                        if (mergeBillboards)
305                        {
306                                if (!enabledTextureCoordSet)
307                                {
308                                        SubEntityPtr subEntity = mBillboardCloud->getEntity()->getSubEntity(0);
309                                        subEntity->addTextureCoordSet(2);
310                                        subEntity->enableVertexColours(true);
311                                        enabledTextureCoordSet = true;
312                                }
313                        }
314                        else
315                        {
316                                if (groupedBillboards)
317                                {
318                                        SubEntityPtr subEntity = mBillboardCloud->getEntity()->getSubEntity(numGeneratedBillboardClouds);       
319                                        subEntity->addTextureCoordSet(2);
320                                        subEntity->enableVertexColours(true);
321                                }
322                        }
323
324                        numGeneratedBillboardClouds++;
325                }
326        }
327
328        if (groupedBillboards)
329        {
330                numBillboardGroups = numGroups;
331        }
332        else
333        {
334                if (mergeBillboards)
335                {
336                        numBillboardGroups = 1;
337                }
338                else // (!mergeBillboards)
339                {
340                        numBillboardGroups = 1;
341                }
342        }
343       
344        unsigned int iBillboardsInGroup = 0;
345        unsigned int numberBillboardsEachGroup = numGeneratedBillboardClouds / numGroups;
346        unsigned int numberBillboardsAddedFirstGroup = numGeneratedBillboardClouds % numGroups;
347        numGeneratedBillboardClouds = 0;
348        unsigned int iBillboardGroup;
349        for (iBillboardGroup = 0; iBillboardGroup < numBillboardGroups; iBillboardGroup++)
350        {               
351                IMG::Bsp *bsp = new IMG::Bsp();
352                IMG::ClusterList *clusterList = new IMG::ClusterList();
353                IMG::NodeBspPtr node = IMG::NodeBspPtr(new IMG::NodeBsp);
354
355                node->GetBound()->SetBoundBox(0, 0, mTextureAtlasWidth, mTextureAtlasHeight);
356                bsp->SetRoot(node);     
357
358                addBsp(bsp);
359                addClusterList(clusterList);
360
361        }
362
363        iBillboardGroup = 0;
364        for (unsigned int iBillboard = 0; iBillboard < mBillboardCloud->getNumBillboards(); iBillboard++)
365        {
366                Ogre::LogManager::getSingleton().logMessage("id:" + Ogre::StringConverter::toString(mBillboardCloud->getBillboard(iBillboard)->getBillboardHandle()));
367
368                BillboardClusterData *billboardClusterData = mBillboardCloud->getBillboard(iBillboard)->getBillboardClusterData().get();               
369               
370                if (billboardClusterData != NULL)
371                {
372                        Ogre::LogManager::getSingleton().logMessage("billboardData");
373                        EntityClusterPtr entityCluster = billboardClusterData->getEntityCluster();
374                        if (entityCluster->getNumEntitiesClusterData() > 0)
375                        {                       
376                                Ogre::LogManager::getSingleton().logMessage("entityCluster");
377                               
378                                if ((iBillboardGroup == 0) && (iBillboardsInGroup < (numberBillboardsEachGroup + numberBillboardsAddedFirstGroup)))
379                                {
380                                        Ogre::LogManager::getSingleton().logMessage("\nA");
381                                        Ogre::LogManager::getSingleton().logMessage("IG:" + Ogre::StringConverter::toString(iBillboardsInGroup) + " SizeCLList(" + Ogre::StringConverter::toString(iBillboardGroup) + "):" + Ogre::StringConverter::toString(getClusterList(iBillboardGroup)->GetSize()) + " -- numBBC:" + Ogre::StringConverter::toString(numGeneratedBillboardClouds));
382
383                                        addTextureInBsp(iBillboardGroup, iBillboard);
384
385                                        addTextureAtlasTextureCoords(mergeBillboards, groupedBillboards, numGeneratedBillboardClouds, iBillboardGroup);
386                                        iBillboardsInGroup++;
387                                }
388                                else
389                                {
390                                        if ((iBillboardGroup > 0) && (iBillboardsInGroup < numberBillboardsEachGroup))
391                                        {
392                                                Ogre::LogManager::getSingleton().logMessage("\nB");
393                                                Ogre::LogManager::getSingleton().logMessage("IG:" + Ogre::StringConverter::toString(iBillboardsInGroup) + " SizeCLList(" + Ogre::StringConverter::toString(iBillboardGroup) + "):" + Ogre::StringConverter::toString(getClusterList(iBillboardGroup)->GetSize()) + " -- numBBC:" + Ogre::StringConverter::toString(numGeneratedBillboardClouds));
394
395                                                addTextureInBsp(iBillboardGroup, iBillboard);
396
397                                                addTextureAtlasTextureCoords(mergeBillboards, groupedBillboards, numGeneratedBillboardClouds, iBillboardGroup);
398                                                iBillboardsInGroup++;
399                                        }
400                                        else
401                                        {
402                                                iBillboardGroup++;
403                                                iBillboardsInGroup = 0;
404
405                                                Ogre::LogManager::getSingleton().logMessage("\nC IG:" + Ogre::StringConverter::toString(iBillboardsInGroup-1) + " SizeCLList(" + Ogre::StringConverter::toString(iBillboardGroup-1) + "):" + Ogre::StringConverter::toString(getClusterList(iBillboardGroup-1)->GetSize()));
406                                                Ogre::LogManager::getSingleton().logMessage("IG:" + Ogre::StringConverter::toString(iBillboardsInGroup) + " SizeCLList(" + Ogre::StringConverter::toString(iBillboardGroup) + "):" + Ogre::StringConverter::toString(getClusterList(iBillboardGroup)->GetSize()) + " -- numBBC:" + Ogre::StringConverter::toString(numGeneratedBillboardClouds));
407
408                                                addTextureInBsp(iBillboardGroup, iBillboard);
409
410                                                addTextureAtlasTextureCoords(mergeBillboards, groupedBillboards, numGeneratedBillboardClouds, iBillboardGroup);
411                                                iBillboardsInGroup++;
412                                        }
413                                }
414
415                                numGeneratedBillboardClouds++;
416                        }
417                }
418        }       
419        //mBsp.Print();
420}
421
422void BillboardCloudUVMapper::setBillboardCloud(BillboardCloud *billboardCloud)
423{
424        mBillboardCloud = billboardCloud;
425}
426
427BillboardCloud * BillboardCloudUVMapper::getBillboardCloud()
428{
429        return mBillboardCloud;
430}
431
432}
Note: See TracBrowser for help on using the repository browser.