#include "behavior.h" #include #include #include #include #include UF_BEHAVIOR_REGISTER_CPP(ext::SoundEmitterBehavior) #define this ((uf::Scene*) &self) void ext::SoundEmitterBehavior::initialize( uf::Object& self ) { auto& emitter = this->getComponent(); auto& metadata = this->getComponent(); auto& scene = uf::scene::getCurrentScene(); auto& sMetadata = scene.getComponent(); auto& assetLoader = scene.getComponent(); this->addHook( "asset:Load.%UID%", [&](const std::string& event)->std::string{ uf::Serializer json = event; std::string filename = json["filename"].as(); if ( uf::io::extension(filename) != "ogg" ) return "false"; const uf::Audio* audioPointer = NULL; try { audioPointer = &assetLoader.get(filename); } catch ( ... ) {} if ( !audioPointer ) return "false"; uf::Audio& audio = this->getComponent(); //emitter.add(filename); audio.load(filename); { float volume = 1.0f; if ( metadata["audio"]["volume"].is() ) { volume = metadata["audio"]["volume"].as(); } else if ( metadata["audio"]["volume"].is() ) { std::string key = metadata["audio"]["volume"].as(); if ( sMetadata["volumes"][key].is() ) { volume = sMetadata["volumes"][key].as(); } } audio.setVolume(volume); } if ( metadata["audio"]["pitch"].is() ) { audio.setPitch(metadata["audio"]["pitch"].as()); } if ( metadata["audio"]["gain"].is() ) { audio.setGain(metadata["audio"]["gain"].as()); } if ( metadata["audio"]["rolloffFactor"].is() ) { audio.setRolloffFactor(metadata["audio"]["rolloffFactor"].as()); } if ( metadata["audio"]["maxDistance"].is() ) { audio.setMaxDistance(metadata["audio"]["maxDistance"].as()); } audio.play(); return "true"; }); } void ext::SoundEmitterBehavior::tick( uf::Object& self ) { auto& emitter = this->getComponent(); auto& metadata = this->getComponent(); auto& transform = this->getComponent>(); // for ( auto pair : emitter.get() ) { // uf::Audio& audio = pair.second; { uf::Audio& audio = this->getComponent(); if ( metadata["audio"]["spatial"].as() ) { audio.setPosition( transform.position ); audio.setOrientation( transform.orientation ); } if ( metadata["audio"]["loop"].as() ) { float current = audio.getTime(); float end = audio.getDuration(); float epsilon = 0.005f; if ( current + epsilon >= end || !audio.playing() ) { audio.setTime(0); if ( !audio.playing() ) audio.play(); } } } } void ext::SoundEmitterBehavior::render( uf::Object& self ){} void ext::SoundEmitterBehavior::destroy( uf::Object& self ){} #undef this