| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- // ----------------------------------------------------------------
- // From Game Programming in C++ by Sanjay Madhav
- // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
- //
- // Released under the BSD License
- // See LICENSE in root directory for full details.
- // ----------------------------------------------------------------
- #include "AudioComponent.h"
- #include "Actor.h"
- #include "Game.h"
- #include "AudioSystem.h"
- AudioComponent::AudioComponent(Actor* owner, int updateOrder)
- :Component(owner, updateOrder)
- {
- }
- AudioComponent::~AudioComponent()
- {
- StopAllEvents();
- }
- void AudioComponent::Update(float deltaTime)
- {
- Component::Update(deltaTime);
- // Remove invalid 2D events
- auto iter = mEvents2D.begin();
- while (iter != mEvents2D.end())
- {
- if (!iter->IsValid())
- {
- iter = mEvents2D.erase(iter);
- }
- else
- {
- ++iter;
- }
- }
- // Remove invalid 3D events
- iter = mEvents3D.begin();
- while (iter != mEvents3D.end())
- {
- if (!iter->IsValid())
- {
- iter = mEvents3D.erase(iter);
- }
- else
- {
- ++iter;
- }
- }
- }
- void AudioComponent::OnUpdateWorldTransform()
- {
- // Update 3D events' world transforms
- Matrix4 world = mOwner->GetWorldTransform();
- for (auto& event : mEvents3D)
- {
- if (event.IsValid())
- {
- event.Set3DAttributes(world);
- }
- }
- }
- SoundEvent AudioComponent::PlayEvent(const std::string& name)
- {
- SoundEvent e = mOwner->GetGame()->GetAudioSystem()->PlayEvent(name);
- // Is this 2D or 3D?
- if (e.Is3D())
- {
- mEvents3D.emplace_back(e);
- // Set initial 3D attributes
- e.Set3DAttributes(mOwner->GetWorldTransform());
- }
- else
- {
- mEvents2D.emplace_back(e);
- }
- return e;
- }
- void AudioComponent::StopAllEvents()
- {
- // Stop all sounds
- for (auto& e : mEvents2D)
- {
- e.Stop();
- }
- for (auto& e : mEvents3D)
- {
- e.Stop();
- }
- // Clear events
- mEvents2D.clear();
- mEvents3D.clear();
- }
|