Przeglądaj źródła

Added C++ wrappers for AudioSource/AudioListener managed interop

BearishSun 9 lat temu
rodzic
commit
127ba3a962

+ 4 - 0
Source/SBansheeEngine/CMakeSources.cmake

@@ -135,6 +135,8 @@ set(BS_SBANSHEEENGINE_INC_WRAPPERS
 	"Include/BsScriptPostProcessSettings.h"
 	"Include/BsScriptAudioClip.h"
 	"Include/BsScriptAudio.h"
+	"Include/BsScriptAudioSource.h"
+	"Include/BsScriptAudioListener.h"
 )
 
 set(BS_SBANSHEEENGINE_INC_WRAPPERS_GUI
@@ -260,6 +262,8 @@ set(BS_SBANSHEEENGINE_SRC_WRAPPERS
 	"Source/BsScriptPostProcessSettings.cpp"
 	"Source/BsScriptAudioClip.cpp"
 	"Source/BsScriptAudio.cpp"
+	"Source/BsScriptAudioSource.cpp"
+	"Source/BsScriptAudioListener.cpp"
 )
 
 set(BS_SBANSHEEENGINE_INC_SERIALIZATION

+ 38 - 0
Source/SBansheeEngine/Include/BsScriptAudioListener.h

@@ -0,0 +1,38 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup ScriptInteropEngine
+	 *  @{
+	 */
+
+	/** Interop class between C++ & CLR for AudioListener. */
+	class BS_SCR_BE_EXPORT ScriptAudioListener : public ScriptObject<ScriptAudioListener>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeAudioListener")
+
+	private:
+		ScriptAudioListener(MonoObject* instance, const SPtr<AudioListener>& listener);
+
+		SPtr<AudioListener> mListener;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static void internal_Destroy(ScriptAudioListener* thisPtr);
+
+		static void internal_SetPosition(ScriptAudioListener* thisPtr, Vector3* position);
+		static void internal_SetDirection(ScriptAudioListener* thisPtr, Vector3* direction);
+		static void internal_SetUp(ScriptAudioListener* thisPtr, Vector3* up);
+		static void internal_SetVelocity(ScriptAudioListener* thisPtr, Vector3* velocity);
+	};
+
+	/** @} */
+}

+ 48 - 0
Source/SBansheeEngine/Include/BsScriptAudioSource.h

@@ -0,0 +1,48 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup ScriptInteropEngine
+	 *  @{
+	 */
+
+	/** Interop class between C++ & CLR for AudioSource. */
+	class BS_SCR_BE_EXPORT ScriptAudioSource : public ScriptObject<ScriptAudioSource>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeAudioSource")
+
+	private:
+		ScriptAudioSource(MonoObject* instance, const SPtr<AudioSource>& source);
+
+		SPtr<AudioSource> mSource;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static void internal_Destroy(ScriptAudioSource* thisPtr);
+
+		static void internal_SetPosition(ScriptAudioSource* thisPtr, Vector3* position);
+		static void internal_SetVelocity(ScriptAudioSource* thisPtr, Vector3* velocity);
+		static void internal_SetClip(ScriptAudioSource* thisPtr, ScriptAudioClip* clip);
+		static void internal_SetVolume(ScriptAudioSource* thisPtr, float volume);
+		static void internal_SetPitch(ScriptAudioSource* thisPtr, float pitch);
+		static void internal_SetIsLooping(ScriptAudioSource* thisPtr, bool loop);
+		static void internal_SetPriority(ScriptAudioSource* thisPtr, UINT32 priority);
+		static void internal_SetMinDistance(ScriptAudioSource* thisPtr, float distance);
+		static void internal_SetAttenuation(ScriptAudioSource* thisPtr, float attenuation);
+		static void internal_Play(ScriptAudioSource* thisPtr);
+		static void internal_Pause(ScriptAudioSource* thisPtr);
+		static void internal_Stop(ScriptAudioSource* thisPtr);
+		static void internal_Seek(ScriptAudioSource* thisPtr, float position);
+		static UINT32 internal_GetState(ScriptAudioSource* thisPtr);
+	};
+
+	/** @} */
+}

+ 57 - 0
Source/SBansheeEngine/Source/BsScriptAudioListener.cpp

@@ -0,0 +1,57 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptAudioListener.h"
+#include "BsMonoUtil.h"
+#include "BsMonoClass.h"
+#include "BsMonoMethod.h"
+#include "BsAudioListener.h"
+
+using namespace std::placeholders;
+
+namespace BansheeEngine
+{
+	ScriptAudioListener::ScriptAudioListener(MonoObject* instance, const SPtr<AudioListener>& listener)
+		:ScriptObject(instance), mListener(listener)
+	{ }
+
+	void ScriptAudioListener::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptAudioListener::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptAudioListener::internal_Destroy);
+		metaData.scriptClass->addInternalCall("Internal_SetPosition", &ScriptAudioListener::internal_SetPosition);
+		metaData.scriptClass->addInternalCall("Internal_SetDirection", &ScriptAudioListener::internal_SetDirection);
+		metaData.scriptClass->addInternalCall("Internal_SetUp", &ScriptAudioListener::internal_SetUp);
+		metaData.scriptClass->addInternalCall("Internal_SetVelocity", &ScriptAudioListener::internal_SetVelocity);
+	}
+
+	void ScriptAudioListener::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<AudioListener> listener = AudioListener::create();
+		new (bs_alloc<ScriptAudioListener>()) ScriptAudioListener(instance, listener);
+	}
+
+	void ScriptAudioListener::internal_Destroy(ScriptAudioListener* thisPtr)
+	{
+		thisPtr->mListener = nullptr;
+	}
+
+	void ScriptAudioListener::internal_SetPosition(ScriptAudioListener* thisPtr, Vector3* position)
+	{
+		thisPtr->mListener->setPosition(*position);
+	}
+
+	void ScriptAudioListener::internal_SetDirection(ScriptAudioListener* thisPtr, Vector3* direction)
+	{
+		thisPtr->mListener->setDirection(*direction);
+	}
+
+	void ScriptAudioListener::internal_SetUp(ScriptAudioListener* thisPtr, Vector3* up)
+	{
+		thisPtr->mListener->setUp(*up);
+	}
+
+	void ScriptAudioListener::internal_SetVelocity(ScriptAudioListener* thisPtr, Vector3* velocity)
+	{
+		thisPtr->mListener->setVelocity(*velocity);
+	}
+}

+ 122 - 0
Source/SBansheeEngine/Source/BsScriptAudioSource.cpp

@@ -0,0 +1,122 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptAudioSource.h"
+#include "BsMonoUtil.h"
+#include "BsMonoClass.h"
+#include "BsMonoMethod.h"
+#include "BsAudioSource.h"
+#include "BsScriptAudioClip.h"
+
+using namespace std::placeholders;
+
+namespace BansheeEngine
+{
+	ScriptAudioSource::ScriptAudioSource(MonoObject* instance, const SPtr<AudioSource>& source)
+		:ScriptObject(instance), mSource(source)
+	{ }
+
+	void ScriptAudioSource::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptAudioSource::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptAudioSource::internal_Destroy);
+		metaData.scriptClass->addInternalCall("Internal_SetPosition", &ScriptAudioSource::internal_SetPosition);
+		metaData.scriptClass->addInternalCall("Internal_SetVelocity", &ScriptAudioSource::internal_SetVelocity);
+		metaData.scriptClass->addInternalCall("Internal_SetClip", &ScriptAudioSource::internal_SetClip);
+		metaData.scriptClass->addInternalCall("Internal_SetVolume", &ScriptAudioSource::internal_SetVolume);
+		metaData.scriptClass->addInternalCall("Internal_SetPitch", &ScriptAudioSource::internal_SetPitch);
+		metaData.scriptClass->addInternalCall("Internal_SetIsLooping", &ScriptAudioSource::internal_SetIsLooping);
+		metaData.scriptClass->addInternalCall("Internal_SetPriority", &ScriptAudioSource::internal_SetPriority);
+		metaData.scriptClass->addInternalCall("Internal_SetMinDistance", &ScriptAudioSource::internal_SetMinDistance);
+		metaData.scriptClass->addInternalCall("Internal_SetAttenuation", &ScriptAudioSource::internal_SetAttenuation);
+		metaData.scriptClass->addInternalCall("Internal_Play", &ScriptAudioSource::internal_Play);
+		metaData.scriptClass->addInternalCall("Internal_Pause", &ScriptAudioSource::internal_Pause);
+		metaData.scriptClass->addInternalCall("Internal_Stop", &ScriptAudioSource::internal_Stop);
+		metaData.scriptClass->addInternalCall("Internal_Seek", &ScriptAudioSource::internal_Seek);
+		metaData.scriptClass->addInternalCall("Internal_GetState", &ScriptAudioSource::internal_GetState);
+	}
+
+	void ScriptAudioSource::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<AudioSource> source = AudioSource::create();
+		new (bs_alloc<ScriptAudioSource>()) ScriptAudioSource(instance, source);
+	}
+
+	void ScriptAudioSource::internal_Destroy(ScriptAudioSource* thisPtr)
+	{
+		thisPtr->mSource = nullptr;
+	}
+
+	void ScriptAudioSource::internal_SetPosition(ScriptAudioSource* thisPtr, Vector3* position)
+	{
+		thisPtr->mSource->setPosition(*position);
+	}
+
+	void ScriptAudioSource::internal_SetVelocity(ScriptAudioSource* thisPtr, Vector3* velocity)
+	{
+		thisPtr->mSource->setVelocity(*velocity);
+	}
+
+	void ScriptAudioSource::internal_SetClip(ScriptAudioSource* thisPtr, ScriptAudioClip* clip)
+	{
+		HAudioClip audioClip;
+		if (clip != nullptr)
+			audioClip = clip->getHandle();
+
+		thisPtr->mSource->setClip(audioClip);
+	}
+
+	void ScriptAudioSource::internal_SetVolume(ScriptAudioSource* thisPtr, float volume)
+	{
+		thisPtr->mSource->setVolume(volume);
+	}
+
+	void ScriptAudioSource::internal_SetPitch(ScriptAudioSource* thisPtr, float pitch)
+	{
+		thisPtr->mSource->setPitch(pitch);
+	}
+
+	void ScriptAudioSource::internal_SetIsLooping(ScriptAudioSource* thisPtr, bool loop)
+	{
+		thisPtr->mSource->setIsLooping(loop);
+	}
+
+	void ScriptAudioSource::internal_SetPriority(ScriptAudioSource* thisPtr, UINT32 priority)
+	{
+		thisPtr->mSource->setPriority(priority);
+	}
+
+	void ScriptAudioSource::internal_SetMinDistance(ScriptAudioSource* thisPtr, float distance)
+	{
+		thisPtr->mSource->setMinDistance(distance);
+	}
+
+	void ScriptAudioSource::internal_SetAttenuation(ScriptAudioSource* thisPtr, float attenuation)
+	{
+		thisPtr->mSource->setAttenuation(attenuation);
+	}
+
+	void ScriptAudioSource::internal_Play(ScriptAudioSource* thisPtr)
+	{
+		thisPtr->mSource->play();
+	}
+
+	void ScriptAudioSource::internal_Pause(ScriptAudioSource* thisPtr)
+	{
+		thisPtr->mSource->pause();
+	}
+
+	void ScriptAudioSource::internal_Stop(ScriptAudioSource* thisPtr)
+	{
+		thisPtr->mSource->stop();
+	}
+
+	void ScriptAudioSource::internal_Seek(ScriptAudioSource* thisPtr, float position)
+	{
+		thisPtr->mSource->seek(position);
+	}
+
+	UINT32 ScriptAudioSource::internal_GetState(ScriptAudioSource* thisPtr)
+	{
+		return (UINT32)thisPtr->mSource->getState();
+	}
+}