< Summary

Class:BuilderInWorldFirstPersonMode
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/States/FirstPerson/BuilderInWorldFirstPersonMode.cs
Covered lines:29
Uncovered lines:135
Coverable lines:164
Total lines:321
Line coverage:17.6% (29 of 164)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BuilderInWorldFirstPersonMode()0%110100%
Start()0%2100%
OnDestroy()0%2100%
LateUpdate()0%42600%
GetPointerPosition()0%2100%
OnMouseClick(...)0%20400%
ShouldCancelUndoAction()0%6200%
UndoSelection()0%2100%
SetDuplicationOffset(...)0%6200%
ResetScaleAndRotation()0%2100%
Activate(...)0%2.092071.43%
StartMultiSelection()0%2100%
EndMultiSelection()0%2100%
SelectedEntity(...)0%2100%
CreatedEntity(...)0%2100%
SetSnapActive(...)0%220100%
CheckInputSelectedEntities()0%90900%
GetCreatedEntityPoint()0%2100%
SetObjectIfSnapOrNot()0%6.83025%
SetEditObjectParent()0%9.157064.71%
RotateSelection(...)0%2100%
ScaleSelection(...)0%2100%

File(s)

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

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.Helpers;
 3using System;
 4using System.Collections;
 5using System.Collections.Generic;
 6using UnityEngine;
 7
 8public class BuilderInWorldFirstPersonMode : BuilderInWorldMode
 9{
 10    [Header("Design variables")]
 19811    public float scaleSpeed = 0.25f;
 19812    public float rotationSpeed = 0.5f;
 19813    public float distanceFromCameraForNewEntitties = 5;
 14
 15    [Header("Prefab references")]
 16    public BuilderInWorldInputWrapper builderInputWrapper;
 17
 18    [Header("InputActions")]
 19    [SerializeField] internal InputAction_Hold rotationHold;
 20
 21    private Quaternion initialRotation;
 22
 23    private float currentScaleAdded, currentYRotationAdded;
 24
 25    private bool snapObjectAlreadyMoved = false, shouldRotate = false;
 26    private Transform originalParentGOEdit;
 27
 28    private InputAction_Hold.Started rotationHoldStartDelegate;
 29    private InputAction_Hold.Finished rotationHoldFinishedDelegate;
 30
 31    private void Start()
 32    {
 033        rotationHoldStartDelegate = (action) => { shouldRotate = true; };
 034        rotationHoldFinishedDelegate = (action) => { shouldRotate = false; };
 35
 036        rotationHold.OnStarted += rotationHoldStartDelegate;
 037        rotationHold.OnFinished += rotationHoldFinishedDelegate;
 38
 039        BuilderInWorldInputWrapper.OnMouseClick += OnMouseClick;
 040    }
 41
 42    private void OnDestroy()
 43    {
 044        rotationHold.OnStarted -= rotationHoldStartDelegate;
 045        rotationHold.OnFinished -= rotationHoldFinishedDelegate;
 46
 047        BuilderInWorldInputWrapper.OnMouseClick -= OnMouseClick;
 048    }
 49
 50    void LateUpdate()
 51    {
 052        if (selectedEntities.Count == 0 || isMultiSelectionActive)
 053            return;
 54
 055        if (isSnapActive)
 56        {
 057            if (snapObjectAlreadyMoved)
 58            {
 059                Vector3 objectPosition = snapGO.transform.position;
 060                Vector3 eulerRotation =  snapGO.transform.rotation.eulerAngles;
 61
 062                float currentSnapFactor = snapFactor;
 63
 064                objectPosition.x = Mathf.RoundToInt(objectPosition.x / currentSnapFactor) * currentSnapFactor;
 065                objectPosition.y = Mathf.RoundToInt(objectPosition.y / currentSnapFactor) * currentSnapFactor;
 066                objectPosition.z = Mathf.RoundToInt(objectPosition.z / currentSnapFactor) * currentSnapFactor;
 067                eulerRotation.y = snapRotationDegresFactor * Mathf.FloorToInt((eulerRotation.y % snapRotationDegresFacto
 68
 069                Quaternion destinationRotation = Quaternion.AngleAxis(currentYRotationAdded, Vector3.up);
 070                editionGO.transform.rotation = initialRotation * destinationRotation;
 071                editionGO.transform.position = objectPosition;
 072            }
 073            else if (Vector3.Distance(snapGO.transform.position, editionGO.transform.position) >= snapDistanceToActivate
 74            {
 075                BuilderInWorldUtils.CopyGameObjectStatus(editionGO, snapGO, false);
 076                snapObjectAlreadyMoved = true;
 077                SetEditObjectParent();
 78            }
 079        }
 80        else
 81        {
 082            Vector3 pointToLookAt = Camera.main.transform.position;
 083            pointToLookAt.y = editionGO.transform.position.y;
 084            Quaternion lookOnLook = Quaternion.LookRotation(editionGO.transform.position - pointToLookAt);
 085            freeMovementGO.transform.rotation = lookOnLook;
 86        }
 87
 088    }
 89
 090    public override Vector3 GetPointerPosition() { return new Vector3(Screen.width / 2, Screen.height / 2, 0); }
 91
 92    public void OnMouseClick(int buttonId, Vector3 mouseposition)
 93    {
 094        if (!isModeActive)
 095            return;
 096        if (buttonId != 1)
 097            return;
 098        if (selectedEntities.Count <= 0)
 099            return;
 100
 0101        UndoSelection();
 0102    }
 103
 104    public override bool ShouldCancelUndoAction()
 105    {
 0106        if (builderInWorldEntityHandler.GetSelectedEntityList().Count >= 1)
 107        {
 0108            UndoSelection();
 0109            return true;
 110        }
 0111        return false;
 112    }
 113
 114    public void UndoSelection()
 115    {
 0116        BuilderInWorldUtils.CopyGameObjectStatus(undoGO, editionGO, false, false);
 0117        builderInWorldEntityHandler.DeselectEntities();
 0118    }
 119
 120    public override void SetDuplicationOffset(float offset)
 121    {
 0122        base.SetDuplicationOffset(offset);
 0123        if (isSnapActive)
 0124            editionGO.transform.position += Vector3.right * offset;
 0125    }
 126
 127    public override void ResetScaleAndRotation()
 128    {
 0129        base.ResetScaleAndRotation();
 0130        currentScaleAdded = 0;
 0131        currentYRotationAdded = 0;
 132
 0133        Quaternion zeroAnglesQuaternion = Quaternion.Euler(Vector3.zero);
 0134        initialRotation = zeroAnglesQuaternion;
 0135    }
 136
 137    public override void Activate(ParcelScene scene)
 138    {
 1139        base.Activate(scene);
 1140        SetEditObjectParent();
 1141        freeMovementGO.transform.SetParent(Camera.main.transform);
 1142        if (HUDController.i.builderInWorldMainHud != null)
 143        {
 0144            HUDController.i.builderInWorldMainHud.ActivateFirstPersonModeUI();
 0145            HUDController.i.builderInWorldMainHud.SetVisibilityOfCatalog(false);
 146        }
 1147    }
 148
 149    public override void StartMultiSelection()
 150    {
 0151        base.StartMultiSelection();
 0152        originalParentGOEdit = editionGO.transform.parent;
 153
 0154        SetEditObjectParent();
 0155        snapGO.transform.SetParent(null);
 0156        freeMovementGO.transform.SetParent(null);
 0157    }
 158
 159    public override void EndMultiSelection()
 160    {
 0161        base.EndMultiSelection();
 0162        SetEditObjectParent();
 163
 0164        snapGO.transform.SetParent(Camera.main.transform);
 0165        freeMovementGO.transform.SetParent(Camera.main.transform);
 166
 0167        SetObjectIfSnapOrNot();
 0168    }
 169
 170    public override void SelectedEntity(DCLBuilderInWorldEntity selectedEntity)
 171    {
 0172        base.SelectedEntity(selectedEntity);
 173
 0174        initialRotation = editionGO.transform.rotation;
 175
 0176        SetObjectIfSnapOrNot();
 177
 0178        currentYRotationAdded = 0;
 0179        BuilderInWorldUtils.CopyGameObjectStatus(editionGO, snapGO, false);
 0180    }
 181
 182    public override void CreatedEntity(DCLBuilderInWorldEntity createdEntity)
 183    {
 0184        base.CreatedEntity(createdEntity);
 0185        Utils.LockCursor();
 0186    }
 187
 188    public override void SetSnapActive(bool isActive)
 189    {
 1190        base.SetSnapActive(isActive);
 1191        if (isSnapActive)
 192        {
 1193            snapObjectAlreadyMoved = false;
 1194            snapGO.transform.SetParent(Camera.main.transform);
 195        }
 1196        SetObjectIfSnapOrNot();
 1197    }
 198
 199    public override void CheckInputSelectedEntities()
 200    {
 0201        base.CheckInputSelectedEntities();
 0202        if (selectedEntities.Count == 0)
 0203            return;
 204
 0205        if (isModeActive && shouldRotate)
 206        {
 0207            if (isSnapActive)
 208            {
 0209                RotateSelection(snapRotationDegresFactor);
 0210                InputDone();
 0211            }
 212            else
 213            {
 0214                RotateSelection(rotationSpeed);
 215            }
 216        }
 217
 0218        if (Input.mouseScrollDelta.y > 0.5f)
 219        {
 0220            if (isSnapActive)
 221            {
 0222                ScaleSelection(snapScaleFactor);
 0223                InputDone();
 0224            }
 225            else
 226            {
 0227                ScaleSelection(scaleSpeed);
 228            }
 0229        }
 0230        else if (Input.mouseScrollDelta.y < -0.5f)
 231        {
 0232            if (isSnapActive)
 233            {
 0234                ScaleSelection(-snapScaleFactor);
 0235                InputDone();
 0236            }
 237            else
 238            {
 0239                ScaleSelection(-scaleSpeed);
 240            }
 241        }
 242
 0243    }
 244
 0245    public override Vector3 GetCreatedEntityPoint() { return Camera.main.transform.position + Camera.main.transform.forw
 246
 247    void SetObjectIfSnapOrNot()
 248    {
 1249        if (isMultiSelectionActive)
 0250            return;
 251
 1252        if (!isSnapActive)
 253        {
 0254            editionGO.transform.SetParent(null);
 0255            freeMovementGO.transform.position = editionGO.transform.position;
 0256            freeMovementGO.transform.rotation = editionGO.transform.rotation;
 0257            freeMovementGO.transform.localScale = editionGO.transform.localScale;
 258
 0259            editionGO.transform.SetParent(null);
 260
 0261            Vector3 pointToLookAt = Camera.main.transform.position;
 0262            pointToLookAt.y = editionGO.transform.position.y;
 0263            Quaternion lookOnLook = Quaternion.LookRotation(editionGO.transform.position - pointToLookAt);
 264
 0265            freeMovementGO.transform.rotation = lookOnLook;
 0266            editionGO.transform.SetParent(freeMovementGO.transform, true);
 0267        }
 268        else
 269        {
 1270            editionGO.transform.SetParent(null);
 271        }
 272
 1273    }
 274
 275    private void SetEditObjectParent()
 276    {
 1277        Transform parentToAsign = null;
 1278        bool worldPositionStays = false;
 1279        if (!isMultiSelectionActive)
 280        {
 1281            if (isSnapActive)
 282            {
 0283                if (snapObjectAlreadyMoved)
 0284                    parentToAsign = Camera.main.transform;
 0285            }
 286            else
 287            {
 1288                worldPositionStays = true;
 1289                if (freeMovementGO != null)
 1290                    parentToAsign = freeMovementGO.transform;
 291            }
 292
 1293        }
 294        else
 295        {
 0296            if (!isSnapActive)
 297            {
 0298                parentToAsign = originalParentGOEdit;
 299            }
 0300            worldPositionStays = true;
 301        }
 302
 1303        if (editionGO != null)
 1304            editionGO.transform.SetParent(parentToAsign, worldPositionStays);
 1305    }
 306
 307    void RotateSelection(float angleToRotate)
 308    {
 0309        currentYRotationAdded += angleToRotate;
 0310        editionGO.transform.Rotate(Vector3.up, angleToRotate);
 0311        snapGO.transform.Rotate(Vector3.up, angleToRotate);
 0312        snapGO.transform.rotation = Quaternion.Euler(BuilderInWorldUtils.SnapFilterEulerAngles(snapGO.transform.rotation
 0313    }
 314
 315    void ScaleSelection(float scaleFactor)
 316    {
 0317        currentScaleAdded += scaleFactor;
 0318        editionGO.transform.localScale += Vector3.one * scaleFactor;
 0319        snapGO.transform.localScale += Vector3.one * scaleFactor;
 0320    }
 321}