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();
}
{
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());
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;
{
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::Mesh>((GL::TEXCOORD2, GL::COLOR4,GL::UNSIGNED_BYTE, GL::VERTEX2));
}
else
current->mesh->clear();
void PartCache::end_rebuild()
{
+ rebuilding = false;
parts.erase(next, parts.end());
}