+Texture::Texture(GLenum t):
+ target(t),
+ min_filter(NEAREST_MIPMAP_LINEAR),
+ mag_filter(LINEAR),
+ wrap_s(REPEAT),
+ wrap_t(REPEAT),
+ wrap_r(REPEAT),
+ gen_mipmap(false),
+ compare(false),
+ cmp_func(LEQUAL),
+ dirty_params(0)
+{
+ glGenTextures(1, &id);
+}
+
+Texture::~Texture()
+{
+ glDeleteTextures(1, &id);
+}
+
+void Texture::update_parameter(int mask) const
+{
+ if(current()==this)
+ {
+ if(mask&MIN_FILTER)
+ glTexParameteri(target, GL_TEXTURE_MIN_FILTER, min_filter);
+ if(mask&MAG_FILTER)
+ glTexParameteri(target, GL_TEXTURE_MAG_FILTER, mag_filter);
+ if(mask&MAX_ANISOTROPY)
+ glTexParameteri(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy);
+ if(mask&WRAP_S)
+ glTexParameteri(target, GL_TEXTURE_WRAP_S, wrap_s);
+ if(mask&WRAP_T)
+ glTexParameteri(target, GL_TEXTURE_WRAP_T, wrap_t);
+ if(mask&WRAP_R)
+ glTexParameteri(target, GL_TEXTURE_WRAP_R, wrap_r);
+ if(mask&GENERATE_MIPMAP)
+ glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, gen_mipmap);
+ if(mask&COMPARE)
+ glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, (compare ? GL_COMPARE_R_TO_TEXTURE : GL_NONE));
+ if(mask&COMPARE_FUNC)
+ glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, cmp_func);
+ }
+ else
+ dirty_params |= mask;
+}
+
+void Texture::set_min_filter(TextureFilter f)