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.
45 lines
1.6 KiB
45 lines
1.6 KiB
#include "../core/convert_func.hpp" |
|
|
|
namespace gli |
|
{ |
|
template <typename texture_type> |
|
inline texture_type convert(texture_type const& Texture, format Format) |
|
{ |
|
typedef float T; |
|
typedef typename texture::extent_type extent_type; |
|
typedef typename texture_type::size_type size_type; |
|
typedef typename extent_type::value_type component_type; |
|
typedef typename detail::convert<texture_type, T, defaultp>::fetchFunc fetch_type; |
|
typedef typename detail::convert<texture_type, T, defaultp>::writeFunc write_type; |
|
|
|
GLI_ASSERT(!Texture.empty()); |
|
GLI_ASSERT(!is_compressed(Texture.format()) && !is_compressed(Format)); |
|
|
|
fetch_type Fetch = detail::convert<texture_type, T, defaultp>::call(Texture.format()).Fetch; |
|
write_type Write = detail::convert<texture_type, T, defaultp>::call(Format).Write; |
|
|
|
texture Storage(Texture.target(), Format, Texture.texture::extent(), Texture.layers(), Texture.faces(), Texture.levels(), Texture.swizzles()); |
|
texture_type Copy(Storage); |
|
|
|
for(size_type Layer = 0; Layer < Texture.layers(); ++Layer) |
|
for(size_type Face = 0; Face < Texture.faces(); ++Face) |
|
for(size_type Level = 0; Level < Texture.levels(); ++Level) |
|
{ |
|
extent_type const& Dimensions = Texture.texture::extent(Level); |
|
|
|
for(component_type k = 0; k < Dimensions.z; ++k) |
|
for(component_type j = 0; j < Dimensions.y; ++j) |
|
for(component_type i = 0; i < Dimensions.x; ++i) |
|
{ |
|
typename texture_type::extent_type const Texelcoord(extent_type(i, j, k)); |
|
Write( |
|
Copy, Texelcoord, Layer, Face, Level, |
|
Fetch(Texture, Texelcoord, Layer, Face, Level)); |
|
} |
|
} |
|
|
|
return texture_type(Copy); |
|
} |
|
|
|
}//namespace gli |
|
|
|
|