Browse Source

Added code for detecting scene view mouse presses

Marko Pintera 11 years ago
parent
commit
524b4e0af7

+ 22 - 0
BansheeEditor/Include/BsSceneEditorWidget.h

@@ -20,18 +20,40 @@ namespace BansheeEngine
 
 
 	protected:
 	protected:
 		void doOnResized(UINT32 width, UINT32 height);
 		void doOnResized(UINT32 width, UINT32 height);
+		void doOnParentChanged();
+		void determineParentWindow();
 
 
 		void updateRenderTexture(UINT32 width, UINT32 height);
 		void updateRenderTexture(UINT32 width, UINT32 height);
 		void render(const Viewport* viewport, DrawList& drawList);
 		void render(const Viewport* viewport, DrawList& drawList);
+		bool toSceneViewPos(const Vector2I& screenPos, Vector2I& scenePos);
+
+		/**
+		 * @brief	Called whenever a pointer (e.g. mouse cursor) is moved.
+		 */
+		void onPointerMoved(const PointerEvent& event);
+
+		/**
+		 * @brief	Called whenever a pointer button (e.g. mouse button) is released.
+		 */
+		void onPointerReleased(const PointerEvent& event);
+
+		/**
+		 * @brief	Called whenever a pointer button (e.g. mouse button) is pressed.
+		 */
+		void onPointerPressed(const PointerEvent& event);
 
 
 	private:
 	private:
 		static SceneEditorWidget* Instance;
 		static SceneEditorWidget* Instance;
 
 
+		RenderWindowPtr mParentWindow;
 		RenderTexturePtr mSceneRenderTarget;
 		RenderTexturePtr mSceneRenderTarget;
 		GUIRenderTexture* mGUIRenderTexture;
 		GUIRenderTexture* mGUIRenderTexture;
 		HCamera mCamera;
 		HCamera mCamera;
 		SceneGrid* mSceneGrid;
 		SceneGrid* mSceneGrid;
 
 
 		HEvent mRenderCallback;
 		HEvent mRenderCallback;
+		HEvent mOnPointerMovedConn;
+		HEvent mOnPointerPressedConn;
+		HEvent mOnPointerReleasedConn;
 	};
 	};
 }
 }

+ 76 - 10
BansheeEditor/Source/BsSceneEditorWidget.cpp

@@ -18,6 +18,8 @@
 #include "BsRenderer.h"
 #include "BsRenderer.h"
 #include "BsGUIWidget.h"
 #include "BsGUIWidget.h"
 #include "BsSceneGrid.h"
 #include "BsSceneGrid.h"
+#include "BsInput.h"
+#include "BsGUILayoutUtility.h"
 
 
 // DEBUG ONLY
 // DEBUG ONLY
 #include "BsTime.h"
 #include "BsTime.h"
@@ -40,30 +42,74 @@ namespace BansheeEngine
 
 
 		mRenderCallback = RendererManager::instance().getActive()->onRenderViewport.connect(std::bind(&SceneEditorWidget::render, this, _1, _2));
 		mRenderCallback = RendererManager::instance().getActive()->onRenderViewport.connect(std::bind(&SceneEditorWidget::render, this, _1, _2));
 		mSceneGrid = bs_new<SceneGrid>();
 		mSceneGrid = bs_new<SceneGrid>();
+
+		mOnPointerMovedConn = gInput().onPointerMoved.connect(std::bind(&SceneEditorWidget::onPointerMoved, this, _1));
+		mOnPointerPressedConn = gInput().onPointerPressed.connect(std::bind(&SceneEditorWidget::onPointerPressed, this, _1));
+		mOnPointerReleasedConn = gInput().onPointerReleased.connect(std::bind(&SceneEditorWidget::onPointerReleased, this, _1));
+
+		determineParentWindow();
 	}
 	}
 
 
 	SceneEditorWidget::~SceneEditorWidget()
 	SceneEditorWidget::~SceneEditorWidget()
 	{
 	{
 		bs_delete(mSceneGrid);
 		bs_delete(mSceneGrid);
 		mRenderCallback.disconnect();
 		mRenderCallback.disconnect();
+		mOnPointerMovedConn.disconnect();
+		mOnPointerPressedConn.disconnect();
+		mOnPointerReleasedConn.disconnect();
 	}
 	}
 
 
 	void SceneEditorWidget::_update()
 	void SceneEditorWidget::_update()
 	{
 	{
-		// DEBUG ONLY
-		if (gTime().getCurrentFrameNumber() == 100)
-		{
-			HTexture colorTex = mSceneRenderTarget->getBindableColorTexture();
-			gResources().save(colorTex, "C:\\SavedRenderTex.asset", true);
+		//// DEBUG ONLY
+		//if (gTime().getCurrentFrameNumber() == 100)
+		//{
+		//	HTexture colorTex = mSceneRenderTarget->getBindableColorTexture();
+		//	gResources().save(colorTex, "C:\\SavedRenderTex.asset", true);
 
 
-			FileSystem::move("C:\\SavedRenderTex.asset", "C:\\SavedRenderTexNew.asset", true);
+		//	FileSystem::move("C:\\SavedRenderTex.asset", "C:\\SavedRenderTexNew.asset", true);
 
 
-			HTexture colorTexLoaded = gResources().load("C:\\SavedRenderTexNew.asset");
-			HSpriteTexture spriteTex = SpriteTexture::create(colorTexLoaded);
+		//	HTexture colorTexLoaded = gResources().load("C:\\SavedRenderTexNew.asset");
+		//	HSpriteTexture spriteTex = SpriteTexture::create(colorTexLoaded);
 
 
-			GUILayout& layout = mContent->getLayout();
-			layout.addElement(GUITexture::create(spriteTex));
+		//	GUILayout& layout = mContent->getLayout();
+		//	layout.addElement(GUITexture::create(spriteTex));
+		//}
+	}
+
+	bool SceneEditorWidget::toSceneViewPos(const Vector2I& screenPos, Vector2I& scenePos)
+	{
+		Vector2I windowPos = mParentWindow->screenToWindowPos(screenPos);
+
+		RectI renderTextureBounds = GUILayoutUtility::calcBounds(mGUIRenderTexture);
+
+		if (renderTextureBounds.contains(windowPos))
+		{
+			scenePos.x = windowPos.x - renderTextureBounds.x;
+			scenePos.y = windowPos.y - renderTextureBounds.y;
+
+			return true;
 		}
 		}
+
+		return false;
+	}
+
+	void SceneEditorWidget::onPointerMoved(const PointerEvent& event)
+	{
+
+		
+	}
+
+	void SceneEditorWidget::onPointerReleased(const PointerEvent& event)
+	{
+
+	}
+
+	void SceneEditorWidget::onPointerPressed(const PointerEvent& event)
+	{
+		Vector2I scenePos;
+		if (!toSceneViewPos(event.screenPos, scenePos))
+			return;
 	}
 	}
 
 
 	void SceneEditorWidget::doOnResized(UINT32 width, UINT32 height)
 	void SceneEditorWidget::doOnResized(UINT32 width, UINT32 height)
@@ -73,6 +119,26 @@ namespace BansheeEngine
 		updateRenderTexture(width, height);
 		updateRenderTexture(width, height);
 	}
 	}
 
 
+	void SceneEditorWidget::doOnParentChanged()
+	{
+		determineParentWindow();
+	}
+
+	void SceneEditorWidget::determineParentWindow()
+	{
+		GUIWidget& parentWidget = getParentWidget();
+		RenderTargetPtr parentTarget = parentWidget.getTarget()->getTarget();
+
+		if (!parentTarget->getProperties().isWindow())
+		{
+			mParentWindow = nullptr;
+			BS_EXCEPT(InvalidStateException, "Scene view parent render target is not a window. This is not supported.");
+			return;
+		}
+
+		mParentWindow = std::static_pointer_cast<RenderWindow>(parentTarget);
+	}
+
 	void SceneEditorWidget::render(const Viewport* viewport, DrawList& drawList)
 	void SceneEditorWidget::render(const Viewport* viewport, DrawList& drawList)
 	{
 	{
 		if (mCamera == nullptr)
 		if (mCamera == nullptr)