void Context::load_missing_textures()

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());
}