X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpartcache.cpp;h=77b51d2cbc2096a101eb941b20e45f6b23568c6a;hb=6d9570c97584758e3cfcac6827d439b7fb844cf4;hp=4747cb50b3e585fd45bb6a5be8fe864bd2937266;hpb=2a665655a15f73d59083fd5cc7e5a58ae5f4d377;p=libs%2Fgltk.git diff --git a/source/partcache.cpp b/source/partcache.cpp index 4747cb5..77b51d2 100644 --- a/source/partcache.cpp +++ b/source/partcache.cpp @@ -6,11 +6,23 @@ using namespace std; namespace Msp { namespace GLtk { -CachedPart::CachedPart(): - part(0), - texture(0), - mesh(0) -{ } +CachedPart::CachedPart(CachedPart &&other): + part(other.part), + texture(other.texture), + mesh(other.mesh) +{ + other.mesh = nullptr; +} + +CachedPart &CachedPart::operator=(CachedPart &&other) +{ + delete mesh; + part = other.part; + texture = other.texture; + mesh = other.mesh; + other.mesh = nullptr; + return *this; +} CachedPart::~CachedPart() { @@ -20,6 +32,10 @@ CachedPart::~CachedPart() void PartCache::begin_rebuild() { + if(rebuilding) + throw logic_error("nested rebuild"); + rebuilding = true; + next = parts.begin(); current = parts.end(); } @@ -28,6 +44,8 @@ void PartCache::insert_special(const Part &part) { if(part.get_name().empty()) throw invalid_argument("PartCache::insert_special"); + if(!rebuilding) + throw logic_error("!rebuilding"); for(current=next; current!=parts.end(); ++current) if(current->part==&part) @@ -48,6 +66,9 @@ void PartCache::insert_special(const Part &part) GL::Mesh &PartCache::create_mesh(const Part &part, const GL::Texture2D &tex) { + if(!rebuilding) + throw logic_error("!rebuilding"); + if(current!=parts.end() && current->texture==&tex) return *current->mesh; @@ -62,7 +83,7 @@ GL::Mesh &PartCache::create_mesh(const Part &part, const GL::Texture2D &tex) { current = parts.insert(next, CachedPart()); current->texture = &tex; - current->mesh = new GL::Mesh((GL::TEXCOORD2, GL::COLOR4_UBYTE, GL::VERTEX2)); + current->mesh = new GL::Mesh((GL::TEXCOORD2, GL::COLOR4,GL::UNSIGNED_BYTE, GL::VERTEX2)); } else current->mesh->clear(); @@ -76,6 +97,7 @@ GL::Mesh &PartCache::create_mesh(const Part &part, const GL::Texture2D &tex) void PartCache::end_rebuild() { + rebuilding = false; parts.erase(next, parts.end()); }