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

#ifdef GD_D3D10

#ifndef DSE_RS_TEXTURES_LOADABLETEXTURE_D3D10_HPP
#define DSE_RS_TEXTURES_LOADABLETEXTURE_D3D10_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Resource System/Textures/baseTexture.hpp>
#include <Darkstar/Graphic System/Direct3D/direct3d_include.hpp>
#include <Darkstar/Kernel/Misc/misc_func.hpp>
#include <Darkstar/Kernel/FileSystem/dfile.hpp>
#include <Darkstar/Resource System/Textures/loadableTexture_common.hpp>

namespace rs_private
{
	class LoadableTexture : public rs::BaseTexture
	{
	private:
		ID3D10Resource* texture;

		_TextureType type;
		_Masks masks;
		unsigned int start_mip;
		unsigned int mip_count;

		bool _makeProxyTexture(const std::string& filename);
		unsigned int _getNextMipLevelSize(const unsigned int width, const unsigned int height,
			const unsigned int depth, const unsigned int bpp, const rs::DSEFORMAT& format) const;
		
		rs::DSEFORMAT _tryToSetPixelFormat(const bool is_signed, const unsigned int bpp);
		rs::DSEFORMAT _tryToSetPixelFormat(const unsigned int fourcc);
		
		unsigned int _getRowPitch(const rs::DSEFORMAT& pixel_format, const unsigned int width, const unsigned int bpp);

		template <typename T, typename S>
		void _fillD3DStructures(T& tex, S& srv);
		bool _createTexture2D(const shared_array<D3D10_SUBRESOURCE_DATA>& sub_data);
		bool _createTextureVolume(const shared_array<D3D10_SUBRESOURCE_DATA>& sub_data);
		bool _createTextureCube(const shared_array<D3D10_SUBRESOURCE_DATA>& sub_data);

		template <typename T>
		bool _loadTextureData(ker::DFile& file, const unsigned int bpp, const unsigned char cube_faces);
		
		template <typename T>
		bool _convertData(const unsigned int bpp, const shared_array<T>& data, shared_array<DWORD>& converted_data);
	public:
		LoadableTexture();
		~LoadableTexture();

		bool load(const std::string& filename, const unsigned int quality);
	};
};

#include <Darkstar/Resource System/Textures/loadableTexture_common.inl>

#endif

#endif