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

#ifndef DSE_NATURE_STAR_DATABASE_HPP
#define DSE_NATURE_STAR_DATABASE_HPP

#include <Darkstar/common.hpp>

#include <Darkstar/Resource System/Model/static_model.hpp>
#include <Darkstar/math.hpp>
#include <Darkstar/Graphic System/Render State/blend_render_state.hpp>

namespace nature
{
	class StarDatabase
	{
	private:
		struct Star
		{
			float declination;
			float right_ascension;
			float visual_magnitude;
		};

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

		// Bright Star Catalog
		std::vector<Star> bright_stars_database;
		shared_ptr<rs::StaticModel> visible_stars_buffer;
		shared_ptr<rs::BaseTexture> star_texture;
		shared_ptr<gs::Effect> star_effect;
		shared_ptr<gs::BlendRenderState> star_blend_render_state;
		shared_ptr<rs::InputLayout> star_input_layout;
		shared_ptr<rs::Material> star_material;

		float site_latitude;

		bool is_database_correct;

		bool _initStarsDatabase(const std::string& base_name);
		Vect3 _getStarPositionOnGeosphere(const Star& star);
		bool _updateVisibleStarsBuffer();
	public:
		StarDatabase(const std::string& database_name, const std::string& star_texture_name, const std::string& star_effect_name, const float site_latitude = 0);
		~StarDatabase();

		void setStarTexture(const std::string& new_star_texture_name);
		void setStarEffect(const std::string& new_star_effect_name);

		void setSiteLatitude(const float site_latitude);

		const shared_ptr<rs::StaticModel>& getVisibleStarsBuffer() const;
		bool getIsDatabaseCorrect() const;
	};
};

#endif