void Audio::playSFX(const std::string &filename, bool relative, const cml::vector2f &pos, float attenuation, float min_dist) { if(sounds.empty()) for(int i = 0; i < 32; i++) { SoundPtr s(new sf::Sound()); s->SetVolume(60.0f); sounds.push_back(s); } SoundPtr s; for(unsigned int i = 0; i < sounds.size(); i++) if(sounds[i]->GetStatus() == sf::Sound::Stopped) s = sounds[i]; if(!s) { warning("too many sounds"); return; } SoundBufferPtr sb = getSoundBuffer(filename); s->SetRelativeToListener(relative); s->SetPosition(pos[0], pos[1], 0.0f); s->SetAttenuation(attenuation); s->SetMinDistance(min_dist); s->SetBuffer(*(sb.get())); s->Play(); }
//---------- void Assets::refreshView() { auto filterString = ofToLower(this->filter.get()); this->view->clear(); this->ownedElements.clear(); auto filterWidget = Widgets::EditableValue<string>::make(this->filter); auto filterWidgetWeak = weak_ptr<Element>(filterWidget); filterWidget->onValueChange += [this, filterWidgetWeak](const string &) { auto filterWidget = filterWidgetWeak.lock(); this->refreshView(); }; this->view->add(filterWidget); auto addReloadButton = [this](ElementPtr element, shared_ptr<ofxAssets::BaseAsset> asset) { auto button = Widgets::Button::make("Reload", [asset]() { asset->reload(); }); this->ownedElements.push_back(button); button->addListenersToParent(element); element->onBoundsChange += [button](BoundsChangeArguments & args) { auto bounds = args.localBounds; const int width = 80; bounds.width = width; bounds.x = args.localBounds.width - width; button->setBounds(bounds); }; }; auto & assetRegister = ofxAssets::Register::X(); this->view->add("Images"); { const auto & images = assetRegister.getImages(); const auto & names = images.getNames(); for(const auto & name : names) { if (!filterString.empty()) { if(ofToLower(name).find(filterString) == string::npos) { continue; } } auto asset = images[name]; auto & image = asset->get(); auto width = image.getWidth(); auto height = image.getHeight(); auto element = make_shared<Element>(); float longestAxis = max(width, height); auto scaleFactor = 48.0f / longestAxis; auto drawWidth = width * scaleFactor; auto drawHeight = height * scaleFactor; element->onDraw += [asset, name, width, height, drawWidth, drawHeight](DrawArguments & args) { stringstream text; text << name << endl; text << width << "x" << height; ofxCvGui::Utils::drawText(text.str(), 58, 0); asset->get().draw(5, 0, drawWidth, drawHeight); }; element->setHeight(58.0f); this->view->add(element); addReloadButton(element, asset); } } this->view->add("Shaders"); { const auto & shaders = assetRegister.getShaders(); const auto & names = shaders.getNames(); for(const auto & name : names) { if (!filterString.empty()) { if(ofToLower(name).find(filterString) == string::npos) { continue; } } auto asset = shaders[name]; auto & shader = asset->get(); bool loaded = shader.isLoaded(); auto element = make_shared<Element>(); element->onDraw += [name, loaded](DrawArguments & args) { stringstream text; text << name << endl; text << "Loaded : " << (loaded ? "true" : "false"); ofxCvGui::Utils::drawText(text.str(), 5, 0); }; element->setHeight(58.0f); this->view->add(element); addReloadButton(element, asset); } } this->view->add("Fonts"); { auto fonts = assetRegister.getFonts(); auto names = fonts.getNames(); for(const auto & name : names) { auto sizes = assetRegister.getFontSizes(name); for(const auto & size : sizes) { auto sizeString = ofToString(size); if (!filterString.empty()) { if(ofToLower(name).find(filterString) == string::npos && filterString != sizeString) { continue; } } auto asset = fonts[name]; auto element = make_shared<Element>(); element->onDraw += [name, size, asset](DrawArguments & args) { stringstream text; text << name << ", size " << size; ofxCvGui::Utils::drawText(text.str(), 5, 38); asset->get(size).drawString("AaBbCcDdEeFf0123456789", 5, 35); }; element->setScissor(true); element->setHeight(58.0f); this->view->add(element); addReloadButton(element, asset); } } } this->view->add("Sounds"); { auto sounds = assetRegister.getSounds(); auto names = sounds.getNames(); for(const auto & name : names) { if (!filterString.empty()) { if(ofToLower(name).find(filterString) == string::npos) { continue; } } auto asset = sounds[name]; auto & buffer = asset->getSoundBuffer(); auto duration = buffer.getDurationMS(); auto channels = buffer.getNumChannels(); auto element = make_shared<Element>(); element->onDraw += [name, duration, channels](DrawArguments & args) { stringstream text; text << name << endl; text << "Duration = " << duration << ". Channels = " << channels; ofxCvGui::Utils::drawText(text.str(), 0, 5); }; element->setHeight(58.0f); this->view->add(element); auto playButton = Widgets::Toggle::make("Play", [asset]() { return asset->getSoundPlayer().isPlaying(); }, [asset](bool play) { if(play) { asset->getSoundPlayer().play(); } }); this->ownedElements.push_back(playButton); playButton->addListenersToParent(element); element->onBoundsChange += [playButton](BoundsChangeArguments & args) { auto bounds = args.localBounds; bounds.width = 64; bounds.x = args.localBounds.width - (80 + 64); playButton->setBounds(bounds); }; addReloadButton(element, asset); } } this->viewDirty = false; }