//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007-2008)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: text_manager.hpp
//      Краткое описание: text manager
//

#ifndef DSE_RS_TEXT_TEXT_MANAGER_HPP
#define DSE_RS_TEXT_TEXT_MANAGER_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Resource System/Text/type.hpp>
#include <Darkstar/Kernel/Misc/singleton.hpp>
#include <Darkstar/Graphic System/Effect/effect.hpp>
#include <Darkstar/Resource System/Model/index_buffer.hpp>
#include <Darkstar/Resource System/Model/vertex_buffer.hpp>
#include <Darkstar/Resource System/Model/input_layout.hpp>

namespace rs
{
	class TextManager : public ker::SingletonHolder<TextManager>
	{
	private:
		shared_ptr<gs::Effect> effect;
		math::Matr4 ortho_projection_matrix;
		math::Matr4 view_matrix;
		math::Matr4 ov_matrix;

		shared_ptr<rs::InputLayout> input_layout;

		unsigned int width, height;
		float znear, zfar;

		struct Vertex
		{
			math::Vect3 position;
			math::Vect2 tex_coord;
		};

		struct TypeDescriptor
		{
			shared_ptr<Type> type;
			unsigned int num_type_textures;
			std::vector<std::vector<Vertex> > buffers;
			std::vector<std::vector<unsigned short> > ibuffers;
			std::vector<shared_ptr<rs::VertexBuffer> > vertex_buffers;
			std::vector<shared_ptr<rs::IndexBuffer> > index_buffers;
			unsigned int vertex_number_in_buffer;

			std::set<unsigned int> usage_buffers;
		};

		std::map<std::string, shared_ptr<TypeDescriptor> >types;

		shared_ptr<TypeDescriptor> current_type;

		typedef std::map<std::string, shared_ptr<TypeDescriptor> >::iterator type_iterator;

		void _clearAllBuffers();
		void _updateMatrix(const unsigned int new_width, const unsigned int new_height);
		bool _resizeBuffers(shared_ptr<TypeDescriptor>& td, unsigned int new_num_of_char);
	public:
		TextManager();
		~TextManager();

		bool init(const shared_ptr<gs::Effect>& effect, const unsigned int width, const unsigned int height);

		bool registerNewType(const shared_ptr<Type>& new_type, const unsigned int char_in_buf = 128);

		void onResize(const unsigned int new_width, const unsigned int new_height);

		void setCurrentType(const std::string& type_name);

		void addText(const std::string& string, const unsigned int x_pos, const unsigned int y_pos, const float scale_factor = 1);

		void clear();
		void drawAll();
	};
};

#endif