source: GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/src/BBCEntityCluster.cpp @ 699

Revision 699, 3.9 KB checked in by igarcia, 19 years ago (diff)
Line 
1
2#include <BBCEntityCluster.h>
3#include <BBCEntity.h>
4
5namespace BBC {
6
7EntityCluster::EntityCluster()
8{
9}
10
11EntityCluster::~EntityCluster()
12{       
13        for (unsigned int iEntityClusterData = 0; iEntityClusterData < getNumEntitiesClusterData(); iEntityClusterData++)
14        {
15                EntityClusterData *entityClusterData = getEntityClusterData(iEntityClusterData);
16                delete entityClusterData;
17        }
18       
19        delete mEntity;
20}
21
22EntityClusterData* EntityCluster::getEntityClusterData(unsigned int value)
23{
24        return mEntityClusterDataList[value];
25}
26
27unsigned int EntityCluster::getNumEntitiesClusterData()
28{
29        return static_cast<unsigned int>(mEntityClusterDataList.size());
30}
31
32void EntityCluster::addEntityClusterData(EntityClusterData *value)
33{
34        mEntityClusterDataList.push_back(value);
35}
36
37void EntityCluster::removeEntitClusterData(unsigned int value)
38{
39        mEntityClusterDataList.erase(mEntityClusterDataList.begin()+value);
40}
41
42Entity* EntityCluster::getEntity()
43{
44        return mEntity;
45}
46
47void EntityCluster::setEntity(Entity* value) {
48        mEntity = value;
49}
50
51unsigned int EntityCluster::getBillboardHandle() {
52        return mBillboardHandle;
53}
54
55void EntityCluster::setBillboardHandle(unsigned int value) {
56        mBillboardHandle = value;
57}
58
59void EntityCluster::setEntityDistribution(EntityDistribution *value)
60{
61        mEntityDistribution = value;
62}
63
64EntityDistribution* EntityCluster::getEntityDistribution()
65{
66        return mEntityDistribution;
67}
68
69void EntityCluster::generateEntityCluster()
70{
71        mEntity = new BBC::Entity();
72
73        mEntity->getSubEntity(0)->addTextureCoordSet(2);
74        Ogre::Vector3 indicesOffset = Ogre::Vector3::ZERO;
75
76        mEntity->getSubEntity(0)->enableVertexColours(true);
77
78        float fRed = Ogre::Math::RangeRandom(0.0,1.0);
79        float fGreen = Ogre::Math::RangeRandom(0.0,1.0);
80        float fBlue = Ogre::Math::RangeRandom(0.0,1.0);
81        Ogre::ColourValue subEntityColour = Ogre::ColourValue(1.0,fRed,fGreen,fBlue);
82
83        unsigned int offset = 0;
84        for (unsigned int iEntityClusterData = 0; iEntityClusterData < getNumEntitiesClusterData(); iEntityClusterData++)
85        {                       
86                Entity *entity = getEntityClusterData(iEntityClusterData)->getEntity();
87
88                for (unsigned int iFace = 0; iFace < entity->getSubEntity(0)->getNumFaces(); iFace++)
89                {
90                        UniqueVertex uniqueVertex01, uniqueVertex02, uniqueVertex03;
91                        Ogre::Vector3 indices = entity->getSubEntity(0)->getFaceVerticesIDs(iFace);
92                        mEntity->getSubEntity(0)->addFaceVerticesIDs(indices + indicesOffset);
93                       
94                        mEntity->getSubEntity(0)->enableVertexColours(entity->getSubEntity(0)->hasVertexColours());
95                       
96                        uniqueVertex01.position = entity->getSubEntity(0)->getUniqueVertex(indices[0]).position;
97                        uniqueVertex01.normal = entity->getSubEntity(0)->getUniqueVertex(indices[0]).normal;
98                        uniqueVertex01.uv[0] = entity->getSubEntity(0)->getUniqueVertex(indices[0]).uv[0];
99                        if (mEntity->getSubEntity(0)->hasVertexColours())
100                        {                       
101                uniqueVertex01.colour = subEntityColour.getAsRGBA();
102                        }
103                        mEntity->getSubEntity(0)->addUniqueVertex(uniqueVertex01);
104
105                        uniqueVertex02.position = entity->getSubEntity(0)->getUniqueVertex(indices[1]).position;
106                        uniqueVertex02.normal = entity->getSubEntity(0)->getUniqueVertex(indices[1]).normal;
107                        uniqueVertex02.uv[0] = entity->getSubEntity(0)->getUniqueVertex(indices[1]).uv[0];
108                        if (mEntity->getSubEntity(0)->hasVertexColours())
109                        {                       
110                uniqueVertex02.colour = subEntityColour.getAsRGBA();
111                        }
112                        mEntity->getSubEntity(0)->addUniqueVertex(uniqueVertex02);
113
114                        uniqueVertex03.position = entity->getSubEntity(0)->getUniqueVertex(indices[2]).position;
115                        uniqueVertex03.normal = entity->getSubEntity(0)->getUniqueVertex(indices[2]).normal;
116                        uniqueVertex03.uv[0] = entity->getSubEntity(0)->getUniqueVertex(indices[2]).uv[0];
117                        if (mEntity->getSubEntity(0)->hasVertexColours())
118                        {                       
119                uniqueVertex03.colour = subEntityColour.getAsRGBA();
120                        }
121                        mEntity->getSubEntity(0)->addUniqueVertex(uniqueVertex03);     
122
123
124                }
125                offset = offset + entity->getSubEntity(0)->getNumFaces() * 3;
126                indicesOffset = Ogre::Vector3(offset, offset, offset);
127        }
128}
129
130}
Note: See TracBrowser for help on using the repository browser.