void GBufferPass::update_ubershader_from_scene(SerializedScene const& scene, SceneGraph const& graph) { bool ubershader_available = true; for (auto const& geometry_pair : scene.geometrynodes_) { ubershader_available = ubershader_available && ubershaders_.count(geometry_pair.first); } if (!ubershader_available) { auto get_ubershader = [&](Node * n) { GeometryNode* geode = dynamic_cast<GeometryNode*>(n); if (geode) { std::type_index type(typeid(*geode)); if (!ubershaders_.count(type)) { auto const& ressource = GeometryDatabase::instance()->lookup(geode->get_filename()); if (ressource) { auto ubershader = ressource->get_ubershader(); ubershader->create(materials_); ubershaders_[type] = ubershader; } } } } ; gua::dfs_traverse(graph.get_root().get(), get_ubershader); } }