Browse Source

Refactor: AudioListener and AudioSource now implement the standardized SceneActor interface

BearishSun 8 years ago
parent
commit
4c431379c3

+ 4 - 1
Source/BansheeCore/Audio/BsAudio.cpp

@@ -7,9 +7,12 @@ namespace bs
 {
 	void Audio::play(const HAudioClip& clip, const Vector3& position, float volume)
 	{
+		Transform transform;
+		transform.setPosition(position);
+
 		SPtr<AudioSource> source = createSource();
 		source->setClip(clip);
-		source->setPosition(position);
+		source->setTransform(transform);
 		source->setVolume(volume);
 		source->play();
 

+ 11 - 15
Source/BansheeCore/Audio/BsAudioListener.cpp

@@ -2,37 +2,33 @@
 //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
 #include "Audio/BsAudioListener.h"
 #include "Audio/BsAudio.h"
+#include "RTTI/BsAudioListenerRTTI.h"
 
 namespace bs
 {
 	AudioListener::AudioListener()
-		:mPosition(BsZero), mDirection(-Vector3::UNIT_Z), mUp(Vector3::UNIT_Y), mVelocity(BsZero)
+		:mVelocity(BsZero)
 	{
 		
 	}
 
-	void AudioListener::setPosition(const Vector3& position)
+	void AudioListener::setVelocity(const Vector3& velocity)
 	{
-		mPosition = position;
+		mVelocity = velocity;
 	}
 
-	void AudioListener::setDirection(const Vector3& direction)
+	SPtr<AudioListener> AudioListener::create()
 	{
-		mDirection = direction;
-	}
+		return gAudio().createListener();
+	}	
 
-	void AudioListener::setUp(const Vector3& up)
+	RTTITypeBase* AudioListener::getRTTIStatic()
 	{
-		mUp = up;
+		return AudioListenerRTTI::instance();
 	}
 
-	void AudioListener::setVelocity(const Vector3& velocity)
+	RTTITypeBase* AudioListener::getRTTI() const
 	{
-		mVelocity = velocity;
+		return AudioListener::getRTTIStatic();
 	}
-
-	SPtr<AudioListener> AudioListener::create()
-	{
-		return gAudio().createListener();
-	}	
 }

+ 10 - 22
Source/BansheeCore/Audio/BsAudioListener.h

@@ -3,6 +3,7 @@
 #pragma once
 
 #include "BsCorePrerequisites.h"
+#include "Scene/BsSceneActor.h"
 #include "Math/BsVector3.h"
 
 namespace bs
@@ -15,29 +16,11 @@ namespace bs
 	 * Represents a listener that hears audio sources. For spatial audio the volume and pitch of played audio is determined
 	 * by the distance, orientation and velocity differences between the source and the listener.
 	 */
-	class BS_CORE_EXPORT AudioListener
+	class BS_CORE_EXPORT AudioListener : public IReflectable, public SceneActor
 	{
 	public:
 		virtual ~AudioListener() {}
 
-		/** Sets the position of the listener in world space. */
-		virtual void setPosition(const Vector3& position);
-
-		/** Retrieves the position of the listener in world space. */
-		Vector3 getPosition() const { return mPosition; }
-
-		/** Sets the forward direction of the listener in world space. */
-		virtual void setDirection(const Vector3& direction);
-
-		/** Retrieves the forward direction of the listener in world space. */
-		Vector3 getDirection() const { return mDirection; }
-
-		/** Sets the up direction of the listener in world space. */
-		virtual void setUp(const Vector3& up);
-
-		/** Retrieves the up direction of the listener in world space. */
-		Vector3 getUp() const { return mUp; }
-
 		/** Sets the velocity of the listener. */
 		virtual void setVelocity(const Vector3& velocity);
 
@@ -50,10 +33,15 @@ namespace bs
 	protected:
 		AudioListener();
 
-		Vector3 mPosition;
-		Vector3 mDirection;
-		Vector3 mUp;
 		Vector3 mVelocity;
+
+		/************************************************************************/
+		/* 								RTTI		                     		*/
+		/************************************************************************/
+	public:
+		friend class AudioListenerRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		RTTITypeBase* getRTTI() const override;
 	};
 
 	/** @} */

+ 12 - 7
Source/BansheeCore/Audio/BsAudioSource.cpp

@@ -3,12 +3,12 @@
 #include "Audio/BsAudioSource.h"
 #include "Audio/BsAudio.h"
 #include "Math/BsMath.h"
+#include "RTTI/BsAudioSourceRTTI.h"
 
 namespace bs
 {
 	AudioSource::AudioSource()
-		: mPosition(BsZero), mVelocity(BsZero), mVolume(1.0f), mPitch(1.0f), mLoop(false), mPriority(0)
-		, mMinDistance(1.0f), mAttenuation(1.0f)
+		: mVelocity(BsZero), mVolume(1.0f), mPitch(1.0f), mLoop(false), mPriority(0), mMinDistance(1.0f), mAttenuation(1.0f)
 	{
 
 	}
@@ -20,11 +20,6 @@ namespace bs
 		markListenerResourcesDirty();
 	}
 
-	void AudioSource::setPosition(const Vector3& position)
-	{
-		mPosition = position;
-	}
-
 	void AudioSource::setVelocity(const Vector3& velocity)
 	{
 		mVelocity = velocity;
@@ -75,4 +70,14 @@ namespace bs
 	{
 		onClipChanged();
 	}
+
+	RTTITypeBase* AudioSource::getRTTIStatic()
+	{
+		return AudioSourceRTTI::instance();
+	}
+
+	RTTITypeBase* AudioSource::getRTTI() const
+	{
+		return AudioSource::getRTTIStatic();
+	}
 }

+ 10 - 11
Source/BansheeCore/Audio/BsAudioSource.h

@@ -4,6 +4,7 @@
 
 #include "BsCorePrerequisites.h"
 #include "Resources/BsIResourceListener.h"
+#include "Scene/BsSceneActor.h"
 #include "Math/BsVector3.h"
 
 namespace bs
@@ -27,7 +28,7 @@ namespace bs
 	 * Whether or not an audio source is spatial is controlled by the assigned AudioClip. The volume and the pitch of a
 	 * spatial audio source is controlled by its position and the AudioListener's position/direction/velocity.
 	 */
-	class BS_CORE_EXPORT AudioSource : public IResourceListener
+	class BS_CORE_EXPORT AudioSource : public IReflectable, public SceneActor, public IResourceListener
 	{
 	public:
 		virtual ~AudioSource() { }
@@ -38,15 +39,6 @@ namespace bs
 		/** @copydoc setClip() */
 		HAudioClip getClip() const { return mAudioClip; }
 
-		/** 
-		 * World position of the source. Determines volume/pitch in relation to AudioListener's position. Only relevant
-		 * for spatial (3D) sources. 
-		 */
-		virtual void setPosition(const Vector3& position);
-
-		/** @copydoc setPosition() */
-		Vector3 getPosition() const { return mPosition; }
-
 		/** 
 		 * Velocity of the source. Determines pitch in relation to AudioListener's position. Only relevant for spatial 
 		 * (3D) sources. 
@@ -138,7 +130,6 @@ namespace bs
 		virtual void onClipChanged() { }
 
 		HAudioClip mAudioClip;
-		Vector3 mPosition;
 		Vector3 mVelocity;
 		float mVolume;
 		float mPitch;
@@ -146,6 +137,14 @@ namespace bs
 		INT32 mPriority;
 		float mMinDistance;
 		float mAttenuation;
+
+		/************************************************************************/
+		/* 								RTTI		                     		*/
+		/************************************************************************/
+	public:
+		friend class AudioSourceRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		RTTITypeBase* getRTTI() const override;
 	};
 
 	/** @} */

+ 2 - 0
Source/BansheeCore/BsCorePrerequisites.h

@@ -578,6 +578,8 @@ namespace bs
 		TID_CLightProbeVolume = 1138,
 		TID_Transform = 1139,
 		TID_SceneActor = 1140,
+		TID_AudioListener = 1141,
+		TID_AudioSource = 1142,
 
 		// Moved from Engine layer
 		TID_CCamera = 30000,

+ 2 - 0
Source/BansheeCore/CMakeSources.cmake

@@ -373,6 +373,8 @@ set(BS_BANSHEECORE_INC_RTTI
 	"RTTI/BsLightProbeVolumeRTTI.h"
 	"RTTI/BsCLightProbeVolumeRTTI.h"
 	"RTTI/BsTransformRTTI.h"
+	"RTTI/BsAudioListenerRTTI.h"
+	"RTTI/BsAudioSourceRTTI.h"
 )
 
 set(BS_BANSHEECORE_SRC_RENDERER

+ 1 - 3
Source/BansheeCore/Components/BsCAudioListener.cpp

@@ -71,9 +71,7 @@ namespace bs
 	{
 		const Transform& tfrm = SO()->getTransform();
 
-		mInternal->setPosition(tfrm.getPosition());
-		mInternal->setDirection(tfrm.getForward());
-		mInternal->setUp(tfrm.getUp());
+		mInternal->setTransform(tfrm);
 		mInternal->setVelocity(mVelocity);
 	}
 	

+ 1 - 1
Source/BansheeCore/Components/BsCAudioSource.cpp

@@ -199,7 +199,7 @@ namespace bs
 
 	void CAudioSource::updateTransform()
 	{
-		mInternal->setPosition(SO()->getTransform().getPosition());
+		mInternal->setTransform(SO()->getTransform());
 		mInternal->setVelocity(mVelocity);
 	}
 

+ 5 - 5
Source/BansheeCore/Components/BsCAudioSource.h

@@ -17,9 +17,9 @@ namespace bs
 	 *
 	 * @note Wraps AudioSource as a Component.
 	 */
-    class BS_CORE_EXPORT BS_SCRIPT_EXPORT(m:Audio,n:AudioSource) CAudioSource : public Component
-    {
-    public:
+	class BS_CORE_EXPORT BS_SCRIPT_EXPORT(m:Audio,n:AudioSource) CAudioSource : public Component
+	{
+	public:
 		CAudioSource(const HSceneObject& parent);
 		virtual ~CAudioSource() {}
 		
@@ -143,7 +143,7 @@ namespace bs
 
 		/** @copydoc Component::update() */
 		void update() override;
-    protected:
+	protected:
 		using Component::destroyInternal;
 
 		/** Creates the internal representation of the AudioSource and restores the values saved by the Component. */
@@ -181,7 +181,7 @@ namespace bs
 
 	protected:
 		CAudioSource() {} // Serialization only
-     };
+	 };
 
 	 /** @} */
 }

+ 50 - 0
Source/BansheeCore/RTTI/BsAudioListenerRTTI.h

@@ -0,0 +1,50 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsCorePrerequisites.h"
+#include "Reflection/BsRTTIType.h"
+#include "Audio/BsAudioListener.h"
+
+namespace bs
+{
+	/** @cond RTTI */
+	/** @addtogroup RTTI-Impl-Engine
+	 *  @{
+	 */
+
+	class BS_CORE_EXPORT AudioListenerRTTI : public RTTIType<AudioListener, IReflectable, AudioListenerRTTI>
+	{
+	private:
+		BS_BEGIN_RTTI_MEMBERS
+			BS_RTTI_MEMBER_REFL(mTransform, 0)
+			BS_RTTI_MEMBER_PLAIN(mActive, 1)
+			BS_RTTI_MEMBER_PLAIN(mMobility, 2)
+			BS_RTTI_MEMBER_PLAIN(mVelocity, 3)
+		BS_END_RTTI_MEMBERS
+
+	public:
+		AudioListenerRTTI()
+			:mInitMembers(this)
+		{ }
+
+		const String& getRTTIName() override
+		{
+			static String name = "AudioListener";
+			return name;
+		}
+
+		UINT32 getRTTIId() override
+		{
+			return TID_AudioListener;
+		}
+
+		SPtr<IReflectable> newRTTIObject() override
+		{
+			return AudioListener::create();
+		}
+	};
+
+	/** @} */
+	/** @endcond */
+}

+ 56 - 0
Source/BansheeCore/RTTI/BsAudioSourceRTTI.h

@@ -0,0 +1,56 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsCorePrerequisites.h"
+#include "Reflection/BsRTTIType.h"
+#include "Audio/BsAudioSource.h"
+
+namespace bs
+{
+	/** @cond RTTI */
+	/** @addtogroup RTTI-Impl-Engine
+	 *  @{
+	 */
+
+	class BS_CORE_EXPORT AudioSourceRTTI : public RTTIType<AudioSource, IReflectable, AudioSourceRTTI>
+	{
+	private:
+		BS_BEGIN_RTTI_MEMBERS
+			BS_RTTI_MEMBER_REFL(mTransform, 0)
+			BS_RTTI_MEMBER_PLAIN(mActive, 1)
+			BS_RTTI_MEMBER_PLAIN(mMobility, 2)
+			BS_RTTI_MEMBER_PLAIN(mVelocity, 3)
+			BS_RTTI_MEMBER_REFL(mAudioClip, 4)
+			BS_RTTI_MEMBER_PLAIN(mVolume, 5)
+			BS_RTTI_MEMBER_PLAIN(mPitch, 6)
+			BS_RTTI_MEMBER_PLAIN(mLoop, 7)
+			BS_RTTI_MEMBER_PLAIN(mPriority, 8)
+			BS_RTTI_MEMBER_PLAIN(mMinDistance, 9)
+			BS_RTTI_MEMBER_PLAIN(mAttenuation, 10)
+		BS_END_RTTI_MEMBERS
+	public:
+		AudioSourceRTTI()
+			:mInitMembers(this)
+		{ }
+
+		const String& getRTTIName() override
+		{
+			static String name = "AudioSource";
+			return name;
+		}
+
+		UINT32 getRTTIId() override
+		{
+			return TID_AudioSource;
+		}
+
+		SPtr<IReflectable> newRTTIObject() override
+		{
+			return AudioSource::create();
+		}
+	};
+
+	/** @} */
+	/** @endcond */
+}

+ 4 - 0
Source/BansheeCore/RTTI/BsCAudioListenerRTTI.h

@@ -16,8 +16,12 @@ namespace bs
 
 	class BS_CORE_EXPORT CAudioListenerRTTI : public RTTIType<CAudioListener, Component, CAudioListenerRTTI>
 	{
+		BS_BEGIN_RTTI_MEMBERS
+			BS_RTTI_MEMBER_REFLPTR(mInternal, 0)
+		BS_END_RTTI_MEMBERS
 	public:
 		CAudioListenerRTTI()
+			:mInitMembers(this)
 		{ }
 
 		const String& getRTTIName() override

+ 2 - 8
Source/BansheeCore/RTTI/BsCAudioSourceRTTI.h

@@ -17,14 +17,8 @@ namespace bs
 	class BS_CORE_EXPORT CAudioSourceRTTI : public RTTIType<CAudioSource, Component, CAudioSourceRTTI>
 	{
 		BS_BEGIN_RTTI_MEMBERS
-			BS_RTTI_MEMBER_REFL(mAudioClip, 0)
-			BS_RTTI_MEMBER_PLAIN(mVolume, 1)
-			BS_RTTI_MEMBER_PLAIN(mPitch, 2)
-			BS_RTTI_MEMBER_PLAIN(mLoop, 3)
-			BS_RTTI_MEMBER_PLAIN(mPriority, 4)
-			BS_RTTI_MEMBER_PLAIN(mMinDistance, 5)
-			BS_RTTI_MEMBER_PLAIN(mAttenuation, 6)
-			BS_RTTI_MEMBER_PLAIN(mPlayOnStart, 7)
+			BS_RTTI_MEMBER_REFLPTR(mInternal, 0)
+			BS_RTTI_MEMBER_PLAIN(mPlayOnStart, 1)
 		BS_END_RTTI_MEMBERS
 	public:
 		CAudioSourceRTTI()

+ 18 - 28
Source/BansheeFMOD/BsFMODAudioListener.cpp

@@ -15,34 +15,20 @@ namespace bs
 		gFMODAudio()._unregisterListener(this);
 	}
 
-	void FMODAudioListener::setPosition(const Vector3& position)
+	void FMODAudioListener::setTransform(const Transform& transform)
 	{
-		AudioListener::setPosition(position);
+		AudioListener::setTransform(transform);
 
-		FMOD::System* fmod = gFMODAudio()._getFMOD();
-		FMOD_VECTOR value = { position.x, position.y, position.z };
-
-		fmod->set3DListenerAttributes(mId, &value, nullptr, nullptr, nullptr);
-	}
-
-	void FMODAudioListener::setDirection(const Vector3& direction)
-	{
-		AudioListener::setDirection(direction);
-
-		FMOD::System* fmod = gFMODAudio()._getFMOD();
-		FMOD_VECTOR value = { direction.x, direction.y, direction.z };
-
-		fmod->set3DListenerAttributes(mId, nullptr, nullptr, &value, nullptr);
-	}
-
-	void FMODAudioListener::setUp(const Vector3& up)
-	{
-		AudioListener::setUp(up);
+		Vector3 position = transform.getPosition();
+		Vector3 direction = transform.getForward();
+		Vector3 up = transform.getUp();
 
 		FMOD::System* fmod = gFMODAudio()._getFMOD();
-		FMOD_VECTOR value = { up.x, up.y, up.z };
+		FMOD_VECTOR fmodPos = { position.x, position.y, position.z };
+		FMOD_VECTOR fmodDir = { direction.x, direction.y, direction.z };
+		FMOD_VECTOR fmodUp = { up.x, up.y, up.z };
 
-		fmod->set3DListenerAttributes(mId, nullptr, nullptr, nullptr, &value);
+		fmod->set3DListenerAttributes(mId, &fmodPos, nullptr, &fmodDir, &fmodUp);
 	}
 
 	void FMODAudioListener::setVelocity(const Vector3& velocity)
@@ -59,12 +45,16 @@ namespace bs
 	{
 		mId = id;
 
+		Vector3 position = mTransform.getPosition();
+		Vector3 direction = mTransform.getForward();
+		Vector3 up = mTransform.getUp();
+
 		FMOD::System* fmod = gFMODAudio()._getFMOD();
-		FMOD_VECTOR position = { mPosition.x, mPosition.y, mPosition.z };
-		FMOD_VECTOR velocity = { mVelocity.x, mVelocity.y, mVelocity.z };
-		FMOD_VECTOR forward = { mDirection.x, mDirection.y, mDirection.z };
-		FMOD_VECTOR up = { mUp.x, mUp.y, mUp.z };
+		FMOD_VECTOR fmodPosition = { position.x, position.y, position.z };
+		FMOD_VECTOR fmodVelocity = { mVelocity.x, mVelocity.y, mVelocity.z };
+		FMOD_VECTOR fmodForward = { direction.x, direction.y, direction.z };
+		FMOD_VECTOR fmodUp = { up.x, up.y, up.z };
 
-		fmod->set3DListenerAttributes(mId, &position, &velocity, &forward, &up);
+		fmod->set3DListenerAttributes(mId, &fmodPosition, &fmodVelocity, &fmodForward, &fmodUp);
 	}
 }

+ 2 - 8
Source/BansheeFMOD/BsFMODAudioListener.h

@@ -18,14 +18,8 @@ namespace bs
 		FMODAudioListener();
 		virtual ~FMODAudioListener();
 
-		/** @copydoc AudioListener::setPosition */
-		void setPosition(const Vector3& position) override;
-
-		/** @copydoc AudioListener::setDirection */
-		void setDirection(const Vector3& direction) override;
-
-		/** @copydoc AudioListener::setUp */
-		void setUp(const Vector3& up) override;
+		/** @copydoc SceneActor::setTransform */
+		void setTransform(const Transform& transform) override;
 
 		/** @copydoc AudioListener::setVelocity */
 		void setVelocity(const Vector3& velocity) override;

+ 8 - 4
Source/BansheeFMOD/BsFMODAudioSource.cpp

@@ -31,12 +31,14 @@ namespace bs
 		AudioSource::setClip(clip);
 	}
 
-	void FMODAudioSource::setPosition(const Vector3& position)
+	void FMODAudioSource::setTransform(const Transform& transform)
 	{
-		AudioSource::setPosition(position);
+		AudioSource::setTransform(transform);
 
-		if (mChannel != nullptr)
+		if(mChannel != nullptr)
 		{
+			Vector3 position = transform.getPosition();
+
 			FMOD_VECTOR fmodPosition = { position.x, position.y, position.z };
 			mChannel->set3DAttributes(&fmodPosition, nullptr);
 		}
@@ -133,7 +135,9 @@ namespace bs
 			mChannel->setPriority(mPriority);
 			mChannel->setPosition((UINT32)(mTime * 1000.0f), FMOD_TIMEUNIT_MS);
 
-			FMOD_VECTOR fmodPosition = { mPosition.x, mPosition.y, mPosition.z };
+			Vector3 position = getTransform().getPosition();
+
+			FMOD_VECTOR fmodPosition = { position.x, position.y, position.z };
 			FMOD_VECTOR fmodVelocity = { mVelocity.x, mVelocity.y, mVelocity.z };
 			mChannel->set3DAttributes(&fmodPosition, &fmodVelocity);
 		}

+ 3 - 3
Source/BansheeFMOD/BsFMODAudioSource.h

@@ -19,12 +19,12 @@ namespace bs
 		FMODAudioSource();
 		virtual ~FMODAudioSource();
 
+		/** @copydoc SceneActor::setTransform */
+		void setTransform(const Transform& transform) override;
+
 		/** @copydoc AudioSource::setClip */
 		void setClip(const HAudioClip& clip) override;
 
-		/** @copydoc AudioSource::setPosition */
-		void setPosition(const Vector3& position) override;
-
 		/** @copydoc AudioSource::setVelocity */
 		void setVelocity(const Vector3& velocity) override;
 

+ 15 - 38
Source/BansheeOpenAudio/BsOAAudioListener.cpp

@@ -17,38 +17,9 @@ namespace bs
 		gOAAudio()._unregisterListener(this);
 	}
 
-	void OAAudioListener::setPosition(const Vector3& position)
+	void OAAudioListener::setTransform(const Transform& transform)
 	{
-		AudioListener::setPosition(position);
-
-		auto& contexts = gOAAudio()._getContexts();
-		if (contexts.size() > 1)
-		{
-			auto context = gOAAudio()._getContext(this);
-			alcMakeContextCurrent(context);
-		}
-
-		updatePosition();
-	}
-
-	void OAAudioListener::setDirection(const Vector3& direction)
-	{
-		AudioListener::setDirection(direction);
-
-		std::array<float, 6> orientation = getOrientation();
-		auto& contexts = gOAAudio()._getContexts();
-		if (contexts.size() > 1)
-		{
-			auto context = gOAAudio()._getContext(this);
-			alcMakeContextCurrent(context);
-		}
-
-		updateOrientation(orientation);
-	}
-
-	void OAAudioListener::setUp(const Vector3& up)
-	{
-		AudioListener::setUp(up);
+		AudioListener::setTransform(transform);
 
 		std::array<float, 6> orientation = getOrientation();
 		auto& contexts = gOAAudio()._getContexts();
@@ -59,6 +30,7 @@ namespace bs
 			alcMakeContextCurrent(context);
 		}
 
+		updatePosition();
 		updateOrientation(orientation);
 	}
 
@@ -97,20 +69,25 @@ namespace bs
 
 	std::array<float, 6> OAAudioListener::getOrientation() const
 	{
+		Vector3 direction = getTransform().getForward();
+		Vector3 up = getTransform().getUp();
+
 		return
 		{
-			mDirection.x,
-			mDirection.y,
-			mDirection.z,
-			mUp.x,
-			mUp.y,
-			mUp.z
+			direction.x,
+			direction.y,
+			direction.z,
+			up.x,
+			up.y,
+			up.z
 		};
 	}
 
 	void OAAudioListener::updatePosition()
 	{
-		alListener3f(AL_POSITION, mPosition.x, mPosition.y, mPosition.z);
+		Vector3 position = getTransform().getPosition();
+
+		alListener3f(AL_POSITION, position.x, position.y, position.z);
 	}
 
 	void OAAudioListener::updateOrientation(const std::array<float, 6>& orientation)

+ 2 - 8
Source/BansheeOpenAudio/BsOAAudioListener.h

@@ -18,14 +18,8 @@ namespace bs
 		OAAudioListener();
 		virtual ~OAAudioListener();
 
-		/** @copydoc AudioListener::setPosition */
-		void setPosition(const Vector3& position) override;
-
-		/** @copydoc AudioListener::setDirection */
-		void setDirection(const Vector3& direction) override;
-
-		/** @copydoc AudioListener::setUp */
-		void setUp(const Vector3& up) override;
+		/** @copydoc SceneActor::setTransform */
+		void setTransform(const Transform& transform) override;
 
 		/** @copydoc AudioListener::setVelocity */
 		void setVelocity(const Vector3& velocity) override;

+ 8 - 3
Source/BansheeOpenAudio/BsOAAudioSource.cpp

@@ -32,9 +32,9 @@ namespace bs
 		applyClip();
 	}
 
-	void OAAudioSource::setPosition(const Vector3& position)
+	void OAAudioSource::setTransform(const Transform& transform)
 	{
-		AudioSource::setPosition(position);
+		AudioSource::setTransform(transform);
 
 		auto& contexts = gOAAudio()._getContexts();
 		UINT32 numContexts = (UINT32)contexts.size();
@@ -44,7 +44,10 @@ namespace bs
 				alcMakeContextCurrent(contexts[i]);
 
 			if (is3D())
+			{
+				Vector3 position = transform.getPosition();
 				alSource3f(mSourceIDs[i], AL_POSITION, position.x, position.y, position.z);
+			}
 			else
 				alSource3f(mSourceIDs[i], AL_POSITION, 0.0f, 0.0f, 0.0f);
 		}
@@ -389,8 +392,10 @@ namespace bs
 
 			if (is3D())
 			{
+				Vector3 position = mTransform.getPosition();
+
 				alSourcei(mSourceIDs[i], AL_SOURCE_RELATIVE, false);
-				alSource3f(mSourceIDs[i], AL_POSITION, mPosition.x, mPosition.y, mPosition.z);
+				alSource3f(mSourceIDs[i], AL_POSITION, position.x, position.y, position.z);
 				alSource3f(mSourceIDs[i], AL_VELOCITY, mVelocity.x, mVelocity.y, mVelocity.z);
 			}
 			else

+ 3 - 3
Source/BansheeOpenAudio/BsOAAudioSource.h

@@ -18,12 +18,12 @@ namespace bs
 		OAAudioSource();
 		virtual ~OAAudioSource();
 
+		/** @copydoc SceneActor::setTransform */
+		void setTransform(const Transform& transform) override;
+
 		/** @copydoc AudioSource::setClip */
 		void setClip(const HAudioClip& clip) override;
 
-		/** @copydoc AudioSource::setPosition */
-		void setPosition(const Vector3& position) override;
-
 		/** @copydoc AudioSource::setVelocity */
 		void setVelocity(const Vector3& velocity) override;