< Summary

Class:BuilderInWorldMode
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/States/BuilderInWorldMode.cs
Covered lines:27
Uncovered lines:93
Coverable lines:120
Total lines:259
Line coverage:22.5% (27 of 120)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BuilderInWorldMode()0%110100%
Init(...)0%110100%
OnDestroy()0%2100%
Activate(...)0%110100%
Deactivate()0%110100%
SetSnapActive(...)0%6.846071.43%
StartMultiSelection()0%2100%
GetPointerPosition()0%2100%
EndMultiSelection()0%2100%
ShouldCancelUndoAction()0%2100%
SetDuplicationOffset(...)0%2100%
EntityDoubleClick(...)0%2100%
SelectedEntity(...)0%2100%
CenterGameObjectToEdit()0%20400%
MouseClickDetected()0%12300%
CreatedEntity(...)0%2100%
EntityDeselected(...)0%6200%
OnDeleteEntity(...)0%110100%
OnDeselectedEntities()0%2100%
CheckInput()0%2100%
CheckInputSelectedEntities()0%2100%
InputDone()0%6200%
ResetScaleAndRotation()0%6200%
GetCreatedEntityPoint()0%2100%
GetCenterPointOfSelectedObjects()0%6200%
TransformActionStarted(...)0%30500%
TransformActionEnd(...)0%1321100%
ActionFinish(...)0%20400%

File(s)

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

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.Models;
 3using System;
 4using System.Collections.Generic;
 5using DCL.Configuration;
 6using UnityEngine;
 7
 8public class BuilderInWorldMode : MonoBehaviour
 9{
 10    [Header("Design variables")]
 39611    public float maxDistanceToSelectEntities = 50;
 12
 13    [Header("Snap variables")]
 39614    public float snapFactor = 1f;
 15
 39616    public float snapRotationDegresFactor = 15f;
 39617    public float snapScaleFactor = 0.5f;
 18
 39619    public float snapDistanceToActivateMovement = 10f;
 20
 21    [Header("Prefab references")]
 22    public BuilderInWorldEntityHandler builderInWorldEntityHandler;
 23    public BIWSaveController biwSaveController;
 24    public ActionController actionController;
 25
 26    public event Action OnInputDone;
 27    public event Action<BuildInWorldCompleteAction> OnActionGenerated;
 28
 29    protected GameObject editionGO, undoGO, snapGO, freeMovementGO;
 30
 31    protected bool isSnapActive = false, isMultiSelectionActive = false, isModeActive = false;
 32    protected List<DCLBuilderInWorldEntity> selectedEntities;
 33
 34    protected bool isNewObjectPlaced = false;
 35
 39636    protected List<BuilderInWorldEntityAction> actionList = new List<BuilderInWorldEntityAction>();
 37
 38    public virtual void Init(GameObject goToEdit, GameObject undoGO, GameObject snapGO, GameObject freeMovementGO, List<
 39    {
 1840        editionGO = goToEdit;
 1841        this.undoGO = undoGO;
 1842        this.snapGO = snapGO;
 1843        this.freeMovementGO = freeMovementGO;
 44
 1845        this.selectedEntities = selectedEntities;
 1846        gameObject.SetActive(false);
 1847        builderInWorldEntityHandler.OnEntityDeleted += OnDeleteEntity;
 1848    }
 49
 050    private void OnDestroy() { builderInWorldEntityHandler.OnEntityDeleted -= OnDeleteEntity; }
 51
 52    public virtual void Activate(ParcelScene scene)
 53    {
 554        gameObject.SetActive(true);
 555        isModeActive = true;
 556    }
 57
 58    public virtual void Deactivate()
 59    {
 460        gameObject.SetActive(false);
 461        isModeActive = false;
 462        builderInWorldEntityHandler.DeselectEntities();
 463    }
 64
 65    public virtual void SetSnapActive(bool isActive)
 66    {
 567        if (isActive && !isSnapActive)
 268            AudioScriptableObjects.enable.Play();
 369        else if (!isActive && isSnapActive)
 070            AudioScriptableObjects.disable.Play();
 71
 572        isSnapActive = isActive;
 573        HUDController.i.builderInWorldMainHud?.SetSnapModeActive(isSnapActive);
 074    }
 75
 076    public virtual void StartMultiSelection() { isMultiSelectionActive = true; }
 77
 078    public virtual Vector3 GetPointerPosition() { return Input.mousePosition; }
 79
 080    public virtual void EndMultiSelection() { isMultiSelectionActive = false; }
 81
 082    public virtual bool ShouldCancelUndoAction() { return false; }
 83
 084    public virtual void SetDuplicationOffset(float offset) { }
 85
 086    public virtual void EntityDoubleClick(DCLBuilderInWorldEntity entity) { }
 87
 88    public virtual void SelectedEntity(DCLBuilderInWorldEntity selectedEntity)
 89    {
 090        CenterGameObjectToEdit();
 91
 092        BuilderInWorldUtils.CopyGameObjectStatus(editionGO, undoGO, false, false);
 093    }
 94
 95    public virtual void CenterGameObjectToEdit()
 96    {
 097        if (selectedEntities.Count > 0)
 98        {
 099            foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 100            {
 0101                entity.rootEntity.gameObject.transform.SetParent(null);
 102            }
 103
 0104            editionGO.transform.position = GetCenterPointOfSelectedObjects();
 0105            editionGO.transform.rotation = Quaternion.Euler(0, 0, 0);
 0106            editionGO.transform.localScale = Vector3.one;
 0107            foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 108            {
 0109                entity.rootEntity.gameObject.transform.SetParent(editionGO.transform);
 110            }
 111        }
 0112    }
 113
 114    public virtual void MouseClickDetected()
 115    {
 0116        DCLBuilderInWorldEntity entityToSelect = builderInWorldEntityHandler.GetEntityOnPointer();
 0117        if (entityToSelect != null)
 118        {
 0119            builderInWorldEntityHandler.EntityClicked(entityToSelect);
 0120        }
 0121        else if (!isMultiSelectionActive)
 122        {
 0123            builderInWorldEntityHandler.DeselectEntities();
 124        }
 0125    }
 126
 0127    public virtual void CreatedEntity(DCLBuilderInWorldEntity createdEntity) { isNewObjectPlaced = true; }
 128
 129    public virtual void EntityDeselected(DCLBuilderInWorldEntity entityDeselected)
 130    {
 0131        CenterGameObjectToEdit();
 132
 0133        if (isNewObjectPlaced)
 134        {
 0135            actionController.CreateActionEntityCreated(entityDeselected.rootEntity);
 136        }
 137
 0138        isNewObjectPlaced = false;
 0139    }
 140
 6141    public virtual void OnDeleteEntity(DCLBuilderInWorldEntity entity) { }
 142
 0143    public virtual void OnDeselectedEntities() { builderInWorldEntityHandler.ReportTransform(true); }
 144
 0145    public virtual void CheckInput() { }
 146
 0147    public virtual void CheckInputSelectedEntities() { }
 148
 0149    public virtual void InputDone() { OnInputDone?.Invoke(); }
 150
 151    public virtual void ResetScaleAndRotation()
 152    {
 0153        editionGO.transform.localScale = Vector3.one;
 0154        snapGO.transform.localScale = Vector3.one;
 0155        freeMovementGO.transform.localScale = Vector3.one;
 156
 0157        Quaternion zeroAnglesQuaternion = Quaternion.Euler(Vector3.zero);
 158
 0159        snapGO.transform.rotation = zeroAnglesQuaternion;
 0160        freeMovementGO.transform.rotation = zeroAnglesQuaternion;
 0161        editionGO.transform.rotation = zeroAnglesQuaternion;
 162
 0163        foreach (DCLBuilderInWorldEntity decentralandEntityToEdit in selectedEntities)
 164        {
 0165            decentralandEntityToEdit.ResetTransfrom();
 166        }
 167
 0168        CenterGameObjectToEdit();
 0169    }
 170
 0171    public virtual Vector3 GetCreatedEntityPoint() { return Vector3.zero; }
 172
 173    protected Vector3 GetCenterPointOfSelectedObjects()
 174    {
 0175        float totalX = 0f;
 0176        float totalY = 0f;
 0177        float totalZ = 0f;
 0178        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 179        {
 0180            totalX += entity.rootEntity.gameObject.transform.position.x;
 0181            totalY += entity.rootEntity.gameObject.transform.position.y;
 0182            totalZ += entity.rootEntity.gameObject.transform.position.z;
 183        }
 184
 0185        float centerX = totalX / selectedEntities.Count;
 0186        float centerY = totalY / selectedEntities.Count;
 0187        float centerZ = totalZ / selectedEntities.Count;
 0188        return new Vector3(centerX, centerY, centerZ);
 189    }
 190
 191    protected void TransformActionStarted(IDCLEntity entity, string type)
 192    {
 0193        BuilderInWorldEntityAction buildModeEntityAction = new BuilderInWorldEntityAction(entity);
 194        switch (type)
 195        {
 196            case BuilderInWorldSettings.TRANSLATE_GIZMO_NAME:
 0197                buildModeEntityAction.oldValue = entity.gameObject.transform.position;
 0198                break;
 199            case BuilderInWorldSettings.ROTATE_GIZMO_NAME:
 0200                buildModeEntityAction.oldValue = entity.gameObject.transform.rotation.eulerAngles;
 0201                break;
 202            case BuilderInWorldSettings.SCALE_GIZMO_NAME:
 0203                buildModeEntityAction.oldValue = entity.gameObject.transform.lossyScale;
 204                break;
 205        }
 206
 0207        actionList.Add(buildModeEntityAction);
 0208    }
 209
 210    protected void TransformActionEnd(IDCLEntity entity, string type)
 211    {
 0212        List<BuilderInWorldEntityAction> removeList = new List<BuilderInWorldEntityAction>();
 0213        foreach (BuilderInWorldEntityAction entityAction in actionList)
 214        {
 0215            if (entityAction.entityId != entity.entityId)
 216                continue;
 217
 218            switch (type)
 219            {
 220                case "MOVE":
 221
 0222                    entityAction.newValue = entity.gameObject.transform.position;
 0223                    if (Vector3.Distance((Vector3) entityAction.oldValue, (Vector3) entityAction.newValue) <= 0.09f)
 0224                        removeList.Add(entityAction);
 0225                    break;
 226                case "ROTATE":
 227
 0228                    entityAction.newValue = entity.gameObject.transform.rotation.eulerAngles;
 0229                    if (Vector3.Distance((Vector3) entityAction.oldValue, (Vector3) entityAction.newValue) <= 0.09f)
 0230                        removeList.Add(entityAction);
 0231                    break;
 232                case "SCALE":
 0233                    entityAction.newValue = entity.gameObject.transform.lossyScale;
 0234                    if (Vector3.Distance((Vector3) entityAction.oldValue, (Vector3) entityAction.newValue) <= 0.09f)
 0235                        removeList.Add(entityAction);
 236                    break;
 237            }
 238        }
 239
 0240        foreach (BuilderInWorldEntityAction entityAction in removeList)
 241        {
 0242            actionList.Remove(entityAction);
 243        }
 0244    }
 245
 246    protected void ActionFinish(BuildInWorldCompleteAction.ActionType type)
 247    {
 0248        if (actionList.Count > 0 && selectedEntities.Count > 0)
 249        {
 0250            BuildInWorldCompleteAction buildModeAction = new BuildInWorldCompleteAction();
 251
 0252            buildModeAction.actionType = type;
 0253            buildModeAction.CreateActionType(actionList, type);
 0254            OnActionGenerated?.Invoke(buildModeAction);
 255
 0256            actionList = new List<BuilderInWorldEntityAction>();
 257        }
 0258    }
 259}