Procházet zdrojové kódy

Added Collider script interop objects

BearishSun před 9 roky
rodič
revize
371bf0b9e9

+ 1 - 1
BansheeCore/Include/BsMeshCollider.h

@@ -24,7 +24,7 @@ namespace BansheeEngine
 		 * @param[in]	mesh	Generic triangle mesh, or and convex mesh. Triangle meshes are not supported as triggers, 
 		 *						nor are they supported for colliders that are parts of a non-kinematic rigidbody.
 		 */
-		void setMesh(const HPhysicsMesh& mesh) { mMesh = mesh; onMeshChanged();  markListenerResourcesDirty(); }
+		void setMesh(const HPhysicsMesh& mesh) { mMesh = mesh; onMeshChanged(); markListenerResourcesDirty(); }
 
 		/** Returns a mesh that represents the collider geometry. */
 		HPhysicsMesh getMesh() const { return mMesh; }

+ 1 - 1
README.md

@@ -1,5 +1,5 @@
 # What is Banshee?
-A high quality modern game development toolkit. It provides a **high performance multi-threaded game engine** written in C++14 that can run 2D and 3D games. The engine offers a wide variety of high level systems needed for game development, ranging from math and utility libraries, to DirectX 11 and OpenGL support all the way to input, GUI, physics, scripting and support for many popular resource formats (e.g. FBX, PNG, PSD, TTF).
+A high quality modern game development toolkit. It provides a **high performance multi-threaded game engine** written in C++14 that runs 2D and 3D games. The engine offers a wide variety of high level systems needed for game development, ranging from math and utility libraries, to DirectX 11 and OpenGL support all the way to input, GUI, physics, scripting and support for many popular resource formats (e.g. FBX, PNG, PSD, TTF).
 
 On top of the engine Banshee also provides a highly intuitive and customizable **editor** that is easy to use by artists, designers and programmers alike. The editor allows you to manage all your project's assets, build levels, compile scripts, test and publish your game. Editor is also fully extensible via scripting to ensure developers can easily customize it for their own needs.
 

+ 27 - 0
SBansheeEngine/Include/BsScriptBoxCollider.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"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for BoxCollider. */
+	class BS_SCR_BE_EXPORT ScriptBoxCollider : public TScriptCollider<ScriptBoxCollider>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeBoxCollider")
+	private:
+		ScriptBoxCollider(MonoObject* instance, const SPtr<Collider>& collider);
+
+		/** Returns the native box collider wrapped by this object. */
+		BoxCollider* getBoxCollider() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static void internal_SetExtents(ScriptBoxCollider* thisPtr, Vector3* extents);
+		static void internal_GetExtents(ScriptBoxCollider* thisPtr, Vector3* extents);
+	};
+}

+ 29 - 0
SBansheeEngine/Include/BsScriptCapsuleCollider.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"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for CapsuleCollider. */
+	class BS_SCR_BE_EXPORT ScriptCapsuleCollider : public TScriptCollider<ScriptCapsuleCollider>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeCapsuleCollider")
+	private:
+		ScriptCapsuleCollider(MonoObject* instance, const SPtr<Collider>& collider);
+
+		/** Returns the native capsule collider wrapped by this object. */
+		CapsuleCollider* getCapsuleCollider() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static void internal_SetHalfHeight(ScriptCapsuleCollider* thisPtr, float halfHeight);
+		static float internal_GetHalfHeight(ScriptCapsuleCollider* thisPtr);
+		static void internal_SetRadius(ScriptCapsuleCollider* thisPtr, float radius);
+		static float internal_GetRadius(ScriptCapsuleCollider* thisPtr);
+	};
+}

+ 103 - 0
SBansheeEngine/Include/BsScriptCollider.h

@@ -0,0 +1,103 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+#include "BsPhysicsCommon.h"
+
+namespace BansheeEngine
+{
+	/** Base class for all Collider interop objects. */
+	class BS_SCR_BE_EXPORT ScriptColliderBase : public ScriptObjectBase
+	{
+	public:
+		/** Returns the native Collider object. */
+		virtual Collider* getCollider() const { return mCollider.get(); };
+	protected:
+		ScriptColliderBase(MonoObject* instance);
+		virtual ~ScriptColliderBase() {}
+
+		/** Initializes the interop object with a native collider. Must be called right after construction. */
+		void initialize(const SPtr<Collider>& collider);
+
+		SPtr<Collider> mCollider;
+	};
+
+	/** A more specialized version of ScriptObject that allows the constructor to set the native collider. */
+	template <class Type>
+	class TScriptCollider : public ScriptObject<Type, ScriptColliderBase>
+	{
+	public:
+		virtual ~TScriptCollider() {}
+
+	protected:
+		TScriptCollider(MonoObject* instance, const SPtr<Collider>& collider)
+			:ScriptObject(instance)
+		{
+			initialize(collider);
+		}
+	};
+
+	/** Interop class between C++ & CLR for Collider. */
+	class BS_SCR_BE_EXPORT ScriptCollider : public TScriptCollider<ScriptCollider>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeCollider")
+	private:
+		friend class ScriptColliderBase;
+
+		ScriptCollider(MonoObject* instance);
+
+		/** Triggered when some object starts interacting with the collider. */
+		static void onCollisionBegin(MonoObject* instance, const CollisionData& collisionData);
+
+		/** Triggered when some object remains interacting with the collider through a frame. */
+		static void onCollisionStay(MonoObject* instance, const CollisionData& collisionData);
+
+		/** Triggered when some object ends interacting with the collider. */
+		static void onCollisionEnd(MonoObject* instance, const CollisionData& collisionData);
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_GetPosition(ScriptColliderBase* thisPtr, Vector3* pos);
+		static void internal_GetRotation(ScriptColliderBase* thisPtr, Quaternion* rot);
+		static void internal_SetTransform(ScriptColliderBase* thisPtr, Vector3* pos, Quaternion* rot);
+
+		static void internal_SetScale(ScriptColliderBase* thisPtr, Vector3* scale);
+		static void internal_GetScale(ScriptColliderBase* thisPtr, Vector3* scale);
+
+		static void internal_SetIsTrigger(ScriptColliderBase* thisPtr, bool value);
+		static bool internal_GetIsTrigger(ScriptColliderBase* thisPtr);
+
+		static void internal_SetRigidbody(ScriptColliderBase* thisPtr, ScriptRigidbody* value);
+		static MonoObject* internal_GetRigidbody(ScriptColliderBase* thisPtr);
+
+		static void internal_SetMass(ScriptColliderBase* thisPtr, float mass);
+		static float internal_GetMass(ScriptColliderBase* thisPtr);
+
+		static void internal_SetMaterial(ScriptColliderBase* thisPtr, ScriptPhysicsMaterial* material);
+		static MonoObject* internal_GetMaterial(ScriptColliderBase* thisPtr);
+
+		static void internal_SetContactOffset(ScriptColliderBase* thisPtr, float value);
+		static float internal_GetContactOffset(ScriptColliderBase* thisPtr);
+
+		static void internal_SetRestOffset(ScriptColliderBase* thisPtr, float value);
+		static float internal_GetRestOffset(ScriptColliderBase* thisPtr);
+
+		static void internal_SetLayer(ScriptColliderBase* thisPtr, UINT64 layer);
+		static UINT64 internal_GetLayer(ScriptColliderBase* thisPtr);
+
+		static void internal_SetCollisionReportMode(ScriptColliderBase* thisPtr, CollisionReportMode mode);
+		static CollisionReportMode internal_GetCollisionReportMode(ScriptColliderBase* thisPtr);
+
+		static bool internal_RayCast(ScriptColliderBase* thisPtr, Vector3* origin, Vector3* unitDir, MonoObject** hit, 
+			float maxDist);
+
+		typedef void(__stdcall *OnCollisionThunkDef) (MonoObject*, MonoObject*, MonoException**);
+
+		static OnCollisionThunkDef onCollisionBeginThunk;
+		static OnCollisionThunkDef onCollisionStayThunk;
+		static OnCollisionThunkDef onCollisionEndThunk;
+	};
+}

+ 53 - 0
SBansheeEngine/Include/BsScriptCollisionData.h

@@ -0,0 +1,53 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+#include "BsPhysicsCommon.h"
+
+namespace BansheeEngine
+{
+	/** Interop struct between C++ & CLR for CollisionData. */
+	struct ScriptCollisionData // Must match C# CollisionData struct layout
+	{
+		MonoObject* colliderA;
+		MonoObject* colliderB;
+		MonoArray* contactPoints;
+	};
+
+	/** Helper class for dealing with CollisionData structure. */
+	class BS_SCR_BE_EXPORT ScriptCollisionDataHelper : public ScriptObject<ScriptCollisionDataHelper>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "CollisionData")
+
+	public:
+		/** Converts native collision data to its managed counterpart. */
+		static ScriptCollisionData create(const CollisionData& data);
+
+		/** Unboxes a boxed managed ScriptCollisionData struct and returns the native version of the structure. */
+		static ScriptCollisionData unbox(MonoObject* obj);
+
+		/** Boxes a native ScriptCollisionData struct and returns a managed object containing it. */
+		static MonoObject* box(const ScriptCollisionData& value);
+
+	private:
+		ScriptCollisionDataHelper(MonoObject* instance);
+	};
+
+	/** Helper class for dealing with ContactPoint structure. */
+	class BS_SCR_BE_EXPORT ScriptContactPointHelper : public ScriptObject<ScriptContactPointHelper>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "ContactPoint")
+
+	public:
+		/** Unboxes a boxed managed ContactPoint struct and returns the native version of the structure. */
+		static ContactPoint unbox(MonoObject* obj);
+
+		/** Boxes a native ContactPoint struct and returns a managed object containing it. */
+		static MonoObject* box(const ContactPoint& value);
+
+	private:
+		ScriptContactPointHelper(MonoObject* instance);
+	};
+}

+ 3 - 0
SBansheeEngine/Include/BsScriptEnginePrerequisites.h

@@ -79,6 +79,9 @@ namespace BansheeEngine
 	class ScriptContextMenu;
 	class ScriptGUISkin;
 	class ScriptResourceRef;
+	class ScriptPhysicsMaterial;
+	class ScriptPhysicsMesh;
+	class ScriptRigidbody;
 
 	typedef GameObjectHandle<ManagedComponent> HManagedComponent;
 	typedef ResourceHandle<ManagedResource> HManagedResource;

+ 27 - 0
SBansheeEngine/Include/BsScriptMeshCollider.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"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for MeshCollider. */
+	class BS_SCR_BE_EXPORT ScriptMeshCollider : public TScriptCollider<ScriptMeshCollider>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeMeshCollider")
+	private:
+		ScriptMeshCollider(MonoObject* instance, const SPtr<Collider>& collider);
+
+		/** Returns the native mesh collider wrapped by this object. */
+		MeshCollider* getMeshCollider() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static void internal_SetMesh(ScriptMeshCollider* thisPtr, ScriptPhysicsMesh* mesh);
+		static MonoObject* internal_GetMesh(ScriptMeshCollider* thisPtr);
+	};
+}

+ 40 - 0
SBansheeEngine/Include/BsScriptPhysicsQueryHit.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 "BsScriptObject.h"
+#include "BsPhysicsCommon.h"
+
+namespace BansheeEngine
+{
+	/** Interop struct between C++ & CLR for PhysicsQueryHit. */
+	struct ScriptPhysicsQueryHit // Must match C# PhysicsQueryHit struct layout
+	{
+		Vector3 point;
+		Vector3 normal;
+		Vector2 uv;
+		float distance;
+		UINT32 triangleIdx;
+		MonoObject* collider;
+	};
+
+	/** Helper class for dealing with PhysicsQueryHit structure. */
+	class BS_SCR_BE_EXPORT ScriptPhysicsQueryHitHelper : public ScriptObject<ScriptPhysicsQueryHitHelper>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "PhysicsQueryHit")
+
+	public:
+		/** Converts native physics query hit to its managed counterpart. */
+		static ScriptPhysicsQueryHit create(const PhysicsQueryHit& data);
+
+		/** Unboxes a boxed managed ScriptPhysicsQueryHit struct and returns the native version of the structure. */
+		static ScriptPhysicsQueryHit unbox(MonoObject* obj);
+
+		/** Boxes a native ScriptPhysicsQueryHit struct and returns a managed object containing it. */
+		static MonoObject* box(const ScriptPhysicsQueryHit& value);
+
+	private:
+		ScriptPhysicsQueryHitHelper(MonoObject* instance);
+	};
+}

+ 25 - 0
SBansheeEngine/Include/BsScriptPlaneCollider.h

@@ -0,0 +1,25 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptCollider.h"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for PlaneCollider. */
+	class BS_SCR_BE_EXPORT ScriptPlaneCollider : public TScriptCollider<ScriptPlaneCollider>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativePlaneCollider")
+	private:
+		ScriptPlaneCollider(MonoObject* instance, const SPtr<Collider>& collider);
+
+		/** Returns the native plane collider wrapped by this object. */
+		PlaneCollider* getPlaneCollider() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+	};
+}

+ 31 - 0
SBansheeEngine/Include/BsScriptRigidbody.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 "BsScriptObject.h"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for Rigidbody. */
+	class BS_SCR_BE_EXPORT ScriptRigidbody : public ScriptObject<ScriptRigidbody>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeRigidbody")
+	public:
+		/** Returns the native Rigidbody object. */
+		Rigidbody* getRigidbody() const { return mRigidbody.get(); }
+
+	private:
+		friend class ScriptColliderBase;
+
+		ScriptRigidbody(MonoObject* instance, const SPtr<Rigidbody>& body);
+
+		SPtr<Rigidbody> mRigidbody;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		
+		// TODO - Dummy class
+	};
+}

+ 27 - 0
SBansheeEngine/Include/BsScriptSphereCollider.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"
+
+namespace BansheeEngine
+{
+	/** Interop class between C++ & CLR for SphereCollider. */
+	class BS_SCR_BE_EXPORT ScriptSphereCollider : public TScriptCollider<ScriptSphereCollider>
+	{
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "NativeSphereCollider")
+	private:
+		ScriptSphereCollider(MonoObject* instance, const SPtr<Collider>& collider);
+
+		/** Returns the native sphere collider wrapped by this object. */
+		SphereCollider* getSphereCollider() const;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_CreateInstance(MonoObject* instance);
+		static void internal_SetRadius(ScriptSphereCollider* thisPtr, float radius);
+		static float internal_GetRadius(ScriptSphereCollider* thisPtr);
+	};
+}

+ 18 - 0
SBansheeEngine/SBansheeEngine.vcxproj

@@ -250,6 +250,7 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="Include\BsScriptBoxCollider.h" />
     <ClInclude Include="Include\BsEngineScriptLibrary.h" />
     <ClInclude Include="Include\BsManagedComponent.h" />
     <ClInclude Include="Include\BsManagedComponentRTTI.h" />
@@ -276,6 +277,9 @@
     <ClInclude Include="Include\BsScriptBoneWeight.h" />
     <ClInclude Include="Include\BsScriptBuiltin.h" />
     <ClInclude Include="Include\BsScriptCamera.h" />
+    <ClInclude Include="Include\BsScriptCapsuleCollider.h" />
+    <ClInclude Include="Include\BsScriptCollider.h" />
+    <ClInclude Include="Include\BsScriptCollisionData.h" />
     <ClInclude Include="Include\BsScriptColor.h" />
     <ClInclude Include="Include\BsScriptComponent.h" />
     <ClInclude Include="Include\BsScriptContextMenu.h" />
@@ -316,15 +320,18 @@
     <ClInclude Include="Include\BsScriptManagedResource.h" />
     <ClInclude Include="Include\BsScriptMaterial.h" />
     <ClInclude Include="Include\BsScriptMesh.h" />
+    <ClInclude Include="Include\BsScriptMeshCollider.h" />
     <ClInclude Include="Include\BsScriptMeshData.h" />
     <ClInclude Include="Include\BsScriptObject.h" />
     <ClInclude Include="Include\BsScriptObjectImpl.h" />
     <ClInclude Include="Include\BsScriptObjectManager.h" />
     <ClInclude Include="Include\BsScriptPhysicsMaterial.h" />
     <ClInclude Include="Include\BsScriptPhysicsMesh.h" />
+    <ClInclude Include="Include\BsScriptPhysicsQueryHit.h" />
     <ClInclude Include="Include\BsScriptPixelData.h" />
     <ClInclude Include="Include\BsScriptPixelUtility.h" />
     <ClInclude Include="Include\BsScriptPlainText.h" />
+    <ClInclude Include="Include\BsScriptPlaneCollider.h" />
     <ClInclude Include="Include\BsScriptPrefab.h" />
     <ClInclude Include="Include\BsScriptProfilerOverlayInternal.h" />
     <ClInclude Include="Include\BsScriptRenderable.h" />
@@ -335,6 +342,7 @@
     <ClInclude Include="Include\BsScriptResourceManager.h" />
     <ClInclude Include="Include\BsScriptResourceRef.h" />
     <ClInclude Include="Include\BsScriptResources.h" />
+    <ClInclude Include="Include\BsScriptRigidbody.h" />
     <ClInclude Include="Include\BsScriptScene.h" />
     <ClInclude Include="Include\BsScriptSceneObject.h" />
     <ClInclude Include="Include\BsManagedSerializableObjectInfoRTTI.h" />
@@ -349,6 +357,7 @@
     <ClInclude Include="Include\BsScriptSerializableUtility.h" />
     <ClInclude Include="Include\BsScriptShader.h" />
     <ClInclude Include="Include\BsScriptShaderInclude.h" />
+    <ClInclude Include="Include\BsScriptSphereCollider.h" />
     <ClInclude Include="Include\BsScriptSpriteTexture.h" />
     <ClInclude Include="Include\BsScriptStringTable.h" />
     <ClInclude Include="Include\BsScriptStringTableManager.h" />
@@ -376,8 +385,12 @@
     <ClCompile Include="Source\BsScriptAssemblyManager.cpp" />
     <ClCompile Include="Source\BsScriptAsyncOp.cpp" />
     <ClCompile Include="Source\BsScriptBoneWeight.cpp" />
+    <ClCompile Include="Source\BsScriptBoxCollider.cpp" />
     <ClCompile Include="Source\BsScriptBuiltin.cpp" />
     <ClCompile Include="Source\BsScriptCamera.cpp" />
+    <ClCompile Include="Source\BsScriptCapsuleCollider.cpp" />
+    <ClCompile Include="Source\BsScriptCollider.cpp" />
+    <ClCompile Include="Source\BsScriptCollisionData.cpp" />
     <ClCompile Include="Source\BsScriptColor.cpp" />
     <ClCompile Include="Source\BsScriptComponent.cpp" />
     <ClCompile Include="Source\BsScriptContextMenu.cpp" />
@@ -418,15 +431,18 @@
     <ClCompile Include="Source\BsScriptManagedResource.cpp" />
     <ClCompile Include="Source\BsScriptMaterial.cpp" />
     <ClCompile Include="Source\BsScriptMesh.cpp" />
+    <ClCompile Include="Source\BsScriptMeshCollider.cpp" />
     <ClCompile Include="Source\BsScriptMeshData.cpp" />
     <ClCompile Include="Source\BsScriptObject.cpp" />
     <ClCompile Include="Source\BsScriptObjectImpl.cpp" />
     <ClCompile Include="Source\BsScriptObjectManager.cpp" />
     <ClCompile Include="Source\BsScriptPhysicsMaterial.cpp" />
     <ClCompile Include="Source\BsScriptPhysicsMesh.cpp" />
+    <ClCompile Include="Source\BsScriptPhysicsQueryHit.cpp" />
     <ClCompile Include="Source\BsScriptPixelData.cpp" />
     <ClCompile Include="Source\BsScriptPixelUtility.cpp" />
     <ClCompile Include="Source\BsScriptPlainText.cpp" />
+    <ClCompile Include="Source\BsScriptPlaneCollider.cpp" />
     <ClCompile Include="Source\BsScriptPrefab.cpp" />
     <ClCompile Include="Source\BsScriptProfilerOverlayInternal.cpp" />
     <ClCompile Include="Source\BsScriptRenderable.cpp" />
@@ -437,6 +453,7 @@
     <ClCompile Include="Source\BsScriptResourceManager.cpp" />
     <ClCompile Include="Source\BsScriptResourceRef.cpp" />
     <ClCompile Include="Source\BsScriptResources.cpp" />
+    <ClCompile Include="Source\BsScriptRigidbody.cpp" />
     <ClCompile Include="Source\BsScriptScene.cpp" />
     <ClCompile Include="Source\BsScriptSceneObject.cpp" />
     <ClCompile Include="Source\BsManagedSerializableArray.cpp" />
@@ -455,6 +472,7 @@
     <ClCompile Include="Source\BsScriptSerializableUtility.cpp" />
     <ClCompile Include="Source\BsScriptShader.cpp" />
     <ClCompile Include="Source\BsScriptShaderInclude.cpp" />
+    <ClCompile Include="Source\BsScriptSphereCollider.cpp" />
     <ClCompile Include="Source\BsScriptSpriteTexture.cpp" />
     <ClCompile Include="Source\BsScriptStringTable.cpp" />
     <ClCompile Include="Source\BsScriptStringTableManager.cpp" />

+ 60 - 0
SBansheeEngine/SBansheeEngine.vcxproj.filters

@@ -27,6 +27,12 @@
     <Filter Include="Header Files\RTTI">
       <UniqueIdentifier>{cff4d9c9-b006-4675-a58e-6a0e449ff8d5}</UniqueIdentifier>
     </Filter>
+    <Filter Include="Header Files\Physics">
+      <UniqueIdentifier>{8355a19c-b7b7-49a0-a8dd-baec11b88e28}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Source Files\Physics">
+      <UniqueIdentifier>{9eb1c24d-26f9-4036-bf91-978b7a78966e}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Include\BsScriptFont.h">
@@ -368,6 +374,33 @@
     <ClInclude Include="Include\BsScriptPhysicsMesh.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsScriptCollider.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptCollisionData.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptPhysicsQueryHit.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptRigidbody.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptBoxCollider.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptSphereCollider.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptCapsuleCollider.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptPlaneCollider.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptMeshCollider.h">
+      <Filter>Header Files\Physics</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsScriptTexture2D.cpp">
@@ -679,5 +712,32 @@
     <ClCompile Include="Source\BsScriptPhysicsMesh.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="Source\BsScriptCollider.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptCollisionData.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptPhysicsQueryHit.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptRigidbody.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptBoxCollider.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptSphereCollider.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptCapsuleCollider.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptPlaneCollider.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptMeshCollider.cpp">
+      <Filter>Source Files\Physics</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 43 - 0
SBansheeEngine/Source/BsScriptBoxCollider.cpp

@@ -0,0 +1,43 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptBoxCollider.h"
+#include "BsBoxCollider.h"
+
+namespace BansheeEngine
+{
+	ScriptBoxCollider::ScriptBoxCollider(MonoObject* instance, const SPtr<Collider>& collider)
+		:TScriptCollider(instance, collider)
+	{
+		
+	}
+
+	void ScriptBoxCollider::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptBoxCollider::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_SetExtents", &ScriptBoxCollider::internal_SetExtents);
+		metaData.scriptClass->addInternalCall("Internal_GetExtents", &ScriptBoxCollider::internal_GetExtents);
+	}
+
+	BoxCollider* ScriptBoxCollider::getBoxCollider() const
+	{
+		return static_cast<BoxCollider*>(mCollider.get());
+	}
+
+	void ScriptBoxCollider::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<BoxCollider> collider = BoxCollider::create(Vector3::ONE);
+		collider->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptBoxCollider* scriptCollider = new (bs_alloc<ScriptBoxCollider>()) ScriptBoxCollider(instance, collider);
+	}
+
+	void ScriptBoxCollider::internal_SetExtents(ScriptBoxCollider* thisPtr, Vector3* extents)
+	{
+		thisPtr->getBoxCollider()->setExtents(*extents);
+	}
+
+	void ScriptBoxCollider::internal_GetExtents(ScriptBoxCollider* thisPtr, Vector3* extents)
+	{
+		*extents = thisPtr->getBoxCollider()->getExtents();
+	}
+}

+ 55 - 0
SBansheeEngine/Source/BsScriptCapsuleCollider.cpp

@@ -0,0 +1,55 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptCapsuleCollider.h"
+#include "BsCapsuleCollider.h"
+
+namespace BansheeEngine
+{
+	ScriptCapsuleCollider::ScriptCapsuleCollider(MonoObject* instance, const SPtr<Collider>& collider)
+		:TScriptCollider(instance, collider)
+	{
+
+	}
+
+	void ScriptCapsuleCollider::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptCapsuleCollider::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_SetHalfHeight", &ScriptCapsuleCollider::internal_SetHalfHeight);
+		metaData.scriptClass->addInternalCall("Internal_GetHalfHeight", &ScriptCapsuleCollider::internal_GetHalfHeight);
+		metaData.scriptClass->addInternalCall("Internal_SetRadius", &ScriptCapsuleCollider::internal_SetRadius);
+		metaData.scriptClass->addInternalCall("Internal_GetRadius", &ScriptCapsuleCollider::internal_GetRadius);
+	}
+
+	CapsuleCollider* ScriptCapsuleCollider::getCapsuleCollider() const
+	{
+		return static_cast<CapsuleCollider*>(mCollider.get());
+	}
+
+	void ScriptCapsuleCollider::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<CapsuleCollider> collider = CapsuleCollider::create(0.2f, 0.5f);
+		collider->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptCapsuleCollider* scriptCollider = new (bs_alloc<ScriptCapsuleCollider>()) ScriptCapsuleCollider(instance, collider);
+	}
+
+	void ScriptCapsuleCollider::internal_SetHalfHeight(ScriptCapsuleCollider* thisPtr, float halfHeight)
+	{
+		thisPtr->getCapsuleCollider()->setHalfHeight(halfHeight);
+	}
+
+	float ScriptCapsuleCollider::internal_GetHalfHeight(ScriptCapsuleCollider* thisPtr)
+	{
+		return thisPtr->getCapsuleCollider()->getHalfHeight();
+	}
+
+	void ScriptCapsuleCollider::internal_SetRadius(ScriptCapsuleCollider* thisPtr, float radius)
+	{
+		thisPtr->getCapsuleCollider()->setRadius(radius);
+	}
+
+	float ScriptCapsuleCollider::internal_GetRadius(ScriptCapsuleCollider* thisPtr)
+	{
+		return thisPtr->getCapsuleCollider()->getRadius();
+	}
+}

+ 227 - 0
SBansheeEngine/Source/BsScriptCollider.cpp

@@ -0,0 +1,227 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptCollider.h"
+#include "BsMonoUtil.h"
+#include "BsMonoClass.h"
+#include "BsMonoMethod.h"
+#include "BsCollider.h"
+#include "BsRigidbody.h"
+#include "BsScriptRigidbody.h"
+#include "BsScriptPhysicsMaterial.h"
+#include "BsScriptCollisionData.h"
+#include "BsScriptPhysicsQueryHit.h"
+#include "BsScriptResourceManager.h"
+
+using namespace std::placeholders;
+
+namespace BansheeEngine
+{
+	ScriptCollider::OnCollisionThunkDef ScriptCollider::onCollisionBeginThunk = nullptr;
+	ScriptCollider::OnCollisionThunkDef ScriptCollider::onCollisionStayThunk = nullptr;
+	ScriptCollider::OnCollisionThunkDef ScriptCollider::onCollisionEndThunk = nullptr;
+
+	ScriptColliderBase::ScriptColliderBase(MonoObject* instance)
+		:ScriptObjectBase(instance)
+	{ }
+
+	void ScriptColliderBase::initialize(const SPtr<Collider>& collider)
+	{
+		mCollider = collider;
+
+		MonoObject* instance = getManagedInstance();
+		collider->onCollisionBegin.connect(std::bind(&Collider::onCollisionBegin, instance, _1));
+		collider->onCollisionStay.connect(std::bind(&Collider::onCollisionStay, instance, _1));
+		collider->onCollisionEnd.connect(std::bind(&Collider::onCollisionEnd, instance, _1));
+	}
+
+	ScriptCollider::ScriptCollider(MonoObject* instance)
+		:TScriptCollider(instance, nullptr)
+	{ }
+
+	void ScriptCollider::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_GetPosition", &ScriptCollider::internal_GetPosition);
+		metaData.scriptClass->addInternalCall("Internal_GetRotation", &ScriptCollider::internal_GetRotation);
+		metaData.scriptClass->addInternalCall("Internal_SetTransform", &ScriptCollider::internal_SetTransform);
+		metaData.scriptClass->addInternalCall("Internal_SetScale", &ScriptCollider::internal_SetScale);
+		metaData.scriptClass->addInternalCall("Internal_GetScale", &ScriptCollider::internal_GetScale);
+		metaData.scriptClass->addInternalCall("Internal_SetIsTrigger", &ScriptCollider::internal_SetIsTrigger);
+		metaData.scriptClass->addInternalCall("Internal_GetIsTrigger", &ScriptCollider::internal_GetIsTrigger);
+		metaData.scriptClass->addInternalCall("Internal_SetRigidbody", &ScriptCollider::internal_SetRigidbody);
+		metaData.scriptClass->addInternalCall("Internal_GetRigidbody", &ScriptCollider::internal_GetRigidbody);
+		metaData.scriptClass->addInternalCall("Internal_SetMass", &ScriptCollider::internal_SetMass);
+		metaData.scriptClass->addInternalCall("Internal_GetMass", &ScriptCollider::internal_GetMass);
+		metaData.scriptClass->addInternalCall("Internal_SetMaterial", &ScriptCollider::internal_SetMaterial);
+		metaData.scriptClass->addInternalCall("Internal_GetMaterial", &ScriptCollider::internal_GetMaterial);
+		metaData.scriptClass->addInternalCall("Internal_SetContactOffset", &ScriptCollider::internal_SetContactOffset);
+		metaData.scriptClass->addInternalCall("Internal_GetContactOffset", &ScriptCollider::internal_GetContactOffset);
+		metaData.scriptClass->addInternalCall("Internal_SetRestOffset", &ScriptCollider::internal_SetRestOffset);
+		metaData.scriptClass->addInternalCall("Internal_GetRestOffset", &ScriptCollider::internal_GetRestOffset);
+		metaData.scriptClass->addInternalCall("Internal_SetLayer", &ScriptCollider::internal_SetLayer);
+		metaData.scriptClass->addInternalCall("Internal_GetLayer", &ScriptCollider::internal_GetLayer);
+		metaData.scriptClass->addInternalCall("Internal_SetCollisionReportMode", &ScriptCollider::internal_SetCollisionReportMode);
+		metaData.scriptClass->addInternalCall("Internal_GetCollisionReportMode", &ScriptCollider::internal_GetCollisionReportMode);
+		metaData.scriptClass->addInternalCall("Internal_RayCast", &ScriptCollider::internal_RayCast);
+
+		onCollisionBeginThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionBegin", 1)->getThunk();
+		onCollisionStayThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionStay", 1)->getThunk();
+		onCollisionEndThunk = (OnCollisionThunkDef)metaData.scriptClass->getMethod("Internal_DoOnCollisionEnd", 1)->getThunk();
+	}
+
+	void ScriptCollider::onCollisionBegin(MonoObject* instance, const CollisionData& collisionData)
+	{
+		MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
+		MonoUtil::invokeThunk(onCollisionBeginThunk, instance, managedCollisionData);
+	}
+
+	void ScriptCollider::onCollisionStay(MonoObject* instance, const CollisionData& collisionData)
+	{
+		MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
+		MonoUtil::invokeThunk(onCollisionStayThunk, instance, managedCollisionData);
+	}
+
+	void ScriptCollider::onCollisionEnd(MonoObject* instance, const CollisionData& collisionData)
+	{
+		MonoObject* managedCollisionData = ScriptCollisionDataHelper::box(ScriptCollisionDataHelper::create(collisionData));
+		MonoUtil::invokeThunk(onCollisionEndThunk, instance, managedCollisionData);
+	}
+
+	void ScriptCollider::internal_GetPosition(ScriptColliderBase* thisPtr, Vector3* pos)
+	{
+		*pos = thisPtr->getCollider()->getPosition();
+	}
+
+	void ScriptCollider::internal_GetRotation(ScriptColliderBase* thisPtr, Quaternion* rot)
+	{
+		*rot = thisPtr->getCollider()->getRotation();
+	}
+
+	void ScriptCollider::internal_SetTransform(ScriptColliderBase* thisPtr, Vector3* pos, Quaternion* rot)
+	{
+		thisPtr->getCollider()->setTransform(*pos, *rot);
+	}
+
+	void ScriptCollider::internal_SetScale(ScriptColliderBase* thisPtr, Vector3* scale)
+	{
+		thisPtr->getCollider()->setScale(*scale);
+	}
+
+	void ScriptCollider::internal_GetScale(ScriptColliderBase* thisPtr, Vector3* scale)
+	{
+		*scale = thisPtr->getCollider()->getScale();
+	}
+
+	void ScriptCollider::internal_SetIsTrigger(ScriptColliderBase* thisPtr, bool value)
+	{
+		thisPtr->getCollider()->setIsTrigger(value);
+	}
+
+	bool ScriptCollider::internal_GetIsTrigger(ScriptColliderBase* thisPtr)
+	{
+		return thisPtr->getCollider()->getIsTrigger();
+	}
+
+	void ScriptCollider::internal_SetRigidbody(ScriptColliderBase* thisPtr, ScriptRigidbody* value)
+	{
+		Rigidbody* rigidbodyPtr = nullptr;
+		if (value != nullptr)
+			rigidbodyPtr = value->getRigidbody();
+
+		thisPtr->getCollider()->setRigidbody(rigidbodyPtr);
+	}
+
+	MonoObject* ScriptCollider::internal_GetRigidbody(ScriptColliderBase* thisPtr)
+	{
+		Rigidbody* rigidbodyPtr = thisPtr->getCollider()->getRigidbody();
+		if (rigidbodyPtr == nullptr)
+			return nullptr;
+
+		return (MonoObject*)rigidbodyPtr->_getOwner(PhysicsOwnerType::Script);
+	}
+
+	void ScriptCollider::internal_SetMass(ScriptColliderBase* thisPtr, float mass)
+	{
+		thisPtr->getCollider()->setMass(mass);
+	}
+
+	float ScriptCollider::internal_GetMass(ScriptColliderBase* thisPtr)
+	{
+		return thisPtr->getCollider()->getMass();
+	}
+
+	void ScriptCollider::internal_SetMaterial(ScriptColliderBase* thisPtr, ScriptPhysicsMaterial* material)
+	{
+		HPhysicsMaterial materialHandle;
+
+		if (material != nullptr)
+			materialHandle = material->getHandle();
+
+		thisPtr->getCollider()->setMaterial(materialHandle);
+	}
+
+	MonoObject* ScriptCollider::internal_GetMaterial(ScriptColliderBase* thisPtr)
+	{
+		HPhysicsMaterial material = thisPtr->getCollider()->getMaterial();
+		if (material == nullptr)
+			return nullptr;
+
+		ScriptPhysicsMaterial* scriptMaterial;
+		ScriptResourceManager::instance().getScriptResource(material, &scriptMaterial, true);
+
+		return scriptMaterial->getManagedInstance();
+	}
+
+	void ScriptCollider::internal_SetContactOffset(ScriptColliderBase* thisPtr, float value)
+	{
+		thisPtr->getCollider()->setContactOffset(value);
+	}
+
+	float ScriptCollider::internal_GetContactOffset(ScriptColliderBase* thisPtr)
+	{
+		return thisPtr->getCollider()->getContactOffset();
+	}
+
+	void ScriptCollider::internal_SetRestOffset(ScriptColliderBase* thisPtr, float value)
+	{
+		thisPtr->getCollider()->setRestOffset(value);
+	}
+
+	float ScriptCollider::internal_GetRestOffset(ScriptColliderBase* thisPtr)
+	{
+		return thisPtr->getCollider()->getRestOffset();
+	}
+
+	void ScriptCollider::internal_SetLayer(ScriptColliderBase* thisPtr, UINT64 layer)
+	{
+		thisPtr->getCollider()->setLayer(layer);
+	}
+
+	UINT64 ScriptCollider::internal_GetLayer(ScriptColliderBase* thisPtr)
+	{
+		return thisPtr->getCollider()->getLayer();
+	}
+
+	void ScriptCollider::internal_SetCollisionReportMode(ScriptColliderBase* thisPtr, CollisionReportMode mode)
+	{
+		thisPtr->getCollider()->setCollisionReportMode(mode);
+	}
+
+	CollisionReportMode ScriptCollider::internal_GetCollisionReportMode(ScriptColliderBase* thisPtr)
+	{
+		return thisPtr->getCollider()->getCollisionReportMode();
+	}
+
+	bool ScriptCollider::internal_RayCast(ScriptColliderBase* thisPtr, Vector3* origin, Vector3* unitDir, MonoObject** hit,
+		float maxDist)
+	{
+		PhysicsQueryHit nativeHit;
+		bool wasHit = thisPtr->getCollider()->rayCast(*origin, *unitDir, nativeHit, maxDist);
+
+		if (!wasHit)
+			*hit = nullptr;
+		else
+			*hit = ScriptPhysicsQueryHitHelper::box(ScriptPhysicsQueryHitHelper::create(nativeHit));
+
+		return wasHit;
+	}
+}

+ 71 - 0
SBansheeEngine/Source/BsScriptCollisionData.cpp

@@ -0,0 +1,71 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptCollisionData.h"
+#include "BsMonoManager.h"
+#include "BsMonoClass.h"
+#include "BsMonoUtil.h"
+#include "BsCollider.h"
+
+namespace BansheeEngine
+{
+	ScriptCollisionDataHelper::ScriptCollisionDataHelper(MonoObject* instance)
+		:ScriptObject(instance)
+	{ }
+
+	void ScriptCollisionDataHelper::initRuntimeData()
+	{ }
+
+	ScriptCollisionData ScriptCollisionDataHelper::create(const CollisionData& data)
+	{
+		ScriptCollisionData output;
+
+		if (data.collidersRaw[0] != nullptr)
+			output.colliderA = (MonoObject*)data.collidersRaw[0]->_getOwner(PhysicsOwnerType::Script);
+		else
+			output.colliderA = nullptr;
+
+		if (data.collidersRaw[1] != nullptr)
+			output.colliderB = (MonoObject*)data.collidersRaw[1]->_getOwner(PhysicsOwnerType::Script);
+		else
+			output.colliderB = nullptr;
+
+		UINT32 numContactPoints = (UINT32)data.contactPoints.size();
+		ScriptArray contactPoints = ScriptArray::create<ContactPoint>(numContactPoints);
+		for (UINT32 i = 0; i < numContactPoints; i++)
+			contactPoints.set(i, ScriptContactPointHelper::box(data.contactPoints[i]));
+
+		output.contactPoints = contactPoints.getInternal();
+		return output;
+	}
+
+	MonoObject* ScriptCollisionDataHelper::box(const ScriptCollisionData& value)
+	{
+		// We're casting away const but it's fine since structs are passed by value anyway
+		return mono_value_box(MonoManager::instance().getDomain(),
+			metaData.scriptClass->_getInternalClass(), (void*)&value);
+	}
+
+	ScriptCollisionData ScriptCollisionDataHelper::unbox(MonoObject* obj)
+	{
+		return *(ScriptCollisionData*)mono_object_unbox(obj);
+	}
+
+	ScriptContactPointHelper::ScriptContactPointHelper(MonoObject* instance)
+		:ScriptObject(instance)
+	{ }
+
+	void ScriptContactPointHelper::initRuntimeData()
+	{ }
+
+	MonoObject* ScriptContactPointHelper::box(const ContactPoint& value)
+	{
+		// We're casting away const but it's fine since structs are passed by value anyway
+		return mono_value_box(MonoManager::instance().getDomain(),
+			metaData.scriptClass->_getInternalClass(), (void*)&value);
+	}
+
+	ContactPoint ScriptContactPointHelper::unbox(MonoObject* obj)
+	{
+		return *(ContactPoint*)mono_object_unbox(obj);
+	}
+}

+ 56 - 0
SBansheeEngine/Source/BsScriptMeshCollider.cpp

@@ -0,0 +1,56 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptMeshCollider.h"
+#include "BsMeshCollider.h"
+#include "BsScriptPhysicsMesh.h"
+#include "BsScriptResourceManager.h"
+
+namespace BansheeEngine
+{
+	ScriptMeshCollider::ScriptMeshCollider(MonoObject* instance, const SPtr<Collider>& collider)
+		:TScriptCollider(instance, collider)
+	{
+
+	}
+
+	void ScriptMeshCollider::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptMeshCollider::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_SetMesh", &ScriptMeshCollider::internal_SetMesh);
+		metaData.scriptClass->addInternalCall("Internal_GetMesh", &ScriptMeshCollider::internal_GetMesh);
+	}
+
+	MeshCollider* ScriptMeshCollider::getMeshCollider() const
+	{
+		return static_cast<MeshCollider*>(mCollider.get());
+	}
+
+	void ScriptMeshCollider::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<MeshCollider> collider = MeshCollider::create();
+		collider->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptMeshCollider* scriptCollider = new (bs_alloc<ScriptMeshCollider>()) ScriptMeshCollider(instance, collider);
+	}
+
+	void ScriptMeshCollider::internal_SetMesh(ScriptMeshCollider* thisPtr, ScriptPhysicsMesh* scriptMesh)
+	{
+		HPhysicsMesh mesh;
+		if (scriptMesh != nullptr)
+			mesh = scriptMesh->getHandle();
+
+		thisPtr->getMeshCollider()->setMesh(mesh);
+	}
+
+	MonoObject* ScriptMeshCollider::internal_GetMesh(ScriptMeshCollider* thisPtr)
+	{
+		HPhysicsMesh mesh = thisPtr->getMeshCollider()->getMesh();
+		if (mesh == nullptr)
+			return nullptr;
+
+		ScriptPhysicsMesh* scriptMesh;
+		ScriptResourceManager::instance().getScriptResource(mesh, &scriptMesh, true);
+
+		return scriptMesh->getManagedInstance();
+	}
+}

+ 47 - 0
SBansheeEngine/Source/BsScriptPhysicsQueryHit.cpp

@@ -0,0 +1,47 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptPhysicsQueryHit.h"
+#include "BsMonoManager.h"
+#include "BsMonoClass.h"
+#include "BsMonoUtil.h"
+#include "BsCollider.h"
+
+namespace BansheeEngine
+{
+	ScriptPhysicsQueryHitHelper::ScriptPhysicsQueryHitHelper(MonoObject* instance)
+		:ScriptObject(instance)
+	{ }
+
+	void ScriptPhysicsQueryHitHelper::initRuntimeData()
+	{ }
+
+	ScriptPhysicsQueryHit ScriptPhysicsQueryHitHelper::create(const PhysicsQueryHit& data)
+	{
+		ScriptPhysicsQueryHit output;
+
+		if (data.colliderRaw != nullptr)
+			output.collider = (MonoObject*)data.colliderRaw->_getOwner(PhysicsOwnerType::Script);
+		else
+			output.collider = nullptr;
+
+		output.distance = data.distance;
+		output.normal = data.normal;
+		output.point = data.point;
+		output.triangleIdx = data.triangleIdx;
+		output.uv = data.uv;
+
+		return output;
+	}
+
+	MonoObject* ScriptPhysicsQueryHitHelper::box(const ScriptPhysicsQueryHit& value)
+	{
+		// We're casting away const but it's fine since structs are passed by value anyway
+		return mono_value_box(MonoManager::instance().getDomain(),
+			metaData.scriptClass->_getInternalClass(), (void*)&value);
+	}
+
+	ScriptPhysicsQueryHit ScriptPhysicsQueryHitHelper::unbox(MonoObject* obj)
+	{
+		return *(ScriptPhysicsQueryHit*)mono_object_unbox(obj);
+	}
+}

+ 31 - 0
SBansheeEngine/Source/BsScriptPlaneCollider.cpp

@@ -0,0 +1,31 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptPlaneCollider.h"
+#include "BsPlaneCollider.h"
+
+namespace BansheeEngine
+{
+	ScriptPlaneCollider::ScriptPlaneCollider(MonoObject* instance, const SPtr<Collider>& collider)
+		:TScriptCollider(instance, collider)
+	{
+
+	}
+
+	void ScriptPlaneCollider::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptPlaneCollider::internal_CreateInstance);
+	}
+
+	PlaneCollider* ScriptPlaneCollider::getPlaneCollider() const
+	{
+		return static_cast<PlaneCollider*>(mCollider.get());
+	}
+
+	void ScriptPlaneCollider::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<PlaneCollider> collider = PlaneCollider::create();
+		collider->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptPlaneCollider* scriptCollider = new (bs_alloc<ScriptPlaneCollider>()) ScriptPlaneCollider(instance, collider);
+	}
+}

+ 15 - 0
SBansheeEngine/Source/BsScriptRigidbody.cpp

@@ -0,0 +1,15 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptRigidbody.h"
+
+namespace BansheeEngine
+{
+	ScriptRigidbody::ScriptRigidbody(MonoObject* instance, const SPtr<Rigidbody>& body)
+		:ScriptObject(instance), mRigidbody(body)
+	{ }
+
+	void ScriptRigidbody::initRuntimeData()
+	{
+		// TODO
+	}
+}

+ 43 - 0
SBansheeEngine/Source/BsScriptSphereCollider.cpp

@@ -0,0 +1,43 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptSphereCollider.h"
+#include "BsSphereCollider.h"
+
+namespace BansheeEngine
+{
+	ScriptSphereCollider::ScriptSphereCollider(MonoObject* instance, const SPtr<Collider>& collider)
+		:TScriptCollider(instance, collider)
+	{
+
+	}
+
+	void ScriptSphereCollider::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptSphereCollider::internal_CreateInstance);
+		metaData.scriptClass->addInternalCall("Internal_SetRadius", &ScriptSphereCollider::internal_SetRadius);
+		metaData.scriptClass->addInternalCall("Internal_GetRadius", &ScriptSphereCollider::internal_GetRadius);
+	}
+
+	SphereCollider* ScriptSphereCollider::getSphereCollider() const
+	{
+		return static_cast<SphereCollider*>(mCollider.get());
+	}
+
+	void ScriptSphereCollider::internal_CreateInstance(MonoObject* instance)
+	{
+		SPtr<SphereCollider> collider = SphereCollider::create(1.0f);
+		collider->_setOwner(PhysicsOwnerType::Script, instance);
+
+		ScriptSphereCollider* scriptCollider = new (bs_alloc<ScriptSphereCollider>()) ScriptSphereCollider(instance, collider);
+	}
+
+	void ScriptSphereCollider::internal_SetRadius(ScriptSphereCollider* thisPtr, float radius)
+	{
+		thisPtr->getSphereCollider()->setRadius(radius);
+	}
+
+	float ScriptSphereCollider::internal_GetRadius(ScriptSphereCollider* thisPtr)
+	{
+		return thisPtr->getSphereCollider()->getRadius();
+	}
+}