Browse Source

Properly update handles as soon as selection changes, not a frame later

Marko Pintera 11 years ago
parent
commit
90ac2fa06f

+ 1 - 1
BansheeCore/Source/BsCoreApplication.cpp

@@ -175,8 +175,8 @@ namespace BansheeEngine
 			Platform::_update();
 			Platform::_update();
 			DeferredCallManager::instance()._update();
 			DeferredCallManager::instance()._update();
 			RenderWindowManager::instance()._update();
 			RenderWindowManager::instance()._update();
-			gInput()._update();
 			gTime().update();
 			gTime().update();
+			gInput()._update();
 
 
 			PROFILE_CALL(gCoreSceneManager()._update(), "SceneManager");
 			PROFILE_CALL(gCoreSceneManager()._update(), "SceneManager");
 
 

+ 0 - 2
BansheeCore/Source/BsInput.cpp

@@ -82,8 +82,6 @@ namespace BansheeEngine
 		}
 		}
 		else
 		else
 			mOSInputHandler->_update();
 			mOSInputHandler->_update();
-
-		// TODO - Perform smoothing
 	}
 	}
 
 
 	void Input::inputWindowChanged(RenderWindow& win)
 	void Input::inputWindowChanged(RenderWindow& win)

+ 3 - 2
BansheeEditor/Include/BsHandleManager.h

@@ -12,8 +12,9 @@ namespace BansheeEngine
 		HandleManager();
 		HandleManager();
 		virtual ~HandleManager();
 		virtual ~HandleManager();
 
 
-		void handleInput(const Vector2I& inputPos, const Ray& inputRay, bool pressed);
-		void update();
+		bool hasHitHandle(const HCamera& camera, const Vector2I& inputPos) const;
+		void handleInput(const HCamera& camera, const Vector2I& inputPos, bool pressed);
+		void update(const HCamera& camera);
 
 
 		HandleSliderManager& getSliderManager() const { return *mSliderManager; }
 		HandleSliderManager& getSliderManager() const { return *mSliderManager; }
 		HandleDrawManager& getDrawManager() const { return *mDrawManager; }
 		HandleDrawManager& getDrawManager() const { return *mDrawManager; }

+ 2 - 1
BansheeEditor/Include/BsHandleSliderManager.h

@@ -11,7 +11,8 @@ namespace BansheeEngine
 		~HandleSliderManager();
 		~HandleSliderManager();
 
 
 		void update(const HCamera& camera);
 		void update(const HCamera& camera);
-		void handleInput(const HCamera& camera, const Vector2I& inputPos, const Ray& inputRay, bool pressed);
+		bool hasHitSlider(const HCamera& camera, const Vector2I& inputPos) const;
+		void handleInput(const HCamera& camera, const Vector2I& inputPos, bool pressed);
 		bool isSliderActive() const;
 		bool isSliderActive() const;
 
 
 		void _registerSlider(HandleSlider* slider);
 		void _registerSlider(HandleSlider* slider);

+ 12 - 19
BansheeEditor/Source/BsHandleManager.cpp

@@ -25,29 +25,22 @@ namespace BansheeEngine
 		return mSliderManager->isSliderActive();
 		return mSliderManager->isSliderActive();
 	}
 	}
 
 
-	void HandleManager::update()
+	void HandleManager::update(const HCamera& camera)
 	{
 	{
-		SceneEditorWidget* sceneView = SceneViewLocator::instance();
-		if (sceneView != nullptr)
-		{
-			HCamera sceneCamera = sceneView->getSceneCamera();
-
-			queueDrawCommands();
-			mDrawManager->draw(sceneCamera);
-		}
+		queueDrawCommands();
+		mDrawManager->draw(camera);
 	}
 	}
 
 
-	void HandleManager::handleInput(const Vector2I& inputPos, const Ray& inputRay, bool pressed)
+	bool HandleManager::hasHitHandle(const HCamera& camera, const Vector2I& inputPos) const
 	{
 	{
-		SceneEditorWidget* sceneView = SceneViewLocator::instance();
-		if (sceneView != nullptr)
-		{
-			HCamera sceneCamera = sceneView->getSceneCamera();
-
-			refreshHandles();
-			mSliderManager->handleInput(sceneCamera, inputPos, inputRay, pressed);
-			triggerHandles();
-		}
+		return mSliderManager->hasHitSlider(camera, inputPos);
+	}
+
+	void HandleManager::handleInput(const HCamera& camera, const Vector2I& inputPos, bool pressed)
+	{
+		refreshHandles();
+		mSliderManager->handleInput(camera, inputPos, pressed);
+		triggerHandles();
 	}
 	}
 
 
 	float HandleManager::getHandleSize(const HCamera& camera, const Vector3& handlePos) const
 	float HandleManager::getHandleSize(const HCamera& camera, const Vector3& handlePos) const

+ 16 - 1
BansheeEditor/Source/BsHandleSliderManager.cpp

@@ -30,8 +30,23 @@ namespace BansheeEngine
 			slider->update(camera);
 			slider->update(camera);
 	}
 	}
 
 
-	void HandleSliderManager::handleInput(const HCamera& camera, const Vector2I& inputPos, const Ray& inputRay, bool pressed)
+	bool HandleSliderManager::hasHitSlider(const HCamera& camera, const Vector2I& inputPos) const
 	{
 	{
+		Ray inputRay = camera->screenPointToRay(inputPos);
+		for (auto& slider : mSliders)
+		{
+			float t;
+			if (slider->intersects(inputRay, t))
+				return true;
+		}
+
+		return false;
+	}
+
+	void HandleSliderManager::handleInput(const HCamera& camera, const Vector2I& inputPos, bool pressed)
+	{
+		Ray inputRay = camera->screenPointToRay(inputPos);
+
 		if (!pressed)
 		if (!pressed)
 		{
 		{
 			if (mActiveSlider != nullptr)
 			if (mActiveSlider != nullptr)

+ 8 - 11
BansheeEditor/Source/BsSceneEditorWidget.cpp

@@ -84,7 +84,7 @@ namespace BansheeEngine
 		handleManager.setMoveHandleSnapAmount(projSettings->getMoveHandleSnap());
 		handleManager.setMoveHandleSnapAmount(projSettings->getMoveHandleSnap());
 		handleManager.setRotateHandleSnapAmount(projSettings->getRotationHandleSnap());
 		handleManager.setRotateHandleSnapAmount(projSettings->getRotationHandleSnap());
 		handleManager.setScaleHandleSnapAmount(projSettings->getScaleHandleSnap());
 		handleManager.setScaleHandleSnapAmount(projSettings->getScaleHandleSnap());
-		handleManager.update();
+		handleManager.update(mCamera);
 
 
 		mSceneGrid->setSize(projSettings->getGridSize());
 		mSceneGrid->setSize(projSettings->getGridSize());
 		mSceneGrid->setSpacing(projSettings->getGridSpacing());
 		mSceneGrid->setSpacing(projSettings->getGridSpacing());
@@ -130,9 +130,7 @@ namespace BansheeEngine
 		if (!toSceneViewPos(event.screenPos, scenePos))
 		if (!toSceneViewPos(event.screenPos, scenePos))
 			return;
 			return;
 
 
-		Ray inputRay = mCamera->screenPointToRay(scenePos);
-
-		HandleManager::instance().handleInput(scenePos, inputRay, mLeftButtonPressed);
+		HandleManager::instance().handleInput(mCamera, scenePos, mLeftButtonPressed);
 	}
 	}
 
 
 	void SceneEditorWidget::onPointerReleased(const PointerEvent& event)
 	void SceneEditorWidget::onPointerReleased(const PointerEvent& event)
@@ -145,9 +143,7 @@ namespace BansheeEngine
 			return;
 			return;
 
 
 		mLeftButtonPressed = false;
 		mLeftButtonPressed = false;
-		Ray inputRay = mCamera->screenPointToRay(scenePos);
-
-		HandleManager::instance().handleInput(scenePos, inputRay, mLeftButtonPressed);
+		HandleManager::instance().handleInput(mCamera, scenePos, mLeftButtonPressed);
 	}
 	}
 
 
 	void SceneEditorWidget::onPointerPressed(const PointerEvent& event)
 	void SceneEditorWidget::onPointerPressed(const PointerEvent& event)
@@ -160,12 +156,9 @@ namespace BansheeEngine
 			return;
 			return;
 
 
 		mLeftButtonPressed = true;
 		mLeftButtonPressed = true;
-		Ray inputRay = mCamera->screenPointToRay(scenePos);
-
-		HandleManager::instance().handleInput(scenePos, inputRay, mLeftButtonPressed);
 
 
 		// If we didn't hit a handle, perform normal selection
 		// If we didn't hit a handle, perform normal selection
-		if (!HandleManager::instance().isHandleActive())
+		if (!HandleManager::instance().hasHitHandle(mCamera, scenePos))
 		{
 		{
 			// TODO - Handle multi-selection (i.e. selection rectangle when dragging)
 			// TODO - Handle multi-selection (i.e. selection rectangle when dragging)
 			HSceneObject pickedObject = ScenePicking::instance().pickClosestObject(mCamera, scenePos, Vector2I(1, 1));
 			HSceneObject pickedObject = ScenePicking::instance().pickClosestObject(mCamera, scenePos, Vector2I(1, 1));
@@ -195,6 +188,10 @@ namespace BansheeEngine
 			else
 			else
 				Selection::instance().clearSceneSelection();
 				Selection::instance().clearSceneSelection();
 		}
 		}
+
+		// This also causes handles to be created/removed, so perform this only after
+		// selection has been updated, otherwise we lag back a frame
+		HandleManager::instance().handleInput(mCamera, scenePos, mLeftButtonPressed);
 	}
 	}
 
 
 	void SceneEditorWidget::doOnResized(UINT32 width, UINT32 height)
 	void SceneEditorWidget::doOnResized(UINT32 width, UINT32 height)

+ 3 - 0
Notes.txt

@@ -75,6 +75,9 @@ Reminders:
     whenever anything in the folder changes. But is that necessary if I can have asset post- and pre- processor that can filter by folder programatically?
     whenever anything in the folder changes. But is that necessary if I can have asset post- and pre- processor that can filter by folder programatically?
   - Add option to optimize mesh for post-transform cache (triangles sharing vertices are sequential) on import (also pre-transform as well, order vertices by their first reference in IB, and so on)
   - Add option to optimize mesh for post-transform cache (triangles sharing vertices are sequential) on import (also pre-transform as well, order vertices by their first reference in IB, and so on)
   - It would be nice to have automated creation of glue code between C# and C++ instead of writing all of these Script classes
   - It would be nice to have automated creation of glue code between C# and C++ instead of writing all of these Script classes
+  - Think about removing C# GUIPanel. If I replace current EditorWidget's GUIArea with GUIWidget then panels aren't needed as those widgets can just
+    use areas directly. This means that the EditorWidgetContainer will also have a GUIWidget but it will be separate.
+	 - When doing this also consider refactoring how GUIArea anchoring works (currently it's limited and have ugly interface)
 
 
 Potential optimizations:
 Potential optimizations:
  - bulkPixelConversion is EXTREMELY poorly unoptimized. Each pixel it calls a separate method that does redudant operations every pixel.
  - bulkPixelConversion is EXTREMELY poorly unoptimized. Each pixel it calls a separate method that does redudant operations every pixel.

+ 2 - 0
SceneView.txt

@@ -2,6 +2,8 @@
  GIZMO TODO:
  GIZMO TODO:
   - Make a C# wrapper for Camera and Renderable
   - Make a C# wrapper for Camera and Renderable
 
 
+Set up Application::getPrimaryViewport so it returns a valid viewport otherwise C# Camera won't work properly
+
 REFACTOR material getParams* and related classes. Those params should update all gpu program params that share that variable, not just the first found
 REFACTOR material getParams* and related classes. Those params should update all gpu program params that share that variable, not just the first found
 Need a way to drag and drop items from Scene tree view to Scene view
 Need a way to drag and drop items from Scene tree view to Scene view
 When dragging a handle make sure it works when cursor leaves the scene view
 When dragging a handle make sure it works when cursor leaves the scene view