00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00027
#include "GlTextureName.hpp"
00028
00029
namespace shgl {
00030
00031
using namespace SH;
00032
00033 GlTextureName::GlTextureName(GLenum target)
00034 : m_target(target),
00035 m_params(0, SH::ShTextureTraits::SH_FILTER_NONE,
00036 SH::ShTextureTraits::SH_WRAP_CLAMP, SH::ShTextureTraits::SH_CLAMPED),
00037 m_managed(true)
00038 {
00039 glGenTextures(1, &m_name);
00040 m_names.push_back(
this);
00041 }
00042
00043 GlTextureName::GlTextureName(GLenum target, GLuint name)
00044 : m_target(target),
00045 m_name(name),
00046 m_params(0, SH::ShTextureTraits::SH_FILTER_NONE,
00047 SH::ShTextureTraits::SH_WRAP_CLAMP, SH::ShTextureTraits::SH_CLAMPED),
00048 m_managed(false)
00049 {
00050 m_names.push_back(
this);
00051 }
00052
00053 GlTextureName::~GlTextureName()
00054 {
00055 m_names.erase(std::remove(m_names.begin(), m_names.end(),
this));
00056
if (m_managed) {
00057 glDeleteTextures(1, &m_name);
00058 }
00059 }
00060
00061
void GlTextureName::addStorage(
SH::ShStorage* storage)
00062 {
00063 m_storages.push_back(storage);
00064 }
00065
00066
void GlTextureName::removeStorage(
SH::ShStorage* storage)
00067 {
00068 m_storages.erase(std::remove(m_storages.begin(), m_storages.end(), storage));
00069 }
00070
00071
void GlTextureName::params(
const SH::ShTextureTraits& params)
00072 {
00073 Binding binding(
this);
00074
00075
if (params.
interpolation() == 0) {
00076 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
00077 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
00078 }
else if (params.
interpolation() == 1) {
00079 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
00080 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
00081 }
00082
if (params.
wrapping() == SH::ShTextureTraits::SH_WRAP_CLAMP) {
00083 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_S, GL_CLAMP));
00084 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_T, GL_CLAMP));
00085 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_R, GL_CLAMP));
00086 }
else if (params.
wrapping() == SH::ShTextureTraits::SH_WRAP_CLAMP_TO_EDGE) {
00087 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
00088 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
00089 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE));
00090 }
else if (params.
wrapping() == SH::ShTextureTraits::SH_WRAP_REPEAT) {
00091 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_S, GL_REPEAT));
00092 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_T, GL_REPEAT));
00093 SH_GL_CHECK_ERROR(glTexParameteri(m_target, GL_TEXTURE_WRAP_R, GL_REPEAT));
00094 }
00095
00096
00097 m_params = params;
00098 }
00099
00100 GlTextureName::NameList GlTextureName::m_names = GlTextureName::NameList();
00101
00102 GlTextureName::Binding::Binding(
const ShPointer<const GlTextureName>& name)
00103 {
00104 target = name->target();
00105
00106
switch(target) {
00107
case GL_TEXTURE_1D:
00108 SH_GL_CHECK_ERROR(glGetIntegerv(GL_TEXTURE_BINDING_1D, &last));
00109
break;
00110
case GL_TEXTURE_2D:
00111 SH_GL_CHECK_ERROR(glGetIntegerv(GL_TEXTURE_BINDING_2D, &last));
00112
break;
00113
case GL_TEXTURE_CUBE_MAP:
00114 SH_GL_CHECK_ERROR(glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &last));
00115
break;
00116
case GL_TEXTURE_RECTANGLE_NV:
00117 SH_GL_CHECK_ERROR(glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_NV, &last));
00118
break;
00119
case GL_TEXTURE_3D:
00120 SH_GL_CHECK_ERROR(glGetIntegerv(GL_TEXTURE_BINDING_3D, &last));
00121
break;
00122
default:
00123 SH_DEBUG_WARN(
"Texture target not handled by GL backend");
00124
break;
00125 }
00126
00127 SH_GL_CHECK_ERROR(glBindTexture(target, name->value()));
00128 }
00129
00130 GlTextureName::Binding::~Binding()
00131 {
00132 SH_GL_CHECK_ERROR(glBindTexture(target, last));
00133 }
00134
00135
00136 }