1 | |
---|
2 | #include "LBBCLeaf.h" |
---|
3 | |
---|
4 | namespace LBBC { |
---|
5 | |
---|
6 | Leaf::Leaf() |
---|
7 | { |
---|
8 | } |
---|
9 | |
---|
10 | Leaf::~Leaf() |
---|
11 | { |
---|
12 | |
---|
13 | } |
---|
14 | |
---|
15 | void Leaf::setPlaneD(float value) { |
---|
16 | mPlaneD = value; |
---|
17 | } |
---|
18 | |
---|
19 | float Leaf::getPlaneD() { |
---|
20 | return mPlaneD; |
---|
21 | } |
---|
22 | |
---|
23 | void Leaf::setPlaneNormal(Ogre::Vector3 value) { |
---|
24 | } |
---|
25 | |
---|
26 | Ogre::Vector3 Leaf::getPlaneNormal() { |
---|
27 | return mPlaneNormal; |
---|
28 | } |
---|
29 | |
---|
30 | void Leaf::setPosition(Ogre::Vector3 value) { |
---|
31 | mPosition = value; |
---|
32 | } |
---|
33 | |
---|
34 | Ogre::Vector3 Leaf::getPosition() { |
---|
35 | return mPosition; |
---|
36 | } |
---|
37 | |
---|
38 | Ogre::Quaternion Leaf::getOrientation() { |
---|
39 | return mOrientation; |
---|
40 | } |
---|
41 | |
---|
42 | void Leaf::setOrientation(const Ogre::Quaternion & orientation) { |
---|
43 | mOrientation = orientation; |
---|
44 | } |
---|
45 | |
---|
46 | void Leaf::addFaceNormal(Ogre::Vector3 value) |
---|
47 | { |
---|
48 | mFacesNormals.push_back(value); |
---|
49 | } |
---|
50 | |
---|
51 | void Leaf::removeFaceNormal(unsigned int value) |
---|
52 | { |
---|
53 | mFacesNormals.erase(mFacesNormals.begin()+value); |
---|
54 | } |
---|
55 | |
---|
56 | Ogre::Vector3 Leaf::getFaceNormal(unsigned int value) |
---|
57 | { |
---|
58 | return mFacesNormals[value]; |
---|
59 | } |
---|
60 | |
---|
61 | bool Leaf::hasFace(unsigned int value) |
---|
62 | { |
---|
63 | bool hasFace = false; |
---|
64 | |
---|
65 | if (mFacesEntitySet.size() > 0) |
---|
66 | { |
---|
67 | hasFace = mFacesEntitySet.find(value) != mFacesEntitySet.end(); |
---|
68 | } |
---|
69 | return hasFace; |
---|
70 | } |
---|
71 | |
---|
72 | void Leaf::addFace(unsigned int value) |
---|
73 | { |
---|
74 | mFacesEntitySet.insert(value); |
---|
75 | } |
---|
76 | |
---|
77 | void Leaf::removeFace(unsigned int value) |
---|
78 | { |
---|
79 | mFacesEntitySet.erase(value); |
---|
80 | } |
---|
81 | |
---|
82 | unsigned int Leaf::getFace(unsigned int value) |
---|
83 | { |
---|
84 | ID_FACESet::iterator itFacesEntitySet; |
---|
85 | itFacesEntitySet = mFacesEntitySet.begin(); |
---|
86 | |
---|
87 | unsigned int iElem = 0; |
---|
88 | while ((iElem < value) && (value < mFacesEntitySet.size())) |
---|
89 | { |
---|
90 | itFacesEntitySet++; |
---|
91 | iElem++; |
---|
92 | } |
---|
93 | return static_cast<unsigned int>(* itFacesEntitySet); |
---|
94 | } |
---|
95 | |
---|
96 | unsigned int Leaf::getNumFaces() |
---|
97 | { |
---|
98 | return static_cast<unsigned int>(mFacesEntitySet.size()); |
---|
99 | } |
---|
100 | |
---|
101 | unsigned int Leaf::getNumLeafNormals()
|
---|
102 | {
|
---|
103 | return static_cast<unsigned int>(mFacesNormals.size());
|
---|
104 | }
|
---|
105 |
|
---|
106 | void Leaf::setLeafNormal(Ogre::Vector3 normal) |
---|
107 | { |
---|
108 | mLeafNormal = normal; |
---|
109 | } |
---|
110 | |
---|
111 | Ogre::Vector3 Leaf::getLeafNormal() |
---|
112 | { |
---|
113 | return mLeafNormal; |
---|
114 | } |
---|
115 | |
---|
116 | void Leaf::setLeafD(float leafD) |
---|
117 | { |
---|
118 | mLeafD = leafD; |
---|
119 | } |
---|
120 | |
---|
121 | float Leaf::getLeafD() |
---|
122 | { |
---|
123 | return mLeafD; |
---|
124 | } |
---|
125 | |
---|
126 | void Leaf::addFaceInfo(BBC::UniqueVertex v0, BBC::UniqueVertex v1, BBC::UniqueVertex v2) |
---|
127 | {
|
---|
128 | // Add vertex 0 from the first face
|
---|
129 | getSubEntity(0)->addUniqueVertex(v0);
|
---|
130 |
|
---|
131 | // Add vertex 1 from the first face
|
---|
132 | getSubEntity(0)->addUniqueVertex(v1);
|
---|
133 |
|
---|
134 | // Add vertex 2 from the first face
|
---|
135 | getSubEntity(0)->addUniqueVertex(v2);
|
---|
136 |
|
---|
137 | unsigned int numIndices = getSubEntity(0)->getNumFaces() * 3;
|
---|
138 | Ogre::Vector3 indices = Ogre::Vector3(numIndices, numIndices + 1, numIndices + 2);
|
---|
139 | getSubEntity(0)->addFaceVerticesIDs(indices);
|
---|
140 |
|
---|
141 | Ogre::Vector3 p1 = v0.position;
|
---|
142 | Ogre::Vector3 p2 = v1.position;
|
---|
143 | Ogre::Vector3 p3 = v2.position;
|
---|
144 | Ogre::Vector3 v21 = p2 - p1;
|
---|
145 | Ogre::Vector3 v31 = p3 - p1;
|
---|
146 | Ogre::Vector3 normal = v21.crossProduct(v31);
|
---|
147 |
|
---|
148 | //if (dotProd < 0)
|
---|
149 | if (normal[2] < 0)
|
---|
150 | {
|
---|
151 | normal = v31.crossProduct(v21);
|
---|
152 | normal.normalise();
|
---|
153 | }
|
---|
154 |
|
---|
155 | addFaceNormal(normal); |
---|
156 | } |
---|
157 | |
---|
158 | void Leaf::readLeaf(TiXmlNode *leafNode) |
---|
159 | { |
---|
160 | unsigned int id = Ogre::StringConverter::parseInt(leafNode->ToElement()->Attribute("id")); |
---|
161 | setEntityHandle(id); |
---|
162 | |
---|
163 | Ogre::Vector3 normal; |
---|
164 | TiXmlNode *coord4dNode = leafNode->FirstChild("coord4d");
|
---|
165 | normal.x = Ogre::StringConverter::parseReal(coord4dNode->ToElement()->Attribute("nx"));
|
---|
166 | normal.y = Ogre::StringConverter::parseReal(coord4dNode->ToElement()->Attribute("ny"));
|
---|
167 | normal.z = Ogre::StringConverter::parseReal(coord4dNode->ToElement()->Attribute("nz"));
|
---|
168 | float d = Ogre::StringConverter::parseReal(coord4dNode->ToElement()->Attribute("d")); |
---|
169 | |
---|
170 | Ogre::Vector3 position; |
---|
171 | TiXmlNode *positionNode = leafNode->FirstChild("position"); |
---|
172 | position.x = Ogre::StringConverter::parseReal(positionNode->ToElement()->Attribute("x"));
|
---|
173 | position.y = Ogre::StringConverter::parseReal(positionNode->ToElement()->Attribute("y"));
|
---|
174 | position.z = Ogre::StringConverter::parseReal(positionNode->ToElement()->Attribute("z")); |
---|
175 | |
---|
176 | setLeafNormal(normal); |
---|
177 | setPosition(position); |
---|
178 | setLeafD(d); |
---|
179 | |
---|
180 | TiXmlNode *facesNode = leafNode->FirstChild("faces"); |
---|
181 | unsigned int count = Ogre::StringConverter::parseInt(facesNode->ToElement()->Attribute("count")); |
---|
182 | |
---|
183 | for (TiXmlNode *faceNode = facesNode->FirstChild("face"); faceNode; faceNode = faceNode->NextSibling() ) |
---|
184 | { |
---|
185 | unsigned int id = Ogre::StringConverter::parseInt(faceNode->ToElement()->Attribute("id")); |
---|
186 | addFace(id); |
---|
187 | } |
---|
188 | } |
---|
189 | |
---|
190 | void Leaf::writeLeaf(TiXmlNode *leafNode)
|
---|
191 | {
|
---|
192 | leafNode->ToElement()->SetAttribute(Ogre::String("id"),Ogre::StringConverter::toString(getEntityHandle()));
|
---|
193 |
|
---|
194 | TiXmlNode *coord4dNode = leafNode->ToElement()->InsertEndChild(TiXmlElement(Ogre::String("coord4d").c_str()))->ToElement();
|
---|
195 |
|
---|
196 | Ogre::String sNx = Ogre::StringConverter::toString(getLeafNormal().x);
|
---|
197 | Ogre::String sNy = Ogre::StringConverter::toString(getLeafNormal().y);
|
---|
198 | Ogre::String sNz = Ogre::StringConverter::toString(getLeafNormal().z);
|
---|
199 | Ogre::String sD = Ogre::StringConverter::toString(getLeafD());
|
---|
200 |
|
---|
201 | coord4dNode->ToElement()->SetAttribute("nx", sNx.c_str());
|
---|
202 | coord4dNode->ToElement()->SetAttribute("ny", sNy.c_str());
|
---|
203 | coord4dNode->ToElement()->SetAttribute("nz", sNz.c_str());
|
---|
204 | coord4dNode->ToElement()->SetAttribute("d", sD.c_str());
|
---|
205 |
|
---|
206 | TiXmlNode *positionNode = leafNode->ToElement()->InsertEndChild(TiXmlElement(Ogre::String("position").c_str()))->ToElement();
|
---|
207 |
|
---|
208 | Ogre::String sCoordX = Ogre::StringConverter::toString(getPosition().x);
|
---|
209 | Ogre::String sCoordY = Ogre::StringConverter::toString(getPosition().y);
|
---|
210 | Ogre::String sCoordZ = Ogre::StringConverter::toString(getPosition().z);
|
---|
211 |
|
---|
212 | positionNode->ToElement()->SetAttribute(Ogre::String("x").c_str(), sCoordX.c_str());
|
---|
213 | positionNode->ToElement()->SetAttribute(Ogre::String("y").c_str(), sCoordY.c_str());
|
---|
214 | positionNode->ToElement()->SetAttribute(Ogre::String("z").c_str(), sCoordZ.c_str());
|
---|
215 | TiXmlNode *facesNode;
|
---|
216 | for (unsigned int i = 0; i < getNumFaces(); i++)
|
---|
217 | {
|
---|
218 | if (i == 0)
|
---|
219 | {
|
---|
220 | facesNode = leafNode->ToElement()->InsertEndChild(TiXmlElement(Ogre::String("faces").c_str()))->ToElement();
|
---|
221 |
|
---|
222 | Ogre::String sFace = Ogre::StringConverter::toString(getNumFaces());
|
---|
223 | facesNode->ToElement()->SetAttribute(Ogre::String("count").c_str(), sFace.c_str());
|
---|
224 | }
|
---|
225 |
|
---|
226 | TiXmlNode *faceNode = facesNode->ToElement()->InsertEndChild(TiXmlElement(Ogre::String("face").c_str()))->ToElement();
|
---|
227 | Ogre::String sId = Ogre::StringConverter::toString(getFace(i));
|
---|
228 | faceNode->ToElement()->SetAttribute("id", sId.c_str());
|
---|
229 | }
|
---|
230 | } |
---|
231 | |
---|
232 | } |
---|