X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpartcache.cpp;h=560db298e8edca248b42c32bbc0926f370b70e68;hb=394e5c9969a30b604bfaf78fc05a8c2d5c98ab5b;hp=4747cb50b3e585fd45bb6a5be8fe864bd2937266;hpb=2a665655a15f73d59083fd5cc7e5a58ae5f4d377;p=libs%2Fgltk.git diff --git a/source/partcache.cpp b/source/partcache.cpp index 4747cb5..560db29 100644 --- a/source/partcache.cpp +++ b/source/partcache.cpp @@ -6,20 +6,12 @@ using namespace std; namespace Msp { namespace GLtk { -CachedPart::CachedPart(): - part(0), - texture(0), - mesh(0) -{ } - -CachedPart::~CachedPart() -{ - delete mesh; -} - - void PartCache::begin_rebuild() { + if(rebuilding) + throw logic_error("nested rebuild"); + rebuilding = true; + next = parts.begin(); current = parts.end(); } @@ -28,13 +20,12 @@ 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) - { - parts.erase(next, current); - break; - } + current = find_if(next, parts.end(), [&part](const CachedPart &p){ return p.part==∂ }); + if(current!=parts.end()) + parts.erase(next, current); if(current==parts.end()) current = parts.insert(next, CachedPart()); @@ -48,6 +39,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 +56,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 = make_unique((GL::TEXCOORD2, GL::COLOR4,GL::UNSIGNED_BYTE, GL::VERTEX2)); } else current->mesh->clear(); @@ -76,6 +70,7 @@ GL::Mesh &PartCache::create_mesh(const Part &part, const GL::Texture2D &tex) void PartCache::end_rebuild() { + rebuilding = false; parts.erase(next, parts.end()); }