You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							595 lines
						
					
					
						
							24 KiB
						
					
					
				
			
		
		
	
	
							595 lines
						
					
					
						
							24 KiB
						
					
					
				/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
// Created : 2010-09-26 | 
						|
// Updated : 2010-09-27 | 
						|
// Licence : This source is under MIT License | 
						|
// File    : gli/gtx/loader_dds10.inl | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
 | 
						|
namespace gli{ | 
						|
namespace gtx{ | 
						|
namespace loader_dds10{ | 
						|
namespace detail | 
						|
{ | 
						|
	// DDS Documentation | 
						|
	/* | 
						|
		http://msdn.microsoft.com/en-us/library/bb943991(VS.85).aspx#File_Layout1 | 
						|
		http://msdn.microsoft.com/en-us/library/bb943992.aspx | 
						|
	*/ | 
						|
 | 
						|
	#define GLI_MAKEFOURCC(ch0, ch1, ch2, ch3) \ | 
						|
	  (glm::uint32)( \ | 
						|
		(((glm::uint32)(glm::uint8)(ch3) << 24) & 0xFF000000) | \ | 
						|
		(((glm::uint32)(glm::uint8)(ch2) << 16) & 0x00FF0000) | \ | 
						|
		(((glm::uint32)(glm::uint8)(ch1) <<  8) & 0x0000FF00) | \ | 
						|
		 ((glm::uint32)(glm::uint8)(ch0)        & 0x000000FF) ) | 
						|
 | 
						|
	enum DXGI_FORMAT  | 
						|
	{ | 
						|
		DXGI_FORMAT_UNKNOWN                      = 0, | 
						|
		DXGI_FORMAT_R32G32B32A32_TYPELESS        = 1, | 
						|
		DXGI_FORMAT_R32G32B32A32_FLOAT           = 2, | 
						|
		DXGI_FORMAT_R32G32B32A32_UINT            = 3, | 
						|
		DXGI_FORMAT_R32G32B32A32_SINT            = 4, | 
						|
		DXGI_FORMAT_R32G32B32_TYPELESS           = 5, | 
						|
		DXGI_FORMAT_R32G32B32_FLOAT              = 6, | 
						|
		DXGI_FORMAT_R32G32B32_UINT               = 7, | 
						|
		DXGI_FORMAT_R32G32B32_SINT               = 8, | 
						|
		DXGI_FORMAT_R16G16B16A16_TYPELESS        = 9, | 
						|
		DXGI_FORMAT_R16G16B16A16_FLOAT           = 10, | 
						|
		DXGI_FORMAT_R16G16B16A16_UNORM           = 11, | 
						|
		DXGI_FORMAT_R16G16B16A16_UINT            = 12, | 
						|
		DXGI_FORMAT_R16G16B16A16_SNORM           = 13, | 
						|
		DXGI_FORMAT_R16G16B16A16_SINT            = 14, | 
						|
		DXGI_FORMAT_R32G32_TYPELESS              = 15, | 
						|
		DXGI_FORMAT_R32G32_FLOAT                 = 16, | 
						|
		DXGI_FORMAT_R32G32_UINT                  = 17, | 
						|
		DXGI_FORMAT_R32G32_SINT                  = 18, | 
						|
		DXGI_FORMAT_R32G8X24_TYPELESS            = 19, | 
						|
		DXGI_FORMAT_D32_FLOAT_S8X24_UINT         = 20, | 
						|
		DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS     = 21, | 
						|
		DXGI_FORMAT_X32_TYPELESS_G8X24_UINT      = 22, | 
						|
		DXGI_FORMAT_R10G10B10A2_TYPELESS         = 23, | 
						|
		DXGI_FORMAT_R10G10B10A2_UNORM            = 24, | 
						|
		DXGI_FORMAT_R10G10B10A2_UINT             = 25, | 
						|
		DXGI_FORMAT_R11G11B10_FLOAT              = 26, | 
						|
		DXGI_FORMAT_R8G8B8A8_TYPELESS            = 27, | 
						|
		DXGI_FORMAT_R8G8B8A8_UNORM               = 28, | 
						|
		DXGI_FORMAT_R8G8B8A8_UNORM_SRGB          = 29, | 
						|
		DXGI_FORMAT_R8G8B8A8_UINT                = 30, | 
						|
		DXGI_FORMAT_R8G8B8A8_SNORM               = 31, | 
						|
		DXGI_FORMAT_R8G8B8A8_SINT                = 32, | 
						|
		DXGI_FORMAT_R16G16_TYPELESS              = 33, | 
						|
		DXGI_FORMAT_R16G16_FLOAT                 = 34, | 
						|
		DXGI_FORMAT_R16G16_UNORM                 = 35, | 
						|
		DXGI_FORMAT_R16G16_UINT                  = 36, | 
						|
		DXGI_FORMAT_R16G16_SNORM                 = 37, | 
						|
		DXGI_FORMAT_R16G16_SINT                  = 38, | 
						|
		DXGI_FORMAT_R32_TYPELESS                 = 39, | 
						|
		DXGI_FORMAT_D32_FLOAT                    = 40, | 
						|
		DXGI_FORMAT_R32_FLOAT                    = 41, | 
						|
		DXGI_FORMAT_R32_UINT                     = 42, | 
						|
		DXGI_FORMAT_R32_SINT                     = 43, | 
						|
		DXGI_FORMAT_R24G8_TYPELESS               = 44, | 
						|
		DXGI_FORMAT_D24_UNORM_S8_UINT            = 45, | 
						|
		DXGI_FORMAT_R24_UNORM_X8_TYPELESS        = 46, | 
						|
		DXGI_FORMAT_X24_TYPELESS_G8_UINT         = 47, | 
						|
		DXGI_FORMAT_R8G8_TYPELESS                = 48, | 
						|
		DXGI_FORMAT_R8G8_UNORM                   = 49, | 
						|
		DXGI_FORMAT_R8G8_UINT                    = 50, | 
						|
		DXGI_FORMAT_R8G8_SNORM                   = 51, | 
						|
		DXGI_FORMAT_R8G8_SINT                    = 52, | 
						|
		DXGI_FORMAT_R16_TYPELESS                 = 53, | 
						|
		DXGI_FORMAT_R16_FLOAT                    = 54, | 
						|
		DXGI_FORMAT_D16_UNORM                    = 55, | 
						|
		DXGI_FORMAT_R16_UNORM                    = 56, | 
						|
		DXGI_FORMAT_R16_UINT                     = 57, | 
						|
		DXGI_FORMAT_R16_SNORM                    = 58, | 
						|
		DXGI_FORMAT_R16_SINT                     = 59, | 
						|
		DXGI_FORMAT_R8_TYPELESS                  = 60, | 
						|
		DXGI_FORMAT_R8_UNORM                     = 61, | 
						|
		DXGI_FORMAT_R8_UINT                      = 62, | 
						|
		DXGI_FORMAT_R8_SNORM                     = 63, | 
						|
		DXGI_FORMAT_R8_SINT                      = 64, | 
						|
		DXGI_FORMAT_A8_UNORM                     = 65, | 
						|
		DXGI_FORMAT_R1_UNORM                     = 66, | 
						|
		DXGI_FORMAT_R9G9B9E5_SHAREDEXP           = 67, | 
						|
		DXGI_FORMAT_R8G8_B8G8_UNORM              = 68, | 
						|
		DXGI_FORMAT_G8R8_G8B8_UNORM              = 69, | 
						|
		DXGI_FORMAT_BC1_TYPELESS                 = 70, | 
						|
		DXGI_FORMAT_BC1_UNORM                    = 71, | 
						|
		DXGI_FORMAT_BC1_UNORM_SRGB               = 72, | 
						|
		DXGI_FORMAT_BC2_TYPELESS                 = 73, | 
						|
		DXGI_FORMAT_BC2_UNORM                    = 74, | 
						|
		DXGI_FORMAT_BC2_UNORM_SRGB               = 75, | 
						|
		DXGI_FORMAT_BC3_TYPELESS                 = 76, | 
						|
		DXGI_FORMAT_BC3_UNORM                    = 77, | 
						|
		DXGI_FORMAT_BC3_UNORM_SRGB               = 78, | 
						|
		DXGI_FORMAT_BC4_TYPELESS                 = 79, | 
						|
		DXGI_FORMAT_BC4_UNORM                    = 80, | 
						|
		DXGI_FORMAT_BC4_SNORM                    = 81, | 
						|
		DXGI_FORMAT_BC5_TYPELESS                 = 82, | 
						|
		DXGI_FORMAT_BC5_UNORM                    = 83, | 
						|
		DXGI_FORMAT_BC5_SNORM                    = 84, | 
						|
		DXGI_FORMAT_B5G6R5_UNORM                 = 85, | 
						|
		DXGI_FORMAT_B5G5R5A1_UNORM               = 86, | 
						|
		DXGI_FORMAT_B8G8R8A8_UNORM               = 87, | 
						|
		DXGI_FORMAT_B8G8R8X8_UNORM               = 88, | 
						|
		DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM   = 89, | 
						|
		DXGI_FORMAT_B8G8R8A8_TYPELESS            = 90, | 
						|
		DXGI_FORMAT_B8G8R8A8_UNORM_SRGB          = 91, | 
						|
		DXGI_FORMAT_B8G8R8X8_TYPELESS            = 92, | 
						|
		DXGI_FORMAT_B8G8R8X8_UNORM_SRGB          = 93, | 
						|
		DXGI_FORMAT_BC6H_TYPELESS                = 94, | 
						|
		DXGI_FORMAT_BC6H_UF16                    = 95, | 
						|
		DXGI_FORMAT_BC6H_SF16                    = 96, | 
						|
		DXGI_FORMAT_BC7_TYPELESS                 = 97, | 
						|
		DXGI_FORMAT_BC7_UNORM                    = 98, | 
						|
		DXGI_FORMAT_BC7_UNORM_SRGB               = 99, | 
						|
		DXGI_FORMAT_FORCE_UINT                   = 0xffffffffUL  | 
						|
	}; | 
						|
 | 
						|
	enum D3D10_RESOURCE_DIMENSION  | 
						|
	{ | 
						|
		D3D10_RESOURCE_DIMENSION_UNKNOWN     = 0, | 
						|
		D3D10_RESOURCE_DIMENSION_BUFFER      = 1, | 
						|
		D3D10_RESOURCE_DIMENSION_TEXTURE1D   = 2, | 
						|
		D3D10_RESOURCE_DIMENSION_TEXTURE2D   = 3, | 
						|
		D3D10_RESOURCE_DIMENSION_TEXTURE3D   = 4  | 
						|
	}; | 
						|
 | 
						|
	enum D3D10_RESOURCE_MISC_FLAG  | 
						|
	{ | 
						|
		D3D10_RESOURCE_MISC_GENERATE_MIPS       = 0x1L, | 
						|
		D3D10_RESOURCE_MISC_SHARED              = 0x2L, | 
						|
		D3D10_RESOURCE_MISC_TEXTURECUBE         = 0x4L, | 
						|
		D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX   = 0x10L, | 
						|
		D3D10_RESOURCE_MISC_GDI_COMPATIBLE      = 0x20L  | 
						|
	}; | 
						|
 | 
						|
	enum dds_format | 
						|
	{ | 
						|
		GLI_D3DFMT_R8G8B8               = 20, | 
						|
		GLI_D3DFMT_A8R8G8B8             = 21, | 
						|
		GLI_D3DFMT_X8R8G8B8             = 22, | 
						|
		GLI_D3DFMT_A8                   = 28, | 
						|
		GLI_D3DFMT_A2B10G10R10          = 31, | 
						|
		GLI_D3DFMT_A8B8G8R8             = 32, | 
						|
		GLI_D3DFMT_X8B8G8R8             = 33, | 
						|
		GLI_D3DFMT_G16R16               = 34, | 
						|
		GLI_D3DFMT_A2R10G10B10          = 35, | 
						|
		GLI_D3DFMT_A16B16G16R16         = 36, | 
						|
 | 
						|
		GLI_D3DFMT_L8                   = 50, | 
						|
		GLI_D3DFMT_A8L8                 = 51, | 
						|
 | 
						|
		GLI_D3DFMT_DXT1                 = GLI_MAKEFOURCC('D', 'X', 'T', '1'), | 
						|
		GLI_D3DFMT_DXT2                 = GLI_MAKEFOURCC('D', 'X', 'T', '2'), | 
						|
		GLI_D3DFMT_DXT3                 = GLI_MAKEFOURCC('D', 'X', 'T', '3'), | 
						|
		GLI_D3DFMT_DXT4                 = GLI_MAKEFOURCC('D', 'X', 'T', '4'), | 
						|
		GLI_D3DFMT_DXT5                 = GLI_MAKEFOURCC('D', 'X', 'T', '5'), | 
						|
		GLI_D3DFMT_DX10                 = GLI_MAKEFOURCC('D', 'X', '1', '0'), | 
						|
 | 
						|
		GLI_D3DFMT_D32                  = 71, | 
						|
		GLI_D3DFMT_D24S8                = 75, | 
						|
		GLI_D3DFMT_D24X8                = 77, | 
						|
		GLI_D3DFMT_D16                  = 80, | 
						|
		GLI_D3DFMT_L16                  = 81, | 
						|
		GLI_D3DFMT_D32F_LOCKABLE        = 82, | 
						|
		GLI_D3DFMT_D24FS8               = 83, | 
						|
 | 
						|
		GLI_D3DFMT_R16F                 = 111, | 
						|
		GLI_D3DFMT_G16R16F              = 112, | 
						|
		GLI_D3DFMT_A16B16G16R16F        = 113, | 
						|
 | 
						|
		GLI_D3DFMT_R32F                 = 114, | 
						|
		GLI_D3DFMT_G32R32F              = 115, | 
						|
		GLI_D3DFMT_A32B32G32R32F        = 116 | 
						|
	}; | 
						|
 | 
						|
	struct ddsHeader10 | 
						|
	{ | 
						|
		DXGI_FORMAT					dxgiFormat; | 
						|
		D3D10_RESOURCE_DIMENSION	resourceDimension; | 
						|
		glm::uint32					miscFlag; // D3D10_RESOURCE_MISC_GENERATE_MIPS | 
						|
		glm::uint32					arraySize; | 
						|
		glm::uint32					reserved; | 
						|
	}; | 
						|
 | 
						|
 | 
						|
	inline gli::format format_fourcc2gli_cast(glm::uint32 const & FourCC) | 
						|
	{ | 
						|
		switch(FourCC) | 
						|
		{ | 
						|
		case loader_dds9::detail::GLI_FOURCC_DXT1: | 
						|
			return DXT1; | 
						|
		case loader_dds9::detail::GLI_FOURCC_DXT2: | 
						|
		case loader_dds9::detail::GLI_FOURCC_DXT3: | 
						|
			return DXT3; | 
						|
		case loader_dds9::detail::GLI_FOURCC_DXT4: | 
						|
		case loader_dds9::detail::GLI_FOURCC_DXT5: | 
						|
			return DXT5; | 
						|
		case loader_dds9::detail::GLI_FOURCC_R16F: | 
						|
			return R16F; | 
						|
		case loader_dds9::detail::GLI_FOURCC_G16R16F: | 
						|
			return RG16F; | 
						|
		case loader_dds9::detail::GLI_FOURCC_A16B16G16R16F: | 
						|
			return RGBA16F; | 
						|
		case loader_dds9::detail::GLI_FOURCC_R32F: | 
						|
			return R32F; | 
						|
		case loader_dds9::detail::GLI_FOURCC_G32R32F: | 
						|
			return RG32F; | 
						|
		case loader_dds9::detail::GLI_FOURCC_A32B32G32R32F: | 
						|
			return RGBA32F; | 
						|
 | 
						|
		case loader_dds9::detail::GLI_D3DFMT_R8G8B8: | 
						|
			return RGB8U; | 
						|
		case loader_dds9::detail::GLI_D3DFMT_A8R8G8B8: | 
						|
		case loader_dds9::detail::GLI_D3DFMT_X8R8G8B8: | 
						|
		case loader_dds9::detail::GLI_D3DFMT_A8B8G8R8: | 
						|
		case loader_dds9::detail::GLI_D3DFMT_X8B8G8R8: | 
						|
			return RGBA8U; | 
						|
		case loader_dds9::detail::GLI_D3DFMT_R5G6B5: | 
						|
			return R5G6B5; | 
						|
		case loader_dds9::detail::GLI_D3DFMT_A4R4G4B4: | 
						|
		case loader_dds9::detail::GLI_D3DFMT_X4R4G4B4: | 
						|
			return RGBA4; | 
						|
		case loader_dds9::detail::GLI_D3DFMT_G16R16: | 
						|
			return RG16U; | 
						|
		case loader_dds9::detail::GLI_D3DFMT_A16B16G16R16: | 
						|
			return RGBA16U; | 
						|
		case loader_dds9::detail::GLI_D3DFMT_A2R10G10B10: | 
						|
		case loader_dds9::detail::GLI_D3DFMT_A2B10G10R10: | 
						|
			return RGB10A2; | 
						|
		default: | 
						|
			assert(0); | 
						|
			return FORMAT_NULL; | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	inline DXGI_FORMAT format_gli2dds_cast(gli::format const & Format) | 
						|
	{ | 
						|
		DXGI_FORMAT Cast[] =  | 
						|
		{ | 
						|
			DXGI_FORMAT_UNKNOWN,				//FORMAT_NULL, | 
						|
 | 
						|
			// Unsigned integer formats | 
						|
			DXGI_FORMAT_R8_UINT,				//R8U, | 
						|
			DXGI_FORMAT_R8G8_UINT,				//RG8U, | 
						|
			DXGI_FORMAT_UNKNOWN,				//RGB8U, | 
						|
			DXGI_FORMAT_R8G8B8A8_UINT,			//RGBA8U, | 
						|
 | 
						|
			DXGI_FORMAT_R16_UINT,				//R16U, | 
						|
			DXGI_FORMAT_R16G16_UINT,			//RG16U, | 
						|
			DXGI_FORMAT_UNKNOWN,				//RGB16U, | 
						|
			DXGI_FORMAT_R16G16B16A16_UINT,		//RGBA16U, | 
						|
 | 
						|
			DXGI_FORMAT_R32_UINT,				//R32U, | 
						|
			DXGI_FORMAT_R32G32_UINT,			//RG32U, | 
						|
			DXGI_FORMAT_R32G32B32_UINT,			//RGB32U, | 
						|
			DXGI_FORMAT_R32G32B32A32_UINT,		//RGBA32U, | 
						|
 | 
						|
			// Signed integer formats | 
						|
			DXGI_FORMAT_R8_SINT,				//R8I, | 
						|
			DXGI_FORMAT_R8G8_SINT,				//RG8I, | 
						|
			DXGI_FORMAT_UNKNOWN,				//RGB8I, | 
						|
			DXGI_FORMAT_R8G8B8A8_SINT,			//RGBA8I, | 
						|
 | 
						|
			DXGI_FORMAT_R16_SINT,				//R16I, | 
						|
			DXGI_FORMAT_R16G16_SINT,			//RG16I, | 
						|
			DXGI_FORMAT_UNKNOWN,				//RGB16I, | 
						|
			DXGI_FORMAT_R16G16B16A16_SINT,		//RGBA16I, | 
						|
 | 
						|
			DXGI_FORMAT_R32_SINT,				//R32I, | 
						|
			DXGI_FORMAT_R32G32_SINT,			//RG32I, | 
						|
			DXGI_FORMAT_R32G32B32_SINT,			//RGB32I, | 
						|
			DXGI_FORMAT_R32G32B32A32_SINT,		//RGBA32I, | 
						|
 | 
						|
			// Floating formats | 
						|
			DXGI_FORMAT_R16_FLOAT,				//R16F, | 
						|
			DXGI_FORMAT_R16G16_FLOAT,			//RG16F, | 
						|
			DXGI_FORMAT_UNKNOWN,				//RGB16F, | 
						|
			DXGI_FORMAT_R16G16B16A16_FLOAT,		//RGBA16F, | 
						|
 | 
						|
			DXGI_FORMAT_R32_FLOAT,				//R32F, | 
						|
			DXGI_FORMAT_R32G32_FLOAT,			//RG32F, | 
						|
			DXGI_FORMAT_R32G32B32_FLOAT,		//RGB32F, | 
						|
			DXGI_FORMAT_R32G32B32A32_FLOAT,		//RGBA32F, | 
						|
 | 
						|
			// Packed formats | 
						|
			DXGI_FORMAT_UNKNOWN,				//RGBE8, | 
						|
			DXGI_FORMAT_R9G9B9E5_SHAREDEXP,		//RGB9E5, | 
						|
			DXGI_FORMAT_R11G11B10_FLOAT, | 
						|
			DXGI_FORMAT_B5G6R5_UNORM,			//R5G6B5, | 
						|
			DXGI_FORMAT_UNKNOWN,				//RGBA4, | 
						|
			DXGI_FORMAT_R10G10B10A2_TYPELESS,	//RGB10A2, | 
						|
 | 
						|
			// Depth formats | 
						|
			DXGI_FORMAT_D16_UNORM,				//D16, | 
						|
			DXGI_FORMAT_D24_UNORM_S8_UINT,		//D24X8, | 
						|
			DXGI_FORMAT_D24_UNORM_S8_UINT,		//D24S8, | 
						|
			DXGI_FORMAT_D32_FLOAT,				//D32F, | 
						|
			DXGI_FORMAT_D32_FLOAT_S8X24_UINT,	//D32FS8X24, | 
						|
 | 
						|
			// Compressed formats | 
						|
			DXGI_FORMAT_BC1_UNORM,				//DXT1, | 
						|
			DXGI_FORMAT_BC2_UNORM,				//DXT3, | 
						|
			DXGI_FORMAT_BC3_UNORM,				//DXT5, | 
						|
			DXGI_FORMAT_BC4_UNORM,				//ATI1N_UNORM, | 
						|
			DXGI_FORMAT_BC4_SNORM,				//ATI1N_SNORM, | 
						|
			DXGI_FORMAT_BC5_UNORM,				//ATI2N_UNORM, | 
						|
			DXGI_FORMAT_BC5_SNORM,				//ATI2N_SNORM, | 
						|
			DXGI_FORMAT_BC6H_UF16,				//BP_FLOAT, | 
						|
			DXGI_FORMAT_BC6H_SF16,				//BP_FLOAT, | 
						|
			DXGI_FORMAT_BC7_UNORM				//BP, | 
						|
		}; | 
						|
 | 
						|
		return Cast[Format]; | 
						|
	} | 
						|
 | 
						|
	inline gli::format format_dds2gli_cast(DXGI_FORMAT const & Format) | 
						|
	{ | 
						|
		gli::format Cast[] =  | 
						|
		{ | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_UNKNOWN                      = 0, | 
						|
			gli::RGBA32U,		//DXGI_FORMAT_R32G32B32A32_TYPELESS        = 1, | 
						|
			gli::RGBA32F,		//DXGI_FORMAT_R32G32B32A32_FLOAT           = 2, | 
						|
			gli::RGBA32U,		//DXGI_FORMAT_R32G32B32A32_UINT            = 3, | 
						|
			gli::RGBA32I,		//DXGI_FORMAT_R32G32B32A32_SINT            = 4, | 
						|
			gli::RGB32U,			//DXGI_FORMAT_R32G32B32_TYPELESS           = 5, | 
						|
			gli::RGB32F,			//DXGI_FORMAT_R32G32B32_FLOAT              = 6, | 
						|
			gli::RGB32U,			//DXGI_FORMAT_R32G32B32_UINT               = 7, | 
						|
			gli::RGB32I,			//DXGI_FORMAT_R32G32B32_SINT               = 8, | 
						|
			gli::RGBA16U,		//DXGI_FORMAT_R16G16B16A16_TYPELESS        = 9, | 
						|
			gli::RGBA16F,		//DXGI_FORMAT_R16G16B16A16_FLOAT           = 10, | 
						|
			gli::RGBA16U,		//DXGI_FORMAT_R16G16B16A16_UNORM           = 11, | 
						|
			gli::RGBA16I,		//DXGI_FORMAT_R16G16B16A16_UINT            = 12, | 
						|
			gli::RGBA16I,		//DXGI_FORMAT_R16G16B16A16_SNORM           = 13, | 
						|
			gli::RGBA16I,		//DXGI_FORMAT_R16G16B16A16_SINT            = 14, | 
						|
			gli::RG32U,			//DXGI_FORMAT_R32G32_TYPELESS              = 15, | 
						|
			gli::RG32F,			//DXGI_FORMAT_R32G32_FLOAT                 = 16, | 
						|
			gli::RG32U,			//DXGI_FORMAT_R32G32_UINT                  = 17, | 
						|
			gli::RG32I,			//DXGI_FORMAT_R32G32_SINT                  = 18, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_R32G8X24_TYPELESS            = 19, | 
						|
			gli::D32FS8X24,		//DXGI_FORMAT_D32_FLOAT_S8X24_UINT         = 20, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS     = 21, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_X32_TYPELESS_G8X24_UINT      = 22, | 
						|
			gli::RGB10A2,		//DXGI_FORMAT_R10G10B10A2_TYPELESS         = 23, | 
						|
			gli::RGB10A2,		//DXGI_FORMAT_R10G10B10A2_UNORM            = 24, | 
						|
			gli::RGB10A2,		//DXGI_FORMAT_R10G10B10A2_UINT             = 25, | 
						|
			gli::RG11B10F,		//DXGI_FORMAT_R11G11B10_FLOAT              = 26, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_R8G8B8A8_TYPELESS            = 27, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_R8G8B8A8_UNORM               = 28, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_R8G8B8A8_UNORM_SRGB          = 29, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_R8G8B8A8_UINT                = 30, | 
						|
			gli::RGBA8I,			//DXGI_FORMAT_R8G8B8A8_SNORM               = 31, | 
						|
			gli::RGBA8I,			//DXGI_FORMAT_R8G8B8A8_SINT                = 32, | 
						|
			gli::RG16U,			//DXGI_FORMAT_R16G16_TYPELESS              = 33, | 
						|
			gli::RG16F,			//DXGI_FORMAT_R16G16_FLOAT                 = 34, | 
						|
			gli::RG16U,			//DXGI_FORMAT_R16G16_UNORM                 = 35, | 
						|
			gli::RG16U,			//DXGI_FORMAT_R16G16_UINT                  = 36, | 
						|
			gli::RG16I,			//DXGI_FORMAT_R16G16_SNORM                 = 37, | 
						|
			gli::RG16I,			//DXGI_FORMAT_R16G16_SINT                  = 38, | 
						|
			gli::R32F,			//DXGI_FORMAT_R32_TYPELESS                 = 39, | 
						|
			gli::D32F,			//DXGI_FORMAT_D32_FLOAT                    = 40, | 
						|
			gli::R32F,			//DXGI_FORMAT_R32_FLOAT                    = 41, | 
						|
			gli::R32U,			//DXGI_FORMAT_R32_UINT                     = 42, | 
						|
			gli::R32I,			//DXGI_FORMAT_R32_SINT                     = 43, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_R24G8_TYPELESS               = 44, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_D24_UNORM_S8_UINT            = 45, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_R24_UNORM_X8_TYPELESS        = 46, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_X24_TYPELESS_G8_UINT         = 47, | 
						|
			gli::RG8U,			//DXGI_FORMAT_R8G8_TYPELESS                = 48, | 
						|
			gli::RG8U,			//DXGI_FORMAT_R8G8_UNORM                   = 49, | 
						|
			gli::RG8U,			//DXGI_FORMAT_R8G8_UINT                    = 50, | 
						|
			gli::RG8I,			//DXGI_FORMAT_R8G8_SNORM                   = 51, | 
						|
			gli::RG8I,			//DXGI_FORMAT_R8G8_SINT                    = 52, | 
						|
			gli::R16U,			//DXGI_FORMAT_R16_TYPELESS                 = 53, | 
						|
			gli::R16F,			//DXGI_FORMAT_R16_FLOAT                    = 54, | 
						|
			gli::D16,			//DXGI_FORMAT_D16_UNORM                    = 55, | 
						|
			gli::R16U,			//DXGI_FORMAT_R16_UNORM                    = 56, | 
						|
			gli::R16U,			//DXGI_FORMAT_R16_UINT                     = 57, | 
						|
			gli::R16I,			//DXGI_FORMAT_R16_SNORM                    = 58, | 
						|
			gli::R16I,			//DXGI_FORMAT_R16_SINT                     = 59, | 
						|
			gli::R8U,			//DXGI_FORMAT_R8_TYPELESS                  = 60, | 
						|
			gli::R8U,			//DXGI_FORMAT_R8_UNORM                     = 61, | 
						|
			gli::R8U,			//DXGI_FORMAT_R8_UINT                      = 62, | 
						|
			gli::R8I,			//DXGI_FORMAT_R8_SNORM                     = 63, | 
						|
			gli::R8I,			//DXGI_FORMAT_R8_SINT                      = 64, | 
						|
			gli::R8U,			//DXGI_FORMAT_A8_UNORM                     = 65, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_R1_UNORM                     = 66, | 
						|
			gli::RGB9E5,			//DXGI_FORMAT_R9G9B9E5_SHAREDEXP           = 67, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_R8G8_B8G8_UNORM              = 68, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_G8R8_G8B8_UNORM              = 69, | 
						|
			gli::DXT1,			//DXGI_FORMAT_BC1_TYPELESS                 = 70, | 
						|
			gli::DXT1,			//DXGI_FORMAT_BC1_UNORM                    = 71, | 
						|
			gli::DXT1,			//DXGI_FORMAT_BC1_UNORM_SRGB               = 72, | 
						|
			gli::DXT3,			//DXGI_FORMAT_BC2_TYPELESS                 = 73, | 
						|
			gli::DXT3,			//DXGI_FORMAT_BC2_UNORM                    = 74, | 
						|
			gli::DXT3,			//DXGI_FORMAT_BC2_UNORM_SRGB               = 75, | 
						|
			gli::DXT5,			//DXGI_FORMAT_BC3_TYPELESS                 = 76, | 
						|
			gli::DXT5,			//DXGI_FORMAT_BC3_UNORM                    = 77, | 
						|
			gli::DXT5,			//DXGI_FORMAT_BC3_UNORM_SRGB               = 78, | 
						|
			gli::ATI1N_UNORM,	//DXGI_FORMAT_BC4_TYPELESS                 = 79, | 
						|
			gli::ATI1N_UNORM,	//DXGI_FORMAT_BC4_UNORM                    = 80, | 
						|
			gli::ATI1N_SNORM,	//DXGI_FORMAT_BC4_SNORM                    = 81, | 
						|
			gli::ATI2N_UNORM,	//DXGI_FORMAT_BC5_TYPELESS                 = 82, | 
						|
			gli::ATI2N_UNORM,	//DXGI_FORMAT_BC5_UNORM                    = 83, | 
						|
			gli::ATI2N_SNORM,	//DXGI_FORMAT_BC5_SNORM                    = 84, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_B5G6R5_UNORM                 = 85, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_B5G5R5A1_UNORM               = 86, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_B8G8R8A8_UNORM               = 87, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_B8G8R8X8_UNORM               = 88, | 
						|
			gli::FORMAT_NULL,	//DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM   = 89, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_B8G8R8A8_TYPELESS            = 90, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_B8G8R8A8_UNORM_SRGB          = 91, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_B8G8R8X8_TYPELESS            = 92, | 
						|
			gli::RGBA8U,			//DXGI_FORMAT_B8G8R8X8_UNORM_SRGB          = 93, | 
						|
			gli::BP_UF16,		//DXGI_FORMAT_BC6H_TYPELESS                = 94, | 
						|
			gli::BP_UF16,		//DXGI_FORMAT_BC6H_UF16                    = 95, | 
						|
			gli::BP_SF16,		//DXGI_FORMAT_BC6H_SF16                    = 96, | 
						|
			gli::BP,				//DXGI_FORMAT_BC7_TYPELESS                 = 97, | 
						|
			gli::BP,				//DXGI_FORMAT_BC7_UNORM                    = 98, | 
						|
			gli::BP,				//DXGI_FORMAT_BC7_UNORM_SRGB               = 99, | 
						|
			gli::R32U			//DXGI_FORMAT_FORCE_UINT                   = 0xffffffffUL  | 
						|
		}; | 
						|
 | 
						|
		return Cast[Format]; | 
						|
	} | 
						|
 | 
						|
}//namespace detail | 
						|
 | 
						|
	inline texture2D loadDDS10 | 
						|
	( | 
						|
		std::string const & Filename | 
						|
	) | 
						|
	{ | 
						|
		std::ifstream FileIn(Filename.c_str(), std::ios::in | std::ios::binary); | 
						|
		if(FileIn.fail()) | 
						|
			return texture2D(); | 
						|
 | 
						|
		loader_dds9::detail::ddsHeader HeaderDesc; | 
						|
		detail::ddsHeader10 HeaderDesc10; | 
						|
		char Magic[4];  | 
						|
 | 
						|
		//* Read magic number and check if valid .dds file  | 
						|
		FileIn.read((char*)&Magic, sizeof(Magic)); | 
						|
 | 
						|
		assert(strncmp(Magic, "DDS ", 4) == 0); | 
						|
 | 
						|
		// Get the surface descriptor  | 
						|
		FileIn.read((char*)&HeaderDesc, sizeof(HeaderDesc)); | 
						|
		if(HeaderDesc.format.flags & loader_dds9::detail::GLI_DDPF_FOURCC && HeaderDesc.format.fourCC == loader_dds9::detail::GLI_FOURCC_DX10) | 
						|
			FileIn.read((char*)&HeaderDesc10, sizeof(HeaderDesc10)); | 
						|
 | 
						|
		loader_dds9::detail::DDLoader Loader; | 
						|
		if(HeaderDesc.format.fourCC == loader_dds9::detail::GLI_FOURCC_DX10) | 
						|
			Loader.Format = detail::format_dds2gli_cast(HeaderDesc10.dxgiFormat); | 
						|
		else if(HeaderDesc.format.flags & loader_dds9::detail::GLI_DDPF_FOURCC) | 
						|
			Loader.Format = detail::format_fourcc2gli_cast(HeaderDesc.format.fourCC); | 
						|
		else | 
						|
		{ | 
						|
			switch(HeaderDesc.format.bpp) | 
						|
			{ | 
						|
			case 8: | 
						|
				Loader.Format = R8U; | 
						|
				break; | 
						|
			case 16: | 
						|
				Loader.Format = RG8U; | 
						|
				break; | 
						|
			case 24: | 
						|
				Loader.Format = RGB8U; | 
						|
				break; | 
						|
			case 32: | 
						|
				Loader.Format = RGBA8U; | 
						|
				break; | 
						|
			} | 
						|
		} | 
						|
		Loader.BlockSize = size(image2D(texture2D::dimensions_type(0), Loader.Format), BLOCK_SIZE); | 
						|
		Loader.BPP = size(image2D(image2D::dimensions_type(0), Loader.Format), BIT_PER_PIXEL); | 
						|
 | 
						|
		std::size_t Width = HeaderDesc.width; | 
						|
		std::size_t Height = HeaderDesc.height; | 
						|
 | 
						|
		gli::format Format = Loader.Format; | 
						|
 | 
						|
		std::streamoff Curr = FileIn.tellg(); | 
						|
		FileIn.seekg(0, std::ios_base::end); | 
						|
		std::streamoff End = FileIn.tellg(); | 
						|
		FileIn.seekg(Curr, std::ios_base::beg); | 
						|
 | 
						|
		std::vector<glm::byte> Data(std::size_t(End - Curr), 0); | 
						|
		std::size_t Offset = 0; | 
						|
 | 
						|
		FileIn.read((char*)&Data[0], std::streamsize(Data.size())); | 
						|
 | 
						|
		//texture2D Image(glm::min(MipMapCount, Levels));//SurfaceDesc.mipMapLevels); | 
						|
		std::size_t MipMapCount = (HeaderDesc.flags & loader_dds9::detail::GLI_DDSD_MIPMAPCOUNT) ? HeaderDesc.mipMapLevels : 1; | 
						|
		//if(Loader.Format == DXT1 || Loader.Format == DXT3 || Loader.Format == DXT5)  | 
						|
		//	MipMapCount -= 2; | 
						|
		texture2D Image(MipMapCount); | 
						|
		for(std::size_t Level = 0; Level < Image.levels() && (Width || Height); ++Level) | 
						|
		{ | 
						|
			Width = glm::max(std::size_t(Width), std::size_t(1)); | 
						|
			Height = glm::max(std::size_t(Height), std::size_t(1)); | 
						|
 | 
						|
			std::size_t MipmapSize = 0; | 
						|
			if((Loader.BlockSize << 3) > Loader.BPP) | 
						|
				MipmapSize = ((Width + 3) >> 2) * ((Height + 3) >> 2) * Loader.BlockSize; | 
						|
			else | 
						|
				MipmapSize = Width * Height * Loader.BlockSize; | 
						|
			std::vector<glm::byte> MipmapData(MipmapSize, 0); | 
						|
 | 
						|
			memcpy(&MipmapData[0], &Data[0] + Offset, MipmapSize); | 
						|
 | 
						|
			image2D::dimensions_type Dimensions(Width, Height); | 
						|
			Image[Level] = image2D(Dimensions, Format, MipmapData); | 
						|
 | 
						|
			Offset += MipmapSize; | 
						|
			Width >>= 1; | 
						|
			Height >>= 1; | 
						|
		} | 
						|
 | 
						|
		return Image; | 
						|
	} | 
						|
 | 
						|
	inline void saveDDS10 | 
						|
	( | 
						|
		gli::texture2D const & Image,  | 
						|
		std::string const & Filename | 
						|
	) | 
						|
	{ | 
						|
		std::ofstream FileOut(Filename.c_str(), std::ios::out | std::ios::binary); | 
						|
		if (!FileOut) | 
						|
			return; | 
						|
 | 
						|
		char const * Magic = "DDS "; | 
						|
		FileOut.write((char*)Magic, sizeof(char) * 4); | 
						|
 | 
						|
		glm::uint32 Caps = loader_dds9::detail::GLI_DDSD_CAPS | loader_dds9::detail::GLI_DDSD_HEIGHT | loader_dds9::detail::GLI_DDSD_WIDTH | loader_dds9::detail::GLI_DDSD_PIXELFORMAT; | 
						|
 | 
						|
		loader_dds9::detail::ddsHeader HeaderDesc; | 
						|
		HeaderDesc.size = sizeof(loader_dds9::detail::ddsHeader); | 
						|
		HeaderDesc.flags = Caps | (loader_dds9::detail::isCompressed(Image) ? loader_dds9::detail::GLI_DDSD_LINEARSIZE : loader_dds9::detail::GLI_DDSD_PITCH) | (Image.levels() > 1 ? loader_dds9::detail::GLI_DDSD_MIPMAPCOUNT : 0); //659463; | 
						|
		HeaderDesc.width = Image[0].dimensions().x; | 
						|
		HeaderDesc.height = Image[0].dimensions().y; | 
						|
		HeaderDesc.pitch = loader_dds9::detail::isCompressed(Image) ? size(Image, LINEAR_SIZE) : 32; | 
						|
		HeaderDesc.depth = 0; | 
						|
		HeaderDesc.mipMapLevels = glm::uint32(Image.levels()); | 
						|
		HeaderDesc.format.size = sizeof(loader_dds9::detail::ddsPixelFormat); | 
						|
		HeaderDesc.format.flags = loader_dds9::detail::GLI_DDPF_FOURCC; | 
						|
		HeaderDesc.format.fourCC = loader_dds9::detail::GLI_FOURCC_DX10; | 
						|
		HeaderDesc.format.bpp = size(Image, BIT_PER_PIXEL); | 
						|
		HeaderDesc.format.redMask = 0; | 
						|
		HeaderDesc.format.greenMask = 0; | 
						|
		HeaderDesc.format.blueMask = 0; | 
						|
		HeaderDesc.format.alphaMask = 0; | 
						|
		HeaderDesc.surfaceFlags = loader_dds9::detail::GLI_DDSCAPS_TEXTURE | (Image.levels() > 1 ? loader_dds9::detail::GLI_DDSCAPS_MIPMAP : 0); | 
						|
		HeaderDesc.cubemapFlags = 0; | 
						|
		FileOut.write((char*)&HeaderDesc, sizeof(HeaderDesc)); | 
						|
 | 
						|
		detail::ddsHeader10 HeaderDesc10; | 
						|
		HeaderDesc10.arraySize = 1; | 
						|
		HeaderDesc10.resourceDimension = detail::D3D10_RESOURCE_DIMENSION_TEXTURE2D; | 
						|
		HeaderDesc10.miscFlag = 0;//Image.levels() > 0 ? detail::D3D10_RESOURCE_MISC_GENERATE_MIPS : 0; | 
						|
		HeaderDesc10.dxgiFormat = detail::format_gli2dds_cast(Image.format()); | 
						|
		HeaderDesc10.reserved = 0; | 
						|
 | 
						|
		FileOut.write((char*)&HeaderDesc10, sizeof(HeaderDesc10)); | 
						|
 | 
						|
		for(gli::texture2D::level_type Level = 0; Level < Image.levels(); ++Level) | 
						|
		{ | 
						|
			gli::texture2D::size_type ImageSize = size(Image[Level], gli::LINEAR_SIZE); | 
						|
			FileOut.write((char*)(Image[Level].data()), ImageSize); | 
						|
		} | 
						|
 | 
						|
		if(FileOut.fail() || FileOut.bad()) | 
						|
			return; | 
						|
 | 
						|
		FileOut.close (); | 
						|
	} | 
						|
 | 
						|
}//namespace loader_dds10 | 
						|
}//namespace gtx | 
						|
}//namespace gli
 | 
						|
 |