summaryrefslogtreecommitdiff
blob: 030368de29e36fee011774306fd39a6a766dfda7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
--- a/OgreMain/include/OgreProgressiveMeshGenerator.h
+++ b/OgreMain/include/OgreProgressiveMeshGenerator.h
@@ -215,7 +215,40 @@
 	void tuneContainerSize();
 	void addVertexData(VertexData* vertexData, bool useSharedVertexLookup);
 	template<typename IndexType>
-	void addIndexDataImpl(IndexType* iPos, const IndexType* iEnd, VertexLookupList& lookup, unsigned short submeshID);
+	void addIndexDataImpl(IndexType* iPos, const IndexType* iEnd, VertexLookupList& lookup, unsigned short submeshID)
+	{
+
+		// Loop through all triangles and connect them to the vertices.
+		for (; iPos < iEnd; iPos += 3) {
+			// It should never reallocate or every pointer will be invalid.
+			OgreAssert(mTriangleList.capacity() > mTriangleList.size(), "");
+			mTriangleList.push_back(PMTriangle());
+			PMTriangle* tri = &mTriangleList.back();
+			tri->isRemoved = false;
+			tri->submeshID = submeshID;
+			for (int i = 0; i < 3; i++) {
+				// Invalid index: Index is bigger then vertex buffer size.
+				OgreAssert(iPos[i] < lookup.size(), "");
+				tri->vertexID[i] = iPos[i];
+				tri->vertex[i] = lookup[iPos[i]];
+			}
+			if (tri->isMalformed()) {
+#if OGRE_DEBUG_MODE
+				stringstream str;
+				str << "In " << mMeshName << " malformed triangle found with ID: " << getTriangleID(tri) << ". " <<
+				std::endl;
+				printTriangle(tri, str);
+				str << "It will be excluded from LOD level calculations.";
+				LogManager::getSingleton().stream() << str.str();
+#endif
+				tri->isRemoved = true;
+				mIndexBufferInfoList[tri->submeshID].indexCount -= 3;
+				continue;
+			}
+			tri->computeNormal();
+			addTriangleToEdges(tri);
+		}
+	}
 	void addIndexData(IndexData* indexData, bool useSharedVertexLookup, unsigned short submeshID);
 
 	void computeCosts();
--- a/OgreMain/src/OgreProgressiveMeshGenerator.cpp
+++ b/OgreMain/src/OgreProgressiveMeshGenerator.cpp
@@ -219,6 +219,8 @@
 	}
 	vbuf->unlock();
 }
+/// Called from OgreQueuedProgressiveMeshGenerator.cpp, so it can not be defined in here.
+#if 0
 template<typename IndexType>
 void ProgressiveMeshGenerator::addIndexDataImpl(IndexType* iPos, const IndexType* iEnd,
                                                 VertexLookupList& lookup,
@@ -256,6 +258,7 @@
 		addTriangleToEdges(tri);
 	}
 }
+#endif // 0
 
 void ProgressiveMeshGenerator::addIndexData(IndexData* indexData, bool useSharedVertexLookup, unsigned short submeshID)
 {