< Summary

Class:BIWEntityHandler
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/Controllers/BIWEntityHandler.cs
Covered lines:363
Uncovered lines:59
Coverable lines:422
Total lines:901
Line coverage:86% (363 of 422)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BIWEntityHandler()0%110100%
Init(...)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%2.152066.67%
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.777075%
ChangeEntityBoundsCheckerStatus(...)0%2.032080%
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%220100%
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
 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
 9671    private readonly Dictionary<string, BIWEntity> convertedEntities = new Dictionary<string, BIWEntity>();
 9672    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
 9680    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 Init(BIWContext context)
 96    {
 9697        base.Init(context);
 9698        if (HUDController.i.builderInWorldMainHud != null)
 99        {
 26100            hudController = HUDController.i.builderInWorldMainHud;
 26101            hudController.OnEntityDelete += DeleteSingleEntity;
 26102            hudController.OnDuplicateSelectedAction += DuplicateSelectedEntitiesInput;
 26103            hudController.OnDeleteSelectedAction += DeleteSelectedEntitiesInput;
 26104            hudController.OnEntityClick += ChangeEntitySelectionFromList;
 26105            hudController.OnEntityLock += ChangeEntityLockStatus;
 26106            hudController.OnEntityChangeVisibility += ChangeEntityVisibilityStatus;
 26107            hudController.OnEntityRename += SetEntityName;
 26108            hudController.OnEntitySmartItemComponentUpdate += UpdateSmartItemComponentInKernel;
 109        }
 110
 111
 96112        BIWInputWrapper.OnMouseDown += OnInputMouseDown;
 96113        BIWInputWrapper.OnMouseUp += OnInputMouseUp;
 114
 96115        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged += ChangeEntityBoundsCheckerStatus
 116
 96117        bridge = context.sceneReferences.builderInWorldBridge;
 118
 96119        outlinerController = context.outlinerController;
 120
 96121        modeController = context.modeController;
 96122        actionController = context.actionController;
 96123        creatorController = context.creatorController;
 96124        raycastController = context.raycastController;
 125
 96126        editMaterial = context.projectReferencesAsset.editMaterial;
 127
 96128        hideSelectedEntitiesAction = context.inputsReferencesAsset.hideSelectedEntitiesAction;
 96129        showAllEntitiesAction = context.inputsReferencesAsset.showAllEntitiesAction;
 130
 96131        hideSelectedEntitiesDelegate = (action) => ChangeShowStateSelectedEntities();
 96132        showAllEntitiesDelegate = (action) => ShowAllEntities();
 133
 96134        hideSelectedEntitiesAction.OnTriggered += hideSelectedEntitiesDelegate;
 96135        showAllEntitiesAction.OnTriggered += showAllEntitiesDelegate;
 136
 96137        actionController.OnRedo += ReSelectEntities;
 96138        actionController.OnUndo += ReSelectEntities;
 96139    }
 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    {
 12149        if (buttonId == 1)
 12150            isSecondayClickPressed = false;
 12151    }
 152
 153    public override void Dispose()
 154    {
 76155        DestroyCollidersForAllEntities();
 156
 76157        actionController.OnRedo -= ReSelectEntities;
 76158        actionController.OnUndo -= ReSelectEntities;
 159
 76160        hideSelectedEntitiesAction.OnTriggered -= hideSelectedEntitiesDelegate;
 76161        showAllEntitiesAction.OnTriggered -= showAllEntitiesDelegate;
 162
 76163        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged -= ChangeEntityBoundsCheckerStatus
 164
 76165        BIWInputWrapper.OnMouseDown -= OnInputMouseDown;
 76166        BIWInputWrapper.OnMouseUp -= OnInputMouseUp;
 167
 76168        if (hudController != null)
 169        {
 27170            hudController.OnEntityDelete -= DeleteSingleEntity;
 27171            hudController.OnDuplicateSelectedAction -= DuplicateSelectedEntitiesInput;
 27172            hudController.OnDeleteSelectedAction -= DeleteSelectedEntitiesInput;
 27173            hudController.OnEntityClick -= ChangeEntitySelectionFromList;
 27174            hudController.OnEntityLock -= ChangeEntityLockStatus;
 27175            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 27176            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 27177            hudController.OnEntityRename -= SetEntityName;
 27178            hudController.OnEntitySmartItemComponentUpdate -= UpdateSmartItemComponentInKernel;
 179        }
 76180    }
 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
 52214    public List<BIWEntity> GetSelectedEntityList() { return selectedEntities; }
 215
 2216    public bool IsAnyEntitySelected() { return selectedEntities.Count > 0; }
 217
 218    public void SetActiveMode(BIWMode buildMode)
 219    {
 7220        currentActiveMode = buildMode;
 7221        DeselectEntities();
 7222    }
 223
 0224    public void SetMultiSelectionActive(bool isActive) { isMultiSelectionActive = isActive; }
 225
 226    public override void EnterEditMode(ParcelScene scene)
 227    {
 79228        base.EnterEditMode(scene);
 229
 79230        SetupAllEntities();
 79231        EntityListChanged();
 79232        CheckErrorOnEntities();
 79233    }
 234
 235    private void CheckErrorOnEntities()
 236    {
 282237        foreach (BIWEntity entity in convertedEntities.Values)
 238        {
 62239            entity.CheckErrors();
 62240            if (entity.hasMissingCatalogItemError)
 62241                creatorController.CreateErrorOnEntity(entity);
 242        }
 79243    }
 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    {
 16499        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entity)))
 16500            return convertedEntities[GetConvertedUniqueKeyForEntity(entity)];
 501
 0502        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    {
 31599        IDCLEntity newEntity = parcelScene.CreateEntity(Guid.NewGuid().ToString());
 600
 31601        DCLTransform.model.position = WorldStateUtils.ConvertUnityToScenePosition(entryPoint, parcelScene);
 602
 31603        Vector3 pointToLookAt = Camera.main.transform.position;
 31604        pointToLookAt.y = editionGOPosition.y;
 31605        Quaternion lookOnLook = Quaternion.LookRotation(editionGOPosition - pointToLookAt);
 606
 31607        DCLTransform.model.rotation = lookOnLook;
 31608        DCLTransform.model.scale = newEntity.gameObject.transform.lossyScale;
 609
 31610        parcelScene.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, CLASS_ID_COMPONENT.TRANSFORM, DCLTransfor
 611
 31612        BIWEntity convertedEntity = SetupEntityToEdit(newEntity, true);
 31613        hudController?.UpdateSceneLimitInfo();
 614
 31615        if (notifyEntityList)
 11616            EntityListChanged();
 31617        return convertedEntity;
 618    }
 619
 620    private void SetupAllEntities()
 621    {
 282622        foreach (IDCLEntity entity in sceneToEdit.entities.Values)
 623        {
 62624            SetupEntityToEdit(entity);
 625        }
 79626    }
 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
 9657    public int GetCurrentSceneEntityCount() { return GetEntitiesInCurrentScene().Count; }
 658
 659    List<BIWEntity> GetEntitiesInCurrentScene()
 660    {
 17661        List<BIWEntity> currentEntitiesInScene = new List<BIWEntity>();
 98662        foreach (BIWEntity entity in convertedEntities.Values)
 663        {
 32664            if (entity.rootEntity.scene == sceneToEdit)
 31665                currentEntitiesInScene.Add(entity);
 666        }
 667
 17668        return currentEntitiesInScene;
 669    }
 670
 671    BIWEntity SetupEntityToEdit(IDCLEntity entity, bool hasBeenCreated = false)
 672    {
 99673        if (!convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entity)))
 674        {
 98675            BIWEntity entityToEdit = new BIWEntity();
 98676            entityToEdit.Init(entity, editMaterial);
 98677            convertedEntities.Add(entityToEdit.entityUniqueId, entityToEdit);
 98678            entity.OnRemoved += RemoveConvertedEntity;
 98679            entityToEdit.isNew = hasBeenCreated;
 680
 98681            string entityName = entityToEdit.GetDescriptiveName();
 98682            var catalogItem = entityToEdit.GetCatalogItemAssociated();
 683
 98684            if ((string.IsNullOrEmpty(entityName) || entityNameList.Contains(entityName)) && catalogItem != null)
 685            {
 0686                entityName = GetNewNameForEntity(catalogItem);
 0687                SetEntityName(entityToEdit, entityName);
 0688            }
 98689            else if (!string.IsNullOrEmpty(entityName) && !entityNameList.Contains(entityName))
 690            {
 0691                entityNameList.Add(entityName);
 692            }
 693
 98694            return entityToEdit;
 695        }
 696        else
 697        {
 1698            return convertedEntities[GetConvertedUniqueKeyForEntity(entity)];
 699        }
 700    }
 701
 702    internal void ChangeEntityBoundsCheckerStatus(IDCLEntity entity, bool isInsideBoundaries)
 703    {
 1704        var convertedEntity = GetConvertedEntity(entity);
 1705        if (convertedEntity == null)
 0706            return;
 707
 1708        convertedEntity.SetEntityBoundariesError(isInsideBoundaries);
 1709    }
 710
 1711    public string GetNewNameForEntity(CatalogItem sceneObject) { return GetNewNameForEntity(sceneObject.name); }
 712
 713    public string GetNewNameForEntity(string name)
 714    {
 3715        int i = 1;
 3716        if (!entityNameList.Contains(name))
 1717            return name;
 718
 2719        string newName = name + " " + i;
 2720        while (entityNameList.Contains(newName))
 721        {
 0722            i++;
 0723            newName = name + " " + i;
 724        }
 725
 2726        return newName;
 727    }
 728
 729    public void DeleteFloorEntities()
 730    {
 4731        List<BIWEntity> entitiesToDelete = new List<BIWEntity>();
 732
 22733        foreach (BIWEntity entity in convertedEntities.Values)
 734        {
 7735            if (entity.isFloor)
 736            {
 4737                entitiesToDelete.Add(entity);
 738            }
 739        }
 740
 16741        foreach (BIWEntity entity in entitiesToDelete)
 4742            DeleteEntity(entity, false);
 4743    }
 744
 745    public void DeleteEntity(string entityId)
 746    {
 3747        BIWEntity entity = convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 3748        DeleteEntity(entity, true);
 3749    }
 750
 8751    public void DeleteEntity(BIWEntity entityToDelete) { DeleteEntity(entityToDelete, true); }
 752
 753    public void DeleteEntity(BIWEntity entityToDelete, bool checkSelection)
 754    {
 13755        if (entityToDelete.isSelected && checkSelection)
 0756            DeselectEntity(entityToDelete);
 757
 13758        if (selectedEntities.Contains(entityToDelete))
 759        {
 1760            selectedEntities.Remove(entityToDelete);
 1761            hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 762        }
 763
 13764        string entityName = entityToDelete.GetDescriptiveName();
 765
 13766        if (entityNameList.Contains(entityName))
 4767            entityNameList.Remove(entityName);
 768
 13769        RemoveConvertedEntity(entityToDelete.rootEntity);
 13770        entityToDelete.rootEntity.OnRemoved -= RemoveConvertedEntity;
 13771        entityToDelete.Delete();
 13772        string idToRemove = entityToDelete.rootEntity.entityId;
 13773        OnEntityDeleted?.Invoke(entityToDelete);
 13774        creatorController.RemoveLoadingObjectInmediate(entityToDelete.rootEntity.entityId);
 13775        if (sceneToEdit.entities.ContainsKey(idToRemove))
 13776            sceneToEdit.RemoveEntity(idToRemove, true);
 777
 13778        hudController?.RefreshCatalogAssetPack();
 13779        EntityListChanged();
 13780        bridge?.RemoveEntityOnKernel(idToRemove, sceneToEdit);
 0781    }
 782
 783    public void DeleteSingleEntity(BIWEntity entityToDelete)
 784    {
 1785        actionController.CreateActionEntityDeleted(entityToDelete);
 1786        DeleteEntity(entityToDelete, true);
 1787    }
 788
 789    public void DeleteSelectedEntities()
 790    {
 2791        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 792
 8793        for (int i = 0; i < selectedEntities.Count; i++)
 794        {
 2795            entitiesToRemove.Add(selectedEntities[i]);
 796        }
 797
 2798        actionController.CreateActionEntityDeleted(entitiesToRemove);
 799
 2800        DeselectEntities();
 801
 8802        foreach (BIWEntity entity in entitiesToRemove)
 803        {
 2804            DeleteEntity(entity);
 805        }
 806
 2807        OnDeleteSelectedEntities?.Invoke(entitiesToRemove);
 0808    }
 809
 810    public void DeleteEntitiesOutsideSceneBoundaries()
 811    {
 1812        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 6813        foreach (BIWEntity entity in convertedEntities.Values)
 814        {
 2815            if (entity.rootEntity.scene == sceneToEdit)
 816            {
 2817                if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityInsideSceneBoundaries(entity.rootEntity))
 818                {
 2819                    entitiesToRemove.Add(entity);
 820                }
 821            }
 822        }
 823
 6824        foreach (BIWEntity entity in entitiesToRemove)
 825        {
 2826            DeleteEntity(entity);
 827        }
 1828    }
 829
 830    private void DestroyCollidersForAllEntities()
 831    {
 276832        foreach (BIWEntity entity in convertedEntities.Values)
 833        {
 62834            entity.DestroyColliders();
 835        }
 76836    }
 837
 196838    private void RemoveConvertedEntity(IDCLEntity entity) { convertedEntities.Remove(GetConvertedUniqueKeyForEntity(enti
 839
 20840    public void NotifyEntityIsCreated(IDCLEntity entity) { bridge?.AddEntityOnKernel(entity, sceneToEdit); }
 841
 842    [ExcludeFromCodeCoverage]
 843    public void UpdateSmartItemComponentInKernel(BIWEntity entityToUpdate) { bridge?.UpdateSmartItemComponent(entityToUp
 844
 4845    public void SetEntityName(BIWEntity entityToApply, string newName) { SetEntityName(entityToApply, newName, true); }
 846
 847    public void SetEntityName(BIWEntity entityToApply, string newName, bool sendUpdateToKernel = true)
 848    {
 18849        string currentName = entityToApply.GetDescriptiveName();
 850
 18851        if (currentName == newName)
 0852            return;
 853
 18854        if (entityNameList.Contains(newName))
 2855            newName = GetNewNameForEntity(newName);
 856
 18857        if (entityNameList.Contains(currentName))
 0858            entityNameList.Remove(currentName);
 859
 18860        entityToApply.SetDescriptiveName(newName);
 18861        entityNameList.Add(newName);
 862
 18863        if (sendUpdateToKernel)
 2864            bridge?.ChangedEntityName(entityToApply, sceneToEdit);
 16865    }
 866
 867    internal void ChangeEntityVisibilityStatus(BIWEntity entityToApply)
 868    {
 1869        entityToApply.ToggleShowStatus();
 1870        if (!entityToApply.isVisible && selectedEntities.Contains(entityToApply))
 1871            DeselectEntity(entityToApply);
 1872    }
 873
 874    internal void ChangeEntityLockStatus(BIWEntity entityToApply)
 875    {
 1876        entityToApply.ToggleLockStatus();
 1877        if (entityToApply.isLocked && selectedEntities.Contains(entityToApply))
 0878            DeselectEntity(entityToApply);
 879
 1880        bridge?.ChangeEntityLockStatus(entityToApply, sceneToEdit);
 0881    }
 882
 15883    private string GetConvertedUniqueKeyForEntity(string entityID) { return sceneToEdit.sceneData.id + entityID; }
 884
 230885    private string GetConvertedUniqueKeyForEntity(IDCLEntity entity) { return entity.scene.sceneData.id + entity.entityI
 886
 887    public bool AreAllEntitiesInsideBoundaries()
 888    {
 4889        bool areAllIn = true;
 12890        foreach (BIWEntity entity in convertedEntities.Values)
 891        {
 3892            if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityInsideSceneBoundaries(entity.rootEntity))
 893            {
 2894                areAllIn = false;
 2895                break;
 896            }
 897        }
 898
 4899        return areAllIn;
 900    }
 901}

Methods/Properties

BIWEntityHandler()
Init(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.ParcelScene)
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()