demotool/glm/test/external/gli/core/convert.inl

46 lines
1.6 KiB
Text
Raw Normal View History

2017-09-30 10:26:30 +02:00
#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