From d12e9b305762c23656a6c53af0ea5aa7211fef8c Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Wed, 15 Feb 2023 15:38:56 -0500 Subject: [PATCH 1/9] add cqb mode Alternate CQB mode for Move camera to selected entity key CQB mode moves camera to top-rear of object bounding box Useful when unit is inside multi-floor structure. Repeated keypresses switch between modes --- addons/editor/XEH_PREP.hpp | 1 + addons/editor/XEH_postInit.sqf | 1 + .../functions/fnc_handleCuratorMoveCamTo.sqf | 31 +++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf diff --git a/addons/editor/XEH_PREP.hpp b/addons/editor/XEH_PREP.hpp index 938cffb7c..d0e7c5ae5 100644 --- a/addons/editor/XEH_PREP.hpp +++ b/addons/editor/XEH_PREP.hpp @@ -2,6 +2,7 @@ PREP(addGroupIcons); PREP(addModIcons); PREP(declutterEmptyTree); PREP(fixSideButtons); +PREP(handleCuratorMoveCamTo); PREP(handleKeyDown); PREP(handleLoad); PREP(handleModeButtons); diff --git a/addons/editor/XEH_postInit.sqf b/addons/editor/XEH_postInit.sqf index 1f43f2f44..f4ec47063 100644 --- a/addons/editor/XEH_postInit.sqf +++ b/addons/editor/XEH_postInit.sqf @@ -3,3 +3,4 @@ ["zen_curatorDisplayLoaded", LINKFUNC(handleLoad)] call CBA_fnc_addEventHandler; ["zen_curatorDisplayUnloaded", LINKFUNC(handleUnload)] call CBA_fnc_addEventHandler; [QGVAR(modeChanged), LINKFUNC(fixSideButtons)] call CBA_fnc_addEventHandler; +addUserActionEventHandler ["curatorMoveCamTo", "Deactivate", LINKFUNC(handleCuratorMoveCamTo)]; diff --git a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf new file mode 100644 index 000000000..9d1775a4f --- /dev/null +++ b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" +/* + * Author: Ampersand + * Handles the behaviour of the curatorMoveCamTo user action. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call zen_editor_fnc_handleCuratorMoveCamTo + * + * Public: No + */ + +private _selectedObjects = curatorSelected select 0; +if (count _selectedObjects == 0) exitWith {}; + +private _selectedObject = _selectedObjects select 0; +if (isNil QGVAR(curatorMovedCamTo) || {_selectedObject != GVAR(curatorMovedCamTo)}) exitWith { + GVAR(curatorMovedCamTo) = _selectedObject; +}; + +// Second activation of curatorMoveCamTo on same object +(0 boundingBoxReal GVAR(curatorMovedCamTo)) params ["_p1", "_p2"]; +// Move camera to top-rear of object bounding box for CQB view +curatorCamera setPosASL (GVAR(curatorMovedCamTo) modelToWorldVisualWorld [0, _p1 select 1, _p2 select 2]); +curatorCamera setDir getDir GVAR(curatorMovedCamTo); +GVAR(curatorMovedCamTo) = nil; From 7141a5b4139c4f0ce6cb2a0a8b7906c5567cd882 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Thu, 16 Feb 2023 15:58:57 -0500 Subject: [PATCH 2/9] Use SELECTED_OBJECTS macro. --- addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf index 9d1775a4f..d9bcdf1f6 100644 --- a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf +++ b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf @@ -15,7 +15,7 @@ * Public: No */ -private _selectedObjects = curatorSelected select 0; +private _selectedObjects = SELECTED_OBJECTS; if (count _selectedObjects == 0) exitWith {}; private _selectedObject = _selectedObjects select 0; From 7083fd8d70dd4291cb80c95abf24edf38f179c0f Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Thu, 16 Feb 2023 15:59:09 -0500 Subject: [PATCH 3/9] combine comments --- addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf index d9bcdf1f6..5693ddf52 100644 --- a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf +++ b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf @@ -24,8 +24,8 @@ if (isNil QGVAR(curatorMovedCamTo) || {_selectedObject != GVAR(curatorMovedCamTo }; // Second activation of curatorMoveCamTo on same object -(0 boundingBoxReal GVAR(curatorMovedCamTo)) params ["_p1", "_p2"]; // Move camera to top-rear of object bounding box for CQB view +(0 boundingBoxReal GVAR(curatorMovedCamTo)) params ["_p1", "_p2"]; curatorCamera setPosASL (GVAR(curatorMovedCamTo) modelToWorldVisualWorld [0, _p1 select 1, _p2 select 2]); curatorCamera setDir getDir GVAR(curatorMovedCamTo); GVAR(curatorMovedCamTo) = nil; From 542b3d37c174a3f08cfd99d1dbc1be53a6ad47a7 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Thu, 16 Feb 2023 20:23:19 -0500 Subject: [PATCH 4/9] keybind instead of eh --- addons/editor/XEH_postInit.sqf | 1 - addons/editor/initKeybinds.sqf | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/editor/XEH_postInit.sqf b/addons/editor/XEH_postInit.sqf index f4ec47063..1f43f2f44 100644 --- a/addons/editor/XEH_postInit.sqf +++ b/addons/editor/XEH_postInit.sqf @@ -3,4 +3,3 @@ ["zen_curatorDisplayLoaded", LINKFUNC(handleLoad)] call CBA_fnc_addEventHandler; ["zen_curatorDisplayUnloaded", LINKFUNC(handleUnload)] call CBA_fnc_addEventHandler; [QGVAR(modeChanged), LINKFUNC(fixSideButtons)] call CBA_fnc_addEventHandler; -addUserActionEventHandler ["curatorMoveCamTo", "Deactivate", LINKFUNC(handleCuratorMoveCamTo)]; diff --git a/addons/editor/initKeybinds.sqf b/addons/editor/initKeybinds.sqf index c0ad0c57e..ec7970a50 100644 --- a/addons/editor/initKeybinds.sqf +++ b/addons/editor/initKeybinds.sqf @@ -75,6 +75,12 @@ }; }, {}, [DIK_F, [false, true, true]]] call CBA_fnc_addKeybind; // Default: CTRL + ALT + F +[ELSTRING(main,DisplayName), QGVAR(curatorMoveCamTo), ["str_usract_curator_move_cam", "str_controls_tooltips_curator_move_cam"], { + if (!isNull curatorCamera) then { + [] call FUNC(handleCuratorMoveCamTo) + }; +}, {}, [DIK_F, [false, false, false]]] call CBA_fnc_addKeybind; // Default: F + [ELSTRING(main,DisplayName), QGVAR(orientTerrainNormal), ["str_3den_display3den_entitymenu_setatl_text", LSTRING(OrientTerrainNormal_Description)], { if (!isNull curatorCamera && {!GETMVAR(RscDisplayCurator_search,false)}) then { { From 7827604d533ee358853e223616c9410566a623a1 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Thu, 16 Feb 2023 20:27:46 -0500 Subject: [PATCH 5/9] handle far view --- .../functions/fnc_handleCuratorMoveCamTo.sqf | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf index 5693ddf52..4640361a7 100644 --- a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf +++ b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf @@ -7,7 +7,7 @@ * None * * Return Value: - * None + * Key handled * * Example: * [] call zen_editor_fnc_handleCuratorMoveCamTo @@ -16,16 +16,26 @@ */ private _selectedObjects = SELECTED_OBJECTS; -if (count _selectedObjects == 0) exitWith {}; +if (count _selectedObjects == 0) exitWith {false}; private _selectedObject = _selectedObjects select 0; -if (isNil QGVAR(curatorMovedCamTo) || {_selectedObject != GVAR(curatorMovedCamTo)}) exitWith { +private _objectPos = getPosWorld _selectedObject; +private _objectDir = getDir _selectedObject; +((0 boundingBoxReal _selectedObject) select 1) params ["", "_y", "_z"]; +private _minDistance = 20; + +// Toggle between far and close views on subsequent activations with the same object selected +if (isNil QGVAR(curatorMovedCamTo) || {_selectedObject != GVAR(curatorMovedCamTo)}) then { GVAR(curatorMovedCamTo) = _selectedObject; +} else { + _minDistance = 0.5; + GVAR(curatorMovedCamTo) = nil; }; -// Second activation of curatorMoveCamTo on same object -// Move camera to top-rear of object bounding box for CQB view -(0 boundingBoxReal GVAR(curatorMovedCamTo)) params ["_p1", "_p2"]; -curatorCamera setPosASL (GVAR(curatorMovedCamTo) modelToWorldVisualWorld [0, _p1 select 1, _p2 select 2]); -curatorCamera setDir getDir GVAR(curatorMovedCamTo); -GVAR(curatorMovedCamTo) = nil; +private _curatorPos = _objectPos getPos [_minDistance max _y, _objectDir + 180]; +_curatorPos set [2, (_objectPos select 2) + (_minDistance max _z)]; +curatorCamera setPosASL _curatorPos; +curatorCamera setDir _objectDir; +curatorCamera setVectorUp (vectorDir curatorCamera vectorAdd [0, 0, 1 + 1 / _minDistance]); + +true From 38533f4187e28abc2699dc9ab4c2e7816deaa530 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Fri, 17 Feb 2023 09:53:00 -0500 Subject: [PATCH 6/9] setting --- addons/editor/initSettings.sqf | 9 +++++++++ addons/editor/stringtable.xml | 15 +++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/addons/editor/initSettings.sqf b/addons/editor/initSettings.sqf index 5fbe4fe59..1952d007e 100644 --- a/addons/editor/initSettings.sqf +++ b/addons/editor/initSettings.sqf @@ -78,3 +78,12 @@ true, true ] call CBA_fnc_addSetting; + +[ + QGVAR(moveCamToSelection), + "LIST", + ["str_usract_curator_move_cam", LSTRING(MoveCamToSelection_Description)], + [ELSTRING(main,DisplayName), ELSTRING(camera,DisplayName)], + [[0, 1, 2, 3], ["str_a3_cfgroles_default0", LSTRING(MoveCamToSelection_Alternate), LSTRING(MoveCamToSelection_CQB), LSTRING(MoveCamToSelection_AlternateCQB)], 3], + false +] call CBA_fnc_addSetting; diff --git a/addons/editor/stringtable.xml b/addons/editor/stringtable.xml index 74734f6fb..2405fb9ad 100644 --- a/addons/editor/stringtable.xml +++ b/addons/editor/stringtable.xml @@ -366,5 +366,20 @@ 重新加載Zeus界面。可用於修復鎖定問題。 Ricarica l'interfaccia di Zeus. Può essere utilizzato per risolvere i problemi di blocco. + + Focus Object Mode + + + Behaviour for "Move camera to selected entity" with an object selected.\nDefault: Base game behaviour.\nAlternate: 20 m above and behind object.\nCQB: Top-rear of object bounding box, useful for units inside buildings.\nAlternate + CQB: Switch between views on subsequent activations. + + + Alternate + + + CQB + + + Alternate + CQB + From a37a33d4cd0ec024981061aaf2916bd4eef965d8 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Fri, 17 Feb 2023 09:53:11 -0500 Subject: [PATCH 7/9] keyDown eh --- addons/editor/functions/fnc_handleKeyDown.sqf | 6 ++++++ addons/editor/initKeybinds.sqf | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/editor/functions/fnc_handleKeyDown.sqf b/addons/editor/functions/fnc_handleKeyDown.sqf index 529d54e4c..78290aec5 100644 --- a/addons/editor/functions/fnc_handleKeyDown.sqf +++ b/addons/editor/functions/fnc_handleKeyDown.sqf @@ -18,6 +18,12 @@ params ["_display", "_keyCode"]; +if (GVAR(moveCamToSelection) > 0 && {_keyCode in actionKeys "curatorMoveCamTo" && {count SELECTED_OBJECTS > 0}}) exitWith { + [] call FUNC(moveCamToSelection); + + true +}; + // One frame later so RscDisplayCurator_sections is updated [{ params ["_display", "_keyCode", "_oldMode"]; diff --git a/addons/editor/initKeybinds.sqf b/addons/editor/initKeybinds.sqf index ec7970a50..c0ad0c57e 100644 --- a/addons/editor/initKeybinds.sqf +++ b/addons/editor/initKeybinds.sqf @@ -75,12 +75,6 @@ }; }, {}, [DIK_F, [false, true, true]]] call CBA_fnc_addKeybind; // Default: CTRL + ALT + F -[ELSTRING(main,DisplayName), QGVAR(curatorMoveCamTo), ["str_usract_curator_move_cam", "str_controls_tooltips_curator_move_cam"], { - if (!isNull curatorCamera) then { - [] call FUNC(handleCuratorMoveCamTo) - }; -}, {}, [DIK_F, [false, false, false]]] call CBA_fnc_addKeybind; // Default: F - [ELSTRING(main,DisplayName), QGVAR(orientTerrainNormal), ["str_3den_display3den_entitymenu_setatl_text", LSTRING(OrientTerrainNormal_Description)], { if (!isNull curatorCamera && {!GETMVAR(RscDisplayCurator_search,false)}) then { { From dd35e080ffeb932be8dfee0c81dc4ca3676482d5 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Fri, 17 Feb 2023 09:53:27 -0500 Subject: [PATCH 8/9] renamed fnc --- addons/editor/XEH_PREP.hpp | 2 +- .../functions/fnc_handleCuratorMoveCamTo.sqf | 41 -------------- .../functions/fnc_moveCamToSelection.sqf | 53 +++++++++++++++++++ 3 files changed, 54 insertions(+), 42 deletions(-) delete mode 100644 addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf create mode 100644 addons/editor/functions/fnc_moveCamToSelection.sqf diff --git a/addons/editor/XEH_PREP.hpp b/addons/editor/XEH_PREP.hpp index d0e7c5ae5..cd3108f55 100644 --- a/addons/editor/XEH_PREP.hpp +++ b/addons/editor/XEH_PREP.hpp @@ -2,7 +2,6 @@ PREP(addGroupIcons); PREP(addModIcons); PREP(declutterEmptyTree); PREP(fixSideButtons); -PREP(handleCuratorMoveCamTo); PREP(handleKeyDown); PREP(handleLoad); PREP(handleModeButtons); @@ -14,3 +13,4 @@ PREP(handleSearchKeyUp); PREP(handleSideButtons); PREP(handleTreeButtons); PREP(handleUnload); +PREP(moveCamToSelection); diff --git a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf b/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf deleted file mode 100644 index 4640361a7..000000000 --- a/addons/editor/functions/fnc_handleCuratorMoveCamTo.sqf +++ /dev/null @@ -1,41 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Ampersand - * Handles the behaviour of the curatorMoveCamTo user action. - * - * Arguments: - * None - * - * Return Value: - * Key handled - * - * Example: - * [] call zen_editor_fnc_handleCuratorMoveCamTo - * - * Public: No - */ - -private _selectedObjects = SELECTED_OBJECTS; -if (count _selectedObjects == 0) exitWith {false}; - -private _selectedObject = _selectedObjects select 0; -private _objectPos = getPosWorld _selectedObject; -private _objectDir = getDir _selectedObject; -((0 boundingBoxReal _selectedObject) select 1) params ["", "_y", "_z"]; -private _minDistance = 20; - -// Toggle between far and close views on subsequent activations with the same object selected -if (isNil QGVAR(curatorMovedCamTo) || {_selectedObject != GVAR(curatorMovedCamTo)}) then { - GVAR(curatorMovedCamTo) = _selectedObject; -} else { - _minDistance = 0.5; - GVAR(curatorMovedCamTo) = nil; -}; - -private _curatorPos = _objectPos getPos [_minDistance max _y, _objectDir + 180]; -_curatorPos set [2, (_objectPos select 2) + (_minDistance max _z)]; -curatorCamera setPosASL _curatorPos; -curatorCamera setDir _objectDir; -curatorCamera setVectorUp (vectorDir curatorCamera vectorAdd [0, 0, 1 + 1 / _minDistance]); - -true diff --git a/addons/editor/functions/fnc_moveCamToSelection.sqf b/addons/editor/functions/fnc_moveCamToSelection.sqf new file mode 100644 index 000000000..f6b0becd6 --- /dev/null +++ b/addons/editor/functions/fnc_moveCamToSelection.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: Ampersand + * Moves the curator camera to the selected object. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call zen_editor_fnc_moveCamToSelection + * + * Public: No + */ + +#define FOCUS_ALT 1 +#define FOCUS_CQB 2 +#define FOCUS_ALTCQB 3 + +private _selectedObjects = SELECTED_OBJECTS; +if (count _selectedObjects == 0) exitWith {}; + +private _selectedObject = _selectedObjects select 0; +private _objectPos = getPosWorld _selectedObject; +private _objectDir = getDir _selectedObject; +((0 boundingBoxReal _selectedObject) select 1) params ["", "_y", "_z"]; + +private _minDistance = switch (GVAR(moveCamToSelection)) do { + case (FOCUS_ALT): { + 20 + }; + case (FOCUS_CQB): { + 0.5 + }; + case (FOCUS_ALTCQB): { + // Toggle between far and close views on subsequent activations with the same object selected + if (isNil QGVAR(curatorMovedCamTo) || {_selectedObject != GVAR(curatorMovedCamTo)}) then { + GVAR(curatorMovedCamTo) = _selectedObject; + 20 + } else { + GVAR(curatorMovedCamTo) = nil; + 0.5 + } + }; +}; + +private _curatorPos = _objectPos getPos [_minDistance max _y, _objectDir + 180]; +_curatorPos set [2, (_objectPos select 2) + (_minDistance max _z)]; +curatorCamera setPosASL _curatorPos; +curatorCamera setDir _objectDir; +curatorCamera setVectorUp (vectorDir curatorCamera vectorAdd [0, 0, 1 + 1 / _minDistance]); From bb987001dd25dfcf22ecaca75c4a6924a78c96c7 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Thu, 12 Oct 2023 13:50:27 -0400 Subject: [PATCH 9/9] prevent blocking curatorLockCameraTo Ctrl+F --- addons/editor/functions/fnc_handleKeyDown.sqf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/editor/functions/fnc_handleKeyDown.sqf b/addons/editor/functions/fnc_handleKeyDown.sqf index 16946fc5a..196203e32 100644 --- a/addons/editor/functions/fnc_handleKeyDown.sqf +++ b/addons/editor/functions/fnc_handleKeyDown.sqf @@ -18,7 +18,12 @@ params ["_display", "_keyCode"]; -if (GVAR(moveCamToSelection) > 0 && {_keyCode in actionKeys "curatorMoveCamTo" && {count SELECTED_OBJECTS > 0}}) exitWith { +if ( + GVAR(moveCamToSelection) > 0 + && {inputAction "curatorLockCameraTo" == 0} + && {_keyCode in actionKeys "curatorMoveCamTo"} + && {count SELECTED_OBJECTS > 0} +) exitWith { [] call FUNC(moveCamToSelection); true