1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#include "Components/BsCAudioListener.h"
4#include "Scene/BsSceneObject.h"
5#include "Utility/BsTime.h"
6#include "Private/RTTI/BsCAudioListenerRTTI.h"
7
8using namespace std::placeholders;
9
10namespace bs
11{
12 CAudioListener::CAudioListener()
13 {
14 setName("AudioListener");
15
16 mNotifyFlags = TCF_Transform;
17 }
18
19 CAudioListener::CAudioListener(const HSceneObject& parent)
20 : Component(parent)
21 {
22 setName("AudioListener");
23
24 mNotifyFlags = TCF_Transform;
25 }
26
27 void CAudioListener::onInitialized()
28 {
29
30 }
31
32 void CAudioListener::onDestroyed()
33 {
34 destroyInternal();
35 }
36
37 void CAudioListener::onDisabled()
38 {
39 destroyInternal();
40 }
41
42 void CAudioListener::onEnabled()
43 {
44 restoreInternal();
45 }
46
47 void CAudioListener::onTransformChanged(TransformChangedFlags flags)
48 {
49 if (!SO()->getActive())
50 return;
51
52 if ((flags & (TCF_Parent | TCF_Transform)) != 0)
53 updateTransform();
54 }
55
56 void CAudioListener::update()
57 {
58 const Vector3 worldPos = SO()->getTransform().getPosition();
59
60 const float frameDelta = gTime().getFrameDelta();
61 if(frameDelta > 0.0f)
62 mVelocity = (worldPos - mLastPosition) / frameDelta;
63 else
64 mVelocity = Vector3::ZERO;
65
66 mLastPosition = worldPos;
67 }
68
69 void CAudioListener::restoreInternal()
70 {
71 if (mInternal == nullptr)
72 mInternal = AudioListener::create();
73
74 updateTransform();
75 }
76
77 void CAudioListener::destroyInternal()
78 {
79 // This should release the last reference and destroy the internal listener
80 mInternal = nullptr;
81 }
82
83 void CAudioListener::updateTransform()
84 {
85 const Transform& tfrm = SO()->getTransform();
86
87 mInternal->setTransform(tfrm);
88 mInternal->setVelocity(mVelocity);
89 }
90
91 RTTITypeBase* CAudioListener::getRTTIStatic()
92 {
93 return CAudioListenerRTTI::instance();
94 }
95
96 RTTITypeBase* CAudioListener::getRTTI() const
97 {
98 return CAudioListener::getRTTIStatic();
99 }
100}