Parcourir la source

Added script interop objects for all joint types

BearishSun il y a 9 ans
Parent
commit
c33aed0079

+ 35 - 0
SBansheeEngine/Include/BsScriptDistanceJoint.h

@@ -0,0 +1,35 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptCollider.h"
+#include "BsScriptJoint.h"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for DistanceJoint. */
+	class BS_SCR_BE_EXPORT ScriptDistanceJoint : public TScriptJoint<ScriptDistanceJoint>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeDistanceJoint")
+	private:
+		ScriptDistanceJoint(MonoObject* instance, const SPtr<Joint>& joint);
+
+		/** Returns the native distance joint wrapped by this object. */
+		DistanceJoint* getDistanceJoint() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static float internal_GetDistance(ScriptDistanceJoint* thisPtr);
+		static void internal_SetMinDistance(ScriptDistanceJoint* thisPtr, float value);
+		static void internal_SetMaxDistance(ScriptDistanceJoint* thisPtr, float value);
+		static void internal_SetTolerance(ScriptDistanceJoint* thisPtr, float value);
+		static void internal_SetSpring(ScriptDistanceJoint* thisPtr, Spring* value);
+		static void internal_SetEnableMinDistanceLimit(ScriptDistanceJoint* thisPtr, bool value);
+		static void internal_SetEnableMaxDistanceLimit(ScriptDistanceJoint* thisPtr, bool value);
+		static void internal_SetEnableSpring(ScriptDistanceJoint* thisPtr, bool value);
+	};
+}

+ 12 - 0
SBansheeEngine/SBansheeEngine.vcxproj

@@ -287,6 +287,7 @@
     <ClInclude Include="Include\BsScriptControllerCollision.h" />
     <ClInclude Include="Include\BsScriptCursor.h" />
     <ClInclude Include="Include\BsScriptDebug.h" />
+    <ClInclude Include="Include\BsScriptDistanceJoint.h" />
     <ClInclude Include="Include\BsScriptEnginePrerequisites.h" />
     <ClInclude Include="Include\BsScriptFontBitmap.h" />
     <ClInclude Include="Include\BsScriptGameObject.h" />
@@ -376,6 +377,11 @@
     <ClInclude Include="Include\BsScriptVector2I.h" />
     <ClInclude Include="Include\BsScriptVirtualButton.h" />
     <ClInclude Include="Include\BsScriptVirtualInput.h" />
+    <ClInclude Include="Source\BsScriptD6Joint.h" />
+    <ClInclude Include="Source\BsScriptFixedJoint.h" />
+    <ClInclude Include="Source\BsScriptHingeJoint.h" />
+    <ClInclude Include="Source\BsScriptSliderJoint.h" />
+    <ClInclude Include="Source\BsScriptSphericalJoint.h" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsEngineScriptLibrary.cpp" />
@@ -401,8 +407,11 @@
     <ClCompile Include="Source\BsScriptContextMenu.cpp" />
     <ClCompile Include="Source\BsScriptControllerCollision.cpp" />
     <ClCompile Include="Source\BsScriptCursor.cpp" />
+    <ClCompile Include="Source\BsScriptD6Joint.cpp" />
     <ClCompile Include="Source\BsScriptDebug.cpp" />
+    <ClCompile Include="Source\BsScriptDistanceJoint.cpp" />
     <ClCompile Include="Source\BsScriptEnginePlugin.cpp" />
+    <ClCompile Include="Source\BsScriptFixedJoint.cpp" />
     <ClCompile Include="Source\BsScriptFontBitmap.cpp" />
     <ClCompile Include="Source\BsScriptGameObject.cpp" />
     <ClCompile Include="Source\BsScriptGameObjectManager.cpp" />
@@ -428,6 +437,7 @@
     <ClCompile Include="Source\BsScriptGUIToggle.cpp" />
     <ClCompile Include="Source\BsScriptGUIToggleGroup.cpp" />
     <ClCompile Include="Source\BsScriptGUIWidget.cpp" />
+    <ClCompile Include="Source\BsScriptHingeJoint.cpp" />
     <ClCompile Include="Source\BsScriptHString.cpp" />
     <ClCompile Include="Source\BsScriptGUIInputBox.cpp" />
     <ClCompile Include="Source\BsScriptInput.cpp" />
@@ -480,7 +490,9 @@
     <ClCompile Include="Source\BsScriptSerializableUtility.cpp" />
     <ClCompile Include="Source\BsScriptShader.cpp" />
     <ClCompile Include="Source\BsScriptShaderInclude.cpp" />
+    <ClCompile Include="Source\BsScriptSliderJoint.cpp" />
     <ClCompile Include="Source\BsScriptSphereCollider.cpp" />
+    <ClCompile Include="Source\BsScriptSphericalJoint.cpp" />
     <ClCompile Include="Source\BsScriptSpriteTexture.cpp" />
     <ClCompile Include="Source\BsScriptStringTable.cpp" />
     <ClCompile Include="Source\BsScriptStringTableManager.cpp" />

+ 36 - 0
SBansheeEngine/SBansheeEngine.vcxproj.filters

@@ -413,6 +413,24 @@
     <ClInclude Include="Include\BsScriptJoint.h">
       <Filter>Header Files\Physics</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsScriptDistanceJoint.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Source\BsScriptHingeJoint.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Source\BsScriptSliderJoint.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Source\BsScriptSphericalJoint.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Source\BsScriptFixedJoint.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Source\BsScriptD6Joint.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsScriptTexture2D.cpp">
@@ -763,5 +781,23 @@
     <ClCompile Include="Source\BsScriptJoint.cpp">
       <Filter>Source Files\Physics</Filter>
     </ClCompile>
+    <ClCompile Include="Source\BsScriptDistanceJoint.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptHingeJoint.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptSliderJoint.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptFixedJoint.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptSphericalJoint.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptD6Joint.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 100 - 0
SBansheeEngine/Source/BsScriptD6Joint.cpp

@@ -0,0 +1,100 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptD6Joint.h"
+#include "BsScriptJointCommon.h"
+
+namespace BansheeEngine
+{
+	ScriptD6Joint::ScriptD6Joint(MonoObject* instance, const SPtr<Joint>& joint)
+		:TScriptJoint(instance, joint)
+	{
+
+	}
+
+	void ScriptD6Joint::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptD6Joint::internal_CreateInstance);
+
+	}
+
+	D6Joint* ScriptD6Joint::getD6Joint() const
+	{
+		return static_cast<D6Joint*>(mJoint.get());
+	}
+
+	void ScriptD6Joint::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<D6Joint> joint = D6Joint::create();
+		joint->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptD6Joint* scriptJoint = new (bs_alloc<ScriptD6Joint>()) ScriptD6Joint(instance, joint);
+	}
+
+	void ScriptD6Joint::internal_SetMotion(ScriptD6Joint* thisPtr, D6Joint::Axis axis, D6Joint::Motion motion)
+	{
+		thisPtr->getD6Joint()->setMotion(axis, motion);
+	}
+
+	float ScriptD6Joint::internal_GetTwist(ScriptD6Joint* thisPtr)
+	{
+		return thisPtr->getD6Joint()->getTwist().valueRadians();
+	}
+
+	float ScriptD6Joint::internal_GetSwingY(ScriptD6Joint* thisPtr)
+	{
+		return thisPtr->getD6Joint()->getSwingY().valueRadians();
+	}
+
+	float ScriptD6Joint::internal_GetSwingZ(ScriptD6Joint* thisPtr)
+	{
+		return thisPtr->getD6Joint()->getSwingZ().valueRadians();
+	}
+
+	void ScriptD6Joint::internal_SetLimitLinear(ScriptD6Joint* thisPtr, MonoObject* limit)
+	{
+		LimitLinear nativeLimit = ScriptLimitLinear::convert(limit);
+		thisPtr->getD6Joint()->setLimitLinear(nativeLimit);
+	}
+
+	void ScriptD6Joint::internal_SetLimitTwist(ScriptD6Joint* thisPtr, MonoObject* limit)
+	{
+		LimitAngularRange nativeLimit = ScriptLimitAngularRange::convert(limit);
+		thisPtr->getD6Joint()->setLimitTwist(nativeLimit);
+	}
+
+	void ScriptD6Joint::internal_SetLimitSwing(ScriptD6Joint* thisPtr, MonoObject* limit)
+	{
+		LimitConeRange nativeLimit = ScriptLimitConeRange::convert(limit);
+		thisPtr->getD6Joint()->setLimitSwing(nativeLimit);
+	}
+
+	void ScriptD6Joint::internal_SetDrive(ScriptD6Joint* thisPtr, D6Joint::DriveType type, MonoObject* drive)
+	{
+		D6Joint::Drive nativeDrive = ScriptD6JointDrive::convert(drive);
+		thisPtr->getD6Joint()->setDrive(type, nativeDrive);
+	}
+
+	void ScriptD6Joint::internal_SetDrivePosition(ScriptD6Joint* thisPtr, Vector3* position)
+	{
+		Quaternion rotation = thisPtr->getD6Joint()->getDriveRotation();
+		thisPtr->getD6Joint()->setDriveTransform(*position, rotation);
+	}
+
+	void ScriptD6Joint::internal_SetDriveRotation(ScriptD6Joint* thisPtr, Quaternion* rotation)
+	{
+		Vector3 position = thisPtr->getD6Joint()->getDrivePosition();
+		thisPtr->getD6Joint()->setDriveTransform(position, *rotation);
+	}
+
+	void ScriptD6Joint::internal_SetDriveLinearVelocity(ScriptD6Joint* thisPtr, Vector3* velocity)
+	{
+		Vector3 angularVelocity = thisPtr->getD6Joint()->getDriveAngularVelocity();
+		thisPtr->getD6Joint()->setDriveVelocity(*velocity, angularVelocity);
+	}
+
+	void ScriptD6Joint::internal_SetDriveAngularVelocity(ScriptD6Joint* thisPtr, Vector3* velocity)
+	{
+		Vector3 linearVelocity = thisPtr->getD6Joint()->getDriveLinearVelocity();
+		thisPtr->getD6Joint()->setDriveVelocity(linearVelocity, *velocity);
+	}
+}

+ 40 - 0
SBansheeEngine/Source/BsScriptD6Joint.h

@@ -0,0 +1,40 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptCollider.h"
+#include "BsScriptJoint.h"
+#include "BsD6Joint.h"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for D6Joint. */
+	class BS_SCR_BE_EXPORT ScriptD6Joint : public TScriptJoint<ScriptD6Joint>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeD6Joint")
+	private:
+		ScriptD6Joint(MonoObject* instance, const SPtr<Joint>& joint);
+
+		/** Returns the native D6 joint wrapped by this object. */
+		D6Joint* getD6Joint() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static void internal_SetMotion(ScriptD6Joint* thisPtr, D6Joint::Axis axis, D6Joint::Motion motion);
+		static float internal_GetTwist(ScriptD6Joint* thisPtr);
+		static float internal_GetSwingY(ScriptD6Joint* thisPtr);
+		static float internal_GetSwingZ(ScriptD6Joint* thisPtr);
+		static void internal_SetLimitLinear(ScriptD6Joint* thisPtr, MonoObject* limit);
+		static void internal_SetLimitTwist(ScriptD6Joint* thisPtr, MonoObject* limit);
+		static void internal_SetLimitSwing(ScriptD6Joint* thisPtr, MonoObject* limit);
+		static void internal_SetDrive(ScriptD6Joint* thisPtr, D6Joint::DriveType type, MonoObject* drive);
+		static void internal_SetDrivePosition(ScriptD6Joint* thisPtr, Vector3* position);
+		static void internal_SetDriveRotation(ScriptD6Joint* thisPtr, Quaternion* rotation);
+		static void internal_SetDriveLinearVelocity(ScriptD6Joint* thisPtr, Vector3* velocity);
+		static void internal_SetDriveAngularVelocity(ScriptD6Joint* thisPtr, Vector3* velocity);
+	};
+}

+ 79 - 0
SBansheeEngine/Source/BsScriptDistanceJoint.cpp

@@ -0,0 +1,79 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptDistanceJoint.h"
+#include "BsDistanceJoint.h"
+
+namespace BansheeEngine
+{
+	ScriptDistanceJoint::ScriptDistanceJoint(MonoObject* instance, const SPtr<Joint>& joint)
+		:TScriptJoint(instance, joint)
+	{
+
+	}
+
+	void ScriptDistanceJoint::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptDistanceJoint::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_GetDistance", &ScriptDistanceJoint::internal_GetDistance);
+		metaData.scriptClass->addInternalCall("Internal_SetMinDistance", &ScriptDistanceJoint::internal_SetMinDistance);
+		metaData.scriptClass->addInternalCall("Internal_SetMaxDistance", &ScriptDistanceJoint::internal_SetMaxDistance);
+		metaData.scriptClass->addInternalCall("Internal_SetTolerance", &ScriptDistanceJoint::internal_SetTolerance);
+		metaData.scriptClass->addInternalCall("Internal_SetSpring", &ScriptDistanceJoint::internal_SetSpring);
+		metaData.scriptClass->addInternalCall("Internal_SetEnableMinDistanceLimit", &ScriptDistanceJoint::internal_SetEnableMinDistanceLimit);
+		metaData.scriptClass->addInternalCall("Internal_SetEnableMaxDistanceLimit", &ScriptDistanceJoint::internal_SetEnableMaxDistanceLimit);
+		metaData.scriptClass->addInternalCall("Internal_SetEnableSpring", &ScriptDistanceJoint::internal_SetEnableSpring);
+	}
+
+	DistanceJoint* ScriptDistanceJoint::getDistanceJoint() const
+	{
+		return static_cast<DistanceJoint*>(mJoint.get());
+	}
+
+	void ScriptDistanceJoint::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<DistanceJoint> joint = DistanceJoint::create();
+		joint->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptDistanceJoint* scriptJoint = new (bs_alloc<ScriptDistanceJoint>()) ScriptDistanceJoint(instance, joint);
+	}
+
+	float ScriptDistanceJoint::internal_GetDistance(ScriptDistanceJoint* thisPtr)
+	{
+		return thisPtr->getDistanceJoint()->getDistance();
+	}
+
+	void ScriptDistanceJoint::internal_SetMinDistance(ScriptDistanceJoint* thisPtr, float value)
+	{
+		thisPtr->getDistanceJoint()->setMinDistance(value);
+	}
+
+	void ScriptDistanceJoint::internal_SetMaxDistance(ScriptDistanceJoint* thisPtr, float value)
+	{
+		thisPtr->getDistanceJoint()->setMaxDistance(value);
+	}
+
+	void ScriptDistanceJoint::internal_SetTolerance(ScriptDistanceJoint* thisPtr, float value)
+	{
+		thisPtr->getDistanceJoint()->setTolerance(value);
+	}
+
+	void ScriptDistanceJoint::internal_SetSpring(ScriptDistanceJoint* thisPtr, Spring* value)
+	{
+		thisPtr->getDistanceJoint()->setSpring(*value);
+	}
+
+	void ScriptDistanceJoint::internal_SetEnableMinDistanceLimit(ScriptDistanceJoint* thisPtr, bool value)
+	{
+		thisPtr->getDistanceJoint()->setFlag(DistanceJoint::Flag::MinDistance, value);
+	}
+
+	void ScriptDistanceJoint::internal_SetEnableMaxDistanceLimit(ScriptDistanceJoint* thisPtr, bool value)
+	{
+		thisPtr->getDistanceJoint()->setFlag(DistanceJoint::Flag::MaxDistance, value);
+	}
+
+	void ScriptDistanceJoint::internal_SetEnableSpring(ScriptDistanceJoint* thisPtr, bool value)
+	{
+		thisPtr->getDistanceJoint()->setFlag(DistanceJoint::Flag::Spring, value);
+	}
+}

+ 31 - 0
SBansheeEngine/Source/BsScriptFixedJoint.cpp

@@ -0,0 +1,31 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptFixedJoint.h"
+#include "BsFixedJoint.h"
+
+namespace BansheeEngine
+{
+	ScriptFixedJoint::ScriptFixedJoint(MonoObject* instance, const SPtr<Joint>& joint)
+		:TScriptJoint(instance, joint)
+	{
+
+	}
+
+	void ScriptFixedJoint::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptFixedJoint::internal_CreateInstance);
+	}
+
+	FixedJoint* ScriptFixedJoint::getFixedJoint() const
+	{
+		return static_cast<FixedJoint*>(mJoint.get());
+	}
+
+	void ScriptFixedJoint::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<FixedJoint> joint = FixedJoint::create();
+		joint->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptFixedJoint* scriptJoint = new (bs_alloc<ScriptFixedJoint>()) ScriptFixedJoint(instance, joint);
+	}
+}

+ 27 - 0
SBansheeEngine/Source/BsScriptFixedJoint.h

@@ -0,0 +1,27 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptCollider.h"
+#include "BsScriptJoint.h"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for FixedJoint. */
+	class BS_SCR_BE_EXPORT ScriptFixedJoint : public TScriptJoint<ScriptFixedJoint>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeFixedJoint")
+	private:
+		ScriptFixedJoint(MonoObject* instance, const SPtr<Joint>& joint);
+
+		/** Returns the native fixed joint wrapped by this object. */
+		FixedJoint* getFixedJoint() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+	};
+}

+ 71 - 0
SBansheeEngine/Source/BsScriptHingeJoint.cpp

@@ -0,0 +1,71 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptHingeJoint.h"
+#include "BsHingeJoint.h"
+#include "BsScriptJointCommon.h"
+
+namespace BansheeEngine
+{
+	ScriptHingeJoint::ScriptHingeJoint(MonoObject* instance, const SPtr<Joint>& joint)
+		:TScriptJoint(instance, joint)
+	{
+
+	}
+
+	void ScriptHingeJoint::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptHingeJoint::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_GetAngle", &ScriptHingeJoint::internal_GetAngle);
+		metaData.scriptClass->addInternalCall("Internal_GetSpeed", &ScriptHingeJoint::internal_GetSpeed);
+		metaData.scriptClass->addInternalCall("Internal_SetLimit", &ScriptHingeJoint::internal_SetLimit);
+		metaData.scriptClass->addInternalCall("Internal_SetDrive", &ScriptHingeJoint::internal_SetDrive);
+		metaData.scriptClass->addInternalCall("Internal_SetEnableLimit", &ScriptHingeJoint::internal_SetEnableLimit);
+		metaData.scriptClass->addInternalCall("Internal_SetEnableDrive", &ScriptHingeJoint::internal_SetEnableDrive);
+	}
+
+	HingeJoint* ScriptHingeJoint::getHingeJoint() const
+	{
+		return static_cast<HingeJoint*>(mJoint.get());
+	}
+
+	void ScriptHingeJoint::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<HingeJoint> joint = HingeJoint::create();
+		joint->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptHingeJoint* scriptJoint = new (bs_alloc<ScriptHingeJoint>()) ScriptHingeJoint(instance, joint);
+	}
+
+	float ScriptHingeJoint::internal_GetAngle(ScriptHingeJoint* thisPtr)
+	{
+		return thisPtr->getHingeJoint()->getAngle().valueRadians();
+	}
+
+	float ScriptHingeJoint::internal_GetSpeed(ScriptHingeJoint* thisPtr)
+	{
+		return thisPtr->getHingeJoint()->getSpeed();
+	}
+
+	void ScriptHingeJoint::internal_SetLimit(ScriptHingeJoint* thisPtr, MonoObject* limit)
+	{
+		LimitAngularRange nativeLimit = ScriptLimitAngularRange::convert(limit);
+
+		thisPtr->getHingeJoint()->setLimit(nativeLimit);
+	}
+
+	void ScriptHingeJoint::internal_SetDrive(ScriptHingeJoint* thisPtr, MonoObject* drive)
+	{
+		HingeJoint::Drive nativeDrive = ScriptHingeJointDrive::convert(drive);
+		thisPtr->getHingeJoint()->setDrive(nativeDrive);
+	}
+
+	void ScriptHingeJoint::internal_SetEnableLimit(ScriptHingeJoint* thisPtr, bool value)
+	{
+		thisPtr->getHingeJoint()->setFlag(HingeJoint::Flag::Limit, value);
+	}
+
+	void ScriptHingeJoint::internal_SetEnableDrive(ScriptHingeJoint* thisPtr, bool value)
+	{
+		thisPtr->getHingeJoint()->setFlag(HingeJoint::Flag::Drive, value);
+	}
+}

+ 33 - 0
SBansheeEngine/Source/BsScriptHingeJoint.h

@@ -0,0 +1,33 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptCollider.h"
+#include "BsScriptJoint.h"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for HingeJoint. */
+	class BS_SCR_BE_EXPORT ScriptHingeJoint : public TScriptJoint<ScriptHingeJoint>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeHingeJoint")
+	private:
+		ScriptHingeJoint(MonoObject* instance, const SPtr<Joint>& joint);
+
+		/** Returns the native hinge joint wrapped by this object. */
+		HingeJoint* getHingeJoint() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static float internal_GetAngle(ScriptHingeJoint* thisPtr);
+		static float internal_GetSpeed(ScriptHingeJoint* thisPtr);
+		static void internal_SetLimit(ScriptHingeJoint* thisPtr, MonoObject* limit);
+		static void internal_SetDrive(ScriptHingeJoint* thisPtr, MonoObject* drive);
+		static void internal_SetEnableLimit(ScriptHingeJoint* thisPtr, bool value);
+		static void internal_SetEnableDrive(ScriptHingeJoint* thisPtr, bool value);
+	};
+}

+ 57 - 0
SBansheeEngine/Source/BsScriptSliderJoint.cpp

@@ -0,0 +1,57 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptSliderJoint.h"
+#include "BsScriptJointCommon.h"
+#include "BsSliderJoint.h"
+
+namespace BansheeEngine
+{
+	ScriptSliderJoint::ScriptSliderJoint(MonoObject* instance, const SPtr<Joint>& joint)
+		:TScriptJoint(instance, joint)
+	{
+
+	}
+
+	void ScriptSliderJoint::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptSliderJoint::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_GetPosition", &ScriptSliderJoint::internal_GetPosition);
+		metaData.scriptClass->addInternalCall("Internal_GetSpeed", &ScriptSliderJoint::internal_GetSpeed);
+		metaData.scriptClass->addInternalCall("Internal_SetLimit", &ScriptSliderJoint::internal_SetLimit);
+		metaData.scriptClass->addInternalCall("Internal_SetEnableLimit", &ScriptSliderJoint::internal_SetEnableLimit);
+	}
+
+	SliderJoint* ScriptSliderJoint::getSliderJoint() const
+	{
+		return static_cast<SliderJoint*>(mJoint.get());
+	}
+
+	void ScriptSliderJoint::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<SliderJoint> joint = SliderJoint::create();
+		joint->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptSliderJoint* scriptJoint = new (bs_alloc<ScriptSliderJoint>()) ScriptSliderJoint(instance, joint);
+	}
+
+	float ScriptSliderJoint::internal_GetPosition(ScriptSliderJoint* thisPtr)
+	{
+		return thisPtr->getSliderJoint()->getPosition();
+	}
+
+	float ScriptSliderJoint::internal_GetSpeed(ScriptSliderJoint* thisPtr)
+	{
+		return thisPtr->getSliderJoint()->getSpeed();
+	}
+
+	void ScriptSliderJoint::internal_SetLimit(ScriptSliderJoint* thisPtr, MonoObject* limit)
+	{
+		LimitLinearRange nativeLimit = ScriptLimitLinearRange::convert(limit);
+		thisPtr->getSliderJoint()->setLimit(nativeLimit);
+	}
+
+	void ScriptSliderJoint::internal_SetEnableLimit(ScriptSliderJoint* thisPtr, bool enable)
+	{
+		thisPtr->getSliderJoint()->setFlag(SliderJoint::Flag::Limit, enable);
+	}
+}

+ 31 - 0
SBansheeEngine/Source/BsScriptSliderJoint.h

@@ -0,0 +1,31 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptCollider.h"
+#include "BsScriptJoint.h"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for SliderJoint. */
+	class BS_SCR_BE_EXPORT ScriptSliderJoint : public TScriptJoint<ScriptSliderJoint>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeSliderJoint")
+	private:
+		ScriptSliderJoint(MonoObject* instance, const SPtr<Joint>& joint);
+
+		/** Returns the native slider joint wrapped by this object. */
+		SliderJoint* getSliderJoint() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static float internal_GetPosition(ScriptSliderJoint* thisPtr);
+		static float internal_GetSpeed(ScriptSliderJoint* thisPtr);
+		static void internal_SetLimit(ScriptSliderJoint* thisPtr, MonoObject* limit);
+		static void internal_SetEnableLimit(ScriptSliderJoint* thisPtr, bool enable);
+	};
+}

+ 45 - 0
SBansheeEngine/Source/BsScriptSphericalJoint.cpp

@@ -0,0 +1,45 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptSphericalJoint.h"
+#include "BsScriptJointCommon.h"
+#include "BsSphericalJoint.h"
+
+namespace BansheeEngine
+{
+	ScriptSphericalJoint::ScriptSphericalJoint(MonoObject* instance, const SPtr<Joint>& joint)
+		:TScriptJoint(instance, joint)
+	{
+
+	}
+
+	void ScriptSphericalJoint::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptSphericalJoint::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_SetLimit", &ScriptSphericalJoint::internal_SetLimit);
+		metaData.scriptClass->addInternalCall("Internal_SetEnableLimit", &ScriptSphericalJoint::internal_SetEnableLimit);
+	}
+
+	SphericalJoint* ScriptSphericalJoint::getSphericalJoint() const
+	{
+		return static_cast<SphericalJoint*>(mJoint.get());
+	}
+
+	void ScriptSphericalJoint::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<SphericalJoint> joint = SphericalJoint::create();
+		joint->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptSphericalJoint* scriptJoint = new (bs_alloc<ScriptSphericalJoint>()) ScriptSphericalJoint(instance, joint);
+	}
+
+	void ScriptSphericalJoint::internal_SetLimit(ScriptSphericalJoint* thisPtr, MonoObject* limit)
+	{
+		LimitConeRange nativeLimit = ScriptLimitConeRange::convert(limit);
+		thisPtr->getSphericalJoint()->setLimit(nativeLimit);
+	}
+
+	void ScriptSphericalJoint::internal_SetEnableLimit(ScriptSphericalJoint* thisPtr, bool enable)
+	{
+		thisPtr->getSphericalJoint()->setFlag(SphericalJoint::Flag::Limit, enable);
+	}
+}

+ 29 - 0
SBansheeEngine/Source/BsScriptSphericalJoint.h

@@ -0,0 +1,29 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptCollider.h"
+#include "BsScriptJoint.h"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for SphericalJoint. */
+	class BS_SCR_BE_EXPORT ScriptSphericalJoint : public TScriptJoint<ScriptSphericalJoint>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeSphericalJoint")
+	private:
+		ScriptSphericalJoint(MonoObject* instance, const SPtr<Joint>& joint);
+
+		/** Returns the native spherical joint wrapped by this object. */
+		SphericalJoint* getSphericalJoint() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static void internal_SetLimit(ScriptSphericalJoint* thisPtr, MonoObject* limit);
+		static void internal_SetEnableLimit(ScriptSphericalJoint* thisPtr, bool enable);
+	};
+}