< Summary

Class:BuilderInWorldGodMode
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/States/EditorMode/BuilderInWorldGodMode.cs
Covered lines:59
Uncovered lines:346
Coverable lines:405
Total lines:860
Line coverage:14.5% (59 of 405)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BuilderInWorldGodMode()0%110100%
Start()0%2100%
OnDestroy()0%6200%
Update()0%90900%
OnGUI()0%12300%
ChangeSnapTemporaryDeactivated()0%6200%
ChangeSnapTemporaryActivated()0%6200%
EntitiesTransfromByGizmos(...)0%12300%
UpdateSelectionPosition(...)0%6200%
UpdateSelectionRotation(...)0%6200%
UpdateSelectionScale(...)0%6200%
UpdateGizmosToSelectedEntities()0%6200%
Init(...)0%3.192033.33%
MouseClickDetected()0%6200%
OnInputMouseDrag(...)0%1101000%
GetPositionRoundedToSnapFactor(...)0%2100%
OnInputMouseUpOnUi(...)0%12300%
OnInputMouseUp(...)0%20400%
OnInputMouseDown(...)0%90900%
CheckEndBoundMultiselection(...)0%20400%
CanCancelAction(...)0%6200%
StarDraggingSelectedEntities()0%30500%
EndDraggingSelectedEntities()0%12300%
EndBoundMultiSelection()0%1321100%
ActivateVoxelMode()0%2100%
DesactivateVoxelMode()0%2100%
Activate(...)0%44093.75%
ActivateCamera(...)0%220100%
OnDeleteEntity(...)0%220100%
OnDeselectedEntities()0%2100%
Deactivate()0%110100%
StartMultiSelection()0%2100%
SetDuplicationOffset(...)0%2100%
CreatedEntity(...)0%12300%
GetCreatedEntityPoint()0%2100%
SelectedEntity(...)0%42600%
EntityDeselected(...)0%12300%
EntityDoubleClick(...)0%6200%
UpdateActionsInteractable()0%2100%
ShouldCancelUndoAction()0%6200%
SetSnapActive(...)0%2.152066.67%
FocusOnSelectedEntitiesInput()0%6200%
TryLookAtEntity(...)0%20400%
LookAtEntity(...)0%20400%
TranslateMode()0%2100%
RotateMode()0%2100%
ScaleMode()0%2100%
GizmosMode(...)0%56700%
OnGizmosTransformStart(...)0%6200%
OnGizmosTransformEnd(...)0%42600%
FocusGameObject(...)0%2100%
GetInitialCameraPosition(...)0%110100%
SetLookAtObject(...)0%110100%
SetEditObjectAtMouse()0%30500%
GetFloorPointAtMouse(...)0%6200%
ResetCamera()0%2100%
TakeSceneScreenshotForPublish()0%6200%
TakeSceneScreenshotForExit()0%6200%
OpenNewProjectDetails()0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/States/EditorMode/BuilderInWorldGodMode.cs

#LineLine coverage
 1using Builder.Gizmos;
 2using DCL;
 3using DCL.Configuration;
 4using DCL.Controllers;
 5using DCL.Helpers;
 6using DCL.Models;
 7using System;
 8using System.Collections.Generic;
 9using DCL.Camera;
 10using UnityEngine;
 11using Environment = DCL.Environment;
 12
 13public class BuilderInWorldGodMode : BuilderInWorldMode
 14{
 15    [Header("Editor Design")]
 19816    public float initialEagleCameraHeight = 10f;
 19817    public float initialEagleCameraDistance = 10f;
 18    public float initialEagleCameraLookAtHeight = 0f;
 19
 20    public LayerMask layerToStopClick;
 19821    public float snapDragFactor = 5f;
 22
 23    [Header("Scenes References")]
 24    public FreeCameraMovement freeCameraController;
 25
 26    public CameraController cameraController;
 27    public Transform lookAtT;
 28    public MouseCatcher mouseCatcher;
 29    public PlayerAvatarController avatarRenderer;
 30
 31    [Header("Prefab References")]
 32    public DCLBuilderGizmoManager gizmoManager;
 33
 34    public VoxelController voxelController;
 35    public BIWOutlinerController outlinerController;
 36
 37    [Header("InputActions")]
 38    [SerializeField]
 39    internal InputAction_Trigger focusOnSelectedEntitiesInputAction;
 40
 41    [SerializeField]
 42    internal InputAction_Hold multiSelectionInputAction;
 43
 44    private ParcelScene sceneToEdit;
 45
 46    public LayerMask groundLayer;
 47
 48    private bool isPlacingNewObject = false;
 49    private bool mouseMainBtnPressed = false;
 50    private bool mouseSecondaryBtnPressed = false;
 51    private bool isSquareMultiSelectionInputActive = false;
 52    private bool isMouseDragging = false;
 53    private bool changeSnapTemporaryButtonPressed = false;
 54
 55    private bool wasGizmosActive = false;
 56    private bool isDraggingStarted = false;
 57    private bool canDragSelectedEntities = false;
 58
 19859    private bool activateCamera = true;
 60    private CameraMode.ModeId avatarCameraModeBeforeEditing;
 61
 62    private Vector3 lastMousePosition;
 63    private Vector3 dragStartedPoint;
 64
 65    public const float RAYCAST_MAX_DISTANCE = 10000f;
 66
 67    private void Start()
 68    {
 069        DCLBuilderGizmoManager.OnGizmoTransformObjectEnd += OnGizmosTransformEnd;
 070        DCLBuilderGizmoManager.OnGizmoTransformObjectStart += OnGizmosTransformStart;
 71
 072        BuilderInWorldInputWrapper.OnMouseDown += OnInputMouseDown;
 073        BuilderInWorldInputWrapper.OnMouseUp += OnInputMouseUp;
 074        BuilderInWorldInputWrapper.OnMouseUpOnUI += OnInputMouseUpOnUi;
 075        BuilderInWorldInputWrapper.OnMouseDrag += OnInputMouseDrag;
 76
 077        focusOnSelectedEntitiesInputAction.OnTriggered += (o) => FocusOnSelectedEntitiesInput();
 78
 079        multiSelectionInputAction.OnStarted += (o) => ChangeSnapTemporaryActivated();
 080        multiSelectionInputAction.OnFinished += (o) => ChangeSnapTemporaryDeactivated();
 81
 082        gizmoManager.OnChangeTransformValue += EntitiesTransfromByGizmos;
 083    }
 84
 85    private void OnDestroy()
 86    {
 087        DCLBuilderGizmoManager.OnGizmoTransformObjectEnd -= OnGizmosTransformEnd;
 088        DCLBuilderGizmoManager.OnGizmoTransformObjectStart -= OnGizmosTransformStart;
 89
 090        BuilderInWorldInputWrapper.OnMouseDown -= OnInputMouseDown;
 091        BuilderInWorldInputWrapper.OnMouseUp -= OnInputMouseUp;
 092        BuilderInWorldInputWrapper.OnMouseUpOnUI -= OnInputMouseUpOnUi;
 093        BuilderInWorldInputWrapper.OnMouseDrag -= OnInputMouseDrag;
 94
 095        gizmoManager.OnChangeTransformValue -= EntitiesTransfromByGizmos;
 96
 097        if (HUDController.i.builderInWorldMainHud == null)
 098            return;
 99
 0100        HUDController.i.builderInWorldMainHud.OnSelectedObjectPositionChange -= UpdateSelectionPosition;
 0101        HUDController.i.builderInWorldMainHud.OnSelectedObjectRotationChange -= UpdateSelectionRotation;
 0102        HUDController.i.builderInWorldMainHud.OnSelectedObjectScaleChange -= UpdateSelectionScale;
 0103        HUDController.i.builderInWorldMainHud.OnTranslateSelectedAction -= TranslateMode;
 0104        HUDController.i.builderInWorldMainHud.OnRotateSelectedAction -= RotateMode;
 0105        HUDController.i.builderInWorldMainHud.OnScaleSelectedAction -= ScaleMode;
 0106        HUDController.i.builderInWorldMainHud.OnResetCameraAction -= ResetCamera;
 0107        HUDController.i.builderInWorldMainHud.OnPublishAction -= TakeSceneScreenshotForPublish;
 0108    }
 109
 110    private void Update()
 111    {
 0112        if (isPlacingNewObject)
 113        {
 0114            if (!voxelController.IsActive())
 0115                SetEditObjectAtMouse();
 116            else
 0117                voxelController.SetEditObjectLikeVoxel();
 0118        }
 0119        else if (isSquareMultiSelectionInputActive && isMouseDragging)
 120        {
 121            List<DCLBuilderInWorldEntity> allEntities = null;
 122
 0123            allEntities = builderInWorldEntityHandler.GetAllEntitiesFromCurrentScene();
 124
 0125            foreach (DCLBuilderInWorldEntity entity in allEntities)
 126            {
 0127                if (!entity.rootEntity.meshRootGameObject || entity.rootEntity.meshesInfo.renderers.Length <= 0)
 128                    continue;
 129
 0130                if (BuilderInWorldUtils.IsWithInSelectionBounds(entity.rootEntity.meshesInfo.mergedBounds.center, lastMo
 131                {
 0132                    outlinerController.OutlineEntity(entity);
 0133                }
 134                else
 135                {
 0136                    outlinerController.CancelEntityOutline(entity);
 137                }
 138            }
 139        }
 0140    }
 141
 142    private void OnGUI()
 143    {
 0144        if (mouseMainBtnPressed && isSquareMultiSelectionInputActive)
 145        {
 0146            var rect = BuilderInWorldUtils.GetScreenRect(lastMousePosition, Input.mousePosition);
 0147            BuilderInWorldUtils.DrawScreenRect(rect, new Color(1f, 1f, 1f, 0.25f));
 0148            BuilderInWorldUtils.DrawScreenRectBorder(rect, 1, Color.white);
 149        }
 0150    }
 151
 152    private void ChangeSnapTemporaryDeactivated()
 153    {
 0154        if (changeSnapTemporaryButtonPressed)
 0155            SetSnapActive(!isSnapActive);
 156
 0157        changeSnapTemporaryButtonPressed = false;
 0158    }
 159
 160    private void ChangeSnapTemporaryActivated()
 161    {
 0162        if (selectedEntities.Count == 0)
 0163            return;
 164
 0165        changeSnapTemporaryButtonPressed = true;
 166
 0167        SetSnapActive(!isSnapActive);
 0168    }
 169
 170    private void EntitiesTransfromByGizmos(Vector3 transformValue)
 171    {
 0172        if (gizmoManager.GetSelectedGizmo() != BuilderInWorldSettings.ROTATE_GIZMO_NAME)
 0173            return;
 174
 0175        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 176        {
 0177            entity.AddRotation(transformValue);
 178        }
 0179    }
 180
 181    public void UpdateSelectionPosition(Vector3 newPosition)
 182    {
 0183        if (selectedEntities.Count != 1)
 0184            return;
 185
 0186        TransformActionStarted(selectedEntities[0].rootEntity, BuilderInWorldSettings.TRANSLATE_GIZMO_NAME);
 0187        editionGO.transform.position = WorldStateUtils.ConvertSceneToUnityPosition(newPosition, sceneToEdit);
 0188        UpdateGizmosToSelectedEntities();
 0189        TransformActionEnd(selectedEntities[0].rootEntity, BuilderInWorldSettings.TRANSLATE_GIZMO_NAME);
 0190        ActionFinish(BuildInWorldCompleteAction.ActionType.MOVE);
 0191        builderInWorldEntityHandler.ReportTransform(true);
 0192        biwSaveController.TryToSave();
 0193    }
 194
 195    public void UpdateSelectionRotation(Vector3 rotation)
 196    {
 0197        if (selectedEntities.Count != 1)
 0198            return;
 199
 0200        TransformActionStarted(selectedEntities[0].rootEntity, BuilderInWorldSettings.ROTATE_GIZMO_NAME);
 0201        selectedEntities[0].transform.rotation = Quaternion.Euler(rotation);
 0202        TransformActionEnd(selectedEntities[0].rootEntity, BuilderInWorldSettings.ROTATE_GIZMO_NAME);
 0203        ActionFinish(BuildInWorldCompleteAction.ActionType.ROTATE);
 0204        builderInWorldEntityHandler.ReportTransform(true);
 0205        biwSaveController.TryToSave();
 0206    }
 207
 208    public void UpdateSelectionScale(Vector3 scale)
 209    {
 0210        if (selectedEntities.Count != 1)
 0211            return;
 212
 0213        var entityToUpdate = selectedEntities[0];
 214
 0215        TransformActionStarted(entityToUpdate.rootEntity, BuilderInWorldSettings.SCALE_GIZMO_NAME);
 216        // Before change the scale, we unparent the entity to not to make it dependant on the editionGO and after that, 
 0217        entityToUpdate.transform.SetParent(null);
 0218        entityToUpdate.transform.localScale = scale;
 0219        editionGO.transform.localScale = Vector3.one;
 0220        entityToUpdate.transform.SetParent(editionGO.transform);
 221
 0222        TransformActionEnd(entityToUpdate.rootEntity, BuilderInWorldSettings.SCALE_GIZMO_NAME);
 0223        ActionFinish(BuildInWorldCompleteAction.ActionType.SCALE);
 0224        builderInWorldEntityHandler.ReportTransform(true);
 0225        biwSaveController.TryToSave();
 0226    }
 227
 228    public void UpdateGizmosToSelectedEntities()
 229    {
 0230        List<EditableEntity> editableEntities = new List<EditableEntity>();
 0231        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 232        {
 0233            editableEntities.Add(entity);
 234        }
 235
 0236        gizmoManager.SetSelectedEntities(editionGO.transform, editableEntities);
 0237    }
 238
 239    public override void Init(GameObject goToEdit, GameObject undoGo, GameObject snapGO, GameObject freeMovementGO, List
 240    {
 9241        base.Init(goToEdit, undoGo, snapGO, freeMovementGO, selectedEntities);
 9242        voxelController.SetEditionGO(goToEdit);
 243
 9244        if (HUDController.i.builderInWorldMainHud != null)
 245        {
 0246            HUDController.i.builderInWorldMainHud.OnTranslateSelectedAction += TranslateMode;
 0247            HUDController.i.builderInWorldMainHud.OnRotateSelectedAction += RotateMode;
 0248            HUDController.i.builderInWorldMainHud.OnScaleSelectedAction += ScaleMode;
 0249            HUDController.i.builderInWorldMainHud.OnSelectedObjectPositionChange += UpdateSelectionPosition;
 0250            HUDController.i.builderInWorldMainHud.OnSelectedObjectRotationChange += UpdateSelectionRotation;
 0251            HUDController.i.builderInWorldMainHud.OnSelectedObjectScaleChange += UpdateSelectionScale;
 0252            HUDController.i.builderInWorldMainHud.OnResetCameraAction += ResetCamera;
 0253            HUDController.i.builderInWorldMainHud.OnPublishAction += TakeSceneScreenshotForPublish;
 254        }
 9255    }
 256
 257    public override void MouseClickDetected()
 258    {
 0259        if (isPlacingNewObject)
 260        {
 0261            builderInWorldEntityHandler.DeselectEntities();
 0262            biwSaveController.TryToSave();
 0263            return;
 264        }
 265
 0266        base.MouseClickDetected();
 0267    }
 268
 269    #region Mouse
 270
 271    private void OnInputMouseDrag(int buttonId, Vector3 mousePosition, float axisX, float axisY)
 272    {
 0273        if (Vector3.Distance(lastMousePosition, mousePosition) <= BuilderInWorldSettings.MOUSE_THRESHOLD_FOR_DRAG && !is
 0274            return;
 275
 0276        isMouseDragging = true;
 0277        if (buttonId != 0 ||
 278            selectedEntities.Count <= 0 ||
 279            BuilderInWorldUtils.IsPointerOverMaskElement(layerToStopClick) ||
 280            isSquareMultiSelectionInputActive)
 0281            return;
 282
 0283        if (!isDraggingStarted)
 0284            StarDraggingSelectedEntities();
 285
 0286        if (canDragSelectedEntities)
 287        {
 0288            Vector3 currentPoint = GetFloorPointAtMouse(mousePosition);
 0289            Vector3 initialEntityPosition = editionGO.transform.position;
 290
 0291            if (isSnapActive)
 292            {
 0293                currentPoint = GetPositionRoundedToSnapFactor(currentPoint);
 0294                initialEntityPosition = GetPositionRoundedToSnapFactor(initialEntityPosition);
 295            }
 296
 0297            Vector3 move = currentPoint - dragStartedPoint;
 0298            Vector3 destination = initialEntityPosition + move;
 0299            editionGO.transform.position = destination;
 0300            dragStartedPoint = currentPoint;
 301        }
 0302    }
 303
 304    private Vector3 GetPositionRoundedToSnapFactor(Vector3 position)
 305    {
 0306        position = new Vector3(
 307            Mathf.Round(position.x / snapDragFactor) * snapDragFactor,
 308            position.y,
 309            Mathf.Round(position.z / snapDragFactor) * snapDragFactor);
 310
 0311        return position;
 312    }
 313
 314    private void OnInputMouseUpOnUi(int buttonID, Vector3 position)
 315    {
 0316        if (buttonID == 1)
 317        {
 0318            mouseSecondaryBtnPressed = false;
 0319            freeCameraController.StopDetectingMovement();
 320        }
 321
 0322        if (buttonID != 0)
 0323            return;
 324
 0325        CheckEndBoundMultiselection(position);
 0326        isMouseDragging = false;
 0327    }
 328
 329    private void OnInputMouseUp(int buttonID, Vector3 position)
 330    {
 0331        if (buttonID == 1)
 332        {
 0333            mouseSecondaryBtnPressed = false;
 0334            if (CanCancelAction(position))
 0335                builderInWorldEntityHandler.CancelSelection();
 336
 0337            freeCameraController.StopDetectingMovement();
 338        }
 339
 0340        if (buttonID != 0)
 0341            return;
 342
 0343        EndDraggingSelectedEntities();
 344
 0345        CheckEndBoundMultiselection(position);
 346
 0347        outlinerController.SetOutlineCheckActive(true);
 348
 0349        isMouseDragging = false;
 0350    }
 351
 352    void OnInputMouseDown(int buttonID, Vector3 position)
 353    {
 0354        lastMousePosition = position;
 355
 0356        if (buttonID == 1)
 357        {
 0358            mouseSecondaryBtnPressed = true;
 0359            freeCameraController.StartDectectingMovement();
 360        }
 361
 0362        if (buttonID != 0)
 0363            return;
 364
 0365        dragStartedPoint = GetFloorPointAtMouse(position);
 366
 0367        if (isSnapActive)
 368        {
 0369            dragStartedPoint.x = Mathf.Round(dragStartedPoint.x);
 0370            dragStartedPoint.z = Mathf.Round(dragStartedPoint.z);
 371        }
 372
 0373        if (isPlacingNewObject)
 0374            return;
 375
 0376        var entity = builderInWorldEntityHandler.GetEntityOnPointer();
 0377        if ((entity == null
 378             || (entity != null && !entity.IsSelected))
 379            && !BuilderInWorldUtils.IsPointerOverMaskElement(layerToStopClick))
 380        {
 0381            isSquareMultiSelectionInputActive = true;
 0382            outlinerController.SetOutlineCheckActive(false);
 383        }
 384
 0385        mouseMainBtnPressed = true;
 0386        freeCameraController.SetCameraCanMove(false);
 0387    }
 388
 389    #endregion
 390
 391    private void CheckEndBoundMultiselection(Vector3 position)
 392    {
 0393        if (isSquareMultiSelectionInputActive && mouseMainBtnPressed )
 394        {
 0395            if (Vector3.Distance(lastMousePosition, position) >= BuilderInWorldSettings.MOUSE_THRESHOLD_FOR_DRAG)
 0396                EndBoundMultiSelection();
 397
 0398            isSquareMultiSelectionInputActive = false;
 0399            mouseMainBtnPressed = false;
 400        }
 0401    }
 402
 0403    private bool CanCancelAction(Vector3 currentMousePosition) { return Vector3.Distance(lastMousePosition, currentMouse
 404
 405    private void StarDraggingSelectedEntities()
 406    {
 0407        if (!builderInWorldEntityHandler.IsPointerInSelectedEntity() ||
 408            gizmoManager.HasAxisHover() ||
 409            voxelController.IsActive())
 0410            return;
 411
 0412        if (gizmoManager.isActiveAndEnabled)
 413        {
 0414            gizmoManager.HideGizmo();
 0415            wasGizmosActive = true;
 416        }
 417
 0418        freeCameraController.SetCameraCanMove(false);
 0419        isDraggingStarted = true;
 420
 0421        canDragSelectedEntities = true;
 0422    }
 423
 424    void EndDraggingSelectedEntities()
 425    {
 0426        if (wasGizmosActive && !isPlacingNewObject)
 427        {
 0428            gizmoManager.ShowGizmo();
 0429            biwSaveController.TryToSave();
 430        }
 431
 0432        wasGizmosActive = false;
 433
 0434        freeCameraController.SetCameraCanMove(true);
 0435        isDraggingStarted = false;
 436
 0437        canDragSelectedEntities = false;
 0438    }
 439
 440    private void EndBoundMultiSelection()
 441    {
 0442        freeCameraController.SetCameraCanMove(true);
 443        List<DCLBuilderInWorldEntity> allEntities = null;
 444
 0445        allEntities = builderInWorldEntityHandler.GetAllEntitiesFromCurrentScene();
 446
 0447        List<DCLBuilderInWorldEntity> selectedInsideBoundsEntities = new List<DCLBuilderInWorldEntity>();
 0448        int alreadySelectedEntities = 0;
 449
 0450        if (!isMultiSelectionActive)
 0451            builderInWorldEntityHandler.DeselectEntities();
 452
 0453        foreach (DCLBuilderInWorldEntity entity in allEntities)
 454        {
 0455            if (entity.rootEntity.meshRootGameObject && entity.rootEntity.meshesInfo.renderers.Length > 0)
 456            {
 0457                if (BuilderInWorldUtils.IsWithInSelectionBounds(entity.rootEntity.meshesInfo.mergedBounds.center, lastMo
 458                    && !entity.IsLocked)
 459                {
 0460                    if (entity.IsSelected)
 0461                        alreadySelectedEntities++;
 462
 0463                    builderInWorldEntityHandler.SelectEntity(entity);
 0464                    selectedInsideBoundsEntities.Add(entity);
 465                }
 466            }
 467        }
 468
 0469        if (selectedInsideBoundsEntities.Count == alreadySelectedEntities && alreadySelectedEntities > 0)
 470        {
 0471            foreach (DCLBuilderInWorldEntity entity in selectedInsideBoundsEntities)
 472            {
 0473                builderInWorldEntityHandler.DeselectEntity(entity);
 474            }
 475        }
 476
 0477        outlinerController.CancelAllOutlines();
 0478    }
 479
 480    #region Voxel
 481
 0482    public void ActivateVoxelMode() { voxelController.SetActiveMode(true); }
 483
 0484    public void DesactivateVoxelMode() { voxelController.SetActiveMode(false); }
 485
 486    #endregion
 487
 488    public override void Activate(ParcelScene scene)
 489    {
 4490        base.Activate(scene);
 4491        gameObject.SetActive(true);
 4492        sceneToEdit = scene;
 4493        voxelController.SetSceneToEdit(scene);
 494
 4495        if (activateCamera)
 4496            ActivateCamera(scene);
 497
 4498        if (gizmoManager.GetSelectedGizmo() == DCL.Components.DCLGizmos.Gizmo.NONE)
 1499            gizmoManager.SetGizmoType(BuilderInWorldSettings.TRANSLATE_GIZMO_NAME);
 4500        mouseCatcher.enabled = false;
 4501        Environment.i.world.sceneController.IsolateScene(sceneToEdit);
 4502        Utils.UnlockCursor();
 503
 4504        gizmoManager.HideGizmo();
 4505        editionGO.transform.SetParent(null);
 4506        avatarRenderer.SetAvatarVisibility(false);
 507
 4508        HUDController.i.builderInWorldMainHud?.ActivateGodModeUI();
 0509    }
 510
 511    public void ActivateCamera(ParcelScene parcelScene)
 512    {
 4513        freeCameraController.gameObject.SetActive(true);
 4514        SetLookAtObject(parcelScene);
 515
 516        // NOTE(Adrian): Take into account that right now to get the relative scale of the gizmos, we set the gizmos in 
 4517        Vector3 cameraPosition = GetInitialCameraPosition(parcelScene);
 4518        freeCameraController.SetPosition(cameraPosition);
 4519        freeCameraController.LookAt(lookAtT);
 4520        freeCameraController.SetResetConfiguration(cameraPosition, lookAtT);
 521
 4522        if (cameraController.currentCameraState.cameraModeId != CameraMode.ModeId.BuildingToolGodMode)
 4523            avatarCameraModeBeforeEditing = cameraController.currentCameraState.cameraModeId;
 524
 4525        cameraController.SetCameraMode(CameraMode.ModeId.BuildingToolGodMode);
 526
 4527        gizmoManager.InitializeGizmos(Camera.main, freeCameraController.transform);
 4528        gizmoManager.ForceRelativeScaleRatio();
 4529    }
 530
 531    public override void OnDeleteEntity(DCLBuilderInWorldEntity entity)
 532    {
 6533        base.OnDeleteEntity(entity);
 6534        biwSaveController.TryToSave();
 535
 6536        if (selectedEntities.Count == 0)
 6537            gizmoManager.HideGizmo();
 6538    }
 539
 540    public override void OnDeselectedEntities()
 541    {
 0542        base.OnDeselectedEntities();
 0543        gizmoManager.SetSelectedEntities(editionGO.transform, new List<EditableEntity>());
 0544    }
 545
 546    public override void Deactivate()
 547    {
 3548        base.Deactivate();
 3549        mouseCatcher.enabled = true;
 3550        Utils.LockCursor();
 3551        cameraController.SetCameraMode(avatarCameraModeBeforeEditing);
 552
 3553        Environment.i.world.sceneController.ReIntegrateIsolatedScene();
 554
 3555        gizmoManager.HideGizmo();
 3556        RenderSettings.fog = true;
 3557        avatarRenderer.SetAvatarVisibility(true);
 3558    }
 559
 560    public override void StartMultiSelection()
 561    {
 0562        base.StartMultiSelection();
 563
 0564        snapGO.transform.SetParent(null);
 0565        freeMovementGO.transform.SetParent(null);
 0566    }
 567
 568    public override void SetDuplicationOffset(float offset)
 569    {
 0570        base.SetDuplicationOffset(offset);
 0571        editionGO.transform.position += Vector3.right * offset;
 0572    }
 573
 574    public override void CreatedEntity(DCLBuilderInWorldEntity createdEntity)
 575    {
 0576        base.CreatedEntity(createdEntity);
 577
 0578        if (!createdEntity.isFloor)
 579        {
 0580            isPlacingNewObject = true;
 0581            outlinerController.SetOutlineCheckActive(false);
 582        }
 583
 0584        gizmoManager.HideGizmo();
 0585        if (createdEntity.isVoxel)
 586        {
 0587            createdEntity.rootEntity.gameObject.tag = BuilderInWorldSettings.VOXEL_TAG;
 0588            voxelController.SetVoxelSelected(createdEntity);
 589
 590            // TODO: Voxels tools will be deactivated for Builder In World V1
 591            //ActivateVoxelMode();
 592        }
 0593    }
 594
 0595    public override Vector3 GetCreatedEntityPoint() { return GetFloorPointAtMouse(Input.mousePosition); }
 596
 597    public override void SelectedEntity(DCLBuilderInWorldEntity selectedEntity)
 598    {
 0599        base.SelectedEntity(selectedEntity);
 600
 0601        List<EditableEntity> editableEntities = new List<EditableEntity>();
 0602        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 603        {
 0604            editableEntities.Add(entity);
 605        }
 606
 0607        gizmoManager.SetSelectedEntities(editionGO.transform, editableEntities);
 608
 0609        if (!isMultiSelectionActive && !selectedEntity.IsNew)
 0610            TryLookAtEntity(selectedEntity.rootEntity);
 611
 0612        snapGO.transform.SetParent(null);
 0613        if (selectedEntity.isVoxel && selectedEntities.Count == 0)
 614        {
 0615            editionGO.transform.position = voxelController.ConverPositionToVoxelPosition(editionGO.transform.position);
 616        }
 617
 0618        UpdateActionsInteractable();
 0619    }
 620
 621    public override void EntityDeselected(DCLBuilderInWorldEntity entityDeselected)
 622    {
 0623        base.EntityDeselected(entityDeselected);
 0624        if (selectedEntities.Count <= 0)
 625        {
 0626            gizmoManager.HideGizmo();
 0627            UpdateActionsInteractable();
 628        }
 629
 0630        if (isPlacingNewObject)
 0631            outlinerController.SetOutlineCheckActive(true);
 0632        isPlacingNewObject = false;
 0633        DesactivateVoxelMode();
 0634    }
 635
 636    public override void EntityDoubleClick(DCLBuilderInWorldEntity entity)
 637    {
 0638        base.EntityDoubleClick(entity);
 0639        if (!entity.IsLocked)
 0640            LookAtEntity(entity.rootEntity);
 0641    }
 642
 643    private void UpdateActionsInteractable()
 644    {
 0645        bool areInteratable = selectedEntities.Count > 0;
 0646        HUDController.i.builderInWorldMainHud.SetActionsButtonsInteractable(areInteratable);
 0647    }
 648
 649    public override bool ShouldCancelUndoAction()
 650    {
 0651        if (isPlacingNewObject)
 652        {
 0653            builderInWorldEntityHandler.DestroyLastCreatedEntities();
 0654            isPlacingNewObject = false;
 0655            return true;
 656        }
 657
 0658        return false;
 659    }
 660
 661    public override void SetSnapActive(bool isActive)
 662    {
 4663        base.SetSnapActive(isActive);
 664
 4665        if (isSnapActive)
 666        {
 4667            gizmoManager.SetSnapFactor(snapFactor, snapRotationDegresFactor, snapScaleFactor);
 4668        }
 669        else
 670        {
 0671            gizmoManager.SetSnapFactor(0, 0, 0);
 672        }
 0673    }
 674
 675    public void FocusOnSelectedEntitiesInput()
 676    {
 0677        if (isModeActive)
 678        {
 0679            FocusGameObject(selectedEntities);
 0680            InputDone();
 681        }
 0682    }
 683
 684    public void TryLookAtEntity(IDCLEntity entity)
 685    {
 0686        if (entity.meshRootGameObject == null
 687            || entity.meshesInfo == null
 688            || BuilderInWorldUtils.IsBoundInsideCamera(entity.meshesInfo.mergedBounds))
 0689            return;
 690
 0691        LookAtEntity(entity);
 0692    }
 693
 694    public void LookAtEntity(IDCLEntity entity)
 695    {
 0696        Vector3 pointToLook = entity.gameObject.transform.position;
 0697        if (entity.meshesInfo.renderers.Length > 0)
 698        {
 0699            Vector3 midPointFromEntityMesh = Vector3.zero;
 0700            foreach (Renderer render in entity.renderers)
 701            {
 0702                if (render == null)
 703                    continue;
 0704                midPointFromEntityMesh += render.bounds.center;
 705            }
 706
 0707            midPointFromEntityMesh /= entity.renderers.Length;
 0708            pointToLook = midPointFromEntityMesh;
 709        }
 710
 0711        freeCameraController.SmoothLookAt(pointToLook);
 0712    }
 713
 714    #region Gizmos
 715
 0716    public void TranslateMode() { GizmosMode( BuilderInWorldSettings.TRANSLATE_GIZMO_NAME); }
 717
 0718    public void RotateMode() { GizmosMode( BuilderInWorldSettings.ROTATE_GIZMO_NAME); }
 719
 0720    public void ScaleMode() { GizmosMode( BuilderInWorldSettings.SCALE_GIZMO_NAME); }
 721
 722    void GizmosMode(string gizmos)
 723    {
 0724        if ((!isModeActive && isPlacingNewObject) || mouseSecondaryBtnPressed)
 0725            return;
 0726        if (gizmoManager.GetSelectedGizmo() != gizmos)
 727        {
 0728            HUDController.i.builderInWorldMainHud?.SetGizmosActive(gizmos);
 0729            gizmoManager.SetGizmoType(gizmos);
 0730            if (selectedEntities.Count > 0 )
 0731                gizmoManager.ShowGizmo();
 732        }
 733        //TODO: Free-Movement tool, This could be re-enabled in the future so let the code there
 734        // else
 735        // {
 736        //     gizmoManager.HideGizmo(true);
 737        //     HUDController.i.builderInWorldMainHud?.SetGizmosActive(BuilderInWorldSettings.EMPTY_GIZMO_NAME);
 738        // }
 0739    }
 740
 741    void OnGizmosTransformStart(string gizmoType)
 742    {
 0743        outlinerController.SetOutlineCheckActive(false);
 0744        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 745        {
 0746            TransformActionStarted(entity.rootEntity, gizmoType);
 747        }
 0748    }
 749
 750    void OnGizmosTransformEnd(string gizmoType)
 751    {
 0752        outlinerController.SetOutlineCheckActive(true);
 0753        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 754        {
 0755            TransformActionEnd(entity.rootEntity, gizmoType);
 756        }
 757
 758        switch (gizmoType)
 759        {
 760            case BuilderInWorldSettings.TRANSLATE_GIZMO_NAME:
 761
 0762                ActionFinish(BuildInWorldCompleteAction.ActionType.MOVE);
 0763                break;
 764            case BuilderInWorldSettings.ROTATE_GIZMO_NAME:
 0765                ActionFinish(BuildInWorldCompleteAction.ActionType.ROTATE);
 0766                break;
 767            case BuilderInWorldSettings.SCALE_GIZMO_NAME:
 0768                ActionFinish(BuildInWorldCompleteAction.ActionType.SCALE);
 769                break;
 770        }
 771
 0772        biwSaveController.TryToSave();
 0773    }
 774
 775    #endregion
 776
 0777    public void FocusGameObject(List<DCLBuilderInWorldEntity> entitiesToFocus) { freeCameraController.FocusOnEntities(en
 778
 779    Vector3 GetInitialCameraPosition(ParcelScene parcelScene)
 780    {
 4781        Vector3 middlePoint = BuilderInWorldUtils.CalculateUnityMiddlePoint(parcelScene);
 4782        Vector3 direction = (parcelScene.transform.position - middlePoint).normalized;
 783
 4784        return parcelScene.transform.position
 785               + direction * initialEagleCameraDistance
 786               + Vector3.up * initialEagleCameraHeight;
 787    }
 788
 789    void SetLookAtObject(ParcelScene parcelScene)
 790    {
 4791        Vector3 middlePoint = BuilderInWorldUtils.CalculateUnityMiddlePoint(parcelScene);
 4792        lookAtT.position = middlePoint + Vector3.up * initialEagleCameraLookAtHeight;
 4793    }
 794
 795    void SetEditObjectAtMouse()
 796    {
 797        RaycastHit hit;
 0798        UnityEngine.Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 799
 0800        if (Physics.Raycast(ray, out hit, RAYCAST_MAX_DISTANCE, groundLayer))
 801        {
 0802            Vector3 destination = hit.point;
 0803            if (isSnapActive)
 804            {
 0805                destination.x = Mathf.Round(destination.x / snapDragFactor) * snapDragFactor;
 0806                destination.z = Mathf.Round(destination.z / snapDragFactor) * snapDragFactor;
 807            }
 808
 0809            editionGO.transform.position = destination;
 810
 0811            if (selectedEntities.Count > 0 && selectedEntities[0].isNFT)
 0812                editionGO.transform.position += Vector3.up * 2f;
 813        }
 0814    }
 815
 816    Vector3 GetFloorPointAtMouse(Vector3 mousePosition)
 817    {
 818        RaycastHit hit;
 0819        UnityEngine.Ray ray = Camera.main.ScreenPointToRay(mousePosition);
 820
 0821        if (Physics.Raycast(ray, out hit, RAYCAST_MAX_DISTANCE, groundLayer))
 822        {
 0823            return hit.point;
 824        }
 825
 0826        return Vector3.zero;
 827    }
 828
 0829    private void ResetCamera() { freeCameraController.ResetCameraPosition(); }
 830
 831    private void TakeSceneScreenshotForPublish()
 832    {
 0833        builderInWorldEntityHandler.DeselectEntities();
 834
 0835        freeCameraController.TakeSceneScreenshot((sceneSnapshot) =>
 836        {
 0837            HUDController.i.builderInWorldMainHud?.SetBuilderProjectScreenshot(sceneSnapshot);
 0838        });
 0839    }
 840
 841    public void TakeSceneScreenshotForExit()
 842    {
 0843        builderInWorldEntityHandler.DeselectEntities();
 844
 0845        freeCameraController.TakeSceneScreenshotFromResetPosition((sceneSnapshot) =>
 846        {
 0847            HUDController.i.builderInWorldMainHud?.SetBuilderProjectScreenshot(sceneSnapshot);
 0848        });
 0849    }
 850
 851    public void OpenNewProjectDetails()
 852    {
 0853        builderInWorldEntityHandler.DeselectEntities();
 854
 0855        freeCameraController.TakeSceneScreenshot((sceneSnapshot) =>
 856        {
 0857            HUDController.i.builderInWorldMainHud?.NewProjectStart(sceneSnapshot);
 0858        });
 0859    }
 860}

Methods/Properties

BuilderInWorldGodMode()
Start()
OnDestroy()
Update()
OnGUI()
ChangeSnapTemporaryDeactivated()
ChangeSnapTemporaryActivated()
EntitiesTransfromByGizmos(UnityEngine.Vector3)
UpdateSelectionPosition(UnityEngine.Vector3)
UpdateSelectionRotation(UnityEngine.Vector3)
UpdateSelectionScale(UnityEngine.Vector3)
UpdateGizmosToSelectedEntities()
Init(UnityEngine.GameObject, UnityEngine.GameObject, UnityEngine.GameObject, UnityEngine.GameObject, System.Collections.Generic.List[DCLBuilderInWorldEntity])
MouseClickDetected()
OnInputMouseDrag(System.Int32, UnityEngine.Vector3, System.Single, System.Single)
GetPositionRoundedToSnapFactor(UnityEngine.Vector3)
OnInputMouseUpOnUi(System.Int32, UnityEngine.Vector3)
OnInputMouseUp(System.Int32, UnityEngine.Vector3)
OnInputMouseDown(System.Int32, UnityEngine.Vector3)
CheckEndBoundMultiselection(UnityEngine.Vector3)
CanCancelAction(UnityEngine.Vector3)
StarDraggingSelectedEntities()
EndDraggingSelectedEntities()
EndBoundMultiSelection()
ActivateVoxelMode()
DesactivateVoxelMode()
Activate(DCL.Controllers.ParcelScene)
ActivateCamera(DCL.Controllers.ParcelScene)
OnDeleteEntity(DCLBuilderInWorldEntity)
OnDeselectedEntities()
Deactivate()
StartMultiSelection()
SetDuplicationOffset(System.Single)
CreatedEntity(DCLBuilderInWorldEntity)
GetCreatedEntityPoint()
SelectedEntity(DCLBuilderInWorldEntity)
EntityDeselected(DCLBuilderInWorldEntity)
EntityDoubleClick(DCLBuilderInWorldEntity)
UpdateActionsInteractable()
ShouldCancelUndoAction()
SetSnapActive(System.Boolean)
FocusOnSelectedEntitiesInput()
TryLookAtEntity(DCL.Models.IDCLEntity)
LookAtEntity(DCL.Models.IDCLEntity)
TranslateMode()
RotateMode()
ScaleMode()
GizmosMode(System.String)
OnGizmosTransformStart(System.String)
OnGizmosTransformEnd(System.String)
FocusGameObject(System.Collections.Generic.List[DCLBuilderInWorldEntity])
GetInitialCameraPosition(DCL.Controllers.ParcelScene)
SetLookAtObject(DCL.Controllers.ParcelScene)
SetEditObjectAtMouse()
GetFloorPointAtMouse(UnityEngine.Vector3)
ResetCamera()
TakeSceneScreenshotForPublish()
TakeSceneScreenshotForExit()
OpenNewProjectDetails()