< Summary

Class:BIWEntityHandler
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/Controllers/BIWEntityHandler.cs
Covered lines:366
Uncovered lines:57
Coverable lines:423
Total lines:899
Line coverage:86.5% (366 of 423)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BIWEntityHandler()0%110100%
Initialize(...)0%220100%
OnInputMouseDown(...)0%6200%
OnInputMouseUp(...)0%220100%
Dispose()0%220100%
Update()0%4.683042.86%
ReportTransform(...)0%15.286036.36%
GetLastTimeReport()0%2100%
GetSelectedEntityList()0%110100%
IsAnyEntitySelected()0%110100%
SetActiveMode(...)0%110100%
SetMultiSelectionActive(...)0%2100%
EnterEditMode(...)0%110100%
CheckErrorOnEntities()0%330100%
IsPointerInSelectedEntity()0%4.024090%
DeleteSelectedEntitiesInput()0%6200%
DuplicateSelectedEntitiesInput()0%12300%
ExitEditMode()0%220100%
ChangeEntitySelectionFromList(...)0%2.52050%
SelectFromList(...)0%4.374071.43%
DeselectEntity(...)0%7.997072.73%
DeselectEntities()0%440100%
EntityClicked(...)0%7.67076.92%
ReSelectEntities()0%330100%
ChangeEntitySelectStatus(...)0%2.062075%
CancelSelection()0%2.032080%
ChangeLockStateSelectedEntities()0%220100%
ShowAllEntities()0%330100%
ChangeShowStateSelectedEntities()0%440100%
Select(...)0%2.032080%
SelectEntity(...)0%6.846071.43%
GetAllVoxelsEntities()0%440100%
GetAllEntitiesFromCurrentScene()0%330100%
GetConvertedEntity(...)0%2.152066.67%
GetConvertedEntity(...)0%220100%
DuplicateSelectedEntities()0%440100%
DuplicateEntity(...)0%110100%
CreateEntityFromJSON(...)0%7.057090%
CreateEmptyEntity(...)0%330100%
SetupAllEntities()0%220100%
DestroyLastCreatedEntities()0%7.017093.33%
EntityListChanged()0%220100%
GetCurrentSceneEntityCount()0%110100%
GetEntitiesInCurrentScene()0%330100%
SetupEntityToEdit(...)0%7.647076.47%
ChangeEntityBoundsCheckerStatus(...)0%220100%
GetNewNameForEntity(...)0%110100%
GetNewNameForEntity(...)0%3.143075%
DeleteFloorEntities()0%440100%
DeleteEntity(...)0%110100%
DeleteEntity(...)0%110100%
DeleteEntity(...)0%9.089090%
DeleteSingleEntity(...)0%110100%
DeleteSelectedEntities()0%4.014092.31%
DeleteEntitiesOutsideSceneBoundaries()0%550100%
DestroyCollidersForAllEntities()0%220100%
RemoveConvertedEntity(...)0%110100%
NotifyEntityIsCreated(...)0%2.52050%
SetEntityName(...)0%110100%
SetEntityName(...)0%6.176083.33%
ChangeEntityVisibilityStatus(...)0%330100%
ChangeEntityLockStatus(...)0%5.024060%
GetConvertedUniqueKeyForEntity(...)0%110100%
GetConvertedUniqueKeyForEntity(...)0%110100%
AreAllEntitiesInsideBoundaries()0%330100%

File(s)

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

#LineLine coverage
 1using DCL;
 2using DCL.Components;
 3using DCL.Configuration;
 4using DCL.Controllers;
 5using DCL.Helpers;
 6using DCL.Interface;
 7using DCL.Models;
 8using Newtonsoft.Json;
 9using System;
 10using System.Collections;
 11using System.Collections.Generic;
 12using System.Diagnostics.CodeAnalysis;
 13using UnityEngine;
 14using Environment = DCL.Environment;
 15
 16public interface IBIWEntityHandler : IBIWController
 17{
 18    event Action<BIWEntity> OnEntityDeselected;
 19    event Action OnEntitySelected;
 20    event Action<List<BIWEntity>> OnDeleteSelectedEntities;
 21    event Action<BIWEntity> OnEntityDeleted;
 22    BIWEntity GetConvertedEntity(string entityId);
 23    BIWEntity GetConvertedEntity(IDCLEntity entity);
 24    void DeleteEntity(BIWEntity entityToDelete);
 25    void DeleteEntity(string entityId);
 26    void DeleteFloorEntities();
 27    void DeleteSelectedEntities();
 28    IDCLEntity CreateEntityFromJSON(string entityJson);
 29    BIWEntity CreateEmptyEntity(ParcelScene parcelScene, Vector3 entryPoint, Vector3 editionGOPosition, bool notifyEntit
 30    List<BIWEntity> GetAllEntitiesFromCurrentScene();
 31    void DeselectEntities();
 32    List<BIWEntity> GetSelectedEntityList();
 33    bool IsAnyEntitySelected();
 34    void SetActiveMode(BIWMode buildMode);
 35    void SetMultiSelectionActive(bool isActive);
 36    void ChangeLockStateSelectedEntities();
 37    void DeleteEntitiesOutsideSceneBoundaries();
 38    bool AreAllEntitiesInsideBoundaries();
 39    void EntityListChanged();
 40    void NotifyEntityIsCreated(IDCLEntity entity);
 41    void SetEntityName(BIWEntity entityToApply, string newName, bool sendUpdateToKernel = true);
 42    void EntityClicked(BIWEntity entityToSelect);
 43    void ReportTransform(bool forceReport = false);
 44    void CancelSelection();
 45    bool IsPointerInSelectedEntity();
 46    void DestroyLastCreatedEntities();
 47    void Select(IDCLEntity entity);
 48    bool SelectEntity(BIWEntity entityEditable, bool selectedFromCatalog = false);
 49    void DeselectEntity(BIWEntity entity);
 50    int GetCurrentSceneEntityCount();
 51}
 52
 53public class BIWEntityHandler : BIWController, IBIWEntityHandler
 54{
 55    private const float DUPLICATE_OFFSET = 2f;
 56
 57    private IBIWOutlinerController outlinerController;
 58
 59    private IBIWModeController modeController;
 60    private IBIWActionController actionController;
 61    private IBIWCreatorController creatorController;
 62    private IBIWRaycastController raycastController;
 63
 64    private BuilderInWorldBridge bridge;
 65    private Material editMaterial;
 66
 67    private InputAction_Trigger hideSelectedEntitiesAction;
 68
 69    private InputAction_Trigger showAllEntitiesAction;
 70
 9571    private readonly Dictionary<string, BIWEntity> convertedEntities = new Dictionary<string, BIWEntity>();
 9572    private readonly List<BIWEntity> selectedEntities = new List<BIWEntity>();
 73
 74    private BIWMode currentActiveMode;
 75    internal bool isMultiSelectionActive = false;
 76    internal bool isSecondayClickPressed = false;
 77
 78    private float lastTransformReportTime;
 79
 9580    private List<string> entityNameList = new List<string>();
 81
 82    private InputAction_Trigger.Triggered hideSelectedEntitiesDelegate;
 83    private InputAction_Trigger.Triggered showAllEntitiesDelegate;
 84
 85    private BuildModeHUDController hudController;
 86
 87    public event Action<BIWEntity> OnEntityDeselected;
 88    public event Action OnEntitySelected;
 89    public event Action<List<BIWEntity>> OnDeleteSelectedEntities;
 90    public event Action<BIWEntity> OnEntityDeleted;
 91
 92    private BIWEntity lastClickedEntity;
 93    private float lastTimeEntityClicked;
 94
 95    public override void Initialize(BIWContext context)
 96    {
 9597        base.Initialize(context);
 9598        if (HUDController.i.builderInWorldMainHud != null)
 99        {
 25100            hudController = HUDController.i.builderInWorldMainHud;
 25101            hudController.OnEntityDelete += DeleteSingleEntity;
 25102            hudController.OnDuplicateSelectedAction += DuplicateSelectedEntitiesInput;
 25103            hudController.OnDeleteSelectedAction += DeleteSelectedEntitiesInput;
 25104            hudController.OnEntityClick += ChangeEntitySelectionFromList;
 25105            hudController.OnEntityLock += ChangeEntityLockStatus;
 25106            hudController.OnEntityChangeVisibility += ChangeEntityVisibilityStatus;
 25107            hudController.OnEntityRename += SetEntityName;
 25108            hudController.OnEntitySmartItemComponentUpdate += UpdateSmartItemComponentInKernel;
 109        }
 110
 111
 95112        BIWInputWrapper.OnMouseDown += OnInputMouseDown;
 95113        BIWInputWrapper.OnMouseUp += OnInputMouseUp;
 114
 95115        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged += ChangeEntityBoundsCheckerStatus
 116
 95117        bridge = context.sceneReferences.builderInWorldBridge;
 118
 95119        outlinerController = context.outlinerController;
 120
 95121        modeController = context.modeController;
 95122        actionController = context.actionController;
 95123        creatorController = context.creatorController;
 95124        raycastController = context.raycastController;
 125
 95126        editMaterial = context.projectReferencesAsset.editMaterial;
 127
 95128        hideSelectedEntitiesAction = context.inputsReferencesAsset.hideSelectedEntitiesAction;
 95129        showAllEntitiesAction = context.inputsReferencesAsset.showAllEntitiesAction;
 130
 95131        hideSelectedEntitiesDelegate = (action) => ChangeShowStateSelectedEntities();
 95132        showAllEntitiesDelegate = (action) => ShowAllEntities();
 133
 95134        hideSelectedEntitiesAction.OnTriggered += hideSelectedEntitiesDelegate;
 95135        showAllEntitiesAction.OnTriggered += showAllEntitiesDelegate;
 136
 95137        actionController.OnRedo += ReSelectEntities;
 95138        actionController.OnUndo += ReSelectEntities;
 95139    }
 140
 141    internal void OnInputMouseDown(int buttonId, Vector3 mousePosition)
 142    {
 0143        if (buttonId == 1)
 0144            isSecondayClickPressed = true;
 0145    }
 146
 147    internal void OnInputMouseUp(int buttonId, Vector3 mousePosition)
 148    {
 5149        if (buttonId == 1)
 5150            isSecondayClickPressed = false;
 5151    }
 152
 153    public override void Dispose()
 154    {
 81155        DestroyCollidersForAllEntities();
 156
 81157        actionController.OnRedo -= ReSelectEntities;
 81158        actionController.OnUndo -= ReSelectEntities;
 159
 81160        hideSelectedEntitiesAction.OnTriggered -= hideSelectedEntitiesDelegate;
 81161        showAllEntitiesAction.OnTriggered -= showAllEntitiesDelegate;
 162
 81163        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged -= ChangeEntityBoundsCheckerStatus
 164
 81165        BIWInputWrapper.OnMouseDown -= OnInputMouseDown;
 81166        BIWInputWrapper.OnMouseUp -= OnInputMouseUp;
 167
 81168        if (hudController != null)
 169        {
 25170            hudController.OnEntityDelete -= DeleteSingleEntity;
 25171            hudController.OnDuplicateSelectedAction -= DuplicateSelectedEntitiesInput;
 25172            hudController.OnDeleteSelectedAction -= DeleteSelectedEntitiesInput;
 25173            hudController.OnEntityClick -= ChangeEntitySelectionFromList;
 25174            hudController.OnEntityLock -= ChangeEntityLockStatus;
 25175            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 25176            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 25177            hudController.OnEntityRename -= SetEntityName;
 25178            hudController.OnEntitySmartItemComponentUpdate -= UpdateSmartItemComponentInKernel;
 179        }
 81180    }
 181
 182    public override void Update()
 183    {
 2184        base.Update();
 185
 2186        if (selectedEntities.Count == 0)
 2187            return;
 0188        if ((DCLTime.realtimeSinceStartup - lastTransformReportTime) <= BIWSettings.ENTITY_POSITION_REPORTING_DELAY)
 0189            return;
 190
 0191        ReportTransform();
 0192    }
 193
 194    public void ReportTransform(bool forceReport = false)
 195    {
 4196        foreach (BIWEntity entity in selectedEntities)
 197        {
 0198            if (!entity.HasMovedSinceLastReport() &&
 199                !entity.HasScaledSinceLastReport() &&
 200                !entity.HasRotatedSinceLastReport() &&
 201                !forceReport)
 0202                return;
 0203            bridge.EntityTransformReport(entity.rootEntity, sceneToEdit);
 0204            entity.PositionReported();
 0205            entity.ScaleReported();
 0206            entity.RotationReported();
 207        }
 208
 2209        lastTransformReportTime = DCLTime.realtimeSinceStartup;
 2210    }
 211
 0212    public float GetLastTimeReport() { return lastTransformReportTime; }
 213
 50214    public List<BIWEntity> GetSelectedEntityList() { return selectedEntities; }
 215
 2216    public bool IsAnyEntitySelected() { return selectedEntities.Count > 0; }
 217
 218    public void SetActiveMode(BIWMode buildMode)
 219    {
 8220        currentActiveMode = buildMode;
 8221        DeselectEntities();
 8222    }
 223
 0224    public void SetMultiSelectionActive(bool isActive) { isMultiSelectionActive = isActive; }
 225
 226    public override void EnterEditMode(IParcelScene scene)
 227    {
 80228        base.EnterEditMode(scene);
 229
 80230        SetupAllEntities();
 80231        EntityListChanged();
 80232        CheckErrorOnEntities();
 80233    }
 234
 235    private void CheckErrorOnEntities()
 236    {
 284237        foreach (BIWEntity entity in convertedEntities.Values)
 238        {
 62239            entity.CheckErrors();
 62240            if (entity.hasMissingCatalogItemError)
 62241                creatorController.CreateErrorOnEntity(entity);
 242        }
 80243    }
 244
 245    public bool IsPointerInSelectedEntity()
 246    {
 2247        BIWEntity entityInPointer = raycastController.GetEntityOnPointer();
 2248        if (entityInPointer == null)
 1249            return false;
 250
 3251        foreach (BIWEntity entity in selectedEntities)
 252        {
 1253            if (entityInPointer == entity)
 1254                return true;
 255        }
 256
 0257        return false;
 1258    }
 259
 260    private void DeleteSelectedEntitiesInput()
 261    {
 0262        if (selectedEntities.Count > 0)
 0263            DeleteSelectedEntities();
 0264    }
 265
 266    private void DuplicateSelectedEntitiesInput()
 267    {
 0268        if (selectedEntities.Count <= 0 || isSecondayClickPressed)
 0269            return;
 270
 0271        DuplicateSelectedEntities();
 0272    }
 273
 274    public override void ExitEditMode()
 275    {
 4276        base.ExitEditMode();
 4277        DeselectEntities();
 278
 16279        foreach (BIWEntity entity in convertedEntities.Values)
 280        {
 4281            entity.Dispose();
 282        }
 283
 4284        convertedEntities.Clear();
 4285    }
 286
 287    internal void ChangeEntitySelectionFromList(BIWEntity entityToEdit)
 288    {
 1289        if (!selectedEntities.Contains(entityToEdit))
 1290            SelectFromList(entityToEdit);
 291        else
 0292            DeselectEntity(entityToEdit);
 0293    }
 294
 295    private void SelectFromList(BIWEntity entityToEdit)
 296    {
 1297        if (!isMultiSelectionActive)
 1298            DeselectEntities();
 1299        if (SelectEntity(entityToEdit))
 300        {
 1301            if (!isMultiSelectionActive)
 1302                outlinerController.OutlineEntity(entityToEdit);
 303            else
 0304                outlinerController.OutlineEntities(selectedEntities);
 305        }
 0306    }
 307
 308    public void DeselectEntity(BIWEntity entity)
 309    {
 12310        if (!selectedEntities.Contains(entity))
 0311            return;
 312
 12313        entity.Deselect();
 314
 12315        outlinerController.CancelEntityOutline(entity);
 12316        selectedEntities.Remove(entity);
 12317        hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 12318        currentActiveMode?.EntityDeselected(entity);
 12319        if (selectedEntities.Count <= 0 &&
 320            hudController != null)
 0321            hudController.HideEntityInformation();
 322
 12323        OnEntityDeselected?.Invoke(entity);
 0324    }
 325
 326    public void DeselectEntities()
 327    {
 55328        if (selectedEntities.Count <= 0)
 46329            return;
 330
 9331        int amountToDeselect = selectedEntities.Count;
 36332        for (int i = 0; i < amountToDeselect; i++)
 333        {
 9334            DeselectEntity(selectedEntities[0]);
 335        }
 336
 9337        currentActiveMode?.OnDeselectedEntities();
 338
 9339        Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
 9340    }
 341
 342    public void EntityClicked(BIWEntity entityToSelect)
 343    {
 3344        if (entityToSelect != null)
 345        {
 3346            if (!isMultiSelectionActive)
 3347                DeselectEntities();
 348
 3349            if (!entityToSelect.isLocked)
 3350                ChangeEntitySelectStatus(entityToSelect);
 351
 3352            if (entityToSelect == lastClickedEntity && (lastTimeEntityClicked + BIWSettings.MOUSE_MS_DOUBLE_CLICK_THRESH
 1353                modeController.EntityDoubleClick(entityToSelect);
 354
 3355            lastClickedEntity = entityToSelect;
 3356            lastTimeEntityClicked = Time.realtimeSinceStartup;
 3357        }
 0358        else if (!isMultiSelectionActive)
 359        {
 0360            DeselectEntities();
 361        }
 0362    }
 363
 364    internal void ReSelectEntities()
 365    {
 13366        List<BIWEntity> entitiesToReselect = new List<BIWEntity>();
 28367        foreach (BIWEntity entity in selectedEntities)
 368        {
 1369            entitiesToReselect.Add(entity);
 370        }
 371
 13372        DeselectEntities();
 373
 28374        foreach (BIWEntity entity in entitiesToReselect)
 375        {
 1376            SelectEntity(entity);
 377        }
 13378    }
 379
 380    internal void ChangeEntitySelectStatus(BIWEntity entityCliked)
 381    {
 3382        if (entityCliked.isSelected)
 0383            DeselectEntity(entityCliked);
 384        else
 3385            SelectEntity(entityCliked);
 3386    }
 387
 388    public void CancelSelection()
 389    {
 1390        if (selectedEntities.Count == 0)
 0391            return;
 392
 1393        DestroyLastCreatedEntities();
 1394        DeselectEntities();
 1395    }
 396
 397    public void ChangeLockStateSelectedEntities()
 398    {
 4399        foreach (BIWEntity entity in selectedEntities)
 400        {
 1401            entity.ToggleLockStatus();
 402        }
 403
 1404        DeselectEntities();
 1405    }
 406
 407    public void ShowAllEntities()
 408    {
 4409        foreach (BIWEntity entity in convertedEntities.Values)
 410        {
 1411            if (!entity.isVisible)
 1412                entity.ToggleShowStatus();
 413        }
 1414    }
 415
 416    public void ChangeShowStateSelectedEntities()
 417    {
 1418        List<BIWEntity> entitiesToHide = new List<BIWEntity>(selectedEntities);
 419
 4420        foreach (BIWEntity entity in entitiesToHide)
 421        {
 1422            if (entity.isVisible && entity.isSelected)
 1423                DeselectEntity(entity);
 1424            entity.ToggleShowStatus();
 425        }
 1426    }
 427
 428    public void Select(IDCLEntity entity)
 429    {
 8430        BIWEntity entityEditable = GetConvertedEntity(entity);
 8431        if (entityEditable == null)
 0432            return;
 433
 8434        SelectEntity(entityEditable, true);
 8435    }
 436
 437    public bool SelectEntity(BIWEntity entityEditable, bool selectedFromCatalog = false)
 438    {
 27439        if (entityEditable.isLocked)
 1440            return false;
 441
 26442        if (entityEditable.isSelected)
 0443            return false;
 444
 26445        entityEditable.Select();
 446
 26447        selectedEntities.Add(entityEditable);
 448
 26449        currentActiveMode?.SelectedEntity(entityEditable);
 450
 26451        if (HUDController.i.builderInWorldMainHud != null)
 452        {
 0453            hudController.UpdateEntitiesSelection(selectedEntities.Count);
 0454            hudController.ShowEntityInformation(selectedFromCatalog);
 0455            hudController.EntityInformationSetEntity(entityEditable, sceneToEdit);
 456        }
 457
 26458        outlinerController.CancelAllOutlines();
 459
 26460        OnEntitySelected?.Invoke();
 461
 26462        return true;
 463    }
 464
 465    public List<BIWEntity> GetAllVoxelsEntities()
 466    {
 1467        List<BIWEntity> voxelEntities = new List<BIWEntity>();
 4468        foreach (BIWEntity entity in convertedEntities.Values)
 469        {
 1470            if (entity.rootEntity.scene == sceneToEdit && entity.isVoxel)
 1471                voxelEntities.Add(entity);
 472        }
 473
 1474        return voxelEntities;
 475    }
 476
 477    public List<BIWEntity> GetAllEntitiesFromCurrentScene()
 478    {
 56479        List<BIWEntity> entities = new List<BIWEntity>();
 246480        foreach (BIWEntity entity in convertedEntities.Values)
 481        {
 67482            if (entity.rootEntity.scene == sceneToEdit)
 67483                entities.Add(entity);
 484        }
 485
 56486        return entities;
 487    }
 488
 489    public BIWEntity GetConvertedEntity(string entityId)
 490    {
 6491        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entityId)))
 6492            return convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 493
 0494        return null;
 495    }
 496
 497    public BIWEntity GetConvertedEntity(IDCLEntity entity)
 498    {
 17499        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entity)))
 16500            return convertedEntities[GetConvertedUniqueKeyForEntity(entity)];
 501
 1502        return null;
 503    }
 504
 505    public void DuplicateSelectedEntities()
 506    {
 2507        BIWCompleteAction buildAction = new BIWCompleteAction();
 2508        buildAction.actionType = BIWCompleteAction.ActionType.CREATE;
 509
 2510        List<BIWEntityAction> entityActionList = new List<BIWEntityAction>();
 2511        List<BIWEntity> entitiesToDuplicate = new List<BIWEntity>(selectedEntities);
 2512        DeselectEntities();
 513
 8514        foreach (BIWEntity entityToDuplicate in entitiesToDuplicate)
 515        {
 2516            if (entityToDuplicate.isNFT)
 517                continue;
 518
 2519            var entityDuplicated = DuplicateEntity(entityToDuplicate);
 2520            BIWEntityAction biwEntityAction = new BIWEntityAction(entityDuplicated.rootEntity, entityDuplicated.rootEnti
 2521            entityActionList.Add(biwEntityAction);
 2522            SelectEntity(entityDuplicated);
 523        }
 524
 2525        currentActiveMode?.SetDuplicationOffset(DUPLICATE_OFFSET);
 526
 2527        buildAction.CreateActionType(entityActionList, BIWCompleteAction.ActionType.CREATE);
 2528        actionController.AddAction(buildAction);
 2529    }
 530
 531    public BIWEntity DuplicateEntity(BIWEntity entityToDuplicate)
 532    {
 3533        IDCLEntity entity = SceneUtils.DuplicateEntity(sceneToEdit, entityToDuplicate.rootEntity);
 534        //Note: If the entity contains the name component or DCLLockedOnEdit, we don't want to copy them
 3535        entity.RemoveSharedComponent(typeof(DCLName), false);
 3536        entity.RemoveSharedComponent(typeof(DCLLockedOnEdit), false);
 537
 3538        BIWUtils.CopyGameObjectStatus(entityToDuplicate.rootEntity.gameObject, entity.gameObject, false, false);
 3539        BIWEntity convertedEntity = SetupEntityToEdit(entity);
 540
 3541        NotifyEntityIsCreated(entity);
 3542        EntityListChanged();
 3543        return convertedEntity;
 544    }
 545
 546    public IDCLEntity CreateEntityFromJSON(string entityJson)
 547    {
 3548        EntityData data = BIWUtils.ConvertJSONToEntityData(entityJson);
 549
 3550        IDCLEntity newEntity = sceneToEdit.CreateEntity(data.entityId);
 551
 552
 3553        if (data.transformComponent != null)
 554        {
 1555            DCLTransform.model.position = data.transformComponent.position;
 1556            DCLTransform.model.rotation = Quaternion.Euler(data.transformComponent.rotation);
 1557            DCLTransform.model.scale = data.transformComponent.scale;
 1558            sceneToEdit.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, CLASS_ID_COMPONENT.TRANSFORM, DCLTran
 559        }
 560
 6561        foreach (ProtocolV2.GenericComponent component in data.components)
 562        {
 0563            sceneToEdit.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, (CLASS_ID_COMPONENT) component.compon
 564        }
 565
 10566        foreach (ProtocolV2.GenericComponent component in data.sharedComponents)
 567        {
 2568            sceneToEdit.SharedComponentAttach(newEntity.entityId, component.classId);
 569        }
 570
 3571        if (data.nftComponent != null)
 572        {
 1573            NFTShape nftShape = (NFTShape) sceneToEdit.SharedComponentCreate(data.nftComponent.id, Convert.ToInt32(CLASS
 1574            nftShape.model = new NFTShape.Model();
 1575            nftShape.model.color = data.nftComponent.color.ToColor();
 1576            nftShape.model.src = data.nftComponent.src;
 1577            nftShape.model.assetId = data.nftComponent.assetId;
 578
 1579            sceneToEdit.SharedComponentAttach(newEntity.entityId, nftShape.id);
 580        }
 581
 3582        var convertedEntity = SetupEntityToEdit(newEntity, true);
 583
 3584        if (convertedEntity.rootEntity.TryGetSharedComponent(CLASS_ID.GLTF_SHAPE, out var gltfComponent))
 0585            gltfComponent.CallWhenReady(convertedEntity.ShapeLoadFinish);
 586
 3587        if (convertedEntity.rootEntity.TryGetSharedComponent(CLASS_ID.NFT_SHAPE, out var nftComponent))
 1588            nftComponent.CallWhenReady(convertedEntity.ShapeLoadFinish);
 589
 590
 3591        creatorController.CreateLoadingObject(convertedEntity);
 3592        EntityListChanged();
 593
 3594        return newEntity;
 595    }
 596
 597    public BIWEntity CreateEmptyEntity(ParcelScene parcelScene, Vector3 entryPoint, Vector3 editionGOPosition, bool noti
 598    {
 30599        IDCLEntity newEntity = parcelScene.CreateEntity(Guid.NewGuid().ToString());
 600
 30601        DCLTransform.model.position = WorldStateUtils.ConvertUnityToScenePosition(entryPoint, parcelScene);
 602
 30603        Vector3 pointToLookAt = Camera.main.transform.position;
 30604        pointToLookAt.y = editionGOPosition.y;
 30605        Quaternion lookOnLook = Quaternion.LookRotation(editionGOPosition - pointToLookAt);
 606
 30607        DCLTransform.model.rotation = lookOnLook;
 30608        DCLTransform.model.scale = newEntity.gameObject.transform.lossyScale;
 609
 30610        parcelScene.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, CLASS_ID_COMPONENT.TRANSFORM, DCLTransfor
 611
 30612        BIWEntity convertedEntity = SetupEntityToEdit(newEntity, true);
 30613        hudController?.UpdateSceneLimitInfo();
 614
 30615        if (notifyEntityList)
 11616            EntityListChanged();
 30617        return convertedEntity;
 618    }
 619
 620    private void SetupAllEntities()
 621    {
 284622        foreach (IDCLEntity entity in sceneToEdit.entities.Values)
 623        {
 62624            SetupEntityToEdit(entity);
 625        }
 80626    }
 627
 628    public void DestroyLastCreatedEntities()
 629    {
 2630        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 8631        foreach (BIWEntity entity in selectedEntities)
 632        {
 2633            if (entity.isSelected && entity.isNew)
 1634                entitiesToRemove.Add(entity);
 635        }
 636
 2637        if (entitiesToRemove.Count == 0)
 1638            return;
 639
 1640        modeController.UndoEditionGOLastStep();
 641
 4642        foreach (BIWEntity entity in entitiesToRemove)
 643        {
 1644            DeleteEntity(entity, false);
 645        }
 646
 1647        hudController?.HideEntityInformation();
 0648    }
 649
 650    public void EntityListChanged()
 651    {
 125652        if (HUDController.i.builderInWorldMainHud == null)
 117653            return;
 8654        hudController.SetEntityList(GetEntitiesInCurrentScene());
 8655    }
 656
 10657    public int GetCurrentSceneEntityCount() { return GetEntitiesInCurrentScene().Count; }
 658
 659    List<BIWEntity> GetEntitiesInCurrentScene()
 660    {
 18661        List<BIWEntity> currentEntitiesInScene = new List<BIWEntity>();
 98662        foreach (BIWEntity entity in convertedEntities.Values)
 663        {
 31664            if (entity.rootEntity.scene == sceneToEdit)
 31665                currentEntitiesInScene.Add(entity);
 666        }
 667
 18668        return currentEntitiesInScene;
 669    }
 670
 671    BIWEntity SetupEntityToEdit(IDCLEntity entity, bool hasBeenCreated = false)
 672    {
 98673        string biwEntityId = GetConvertedUniqueKeyForEntity(entity);
 674
 98675        if (convertedEntities.ContainsKey(biwEntityId))
 1676            return convertedEntities[biwEntityId];
 677
 97678        BIWEntity entityToEdit = new BIWEntity();
 97679        entityToEdit.Initialize(entity, editMaterial);
 97680        convertedEntities.Add(entityToEdit.entityUniqueId, entityToEdit);
 97681        entity.OnRemoved += RemoveConvertedEntity;
 97682        entityToEdit.isNew = hasBeenCreated;
 683
 97684        string entityName = entityToEdit.GetDescriptiveName();
 97685        var catalogItem = entityToEdit.GetCatalogItemAssociated();
 686
 97687        if ((string.IsNullOrEmpty(entityName) || entityNameList.Contains(entityName)) && catalogItem != null)
 688        {
 0689            entityName = GetNewNameForEntity(catalogItem);
 0690            SetEntityName(entityToEdit, entityName);
 0691        }
 97692        else if (!string.IsNullOrEmpty(entityName) && !entityNameList.Contains(entityName))
 693        {
 0694            entityNameList.Add(entityName);
 695        }
 696
 97697        return entityToEdit;
 698    }
 699
 700    internal void ChangeEntityBoundsCheckerStatus(IDCLEntity entity, bool isInsideBoundaries)
 701    {
 2702        var convertedEntity = GetConvertedEntity(entity);
 2703        if (convertedEntity == null)
 1704            return;
 705
 1706        convertedEntity.SetEntityBoundariesError(isInsideBoundaries);
 1707    }
 708
 1709    public string GetNewNameForEntity(CatalogItem sceneObject) { return GetNewNameForEntity(sceneObject.name); }
 710
 711    public string GetNewNameForEntity(string name)
 712    {
 3713        int i = 1;
 3714        if (!entityNameList.Contains(name))
 1715            return name;
 716
 2717        string newName = name + " " + i;
 2718        while (entityNameList.Contains(newName))
 719        {
 0720            i++;
 0721            newName = name + " " + i;
 722        }
 723
 2724        return newName;
 725    }
 726
 727    public void DeleteFloorEntities()
 728    {
 4729        List<BIWEntity> entitiesToDelete = new List<BIWEntity>();
 730
 22731        foreach (BIWEntity entity in convertedEntities.Values)
 732        {
 7733            if (entity.isFloor)
 734            {
 4735                entitiesToDelete.Add(entity);
 736            }
 737        }
 738
 16739        foreach (BIWEntity entity in entitiesToDelete)
 4740            DeleteEntity(entity, false);
 4741    }
 742
 743    public void DeleteEntity(string entityId)
 744    {
 3745        BIWEntity entity = convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 3746        DeleteEntity(entity, true);
 3747    }
 748
 8749    public void DeleteEntity(BIWEntity entityToDelete) { DeleteEntity(entityToDelete, true); }
 750
 751    public void DeleteEntity(BIWEntity entityToDelete, bool checkSelection)
 752    {
 13753        if (entityToDelete.isSelected && checkSelection)
 0754            DeselectEntity(entityToDelete);
 755
 13756        if (selectedEntities.Contains(entityToDelete))
 757        {
 1758            selectedEntities.Remove(entityToDelete);
 1759            hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 760        }
 761
 13762        string entityName = entityToDelete.GetDescriptiveName();
 763
 13764        if (entityNameList.Contains(entityName))
 4765            entityNameList.Remove(entityName);
 766
 13767        RemoveConvertedEntity(entityToDelete.rootEntity);
 13768        entityToDelete.rootEntity.OnRemoved -= RemoveConvertedEntity;
 13769        entityToDelete.Delete();
 13770        string idToRemove = entityToDelete.rootEntity.entityId;
 13771        OnEntityDeleted?.Invoke(entityToDelete);
 13772        creatorController.RemoveLoadingObjectInmediate(entityToDelete.rootEntity.entityId);
 13773        if (sceneToEdit.entities.ContainsKey(idToRemove))
 13774            sceneToEdit.RemoveEntity(idToRemove, true);
 775
 13776        hudController?.RefreshCatalogAssetPack();
 13777        EntityListChanged();
 13778        bridge?.RemoveEntityOnKernel(idToRemove, sceneToEdit);
 0779    }
 780
 781    public void DeleteSingleEntity(BIWEntity entityToDelete)
 782    {
 1783        actionController.CreateActionEntityDeleted(entityToDelete);
 1784        DeleteEntity(entityToDelete, true);
 1785    }
 786
 787    public void DeleteSelectedEntities()
 788    {
 2789        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 790
 8791        for (int i = 0; i < selectedEntities.Count; i++)
 792        {
 2793            entitiesToRemove.Add(selectedEntities[i]);
 794        }
 795
 2796        actionController.CreateActionEntityDeleted(entitiesToRemove);
 797
 2798        DeselectEntities();
 799
 8800        foreach (BIWEntity entity in entitiesToRemove)
 801        {
 2802            DeleteEntity(entity);
 803        }
 804
 2805        OnDeleteSelectedEntities?.Invoke(entitiesToRemove);
 0806    }
 807
 808    public void DeleteEntitiesOutsideSceneBoundaries()
 809    {
 1810        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 6811        foreach (BIWEntity entity in convertedEntities.Values)
 812        {
 2813            if (entity.rootEntity.scene == sceneToEdit)
 814            {
 2815                if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityInsideSceneBoundaries(entity.rootEntity))
 816                {
 2817                    entitiesToRemove.Add(entity);
 818                }
 819            }
 820        }
 821
 6822        foreach (BIWEntity entity in entitiesToRemove)
 823        {
 2824            DeleteEntity(entity);
 825        }
 1826    }
 827
 828    private void DestroyCollidersForAllEntities()
 829    {
 300830        foreach (BIWEntity entity in convertedEntities.Values)
 831        {
 69832            entity.DestroyColliders();
 833        }
 81834    }
 835
 194836    private void RemoveConvertedEntity(IDCLEntity entity) { convertedEntities.Remove(GetConvertedUniqueKeyForEntity(enti
 837
 18838    public void NotifyEntityIsCreated(IDCLEntity entity) { bridge?.AddEntityOnKernel(entity, sceneToEdit); }
 839
 840    [ExcludeFromCodeCoverage]
 841    public void UpdateSmartItemComponentInKernel(BIWEntity entityToUpdate) { bridge?.UpdateSmartItemComponent(entityToUp
 842
 4843    public void SetEntityName(BIWEntity entityToApply, string newName) { SetEntityName(entityToApply, newName, true); }
 844
 845    public void SetEntityName(BIWEntity entityToApply, string newName, bool sendUpdateToKernel = true)
 846    {
 17847        string currentName = entityToApply.GetDescriptiveName();
 848
 17849        if (currentName == newName)
 0850            return;
 851
 17852        if (entityNameList.Contains(newName))
 2853            newName = GetNewNameForEntity(newName);
 854
 17855        if (entityNameList.Contains(currentName))
 0856            entityNameList.Remove(currentName);
 857
 17858        entityToApply.SetDescriptiveName(newName);
 17859        entityNameList.Add(newName);
 860
 17861        if (sendUpdateToKernel)
 2862            bridge?.ChangedEntityName(entityToApply, sceneToEdit);
 15863    }
 864
 865    internal void ChangeEntityVisibilityStatus(BIWEntity entityToApply)
 866    {
 1867        entityToApply.ToggleShowStatus();
 1868        if (!entityToApply.isVisible && selectedEntities.Contains(entityToApply))
 1869            DeselectEntity(entityToApply);
 1870    }
 871
 872    internal void ChangeEntityLockStatus(BIWEntity entityToApply)
 873    {
 1874        entityToApply.ToggleLockStatus();
 1875        if (entityToApply.isLocked && selectedEntities.Contains(entityToApply))
 0876            DeselectEntity(entityToApply);
 877
 1878        bridge?.ChangeEntityLockStatus(entityToApply, sceneToEdit);
 0879    }
 880
 15881    private string GetConvertedUniqueKeyForEntity(string entityID) { return sceneToEdit.sceneData.id + entityID; }
 882
 228883    private string GetConvertedUniqueKeyForEntity(IDCLEntity entity) { return entity.scene.sceneData.id + entity.entityI
 884
 885    public bool AreAllEntitiesInsideBoundaries()
 886    {
 4887        bool areAllIn = true;
 12888        foreach (BIWEntity entity in convertedEntities.Values)
 889        {
 3890            if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityInsideSceneBoundaries(entity.rootEntity))
 891            {
 2892                areAllIn = false;
 2893                break;
 894            }
 895        }
 896
 4897        return areAllIn;
 898    }
 899}

Methods/Properties

BIWEntityHandler()
Initialize(BIWContext)
OnInputMouseDown(System.Int32, UnityEngine.Vector3)
OnInputMouseUp(System.Int32, UnityEngine.Vector3)
Dispose()
Update()
ReportTransform(System.Boolean)
GetLastTimeReport()
GetSelectedEntityList()
IsAnyEntitySelected()
SetActiveMode(BIWMode)
SetMultiSelectionActive(System.Boolean)
EnterEditMode(DCL.Controllers.IParcelScene)
CheckErrorOnEntities()
IsPointerInSelectedEntity()
DeleteSelectedEntitiesInput()
DuplicateSelectedEntitiesInput()
ExitEditMode()
ChangeEntitySelectionFromList(BIWEntity)
SelectFromList(BIWEntity)
DeselectEntity(BIWEntity)
DeselectEntities()
EntityClicked(BIWEntity)
ReSelectEntities()
ChangeEntitySelectStatus(BIWEntity)
CancelSelection()
ChangeLockStateSelectedEntities()
ShowAllEntities()
ChangeShowStateSelectedEntities()
Select(DCL.Models.IDCLEntity)
SelectEntity(BIWEntity, System.Boolean)
GetAllVoxelsEntities()
GetAllEntitiesFromCurrentScene()
GetConvertedEntity(System.String)
GetConvertedEntity(DCL.Models.IDCLEntity)
DuplicateSelectedEntities()
DuplicateEntity(BIWEntity)
CreateEntityFromJSON(System.String)
CreateEmptyEntity(DCL.Controllers.ParcelScene, UnityEngine.Vector3, UnityEngine.Vector3, System.Boolean)
SetupAllEntities()
DestroyLastCreatedEntities()
EntityListChanged()
GetCurrentSceneEntityCount()
GetEntitiesInCurrentScene()
SetupEntityToEdit(DCL.Models.IDCLEntity, System.Boolean)
ChangeEntityBoundsCheckerStatus(DCL.Models.IDCLEntity, System.Boolean)
GetNewNameForEntity(CatalogItem)
GetNewNameForEntity(System.String)
DeleteFloorEntities()
DeleteEntity(System.String)
DeleteEntity(BIWEntity)
DeleteEntity(BIWEntity, System.Boolean)
DeleteSingleEntity(BIWEntity)
DeleteSelectedEntities()
DeleteEntitiesOutsideSceneBoundaries()
DestroyCollidersForAllEntities()
RemoveConvertedEntity(DCL.Models.IDCLEntity)
NotifyEntityIsCreated(DCL.Models.IDCLEntity)
SetEntityName(BIWEntity, System.String)
SetEntityName(BIWEntity, System.String, System.Boolean)
ChangeEntityVisibilityStatus(BIWEntity)
ChangeEntityLockStatus(BIWEntity)
GetConvertedUniqueKeyForEntity(System.String)
GetConvertedUniqueKeyForEntity(DCL.Models.IDCLEntity)
AreAllEntitiesInsideBoundaries()