|
|
@@ -22,7 +22,10 @@ bool contextMenuActionWaitFrame = false;
|
|
|
bool cameraFlyMode = true;
|
|
|
int hotKeyMode = 0; // used for checking that kind of style manipulation user are prefer ( see HotKeysMode )
|
|
|
Vector3 lastSelectedNodesCenterPoint = Vector3(0,0,0); // for Blender mode to avoid own origin rotation when no nodes are selected. preserve last center for this
|
|
|
-
|
|
|
+WeakHandle lastSelectedNode = null;
|
|
|
+WeakHandle lastSelectedDrawable = null;
|
|
|
+WeakHandle lastSelectedComponent = null;
|
|
|
+bool viewCloser = false;
|
|
|
|
|
|
const uint VIEWPORT_BORDER_H = 0x00000001;
|
|
|
const uint VIEWPORT_BORDER_H1 = 0x00000002;
|
|
|
@@ -1137,7 +1140,7 @@ void UpdateStats(float timeStep)
|
|
|
String adding = "";
|
|
|
// Todo: add localization
|
|
|
if (hotKeyMode == HOTKEYS_MODE_BLENDER)
|
|
|
- adding = " CameraFlyMode: " + (cameraFlyMode ? "True" : "False");
|
|
|
+ adding = localization.Get(" CameraFlyMode: ") + (cameraFlyMode ? "True" : "False");
|
|
|
|
|
|
editorModeText.text = String(
|
|
|
localization.Get("Mode: ") + localization.Get(editModeText[editMode]) +
|
|
|
@@ -1278,7 +1281,7 @@ void UpdateView(float timeStep)
|
|
|
if (mouseWheelCameraPosition && !camera.orthographic )
|
|
|
{
|
|
|
if (input.keyDown[KEY_LSHIFT])
|
|
|
- cameraNode.Translate(Vector3(0, -cameraBaseSpeed, 0) * -input.mouseMoveWheel*5* timeStep * speedMultiplier);
|
|
|
+ cameraNode.Translate(Vector3(0, -cameraBaseSpeed, 0) * -input.mouseMoveWheel*20* timeStep * speedMultiplier);
|
|
|
else if (input.keyDown[KEY_LCTRL])
|
|
|
cameraNode.Translate(Vector3(-cameraBaseSpeed,0, 0) * -input.mouseMoveWheel*20 * timeStep * speedMultiplier);
|
|
|
else
|
|
|
@@ -1286,21 +1289,30 @@ void UpdateView(float timeStep)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (input.keyDown[KEY_LSHIFT])
|
|
|
- cameraNode.Translate(Vector3(0, -cameraBaseSpeed, 0) * -input.mouseMoveWheel*5* timeStep * speedMultiplier);
|
|
|
- else if (input.keyDown[KEY_LCTRL])
|
|
|
+ if (input.keyDown[KEY_LSHIFT])
|
|
|
+ {
|
|
|
+ cameraNode.Translate(Vector3(0, -cameraBaseSpeed, 0) * -input.mouseMoveWheel*20* timeStep * speedMultiplier);
|
|
|
+ }
|
|
|
+ else if (input.keyDown[KEY_LCTRL])
|
|
|
+ {
|
|
|
cameraNode.Translate(Vector3(-cameraBaseSpeed,0, 0) * -input.mouseMoveWheel*20 * timeStep * speedMultiplier);
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
- float zoom = camera.zoom + -input.mouseMoveWheel *.1 * speedMultiplier;
|
|
|
- camera.zoom = Clamp(zoom, .1, 30);
|
|
|
+ if (input.qualifierDown[QUAL_ALT])
|
|
|
+ {
|
|
|
+ float zoom = camera.zoom + -input.mouseMoveWheel *.1 * speedMultiplier;
|
|
|
+ camera.zoom = Clamp(zoom, .1, 30);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cameraNode.Translate(Vector3(0, 0, -cameraBaseSpeed) * -input.mouseMoveWheel*20 * timeStep * speedMultiplier);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-
|
|
|
if (input.keyDown[KEY_HOME])
|
|
|
{
|
|
|
if (selectedNodes.length > 0 || selectedComponents.length > 0)
|
|
|
@@ -1333,14 +1345,24 @@ void UpdateView(float timeStep)
|
|
|
if (mouseMove.x != 0 || mouseMove.y != 0)
|
|
|
{
|
|
|
bool panTheCamera = false;
|
|
|
+
|
|
|
if(mmbPanMode || (hotKeyMode == HOTKEYS_MODE_BLENDER))
|
|
|
if ( hotKeyMode == HOTKEYS_MODE_STANDARD)
|
|
|
panTheCamera = !(changeCamViewButton && input.keyDown[KEY_LSHIFT]);
|
|
|
- else if (hotKeyMode == HOTKEYS_MODE_BLENDER && cameraFlyMode == true )
|
|
|
+ else if (hotKeyMode == HOTKEYS_MODE_BLENDER && cameraFlyMode)
|
|
|
+ {
|
|
|
panTheCamera = false;
|
|
|
- else
|
|
|
- panTheCamera = (changeCamViewButton && input.keyDown[KEY_LSHIFT]);
|
|
|
-
|
|
|
+ //else if (camera.orthographic)
|
|
|
+ // panTheCamera = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (!camera.orthographic)
|
|
|
+ panTheCamera = changeCamViewButton && input.keyDown[KEY_LSHIFT];
|
|
|
+ else
|
|
|
+ panTheCamera = changeCamViewButton && !input.keyDown[KEY_LSHIFT];
|
|
|
+ }
|
|
|
+
|
|
|
if (panTheCamera)
|
|
|
cameraNode.Translate(Vector3(-mouseMove.x, mouseMove.y, 0) * timeStep * cameraBaseSpeed * 0.5);
|
|
|
else
|
|
|
@@ -1388,8 +1410,59 @@ void UpdateView(float timeStep)
|
|
|
|
|
|
if (orbiting && !input.mouseButtonDown[MOUSEB_MIDDLE])
|
|
|
orbiting = false;
|
|
|
-
|
|
|
+
|
|
|
+ if ( hotKeyMode == HOTKEYS_MODE_BLENDER )
|
|
|
+ if ( viewCloser && lastSelectedDrawable.Get() !is null)
|
|
|
+ {
|
|
|
+ SetMouseLock();
|
|
|
+ BoundingBox bb;
|
|
|
+ Vector3 centerPoint;
|
|
|
+
|
|
|
+ if ( selectedNodes.length <= 1 )
|
|
|
+ {
|
|
|
+ Drawable@ drawable = lastSelectedDrawable.Get();
|
|
|
+ if (drawable !is null)
|
|
|
+ {
|
|
|
+ bb = drawable.boundingBox;
|
|
|
+ centerPoint = drawable.node.worldPosition;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for (int i = 0; i < selectedNodes.length; i++)
|
|
|
+ {
|
|
|
+ bb.Merge(selectedNodes[i].position);
|
|
|
+ }
|
|
|
+
|
|
|
+ centerPoint = SelectedNodesCenterPoint();
|
|
|
+ }
|
|
|
+
|
|
|
+ float distance = bb.size.length;
|
|
|
+ if (camera.orthographic) // if we use viewCloser for 2D get current distance to avoid near clip
|
|
|
+ distance = cameraNode.worldPosition.length;
|
|
|
+
|
|
|
+ Quaternion q = Quaternion(activeViewport.cameraPitch, activeViewport.cameraYaw, 0);
|
|
|
+ cameraNode.rotation = q;
|
|
|
+ cameraNode.worldPosition = centerPoint - cameraNode.worldDirection * distance;
|
|
|
+ // ReacquireCameraYawPitch();
|
|
|
+ viewCloser = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ viewCloser = false;
|
|
|
+
|
|
|
// Move/rotate/scale object
|
|
|
+ if ( hotKeyMode == HOTKEYS_MODE_BLENDER) // force to select component node for manipulation if selected only component and not his node
|
|
|
+ {
|
|
|
+ if ((editMode != EDIT_SELECT && editNodes.empty) && lastSelectedComponent.Get() !is null )
|
|
|
+ {
|
|
|
+ if (lastSelectedComponent.Get() !is null)
|
|
|
+ {
|
|
|
+ Component@ component = lastSelectedComponent.Get();
|
|
|
+ SelectNode(component.node, false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (!editNodes.empty && editMode != EDIT_SELECT && input.keyDown[KEY_LCTRL])
|
|
|
{
|
|
|
Vector3 adjust(0, 0, 0);
|
|
|
@@ -1683,9 +1756,29 @@ void ViewRaycast(bool mouseClick)
|
|
|
|
|
|
RayQueryResult result = editorScene.octree.RaycastSingle(cameraRay, RAY_TRIANGLE, camera.farClip,
|
|
|
pickModeDrawableFlags[pickMode], 0x7fffffff);
|
|
|
+
|
|
|
if (result.drawable !is null)
|
|
|
- {
|
|
|
+ {
|
|
|
Drawable@ drawable = result.drawable;
|
|
|
+
|
|
|
+ // for actual last selected node or component in both modes
|
|
|
+ if ( hotKeyMode == HOTKEYS_MODE_STANDARD ) {
|
|
|
+ if (input.mouseButtonDown[MOUSEB_LEFT])
|
|
|
+ {
|
|
|
+ lastSelectedNode = drawable.node;
|
|
|
+ lastSelectedDrawable = drawable;
|
|
|
+ lastSelectedComponent = drawable;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if ( hotKeyMode == HOTKEYS_MODE_BLENDER ) {
|
|
|
+ if (input.mouseButtonDown[MOUSEB_RIGHT])
|
|
|
+ {
|
|
|
+ lastSelectedNode = drawable.node;
|
|
|
+ lastSelectedDrawable = drawable;
|
|
|
+ lastSelectedComponent = drawable;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// If selecting a terrain patch, select the parent terrain instead
|
|
|
if (drawable.typeName != "TerrainPatch")
|
|
|
{
|