in roboschool/cpp-household/render-simple.cpp [161:217]
void Context::load_missing_textures()
{
shared_ptr<Household::World> world = weak_world.lock();
if (!world) return;
while (1) {
bool did_anything = false;
for (auto i=world->klass_cache.begin(); i!=world->klass_cache.end(); ++i) {
shared_ptr<ThingyClass> klass = i->second.lock();
if (!klass) {
world->klass_cache.erase(i);
did_anything = true;
break;
}
shared_ptr<ShapeDetailLevels> v = klass->shapedet_visual;
if (v->load_later_on) {
v->load_later_on = false;
load_model(v, v->load_later_fn, 1, v->load_later_transform);
}
}
if (!did_anything) break;
}
//fprintf(stderr, "world now has %i classes\n", (int)world->classes.size());
for (const weak_ptr<Thingy>& w: world->drawlist) {
shared_ptr<Thingy> t = w.lock();
if (!t) continue;
if (!t->klass) continue;
const shared_ptr<MaterialNamespace>& mats = t->klass->shapedet_visual->materials;
if (!mats) continue;
for (const std::pair<std::string, shared_ptr<Material>>& pair: mats->name2mtl) {
shared_ptr<Material> mat = pair.second;
if (mat->texture_loaded) continue;
if (mat->diffuse_texture_image_fn.empty()) continue;
mat->texture = cached_bind_texture(mat->diffuse_texture_image_fn);
mat->texture_loaded = true;
}
}
for (auto i=allocated_vaos.begin(); i!=allocated_vaos.end(); ) {
if (i->unique()) {
i = allocated_vaos.erase(i);
continue;
}
++i;
}
for (auto i=allocated_buffers.begin(); i!=allocated_buffers.end(); ) {
if (i->unique()) {
i = allocated_buffers.erase(i);
continue;
}
++i;
}
//fprintf(stderr, "allocated_vaos %i\n", (int)allocated_vaos.size());
//fprintf(stderr, "allocated_buffers %i\n", (int)allocated_buffers.size());
}