Ejemplo n.º 1
0
	void indexVBO(std::vector<natVec3<>>& vertices, std::vector<natVec2<>>& uvs, std::vector<natVec3<>>& normals, std::vector<unsigned short>& out_indices)
	{
		out_indices.clear();
		std::vector<natVec3<>> out_vertices(vertices);
		std::vector<natVec2<>> out_uvs(uvs);
		std::vector<natVec3<>> out_normals(normals);

		std::map<PackedVertex, nuShort> VertexToOutIndex;

		nuInt count = static_cast<nuInt>(std::min({ vertices.size(), uvs.size(), normals.size() }));

		for (nuInt i = 0u; i < count; ++i)
		{
			PackedVertex packed = { vertices[i], uvs[i], normals[i] };

			// Try to find a similar vertex in out_XXXX
			nuShort index;

			if (getSimilarVertexIndex(packed, VertexToOutIndex, index))
			{
				// A similar vertex is already in the VBO, use it instead !
				out_indices.push_back(index);
			}
			else
			{
				// If not, it needs to be added in the output data.
				out_vertices.push_back(vertices[i]);
				out_uvs.push_back(uvs[i]);
				out_normals.push_back(normals[i]);
				unsigned short newindex = static_cast<unsigned short>(out_vertices.size()) - 1;
				out_indices.push_back(newindex);
				VertexToOutIndex[packed] = newindex;
			}
		}

		/*vertices.swap(out_vertices);
		uvs.swap(out_uvs);
		normals.swap(out_normals);*/

		vertices.assign(out_vertices.begin(), out_vertices.end());
		uvs.assign(out_uvs.begin(), out_uvs.end());
		normals.assign(out_normals.begin(), out_normals.end());
	}
Ejemplo n.º 2
0
	void Mesh::applyIndexing()
	{
		vector<vec3> outVertexData;
		vector<vec3> outNormalData;
		vector<vec2> outUvData;
		vector<unsigned int> outIndexData;

		map<Vertex, unsigned int> VertexToOutIndex;
		bool hasUV = uvData.size() > 0;
		bool hasNormal = normalData.size() > 0;
		const vec3 zero(0.0f);

		unsigned int n = vertexData.size();
		for (unsigned int i = 0; i < n; i++)
		{
			Vertex packed(vertexData[i], hasNormal ? normalData[i] : zero, hasUV ? uvData[i] : vec2(0.0f));

			unsigned int index;
			bool found = getSimilarVertexIndex(packed, VertexToOutIndex, index);

			if (found)
				outIndexData.push_back(index);
			else
			{
				outVertexData.push_back(vertexData[i]);
				if(hasUV)
					outUvData.push_back(uvData[i]);
				if(hasNormal)
					outNormalData.push_back(normalData[i]);
				outIndexData.push_back(outVertexData.size() - 1);
				VertexToOutIndex[packed] = outVertexData.size() - 1;
			}
		}

		indexData.setData(outIndexData);
		vertexData = outVertexData;
		uvData = outUvData;
		normalData = outNormalData;
	}