#ifndef MESH_BUILDER_H
#define MESH_BUILDER_H

#include "../../util/utility.h"
#include <core/map.h>
#include <scene/resources/mesh.h>
#include <vector>

namespace dmc {

// Faster than SurfaceTool, only does what is needed to build a smooth mesh
class MeshBuilder {
public:
	MeshBuilder() :
			_reused_vertices(0) {}

	inline void add_vertex(Vector3 position, Vector3 normal) {

		int i = 0;

		Map<Vector3, int>::Element *e = _position_to_index.find(position);

		if (e) {

			i = e->get();
			++_reused_vertices;

		} else {

			i = _positions.size();
			_position_to_index.insert(position, i);

			_positions.push_back(position);
			_normals.push_back(normal);
		}

		_indices.push_back(i);
	}

	Array commit(bool wireframe);
	void clear();

	int get_reused_vertex_count() const { return _reused_vertices; }

private:
	std::vector<Vector3> _positions;
	std::vector<Vector3> _normals;
	std::vector<int> _indices;
	Map<Vector3, int> _position_to_index;
	int _reused_vertices;
};

} // namespace dmc

#endif // MESH_BUILDER_H
