bool FSpriteEditorViewportClient::InputKey(FViewport* Viewport, int32 ControllerId, FKey Key, EInputEvent Event, float AmountDepressed, bool bGamepad) { bool bHandled = false; FInputEventState InputState(Viewport, Key, Event); // Handle marquee tracking in source region edit mode if (IsInSourceRegionEditMode()) { FSpriteGeometryEditMode* GeometryEditMode = ModeTools->GetActiveModeTyped<FSpriteGeometryEditMode>(FSpriteGeometryEditMode::EM_SpriteGeometry); check(GeometryEditMode); const bool bMarqueeStartModifier = InputState.IsCtrlButtonPressed(); if (GeometryEditMode->ProcessMarquee(Viewport, Key, Event, bMarqueeStartModifier)) { FIntPoint TextureSpaceStartPos; FIntPoint TextureSpaceDimensions; if (ConvertMarqueeToSourceTextureSpace(/*out*/TextureSpaceStartPos, /*out*/TextureSpaceDimensions)) { //@TODO: Warn if overlapping with another sprite CreateNewSprite(TextureSpaceStartPos, TextureSpaceDimensions); } } } // Pass keys to standard controls, if we didn't consume input return (bHandled) ? true : FEditorViewportClient::InputKey(Viewport, ControllerId, Key, Event, AmountDepressed, bGamepad); }
//------------------------------------------------------------------------ // Purpose : Let the POLLing begin... //------------------------------------------------------------------------ void InputDevice::Poll() { HRESULT Hr; // Poll Keyboard if (m_pKeyboard) { Hr = m_pKeyboard->GetDeviceState(sizeof(m_KeyboardState), (void**)&m_KeyboardState); if (FAILED(Hr)) { // Keyboard lost ... ZeroMemory(m_KeyboardState, sizeof(m_KeyboardState)); // try to acquire next time we poll Hr = m_pKeyboard->Acquire(); } else { std::map<char, InputState>::iterator iter = m_keyMap.begin(); for ( ; iter != m_keyMap.end() ; iter++) { if(KeyDown(iter->first)) notifyObserver(iter->second); } } } // Poll Mouse... if (m_pMouse) { Hr = m_pMouse->GetDeviceState(sizeof(DIMOUSESTATE2), (void**)&m_MouseState); if (FAILED(Hr)) { // Mouse Lost... ZeroMemory(&m_MouseState, sizeof(m_MouseState)); // try to acquire next time we poll Hr = m_pMouse->Acquire(); } else { // We look for first three entries in the InputState enum // which holds Mouse Buttons for (int i = 0 ; i < 3 ; i++) { if (MouseButtonDown(i)) notifyObserver(InputState(i)); } } } }
bool FSpriteGeometryEditMode::InputKey(FEditorViewportClient* ViewportClient, FViewport* Viewport, FKey Key, EInputEvent Event) { bool bHandled = false; FInputEventState InputState(Viewport, Key, Event); // Handle marquee tracking in source region edit mode if (IsEditingGeometry()) { if (SpriteGeometryHelper.IsAddingPolygon()) { if (Key == EKeys::LeftMouseButton) { const int32 HitX = Viewport->GetMouseX(); const int32 HitY = Viewport->GetMouseY(); // Calculate the texture space position of the mouse click FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(Viewport, ViewportClient->GetScene(), ViewportClient->EngineShowFlags)); FSceneView* View = ViewportClient->CalcSceneView(&ViewFamily); const FVector WorldPoint = View->PixelToWorld(HitX, HitY, 0); const FVector2D TexturePoint = SpriteGeometryHelper.GetEditorContext()->WorldSpaceToTextureSpace(WorldPoint); // Add or close the polygon (depending on where the click happened and how) const bool bMakeSubtractiveIfAllowed = Viewport->KeyState(EKeys::LeftControl) || Viewport->KeyState(EKeys::RightControl); SpriteGeometryHelper.HandleAddPolygonClick(TexturePoint, bMakeSubtractiveIfAllowed, *View, Event); } else if ((Key == EKeys::BackSpace) && (Event == IE_Pressed)) { SpriteGeometryHelper.DeleteLastVertexFromAddPolygonMode(); } else if (Key == EKeys::Enter) { SpriteGeometryHelper.ResetAddPolygonMode(); } else if (Key == EKeys::Escape) { SpriteGeometryHelper.AbandonAddPolygonMode(); } } else { if (ProcessMarquee(Viewport, Key, Event, true)) { const bool bAddingToSelection = InputState.IsShiftButtonPressed(); //@TODO: control button moves widget? Hopefully make this more consistent when that is changed SelectVerticesInMarquee(ViewportClient, Viewport, bAddingToSelection); } } } //@TODO: Support select-and-drag in a single operation (may involve InputAxis and StartTracking) // Pass keys to standard controls, if we didn't consume input return bHandled ? true : FEdMode::InputKey(ViewportClient, Viewport, Key, Event); }