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 | |
8 | using namespace std::placeholders; |
9 | |
10 | namespace 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 | } |