+void MetaScene::update(float dt)
+{
+ bool expanded;
+ static char text[256];
+ if(debug_gui) {
+ ImGui::Begin("MetaScene nodes", 0, 0);
+ }
+
+ int nscn = scenes.size();
+ for(int i=0; i<nscn; i++) {
+
+ if(debug_gui) {
+ if(scenes[i]->name.empty()) {
+ sprintf(text, "scene %3d", i);
+ } else {
+ sprintf(text, "scene %3d: %s", i, scenes[i]->name.c_str());
+ }
+ expanded = parent_expanded = ImGui::TreeNode(text);
+ }
+
+ scenes[i]->update(dt);
+
+ if(debug_gui && expanded) {
+ ImGui::TreePop();
+ }
+ }
+
+ if(debug_gui) {
+ ImGui::End();
+ }
+}
+
+void MetaScene::draw() const
+{
+ int nscn = scenes.size();
+ for(int i=0; i<nscn; i++) {
+ scenes[i]->draw();
+ }
+}
+
+SceneNode *MetaScene::find_node(const char *name) const
+{
+ int num = scenes.size();
+ for(int i=0; i<num; i++) {
+ SceneNode *n = scenes[i]->find_node(name);
+ if(n) return n;
+ }
+ return 0;
+}
+
+SceneNode *MetaScene::match_node(const char *qstr) const
+{
+ int num = scenes.size();
+ for(int i=0; i<num; i++) {
+ SceneNode *n = scenes[i]->match_node(qstr);
+ if(n) return n;
+ }
+ return 0;
+}
+
+std::list<SceneNode*> MetaScene::match_nodes(const char *qstr) const
+{
+ std::list<SceneNode*> res;
+ int num = scenes.size();
+ for(int i=0; i<num; i++) {
+ std::list<SceneNode*> tmp = scenes[i]->match_nodes(qstr);
+ if(!tmp.empty()) {
+ res.splice(res.end(), tmp);
+ }
+ }
+ return std::move(res);
+}
+
+Scene *MetaScene::extract_nodes(const char *qstr)
+{
+ Scene *scn = 0;
+ int nscn = scenes.size();
+ for(int i=0; i<nscn; i++) {
+ Scene *tmp = scenes[i]->extract_nodes(qstr);
+ if(tmp) {
+ if(!scn) {
+ scn = tmp;
+ } else {
+ scn->merge(tmp);
+ delete tmp;
+ }
+ }
+ }
+ return scn;
+}
+
+static bool proc_node(MetaScene *mscn, struct ts_node *node)