bool FSpriteGeometryEditMode::HandleClick(FEditorViewportClient* InViewportClient, HHitProxy* HitProxy, const FViewportClick& Click) { FViewport* Viewport = InViewportClient->Viewport; const bool bIsCtrlKeyDown = Viewport->KeyState(EKeys::LeftControl) || Viewport->KeyState(EKeys::RightControl); const bool bIsShiftKeyDown = Viewport->KeyState(EKeys::LeftShift) || Viewport->KeyState(EKeys::RightShift); const bool bIsAltKeyDown = Viewport->KeyState(EKeys::LeftAlt) || Viewport->KeyState(EKeys::RightAlt); bool bHandled = false; const bool bAllowSelectVertex = !(IsEditingGeometry() && SpriteGeometryHelper.IsAddingPolygon()) && !bIsShiftKeyDown; const bool bClearSelectionModifier = bIsCtrlKeyDown; const bool bDeleteClickedVertex = bIsAltKeyDown; const bool bInsertVertexModifier = bIsShiftKeyDown; HSpriteSelectableObjectHitProxy* SelectedItemProxy = HitProxyCast<HSpriteSelectableObjectHitProxy>(HitProxy); if (bAllowSelectVertex && (SelectedItemProxy != nullptr)) { if (!bClearSelectionModifier) { SpriteGeometryHelper.ClearSelectionSet(); } if (bDeleteClickedVertex) { // Delete selection if (const FSpriteSelectedVertex* SelectedVertex = SelectedItemProxy->Data->CastTo<const FSpriteSelectedVertex>(FSelectionTypes::Vertex)) { SpriteGeometryHelper.ClearSelectionSet(); SpriteGeometryHelper.AddPolygonVertexToSelection(SelectedVertex->ShapeIndex, SelectedVertex->VertexIndex); SpriteGeometryHelper.DeleteSelectedItems(); } else if (const FSpriteSelectedShape* SelectedShape = SelectedItemProxy->Data->CastTo<const FSpriteSelectedShape>(FSelectionTypes::GeometryShape)) { SpriteGeometryHelper.ClearSelectionSet(); SpriteGeometryHelper.AddShapeToSelection(SelectedShape->ShapeIndex); SpriteGeometryHelper.DeleteSelectedItems(); } } else if (Click.GetEvent() == EInputEvent::IE_DoubleClick) { // Double click to select a polygon if (const FSpriteSelectedVertex* SelectedVertex = SelectedItemProxy->Data->CastTo<const FSpriteSelectedVertex>(FSelectionTypes::Vertex)) { SpriteGeometryHelper.ClearSelectionSet(); SpriteGeometryHelper.AddShapeToSelection(SelectedVertex->ShapeIndex); } } else { //@TODO: This needs to be generalized! if (const FSpriteSelectedEdge* SelectedEdge = SelectedItemProxy->Data->CastTo<const FSpriteSelectedEdge>(FSelectionTypes::Edge)) { // Add the next vertex defined by this edge SpriteGeometryHelper.AddPolygonEdgeToSelection(SelectedEdge->ShapeIndex, SelectedEdge->VertexIndex); } else if (const FSpriteSelectedVertex* SelectedVertex = SelectedItemProxy->Data->CastTo<const FSpriteSelectedVertex>(FSelectionTypes::Vertex)) { SpriteGeometryHelper.AddPolygonVertexToSelection(SelectedVertex->ShapeIndex, SelectedVertex->VertexIndex); } else if (const FSpriteSelectedShape* SelectedShape = SelectedItemProxy->Data->CastTo<const FSpriteSelectedShape>(FSelectionTypes::GeometryShape)) { SpriteGeometryHelper.AddShapeToSelection(SelectedShape->ShapeIndex); } else { SpriteGeometryHelper.SelectItem(SelectedItemProxy->Data); } } bHandled = true; } // else if (HWidgetUtilProxy* PivotProxy = HitProxyCast<HWidgetUtilProxy>(HitProxy)) // { // //const bool bUserWantsPaint = bIsLeftButtonDown && ( !GetDefault<ULevelEditorViewportSettings>()->bLeftMouseDragMovesCamera || bIsCtrlDown ); // //findme // WidgetAxis = WidgetProxy->Axis; // // // Calculate the screen-space directions for this drag. // FSceneViewFamilyContext ViewFamily( FSceneViewFamily::ConstructionValues( Viewport, GetScene(), EngineShowFlags )); // FSceneView* View = CalcSceneView(&ViewFamily); // WidgetProxy->CalcVectors(View, FViewportClick(View, this, Key, Event, HitX, HitY), LocalManipulateDir, WorldManipulateDir, DragX, DragY); // bHandled = true; // } else { if (IsEditingGeometry() && !SpriteGeometryHelper.IsAddingPolygon()) { FSpriteGeometryCollection* Geometry = SpriteGeometryHelper.GetGeometryBeingEdited(); if (bInsertVertexModifier) { const FPlane SpritePlane(PaperAxisX, FVector::ZeroVector, PaperAxisY); const FVector WorldPoint = FMath::LinePlaneIntersection(Click.GetOrigin(), Click.GetOrigin() + Click.GetDirection(), SpritePlane); const FVector2D SpriteSpaceClickPoint = SpriteGeometryHelper.GetEditorContext()->WorldSpaceToTextureSpace(WorldPoint); // find a polygon to add vert to bool bFoundShapeToAddTo = false; for (TSharedPtr<FSelectedItem> SelectedItemPtr : SpriteGeometryHelper.GetSelectionSet()) { if (const FSpriteSelectedVertex* SelectedVertex = SelectedItemPtr->CastTo<const FSpriteSelectedVertex>(FSelectionTypes::Vertex)) //@TODO: Inflexible? { SpriteGeometryHelper.AddPointToGeometry(SpriteSpaceClickPoint, SelectedVertex->ShapeIndex); bFoundShapeToAddTo = true; break; } } if (!bFoundShapeToAddTo) { SpriteGeometryHelper.AddPointToGeometry(SpriteSpaceClickPoint); } bHandled = true; } } else if (!IsEditingGeometry()) { // Clicked on the background (missed any proxies), deselect the socket or whatever was selected SpriteGeometryHelper.ClearSelectionSet(); } } return bHandled ? true : FEdMode::HandleClick(InViewportClient, HitProxy, Click); }