Bläddra i källkod

C# input and virtual input work

Marko Pintera 11 år sedan
förälder
incheckning
474830fefa

+ 5 - 0
MBansheeEngine/Math/Vector2.cs

@@ -181,5 +181,10 @@ namespace BansheeEngine
             
             return false;
         }
+
+        public override string ToString()
+        {
+            return "(" + x + ", " + y + ")";
+        }
     }
 }

+ 5 - 0
MBansheeEngine/Math/Vector2I.cs

@@ -102,5 +102,10 @@ namespace BansheeEngine
 
             return false;
         }
+
+        public override string ToString()
+        {
+            return "(" + x + ", " + y + ")";
+        }
     }
 }

+ 5 - 0
MBansheeEngine/Math/Vector3.cs

@@ -195,5 +195,10 @@ namespace BansheeEngine
 
             return false;
         }
+
+        public override string ToString()
+        {
+            return "(" + x + ", " + y + ", " + z + ")";
+        }
     }
 }

+ 5 - 0
MBansheeEngine/Math/Vector4.cs

@@ -198,5 +198,10 @@ namespace BansheeEngine
 
             return false;
         }
+
+        public override string ToString()
+        {
+            return "(" + x + ", " + y + ", " + z + ", " + w + ")";
+        }
     }
 }

+ 2 - 1
SBansheeEngine/Include/BsScriptInput.h

@@ -30,7 +30,8 @@ namespace BansheeEngine
 
 		typedef void(__stdcall *OnButtonEventThunkDef) (ButtonCode, UINT32, MonoException**);
 		typedef void(__stdcall *OnCharInputEventThunkDef) (UINT32, MonoException**);
-		typedef void(__stdcall *OnPointerEventThunkDef) (Vector2I, PointerEventButton, bool, bool, bool, float, MonoException**);
+		typedef void(__stdcall *OnPointerEventThunkDef) (MonoObject*, PointerEventButton, 
+			bool, bool, bool, float, MonoException**);
 
 		static OnButtonEventThunkDef OnButtonPressedThunk;
 		static OnButtonEventThunkDef OnButtonReleasedThunk;

+ 0 - 11
SBansheeEngine/Include/BsScriptInputConfiguration.h

@@ -39,17 +39,6 @@ namespace BansheeEngine
 		static Map<UINT64, ScriptInputConfiguration*> ScriptInputConfigurations;
 	};
 
-	class BS_SCR_BE_EXPORT ScriptVirtualButton : public ScriptObject <ScriptVirtualButton>
-	{
-	public:
-		SCRIPT_OBJ(BansheeEngineAssemblyName, "BansheeEngine", "VirtualButton")
-
-	private:
-		static UINT32 internal_InitVirtualButton(MonoString* name);
-
-		ScriptVirtualButton(MonoObject* instance);
-	};
-
 	class BS_SCR_BE_EXPORT ScriptVirtualAxis : public ScriptObject <ScriptVirtualAxis>
 	{
 	public:

+ 20 - 0
SBansheeEngine/Include/BsScriptVector2I.h

@@ -0,0 +1,20 @@
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+#include "BsVector2I.h"
+
+namespace BansheeEngine
+{
+	class BS_SCR_BE_EXPORT ScriptVector2I : public ScriptObject<ScriptVector2I>
+	{
+	public:
+		SCRIPT_OBJ(BansheeEngineAssemblyName, "BansheeEngine", "Vector2I")
+
+		static Vector2I unbox(MonoObject* obj);
+		static MonoObject* box(const Vector2I& value);
+
+	private:
+		ScriptVector2I(MonoObject* instance);
+	};
+}

+ 22 - 0
SBansheeEngine/Include/BsScriptVirtualButton.h

@@ -0,0 +1,22 @@
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+#include "BsInputConfiguration.h"
+
+namespace BansheeEngine
+{
+	class BS_SCR_BE_EXPORT ScriptVirtualButton : public ScriptObject <ScriptVirtualButton>
+	{
+	public:
+		SCRIPT_OBJ(BansheeEngineAssemblyName, "BansheeEngine", "VirtualButton")
+
+		static VirtualButton unbox(MonoObject* obj);
+		static MonoObject* box(const VirtualButton& value);
+
+	private:
+		static UINT32 internal_InitVirtualButton(MonoString* name);
+
+		ScriptVirtualButton(MonoObject* instance);
+	};
+}

+ 1 - 1
SBansheeEngine/Include/BsScriptVirtualInput.h

@@ -25,7 +25,7 @@ namespace BansheeEngine
 		static bool internal_isButtonUp(VirtualButton btn, UINT32 deviceIdx);
 		static float internal_getAxisValue(VirtualAxis axis, UINT32 deviceIdx);
 
-		typedef void(__stdcall *OnButtonEventThunkDef) (VirtualButton, UINT32, MonoException**);
+		typedef void(__stdcall *OnButtonEventThunkDef) (MonoObject*, UINT32, MonoException**);
 
 		static OnButtonEventThunkDef OnButtonUpThunk;
 		static OnButtonEventThunkDef OnButtonDownThunk;

+ 4 - 0
SBansheeEngine/SBansheeEngine.vcxproj

@@ -290,6 +290,8 @@
     <ClInclude Include="Include\BsScriptTexture2D.h" />
     <ClInclude Include="Include\BsScriptGUIContent.h" />
     <ClInclude Include="Include\BsManagedSerializableObjectInfo.h" />
+    <ClInclude Include="Include\BsScriptVector2I.h" />
+    <ClInclude Include="Include\BsScriptVirtualButton.h" />
     <ClInclude Include="Include\BsScriptVirtualInput.h" />
   </ItemGroup>
   <ItemGroup>
@@ -345,7 +347,9 @@
     <ClCompile Include="Source\BsScriptStringTable.cpp" />
     <ClCompile Include="Source\BsScriptTexture2D.cpp" />
     <ClCompile Include="Source\BsScriptGUIContent.cpp" />
+    <ClCompile Include="Source\BsScriptVector2I.cpp" />
     <ClCompile Include="Source\BsScriptVirtualInput.cpp" />
+    <ClCompile Include="Source\BsScriptVirtualButton.cpp" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 12 - 0
SBansheeEngine/SBansheeEngine.vcxproj.filters

@@ -228,6 +228,12 @@
     <ClInclude Include="Include\BsScriptVirtualInput.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsScriptVector2I.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsScriptVirtualButton.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsScriptTexture2D.cpp">
@@ -389,5 +395,11 @@
     <ClCompile Include="Source\BsScriptVirtualInput.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="Source\BsScriptVector2I.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Source\BsScriptVirtualButton.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 13 - 4
SBansheeEngine/Source/BsScriptInput.cpp

@@ -5,6 +5,7 @@
 #include "BsMonoUtil.h"
 #include "BsDebug.h"
 #include "BsInput.h"
+#include "BsScriptVector2I.h"
 
 namespace BansheeEngine
 {
@@ -95,7 +96,9 @@ namespace BansheeEngine
 	void ScriptInput::onPointerMoved(const PointerEvent& ev)
 	{
 		MonoException* exception = nullptr;
-		OnPointerMovedThunk(ev.screenPos, ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount, &exception);
+		MonoObject* screenPos = ScriptVector2I::box(ev.screenPos);
+
+		OnPointerMovedThunk(screenPos, ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount, &exception);
 
 		MonoUtil::throwIfException(exception);
 	}
@@ -103,7 +106,9 @@ namespace BansheeEngine
 	void ScriptInput::onPointerPressed(const PointerEvent& ev)
 	{
 		MonoException* exception = nullptr;
-		OnPointerPressedThunk(ev.screenPos, ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount, &exception);
+		MonoObject* screenPos = ScriptVector2I::box(ev.screenPos);
+
+		OnPointerPressedThunk(screenPos, ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount, &exception);
 
 		MonoUtil::throwIfException(exception);
 	}
@@ -111,7 +116,9 @@ namespace BansheeEngine
 	void ScriptInput::onPointerReleased(const PointerEvent& ev)
 	{
 		MonoException* exception = nullptr;
-		OnPointerReleasedThunk(ev.screenPos, ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount, &exception);
+		MonoObject* screenPos = ScriptVector2I::box(ev.screenPos);
+
+		OnPointerReleasedThunk(screenPos, ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount, &exception);
 
 		MonoUtil::throwIfException(exception);
 	}
@@ -119,7 +126,9 @@ namespace BansheeEngine
 	void ScriptInput::onPointerDoubleClick(const PointerEvent& ev)
 	{
 		MonoException* exception = nullptr;
-		OnPointerDoubleClickThunk(ev.screenPos, ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount, &exception);
+		MonoObject* screenPos = ScriptVector2I::box(ev.screenPos);
+
+		OnPointerDoubleClickThunk(screenPos, ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount, &exception);
 
 		MonoUtil::throwIfException(exception);
 	}

+ 0 - 17
SBansheeEngine/Source/BsScriptInputConfiguration.cpp

@@ -106,23 +106,6 @@ namespace BansheeEngine
 		ScriptInputConfigurations.erase(configId);
 	}
 
-	ScriptVirtualButton::ScriptVirtualButton(MonoObject* instance)
-		:ScriptObject(instance)
-	{ }
-
-	void ScriptVirtualButton::initRuntimeData()
-	{
-		metaData.scriptClass->addInternalCall("Internal_InitVirtualButton", &ScriptVirtualButton::internal_InitVirtualButton);
-	}
-
-	UINT32 ScriptVirtualButton::internal_InitVirtualButton(MonoString* name)
-	{
-		String nameStr = MonoUtil::monoToString(name);
-
-		VirtualButton vb(nameStr);
-		return vb.buttonIdentifier;
-	}
-
 	ScriptVirtualAxis::ScriptVirtualAxis(MonoObject* instance)
 		:ScriptObject(instance)
 	{ }

+ 26 - 0
SBansheeEngine/Source/BsScriptVector2I.cpp

@@ -0,0 +1,26 @@
+#include "BsScriptVector2I.h"
+#include "BsMonoManager.h"
+#include "BsMonoClass.h"
+#include "BsMonoUtil.h"
+
+namespace BansheeEngine
+{
+	ScriptVector2I::ScriptVector2I(MonoObject* instance)
+		:ScriptObject(instance)
+	{ }
+
+	void ScriptVector2I::initRuntimeData()
+	{ }
+
+	MonoObject* ScriptVector2I::box(const Vector2I& 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);
+	}
+
+	Vector2I ScriptVector2I::unbox(MonoObject* obj)
+	{
+		return *(Vector2I*)mono_object_unbox(obj);
+	}
+}

+ 36 - 0
SBansheeEngine/Source/BsScriptVirtualButton.cpp

@@ -0,0 +1,36 @@
+#include "BsScriptVirtualButton.h"
+#include "BsMonoManager.h"
+#include "BsMonoClass.h"
+#include "BsMonoUtil.h"
+
+namespace BansheeEngine
+{
+	ScriptVirtualButton::ScriptVirtualButton(MonoObject* instance)
+		:ScriptObject(instance)
+	{ }
+
+	void ScriptVirtualButton::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_InitVirtualButton", &ScriptVirtualButton::internal_InitVirtualButton);
+	}
+
+	UINT32 ScriptVirtualButton::internal_InitVirtualButton(MonoString* name)
+	{
+		String nameStr = MonoUtil::monoToString(name);
+
+		VirtualButton vb(nameStr);
+		return vb.buttonIdentifier;
+	}
+
+	MonoObject* ScriptVirtualButton::box(const VirtualButton& 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);
+	}
+
+	VirtualButton ScriptVirtualButton::unbox(MonoObject* obj)
+	{
+		return *(VirtualButton*)mono_object_unbox(obj);
+	}
+}

+ 7 - 3
SBansheeEngine/Source/BsScriptVirtualInput.cpp

@@ -5,6 +5,7 @@
 #include "BsMonoUtil.h"
 #include "BsDebug.h"
 #include "BsVirtualInput.h"
+#include "BsScriptVirtualButton.h"
 #include "BsScriptInputConfiguration.h"
 
 namespace BansheeEngine
@@ -54,7 +55,8 @@ namespace BansheeEngine
 	void ScriptVirtualInput::onButtonDown(const VirtualButton& btn, UINT32 deviceIdx)
 	{
 		MonoException* exception = nullptr;
-		OnButtonDownThunk(btn, deviceIdx, &exception);
+		MonoObject* virtualButton = ScriptVirtualButton::box(btn);
+		OnButtonDownThunk(virtualButton, deviceIdx, &exception);
 
 		MonoUtil::throwIfException(exception);
 	}
@@ -62,7 +64,8 @@ namespace BansheeEngine
 	void ScriptVirtualInput::onButtonUp(const VirtualButton& btn, UINT32 deviceIdx)
 	{
 		MonoException* exception = nullptr;
-		OnButtonUpThunk(btn, deviceIdx, &exception);
+		MonoObject* virtualButton = ScriptVirtualButton::box(btn);
+		OnButtonUpThunk(virtualButton, deviceIdx, &exception);
 
 		MonoUtil::throwIfException(exception);
 	}
@@ -70,7 +73,8 @@ namespace BansheeEngine
 	void ScriptVirtualInput::onButtonHeld(const VirtualButton& btn, UINT32 deviceIdx)
 	{
 		MonoException* exception = nullptr;
-		OnButtonHeldThunk(btn, deviceIdx, &exception);
+		MonoObject* virtualButton = ScriptVirtualButton::box(btn);
+		OnButtonHeldThunk(virtualButton, deviceIdx, &exception);
 
 		MonoUtil::throwIfException(exception);
 	}

+ 3 - 4
SceneView.txt

@@ -1,9 +1,8 @@
 
  GIZMO TODO:
-  - Make a C# wrapper for Camera and Renderable
+  - Make a C# wrapper for Renderable
 
 The bounds I retrieve from GUIUtility are relative to the entire window, not just the current widget. Another reason to move editor widgets to their own GUIWidget.
-Hook up Input callbacks in ScriptInput
 Passing a Vector2I (and I'm assuming any script) through a thunk crashes the runtime
 
 Set up Application::getPrimaryViewport so it returns a valid viewport otherwise C# Camera won't work properly
@@ -15,7 +14,7 @@ Also make sure that handle manager receives mouse up event if its done outside o
 When selecting/deselecting stuff handle display is delayed
 
 Create the scene widget completely in C#?
- - Port Camera/viewport, RenderTexture, SceneCameraController, Input, ProjectSettings, SceneGrid
+ - Port RenderTexture, SceneCameraController, ProjectSettings, SceneGrid
  - Will need to track when widget resizes so I can resize the render target
  - Handle manager update will originate from the widget
   - Actually it could still be done from C++
@@ -42,7 +41,7 @@ LATER:
 
 ---------------------------------------------------------------------
 Render textures in C#:
- - In C# have Texture2D, TextureCube, TextureVolume, Texture2DArray. They should have a common Texture base.
+ - In C# have Texture2D, TextureCube, TextureVolume. They should have a common Texture base.
    - Each of those can be created with a Renderable flag
  - Render textures mirror what we have in C++
    - RenderTexture and MultiRenderTexture (since we have these separate representation we don't need RenderBuffer that Unity has)