О рисовании графики в editor UE

Иногда нужно нарисовать некие фигуры, нужные для инстурментария (например сетка Landscape), но их можно не просто рисовать, а еще и добавить функционал, и для этого коректно отобразить указатель мыши. Для этого существует подобная структура:

struct HBTGrabHandleProxy : public HHitProxy
{
	DECLARE_HIT_PROXY();

	EMouseCursor::Type OverrideCursorType;

	HBTGrabHandleProxy(EMouseCursor::Type InOverrideCursorType)
	    : HHitProxy(HPP_Wireframe)
	{
		OverrideCursorType = InOverrideCursorType;
	}

	virtual EMouseCursor::Type GetMouseCursor() override
	{
		return OverrideCursorType;
	}
};

IMPLEMENT_HIT_PROXY(HBTGrabHandleProxy, HHitProxy)

Ее можно использовать при рисовании в Render() функции модуля:

void FBuildingToolsEdMode::Render(const FSceneView* View, FViewport* Viewport, FPrimitiveDrawInterface* PDI)
{
	/** Call parent implementation */
	FEdMode::Render(View, Viewport, PDI);

	auto z = 15.f;

	auto PivotTransform = FTransform::Identity;

	auto DrawIt = [&](EMouseCursor::Type NewCursorType, float Index = 1.f) {
		PDI->SetHitProxy(new HBTGrabHandleProxy(NewCursorType));
		PDI->DrawLine(PivotTransform.TransformPosition(FVector(0, 0, z * Index)), PivotTransform.TransformPosition(FVector(0, 100.f, z * Index)), CornerColour, SDPG_Foreground);
		PDI->SetHitProxy(NULL);
	};

	DrawIt(EMouseCursor::CardinalCross, 1);
	DrawIt(EMouseCursor::Crosshairs, 2);
	DrawIt(EMouseCursor::Default, 3);
	DrawIt(EMouseCursor::EyeDropper, 4);
	DrawIt(EMouseCursor::GrabHand, 5);
	DrawIt(EMouseCursor::GrabHandClosed, 6);
	DrawIt(EMouseCursor::Hand, 7);
	DrawIt(EMouseCursor::ResizeLeftRight, 8);
	DrawIt(EMouseCursor::ResizeSouthEast, 9);
	DrawIt(EMouseCursor::ResizeSouthWest, 10);
	DrawIt(EMouseCursor::ResizeUpDown, 11);
	DrawIt(EMouseCursor::SlashedCircle, 12);
	DrawIt(EMouseCursor::TextEditBeam, 13);
}

Подобная фунция дает вот такой результат:

FSnappingUtils::SnapLocationToNearestVertex(...)

FLevelEditorViewportClient* LevelEditor
GUnrealEd->SetPivotMovedIndependently(true);
		LevelEditor->bOnlyMovedPivot = true;
		LevelEditor->GetModeTools()->SetPivotLocation(TraceLocation, false);
		LevelEditor->GetModeTools()->UpdateInternalData();
//GetMutableDefault<ULevelEditorViewportSettings>()->bSnapVertices = false;

Last updated