When using the Combined Translate and Rotate Mode we run into an issue where the rotation arrow moves twice as fast as the coordinate frame. The object itself rotates correctly, but if we release the mouse button and then click on the arrow again the rotation quickly snaps to the double rotated value. This only occurs when using local space instead of global space.
The fix is pretty easy and goes into:
Engine/Source/Editor/UnrealEd/Private/UnrealWidgetRender.cpp in the functionFWidget::Render_TranslateRotateZ()
FVector XAxis = CustomCoordSystem.TransformPosition( FVector(1,0,0).RotateAngleAxis( (EditorModeTools ? EditorModeTools->TranslateRotateXAxisAngle : 0 ), FVector(0,0,1)) ); FVector YAxis = CustomCoordSystem.TransformPosition( FVector(0,1,0).RotateAngleAxis( (EditorModeTools ? EditorModeTools->TranslateRotateXAxisAngle : 0 ), FVector(0,0,1)) );
FVector XAxis, YAxis; if(Space.bIsLocalSpace) {
What we are doing is locking the rotation arrow to the X-axis when we are in local space. The frame rotates to match the local transform and the big arrow rotates in lock step with it. In global space the frame is not rotated so we need to apply the local frame and the current rotation.