X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpartcache.cpp;h=3c3fbb169e3e2c20b707f20b6bdb25f656fc94fd;hb=caa04d76bc031dd0c4a4157732deb340d934ceeb;hp=5589b0dd8b7c948685964fe5c49aa6cb2dda50a4;hpb=319cde3c06181ba1c3619567525002926d8b4889;p=libs%2Fgltk.git diff --git a/source/partcache.cpp b/source/partcache.cpp index 5589b0d..3c3fbb1 100644 --- a/source/partcache.cpp +++ b/source/partcache.cpp @@ -18,31 +18,79 @@ CachedPart::~CachedPart() } -void PartCache::clear() +PartCache::PartCache(): + rebuilding(false) +{ } + +void PartCache::begin_rebuild() { - parts.clear(); + if(rebuilding) + throw logic_error("nested rebuild"); + rebuilding = true; + + next = parts.begin(); + current = parts.end(); } 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; + } - parts.push_back(CachedPart()); - parts.back().part = ∂ + if(current==parts.end()) + current = parts.insert(next, CachedPart()); + else + *current = CachedPart(); + current->part = ∂ + + next = current; + ++next; } GL::Mesh &PartCache::create_mesh(const Part &part, const GL::Texture2D &tex) { - if(!parts.empty() && parts.back().texture==&tex) - return *parts.back().mesh; - - parts.push_back(CachedPart()); - CachedPart &cpart = parts.back(); - cpart.part = ∂ - cpart.texture = &tex; - cpart.mesh = new GL::Mesh((GL::TEXCOORD2, GL::COLOR4_UBYTE, GL::VERTEX2)); - return *cpart.mesh; + if(!rebuilding) + throw logic_error("!rebuilding"); + + if(current!=parts.end() && current->texture==&tex) + return *current->mesh; + + for(current=next; current!=parts.end(); ++current) + if(current->texture==&tex) + { + parts.erase(next, current); + break; + } + + if(current==parts.end()) + { + current = parts.insert(next, CachedPart()); + current->texture = &tex; + current->mesh = new GL::Mesh((GL::TEXCOORD2, GL::COLOR4_UBYTE, GL::VERTEX2)); + } + else + current->mesh->clear(); + current->part = ∂ + + next = current; + ++next; + + return *current->mesh; +} + +void PartCache::end_rebuild() +{ + rebuilding = false; + parts.erase(next, parts.end()); } } // namespace GLtk