void SimulationBar::forEachSimulator(boost::function<void(SimulatorItem* simulator)> callback, bool doSelect) { MessageView* mv = MessageView::instance(); /* ItemList<SimulatorItem> simulators = ItemTreeView::mainInstance()->selectedItems<SimulatorItem>(); */ ItemList<SimulatorItem> simulators = ItemTreeView::mainInstance()->selectedItems<SimulatorItem>(); if(simulators.empty()){ simulators.extractChildItems(RootItem::instance()); if(simulators.empty()){ mv->notify(_("There is no simulator item.")); } else if(simulators.size() > 1){ simulators.clear(); mv->notify(_("Please select a simulator item to simulate.")); } else { if(doSelect){ ItemTreeView::instance()->selectItem(simulators.front()); } } } typedef map<WorldItem*, SimulatorItem*> WorldToSimulatorMap; WorldToSimulatorMap worldToSimulator; for(int i=0; i < simulators.size(); ++i){ SimulatorItem* simulator = simulators.get(i); WorldItem* world = simulator->findOwnerItem<WorldItem>(); if(world){ WorldToSimulatorMap::iterator p = worldToSimulator.find(world); if(p == worldToSimulator.end()){ worldToSimulator[world] = simulator; } else { p->second = 0; // skip if multiple simulators are selected } } } for(int i=0; i < simulators.size(); ++i){ SimulatorItem* simulator = simulators.get(i); WorldItem* world = simulator->findOwnerItem<WorldItem>(); if(!world){ mv->notify(format(_("%1% cannot be processed because it is not related with a world.")) % simulator->name()); } else { WorldToSimulatorMap::iterator p = worldToSimulator.find(world); if(p != worldToSimulator.end()){ if(!p->second){ mv->notify(format(_("%1% cannot be processed because another simulator" "in the same world is also selected.")) % simulator->name()); } else { callback(simulator); } } } } }
Item_spawn_data::ItemList Item_group::create(int birthday, RecursionList &rec) const { ItemList result; if (type == G_COLLECTION) { for(prop_list::const_iterator a = items.begin(); a != items.end(); ++a) { if(rng(0, 99) >= (*a)->probability) { continue; } ItemList tmp = (*a)->create(birthday, rec); result.insert(result.end(), tmp.begin(), tmp.end()); } } else if (type == G_DISTRIBUTION) { int p = rng(0, sum_prob - 1); for(prop_list::const_iterator a = items.begin(); a != items.end(); ++a) { p -= (*a)->probability; if (p >= 0) { continue; } ItemList tmp = (*a)->create(birthday, rec); result.insert(result.end(), tmp.begin(), tmp.end()); break; } } if (with_ammo && !result.empty()) { it_gun *maybe_gun = dynamic_cast<it_gun *>(result.front().type); if (maybe_gun != NULL) { item ammo(default_ammo(maybe_gun->ammo), birthday); // TODO: change the spawn lists to contain proper references to containers ammo = ammo.in_its_container(); result.push_back(ammo); } } return result; }
void CollisionSeq::readCollisionData(int nFrames, const Listing& values) { /* WorldItem* worldItem = collisionSeqItem_->findOwnerItem<WorldItem>(); if(!worldItem) return; */ WorldItem* worldItem = 0; RootItem* rootItem = RootItem::instance(); ItemList<WorldItem> worldItems; if(worldItems.extractChildItems(rootItem)){ worldItem = worldItems.front(); } if(!worldItem) return; for(int i=0; i < nFrames; ++i){ const Mapping& frameNode = *values[i].toMapping(); const Listing& linkPairs = *frameNode.findListing("LinkPairs"); Frame f = frame(i); f[0] = std::make_shared<CollisionLinkPairList>(); for(int j=0; j<linkPairs.size(); j++){ CollisionLinkPairPtr destLinkPair = std::make_shared<CollisionLinkPair>(); const Mapping& linkPair = *linkPairs[j].toMapping(); string body0name = linkPair["body0"].toString(); string body1name = linkPair["body1"].toString(); string link0name = linkPair["link0"].toString(); string link1name = linkPair["link1"].toString(); BodyItem* body0Item = worldItem->findChildItem<BodyItem>(body0name); Body* body0=0; Body* body1=0; Link* link0=0; Link* link1=0; if(body0Item){ body0 = body0Item->body(); link0 = body0->link(link0name); } BodyItem* body1Item = worldItem->findChildItem<BodyItem>(body1name); if(body1Item){ body1 = body1Item->body(); link1 = body1->link(link1name); } destLinkPair->body[0] = body0; destLinkPair->link[0] = link0; destLinkPair->body[1] = body1; destLinkPair->link[1] = link1; const Listing& collisions = *linkPair.findListing("Collisions"); for(int k=0; k<collisions.size(); k++){ destLinkPair->collisions.push_back(Collision()); Collision& destCol = destLinkPair->collisions.back(); const Listing& collision = *collisions[k].toListing(); destCol.point = Vector3(collision[0].toDouble(), collision[1].toDouble(), collision[2].toDouble()); destCol.normal = Vector3(collision[3].toDouble(), collision[4].toDouble(), collision[5].toDouble()); destCol.depth = collision[6].toDouble(); } f[0]->push_back(destLinkPair); } } }
void OnlineViewerServerImpl::load(string name, string url) { string filepath; QRegExp filePattern("(\\w+)://(.+)"); if(filePattern.exactMatch(url.c_str())){ string protocol = filePattern.cap(1).toStdString(); if(protocol == "file"){ filepath = filePattern.cap(2).toStdString(); } else { mv->putln( fmt(_("OnlineViewer: The model file at \"%1%\" cannot be read. %2% protocol is not supported.")) % url % protocol); return; } } else { filepath = url; } // search for registered body items BodyItemInfo* info = findInfo(name); if(info && info->bodyItem->filePath() == filepath){ info->needToSelectLogItem = true; // mv->putln(fmt(_("OnlineViewer: \"%1%\" at \"%2%\" has already been loaded.")) % name % url); return; } // search for existing body items RootItem* rootItem = RootItem::instance(); ItemList<BodyItem> bodyItems; bodyItems.extractChildItems(rootItem); for(int i=0; i < bodyItems.size(); ++i){ BodyItemPtr bodyItem = bodyItems[i]; if(bodyItem->name() == name && bodyItem->filePath() == filepath){ registerBodyItem(bodyItem); return; } } // load a new body item BodyItemPtr bodyItem = new BodyItem(); mv->putln(fmt(_("OnlineViewer: Loading \"%1%\" at \"%2%\".")) % name % url); mv->flush(); if(!bodyItem->load(filepath)){ mv->putln(fmt(_("OnlineViewer: Loading \"%1%\" failed.")) % name); } else { bodyItem->setName(name); ItemList<WorldItem> worldItems; if(worldItems.extractChildItems(rootItem)){ worldItems.front()->addChildItem(bodyItem); } else { rootItem->addChildItem(bodyItem); } ItemTreeView::instance()->checkItem(bodyItem, true); registerBodyItem(bodyItem); } }
void OpenHRPOnlineViewerItemImpl::updatesub(const WorldState& state) { if(!worldItem){ RootItem* rootItem = RootItem::instance(); ItemList<WorldItem> worldItems; if(worldItems.extractChildItems(rootItem)){ worldItem = worldItems.front(); } else { worldItem = new WorldItem(); worldItem->setName("World"); rootItem->addChildItem(worldItem); ItemTreeView::instance()->checkItem(worldItem, true); } worldItemConnections.add( worldItem->sigDisconnectedFromRoot().connect( boost::bind(&OpenHRPOnlineViewerItemImpl::onWorldItemDetachedFromRoot, this))); } if(!collisionSeqItem){ collisionSeqItem = worldItem->findChildItem<CollisionSeqItem>(collisionLogName); if(!collisionSeqItem){ collisionSeqItem = new CollisionSeqItem(); collisionSeqItem->setTemporal(); collisionSeqItem->setName(collisionLogName); worldItem->addChildItem(collisionSeqItem); } resetCollisionLogItem(collisionSeqItem); needToSelectCollisionLogItem = true; } if(needToSelectCollisionLogItem){ ItemTreeView::instance()->selectItem(collisionSeqItem, true); needToSelectCollisionLogItem = false; } const CollisionSeqPtr& colSeq = collisionSeqItem->collisionSeq(); int frame = colSeq->frameOfTime(state.time); int lastFrame = std::max(0, std::min(frame, colSeq->numFrames())); colSeq->setNumFrames(frame + 1); CollisionLinkPairListPtr collisionPairs = boost::make_shared<CollisionLinkPairList>(); updateCollision(state, collisionPairs.get()); for(int i=lastFrame; i <= frame; ++i){ CollisionSeq::Frame collisionPairs0 = colSeq->frame(i); collisionPairs0[0] = collisionPairs; } forEachBody(state, boost::bind(&OpenHRPOnlineViewerItemImpl::updateLog, this, _1, _2, _3, _4)); }
Item_spawn_data::ItemList Item_group::create(int birthday, RecursionList &rec) const { ItemList result; if (type == G_COLLECTION) { for( const auto &elem : items ) { if( rng( 0, 99 ) >= ( elem )->probability ) { continue; } ItemList tmp = ( elem )->create( birthday, rec ); result.insert(result.end(), tmp.begin(), tmp.end()); } } else if (type == G_DISTRIBUTION) { int p = rng(0, sum_prob - 1); for( const auto &elem : items ) { p -= ( elem )->probability; if (p >= 0) { continue; } ItemList tmp = ( elem )->create( birthday, rec ); result.insert(result.end(), tmp.begin(), tmp.end()); break; } } if (with_ammo && !result.empty()) { const auto t = result.front().type; if( t->gun ) { const std::string ammoid = default_ammo( t->gun->ammo ); if ( !ammoid.empty() ) { item ammo( ammoid, birthday ); // TODO: change the spawn lists to contain proper references to containers ammo = ammo.in_its_container(); result.push_back( ammo ); } } } return result; }
void GSMediaViewImpl::onItemCheckToggled(Item* item, bool isChecked) { if(TRACE_FUNCTIONS){ cout << "GSMediaViewImpl::onItemCheckToggled()" << endl; } MediaItem* mediaItem = dynamic_cast<MediaItem*>(item); if(mediaItem){ ItemList<MediaItem> checkedItems = ItemTreeView::mainInstance()->checkedItems<MediaItem>(); MediaItemPtr targetItem; if(!checkedItems.empty()){ targetItem = checkedItems.front(); } if(targetItem != currentMediaItem){ if(currentMediaItem){ stopPlayback(); } currentMediaItem = targetItem; if(!currentMediaItem || currentMediaItem->mediaURI().empty()){ g_object_set(G_OBJECT(playbin), "uri", "", NULL); timeBarConnections.disconnect(); } else { GstPad* pad = gst_element_get_static_pad(GST_ELEMENT(videoSink), "sink"); gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, (GstPadProbeCallback)videoPadBufferProbeCallback, this, NULL); gst_object_unref(pad); if(self->winId()){ activateCurrentMediaItem(); } } } } }