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.
		
		
		
		
		
			
		
			
				
					
					
						
							304 lines
						
					
					
						
							8.0 KiB
						
					
					
				
			
		
		
	
	
							304 lines
						
					
					
						
							8.0 KiB
						
					
					
				/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
// Created : 2010-09-27 | 
						|
// Updated : 2010-09-27 | 
						|
// Licence : This source is under MIT License | 
						|
// File    : gli/core/texture2D.inl | 
						|
/////////////////////////////////////////////////////////////////////////////////////////////////// | 
						|
 | 
						|
namespace gli | 
						|
{ | 
						|
	namespace detail | 
						|
	{ | 
						|
		inline texture2D::size_type sizeLinear | 
						|
		( | 
						|
			texture2D const & Texture | 
						|
		) | 
						|
		{ | 
						|
			texture2D::size_type Result = 0; | 
						|
			for(texture2D::level_type Level = 0; Level < Texture.levels(); ++Level) | 
						|
				Result += sizeLinear(Texture[Level]); | 
						|
			return Result; | 
						|
		} | 
						|
	}//namespace detail | 
						|
 | 
						|
	inline texture2D::texture2D() | 
						|
	{} | 
						|
 | 
						|
	inline texture2D::texture2D | 
						|
	( | 
						|
		level_type const & Levels | 
						|
	) | 
						|
	{ | 
						|
		this->Images.resize(Levels); | 
						|
	} | 
						|
 | 
						|
	//inline texture2D::texture2D | 
						|
	//( | 
						|
	//	image const & Mipmap,  | 
						|
	//	bool GenerateMipmaps // ToDo | 
						|
	//) | 
						|
	//{ | 
						|
	//	//std::size_t Levels = !GenerateMipmaps ? 1 : std::size_t(glm::log2(float(glm::max(Mipmap.width(), Mipmap.height())))); | 
						|
	//	texture2D::level_type Levels = !GenerateMipmaps ? 1 : std::size_t(glm::log2(float(glm::compMax(Mipmap.dimensions())))); | 
						|
	//	this->Mipmaps.resize(Levels); | 
						|
	//	this->Mipmaps[0] = Mipmap; | 
						|
 | 
						|
	//	if(GenerateMipmaps) | 
						|
	//		this->generateMipmaps(0); | 
						|
	//} | 
						|
 | 
						|
	inline texture2D::~texture2D() | 
						|
	{} | 
						|
 | 
						|
	inline image2D & texture2D::operator[] (level_type const & Level) | 
						|
	{ | 
						|
		return this->Images[Level]; | 
						|
	} | 
						|
 | 
						|
	inline image2D const & texture2D::operator[] (level_type const & Level) const | 
						|
	{ | 
						|
		return this->Images[Level]; | 
						|
	} | 
						|
 | 
						|
	inline bool texture2D::empty() const | 
						|
	{ | 
						|
		return this->Images.size() == 0; | 
						|
	} | 
						|
 | 
						|
	inline texture2D::format_type texture2D::format() const | 
						|
	{ | 
						|
		return this->Images.empty() ? FORMAT_NULL : this->Images[0].format(); | 
						|
	} | 
						|
 | 
						|
	inline texture2D::level_type texture2D::levels() const | 
						|
	{ | 
						|
		return this->Images.size(); | 
						|
	} | 
						|
 | 
						|
	inline void texture2D::resize | 
						|
	( | 
						|
		texture2D::level_type const & Levels | 
						|
	) | 
						|
	{ | 
						|
		this->Images.resize(Levels); | 
						|
	} | 
						|
 | 
						|
	template <typename genType> | 
						|
	inline void texture2D::swizzle(glm::comp X, glm::comp Y, glm::comp Z, glm::comp W) | 
						|
	{ | 
						|
		for(texture2D::level_type Level = 0; Level < this->levels(); ++Level) | 
						|
		{ | 
						|
			genType * Data = reinterpret_cast<genType*>(this->Images[Level].data()); | 
						|
			texture2D::size_type Components = this->Images[Level].components(); | 
						|
			//gli::detail::getComponents(this->Images[Level].format()); | 
						|
			texture2D::size_type Size = (glm::compMul(this->Images[Level].dimensions()) * Components) / sizeof(genType); | 
						|
 | 
						|
			for(texture2D::size_type i = 0; i < Size; ++i) | 
						|
			{ | 
						|
				genType Copy = Data[i]; | 
						|
				if(Components > 0) | 
						|
					Data[i][0] = Copy[X]; | 
						|
				if(Components > 1) | 
						|
					Data[i][1] = Copy[Y]; | 
						|
				if(Components > 2) | 
						|
					Data[i][2] = Copy[Z]; | 
						|
				if(Components > 3) | 
						|
					Data[i][3] = Copy[W]; | 
						|
			} | 
						|
		} | 
						|
	} | 
						|
 | 
						|
/* | 
						|
	template <typename T> | 
						|
	inline T texture<T>::texture(float x, float y) const | 
						|
	{ | 
						|
        size_type x_below = size_type(std::floor(x * (_width - 1))); | 
						|
		size_type x_above = size_type(std::ceil(x * (_width - 1))); | 
						|
        size_type y_below = size_type(std::floor(y * (_height - 1))); | 
						|
        size_type y_above = size_type(std::ceil(y * (_height - 1))); | 
						|
 | 
						|
        float x_step = 1.0f / float(_width); | 
						|
        float y_step = 1.0f / float(_height); | 
						|
 | 
						|
        float x_below_normalized = float(x_below) / float(_width - 1); | 
						|
        float x_above_normalized = float(x_above) / float(_width - 1); | 
						|
        float y_below_normalized = float(y_below) / float(_height - 1); | 
						|
        float y_above_normalized = float(y_above) / float(_height - 1); | 
						|
		 | 
						|
		T value1 = _data[x_below + y_below * _width]; | 
						|
		T value2 = _data[x_above + y_below * _width]; | 
						|
		T value3 = _data[x_above + y_above * _width]; | 
						|
		T value4 = _data[x_below + y_above * _width]; | 
						|
 | 
						|
		T valueA = glm::mix(value1, value2, x - x_below_normalized); | 
						|
		T valueB = glm::mix(value4, value3, x - x_below_normalized); | 
						|
		T valueC = glm::mix(valueA, valueB, y - y_below_normalized); | 
						|
		return valueC; | 
						|
	} | 
						|
*/ | 
						|
/* | 
						|
	template <typename T> | 
						|
	inline T texture(const texture2D<T>& Image2D, const glm::vec2& TexCoord) | 
						|
	{ | 
						|
		texture2D<T>::size_type s_below = texture2D<T>::size_type(std::floor(TexCoord.s * (Image2D.width() - 1))); | 
						|
		texture2D<T>::size_type s_above = texture2D<T>::size_type(std::ceil(TexCoord.s * (Image2D.width() - 1))); | 
						|
        texture2D<T>::size_type t_below = texture2D<T>::size_type(std::floor(TexCoord.t * (Image2D.height() - 1))); | 
						|
        texture2D<T>::size_type t_above = texture2D<T>::size_type(std::ceil(TexCoord.t * (Image2D.height() - 1))); | 
						|
 | 
						|
		glm::vec2::value_type s_step = 1.0f / glm::vec2::value_type(Image2D.width()); | 
						|
        glm::vec2::value_type t_step = 1.0f / glm::vec2::value_type(Image2D.height()); | 
						|
 | 
						|
        glm::vec2::value_type s_below_normalized = glm::vec2::value_type(s_below) / glm::vec2::value_type(Image2D.width() - 1); | 
						|
        glm::vec2::value_type s_above_normalized = glm::vec2::value_type(s_above) / glm::vec2::value_type(Image2D.width() - 1); | 
						|
        glm::vec2::value_type t_below_normalized = glm::vec2::value_type(t_below) / glm::vec2::value_type(Image2D.height() - 1); | 
						|
        glm::vec2::value_type t_above_normalized = glm::vec2::value_type(t_above) / glm::vec2::value_type(Image2D.height() - 1); | 
						|
		 | 
						|
		T value1 = Image2D[s_below + t_below * Image2D.width()]; | 
						|
		T value2 = Image2D[s_above + t_below * Image2D.width()]; | 
						|
		T value3 = Image2D[s_above + t_above * Image2D.width()]; | 
						|
		T value4 = Image2D[s_below + t_above * Image2D.width()]; | 
						|
 | 
						|
		T valueA = glm::mix(value1, value2, TexCoord.s - s_below_normalized); | 
						|
		T valueB = glm::mix(value4, value3, TexCoord.s - s_below_normalized); | 
						|
		T valueC = glm::mix(valueA, valueB, TexCoord.t - t_below_normalized); | 
						|
		return valueC; | 
						|
	} | 
						|
 | 
						|
	template <typename T> | 
						|
	inline T textureNearest(const texture2D<T>& Image2D, const glm::vec2& TexCoord) | 
						|
	{ | 
						|
		texture2D<T>::size_type s = texture2D<T>::size_type(glm::roundGTX(TexCoord.s * (Image2D.width() - 1))); | 
						|
        texture2D<T>::size_type t = texture2D<T>::size_type(std::roundGTX(TexCoord.t * (Image2D.height() - 1))); | 
						|
 | 
						|
		return Image2D[s + t * Image2D.width()]; | 
						|
	} | 
						|
*/ | 
						|
 | 
						|
namespace wip | 
						|
{ | 
						|
	//////////////// | 
						|
	// image | 
						|
/* | 
						|
	//  | 
						|
	template | 
						|
	< | 
						|
		typename coordType | 
						|
	> | 
						|
	template | 
						|
	< | 
						|
		typename genType,  | 
						|
		template <typename> class surface | 
						|
	> | 
						|
	typename texture2D<genType, surface>::value_type &  | 
						|
	texture2D<genType, surface>::image_impl<coordType>::operator()  | 
						|
	( | 
						|
		coordType const & Coord | 
						|
	) | 
						|
	{ | 
						|
		 | 
						|
	} | 
						|
*/ | 
						|
/* | 
						|
	//  | 
						|
	template | 
						|
	< | 
						|
		typename coordType | 
						|
	> | 
						|
	template | 
						|
	< | 
						|
		typename genType,  | 
						|
		template <typename> class surface | 
						|
	> | 
						|
	typename texture2D<genType, surface>::value_type const &  | 
						|
	texture2D<genType, surface>::image_impl::operator() | 
						|
	( | 
						|
		coordType const & Coord | 
						|
	) const | 
						|
	{ | 
						|
		return value_type(0); | 
						|
	} | 
						|
*/ | 
						|
/* | 
						|
	// | 
						|
	template | 
						|
	< | 
						|
		typename coordType | 
						|
	> | 
						|
	template | 
						|
	< | 
						|
		typename genType,  | 
						|
		template <typename> class surface | 
						|
	> | 
						|
	void texture2D<genType, surface>::image_impl::operator() | 
						|
	( | 
						|
		coordType const & Coord | 
						|
	) const | 
						|
	{ | 
						|
		 | 
						|
	} | 
						|
*/ | 
						|
	//// | 
						|
	//template | 
						|
	//< | 
						|
	//	typename genType,  | 
						|
	//	template <typename> class surface | 
						|
	//> | 
						|
	//template | 
						|
	//< | 
						|
	//	typename coordType | 
						|
	//> | 
						|
	//typename texture2D<genType, surface>::value_type const &  | 
						|
	//texture2D<genType, surface>::image_impl::operator() | 
						|
	//( | 
						|
	//	coordType const & Coord | 
						|
	//) const | 
						|
	//{ | 
						|
	//	return value_type(0); | 
						|
	//} | 
						|
 | 
						|
	////////////////// | 
						|
	//// texture2D | 
						|
 | 
						|
	////  | 
						|
	//template | 
						|
	//< | 
						|
	//	typename genType,  | 
						|
	//	template <typename> class surface | 
						|
	//> | 
						|
	//typename texture2D<genType, surface>::level_type texture2D<genType, surface>::levels() const | 
						|
	//{ | 
						|
	//	return this->Mipmaps.size(); | 
						|
	//} | 
						|
 | 
						|
	////  | 
						|
	//template | 
						|
	//< | 
						|
	//	typename genType,  | 
						|
	//	template <typename> class surface | 
						|
	//> | 
						|
	//typename texture2D<genType, surface>::image & texture2D<genType, surface>::operator[]  | 
						|
	//( | 
						|
	//	typename texture2D<genType, surface>::level_type Level | 
						|
	//) | 
						|
	//{ | 
						|
	//	return this->Mipmaps[Level]; | 
						|
	//} | 
						|
 | 
						|
	////  | 
						|
	//template | 
						|
	//< | 
						|
	//	typename genType,  | 
						|
	//	template <typename> class surface | 
						|
	//> | 
						|
	//typename texture2D<genType, surface>::image const & texture2D<genType, surface>::operator[]  | 
						|
	//( | 
						|
	//	typename texture2D<genType, surface>::level_type Level | 
						|
	//) const | 
						|
	//{ | 
						|
	//	return this->Mipmaps[Level]; | 
						|
	//} | 
						|
 | 
						|
}//namespace wip | 
						|
}//namespace gli
 | 
						|
 |