X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexture.cpp;h=0fa65eadaed0f7b31508c6e9e4fa55a2d6ba4cfe;hb=00d3ccedefb1a5efb3d2d4625a2b68446703fbab;hp=fe8b7be9a3e4fbb56dda02464bfb0541d8e131ce;hpb=126161d1d44ab9503bc747d24a07b7b9d15e527a;p=libs%2Fgl.git diff --git a/source/texture.cpp b/source/texture.cpp index fe8b7be9..0fa65ead 100644 --- a/source/texture.cpp +++ b/source/texture.cpp @@ -2,6 +2,8 @@ #include #include #include "error.h" +#include "resourcemanager.h" +#include "resources.h" #include "texture.h" #include "texunit.h" @@ -42,7 +44,8 @@ void operator>>(const LexicalConverter &c, TextureWrap &tw) } -Texture::Texture(GLenum t): +Texture::Texture(GLenum t, ResourceManager *m): + id(0), target(t), min_filter(NEAREST_MIPMAP_LINEAR), mag_filter(LINEAR), @@ -54,12 +57,19 @@ Texture::Texture(GLenum t): cmp_func(LEQUAL), dirty_params(0) { - glGenTextures(1, &id); + if(m) + set_manager(m); + else + glGenTextures(1, &id); } Texture::~Texture() { - glDeleteTextures(1, &id); + while(TexUnit *unit = TexUnit::find_unit(this)) + unbind_from(unit->get_index()); + + if(id) + glDeleteTextures(1, &id); } void Texture::update_parameter(int mask) const @@ -175,6 +185,9 @@ void Texture::bind_to(unsigned i) const const Texture *cur = unit.get_texture(); if(unit.set_texture(this)) { + if(manager) + manager->resource_used(*this); + unit.bind(); if(cur && cur->target!=target) glDisable(cur->target); @@ -209,8 +222,24 @@ void Texture::unbind_from(unsigned i) Texture::Loader::Loader(Texture &t): - DataFile::ObjectLoader(t) + DataFile::CollectionObjectLoader(t, 0) +{ + init(); +} + +Texture::Loader::Loader(Texture &t, Collection &c): + DataFile::CollectionObjectLoader(t, &c) { + init(); +} + +void Texture::Loader::init() +{ + if(Resources *res = dynamic_cast(coll)) + srgb = res->get_srgb_conversion(); + else + srgb = false; + add("filter", &Loader::filter); add("max_anisotropy", &Loader::max_anisotropy); add("generate_mipmap", &Loader::generate_mipmap);