< Summary

Class:BIWEntityHandler
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/Scripts/Controllers/BIWEntityHandler.cs
Covered lines:372
Uncovered lines:68
Coverable lines:440
Total lines:893
Line coverage:84.5% (372 of 440)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BIWEntityHandler()0%110100%
Initialize(...)0%330100%
OnInputMouseDown(...)0%6200%
OnInputMouseUp(...)0%220100%
Dispose()0%220100%
Update()0%12300%
ReportTransform(...)0%21.527033.33%
GetLastTimeReport()0%2100%
GetSelectedEntityList()0%2100%
IsAnyEntitySelected()0%110100%
SetActiveMode(...)0%2100%
SetMultiSelectionActive(...)0%2100%
EnterEditMode(...)0%110100%
CheckErrorOnEntities()0%330100%
IsPointerInSelectedEntity()0%4.024090%
DeleteSelectedEntitiesInput()0%6200%
DuplicateSelectedEntitiesInput()0%12300%
ExitEditMode()0%6200%
ChangeEntitySelectionFromList(...)0%2.52050%
SelectFromList(...)0%4.374071.43%
DeselectEntity(...)0%7.297081.82%
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.016092.86%
GetAllVoxelsEntities()0%440100%
GetAllEntitiesFromCurrentScene()0%330100%
GetConvertedEntity(...)0%2.152066.67%
GetConvertedEntity(...)0%220100%
DuplicateSelectedEntities()0%330100%
DuplicateEntity(...)0%110100%
CreateEntityFromJSON(...)0%8.058090.62%
CreateEmptyEntity(...)0%440100%
SetupAllEntities()0%220100%
DestroyLastCreatedEntities()0%770100%
EntityListChanged()0%2.062075%
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.079090.48%
DeleteSingleEntity(...)0%110100%
DeleteSelectedEntities()0%440100%
DeleteEntitiesOutsideSceneBoundaries()0%550100%
DestroyCollidersForAllEntities()0%220100%
RemoveConvertedEntity(...)0%110100%
NotifyEntityIsCreated(...)0%2.152066.67%
SetEntityName(...)0%110100%
SetEntityName(...)0%6.566075%
ChangeEntityVisibilityStatus(...)0%330100%
ChangeEntityLockStatus(...)0%4.594066.67%
GetConvertedUniqueKeyForEntity(...)0%110100%
GetConvertedUniqueKeyForEntity(...)0%110100%
AreAllEntitiesInsideBoundaries()0%330100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/Scripts/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 DCL.Builder;
 14using UnityEngine;
 15using Environment = DCL.Environment;
 16
 17public class BIWEntityHandler : BIWController, IBIWEntityHandler
 18{
 19    private const float DUPLICATE_OFFSET = 2f;
 20
 21    private IBIWOutlinerController outlinerController;
 22
 23    private IBIWModeController modeController;
 24    private IBIWActionController actionController;
 25    private IBIWCreatorController creatorController;
 26    private IBIWRaycastController raycastController;
 27    private IBIWSaveController saveController;
 28
 29    private BuilderInWorldBridge bridge;
 30    private Material editMaterial;
 31
 32    private InputAction_Trigger hideSelectedEntitiesAction;
 33
 34    private InputAction_Trigger showAllEntitiesAction;
 35
 7036    private readonly Dictionary<string, BIWEntity> convertedEntities = new Dictionary<string, BIWEntity>();
 7037    private readonly List<BIWEntity> selectedEntities = new List<BIWEntity>();
 38
 39    private IBIWMode currentActiveMode;
 40    internal bool isMultiSelectionActive = false;
 41    internal bool isSecondayClickPressed = false;
 42
 43    private float lastTransformReportTime;
 44
 7045    private List<string> entityNameList = new List<string>();
 46
 47    private InputAction_Trigger.Triggered hideSelectedEntitiesDelegate;
 48    private InputAction_Trigger.Triggered showAllEntitiesDelegate;
 49
 50    private IBuilderEditorHUDController hudController;
 51
 52    public event Action<BIWEntity> OnEntityDeselected;
 53    public event Action OnEntitySelected;
 54    public event Action<List<BIWEntity>> OnDeleteSelectedEntities;
 55    public event Action<BIWEntity> OnEntityDeleted;
 56
 57    private BIWEntity lastClickedEntity;
 58    private float lastTimeEntityClicked;
 59
 60    public override void Initialize(IContext context)
 61    {
 7062        base.Initialize(context);
 7063        if ( context.editorContext.editorHUD != null)
 64        {
 7065            hudController = context.editorContext.editorHUD;
 7066            hudController.OnEntityDelete += DeleteSingleEntity;
 7067            hudController.OnDuplicateSelectedAction += DuplicateSelectedEntitiesInput;
 7068            hudController.OnDeleteSelectedAction += DeleteSelectedEntitiesInput;
 7069            hudController.OnEntityClick += ChangeEntitySelectionFromList;
 7070            hudController.OnEntityLock += ChangeEntityLockStatus;
 7071            hudController.OnEntityChangeVisibility += ChangeEntityVisibilityStatus;
 7072            hudController.OnEntityRename += SetEntityName;
 7073            hudController.OnEntitySmartItemComponentUpdate += UpdateSmartItemComponentInKernel;
 74        }
 75
 76
 7077        BIWInputWrapper.OnMouseDown += OnInputMouseDown;
 7078        BIWInputWrapper.OnMouseUp += OnInputMouseUp;
 79
 7080        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged += ChangeEntityBoundsCheckerStatus
 81
 7082        if ( context.sceneReferences.biwBridgeGameObject != null )
 483            bridge = context.sceneReferences.biwBridgeGameObject.GetComponent<BuilderInWorldBridge>();
 84
 7085        outlinerController = context.editorContext.outlinerController;
 86
 7087        modeController = context.editorContext.modeController;
 7088        actionController = context.editorContext.actionController;
 7089        creatorController = context.editorContext.creatorController;
 7090        raycastController = context.editorContext.raycastController;
 7091        saveController = context.editorContext.saveController;
 92
 7093        editMaterial = context.projectReferencesAsset.editMaterial;
 94
 7095        hideSelectedEntitiesAction = context.inputsReferencesAsset.hideSelectedEntitiesAction;
 7096        showAllEntitiesAction = context.inputsReferencesAsset.showAllEntitiesAction;
 97
 7098        hideSelectedEntitiesDelegate = (action) => ChangeShowStateSelectedEntities();
 7099        showAllEntitiesDelegate = (action) => ShowAllEntities();
 100
 70101        hideSelectedEntitiesAction.OnTriggered += hideSelectedEntitiesDelegate;
 70102        showAllEntitiesAction.OnTriggered += showAllEntitiesDelegate;
 103
 70104        actionController.OnRedo += ReSelectEntities;
 70105        actionController.OnUndo += ReSelectEntities;
 70106    }
 107
 108    internal void OnInputMouseDown(int buttonId, Vector3 mousePosition)
 109    {
 0110        if (buttonId == 1)
 0111            isSecondayClickPressed = true;
 0112    }
 113
 114    internal void OnInputMouseUp(int buttonId, Vector3 mousePosition)
 115    {
 5116        if (buttonId == 1)
 5117            isSecondayClickPressed = false;
 5118    }
 119
 120    public override void Dispose()
 121    {
 56122        DestroyCollidersForAllEntities();
 123
 56124        actionController.OnRedo -= ReSelectEntities;
 56125        actionController.OnUndo -= ReSelectEntities;
 126
 56127        hideSelectedEntitiesAction.OnTriggered -= hideSelectedEntitiesDelegate;
 56128        showAllEntitiesAction.OnTriggered -= showAllEntitiesDelegate;
 129
 56130        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged -= ChangeEntityBoundsCheckerStatus
 131
 56132        BIWInputWrapper.OnMouseDown -= OnInputMouseDown;
 56133        BIWInputWrapper.OnMouseUp -= OnInputMouseUp;
 134
 56135        if (hudController != null)
 136        {
 56137            hudController.OnEntityDelete -= DeleteSingleEntity;
 56138            hudController.OnDuplicateSelectedAction -= DuplicateSelectedEntitiesInput;
 56139            hudController.OnDeleteSelectedAction -= DeleteSelectedEntitiesInput;
 56140            hudController.OnEntityClick -= ChangeEntitySelectionFromList;
 56141            hudController.OnEntityLock -= ChangeEntityLockStatus;
 56142            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 56143            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 56144            hudController.OnEntityRename -= SetEntityName;
 56145            hudController.OnEntitySmartItemComponentUpdate -= UpdateSmartItemComponentInKernel;
 146        }
 56147    }
 148
 149    public override void Update()
 150    {
 0151        base.Update();
 152
 0153        if (selectedEntities.Count == 0)
 0154            return;
 0155        if ((DCLTime.realtimeSinceStartup - lastTransformReportTime) <= BIWSettings.ENTITY_POSITION_REPORTING_DELAY)
 0156            return;
 157
 0158        ReportTransform();
 0159    }
 160
 161    public void ReportTransform(bool forceReport = false)
 162    {
 4163        foreach (BIWEntity entity in selectedEntities)
 164        {
 0165            if (!entity.HasMovedSinceLastReport() &&
 166                !entity.HasScaledSinceLastReport() &&
 167                !entity.HasRotatedSinceLastReport() &&
 168                !forceReport)
 0169                return;
 170
 0171            if ( bridge != null )
 0172                bridge.EntityTransformReport(entity.rootEntity, sceneToEdit);
 0173            entity.PositionReported();
 0174            entity.ScaleReported();
 0175            entity.RotationReported();
 176        }
 177
 2178        lastTransformReportTime = DCLTime.realtimeSinceStartup;
 2179    }
 180
 0181    public float GetLastTimeReport() { return lastTransformReportTime; }
 182
 0183    public List<BIWEntity> GetSelectedEntityList() { return selectedEntities; }
 184
 1185    public bool IsAnyEntitySelected() { return selectedEntities.Count > 0; }
 186
 187    public void SetActiveMode(IBIWMode buildMode)
 188    {
 0189        currentActiveMode = buildMode;
 0190        DeselectEntities();
 0191    }
 192
 0193    public void SetMultiSelectionActive(bool isActive) { isMultiSelectionActive = isActive; }
 194
 195    public override void EnterEditMode(IBuilderScene scene)
 196    {
 72197        base.EnterEditMode(scene);
 198
 72199        SetupAllEntities();
 72200        EntityListChanged();
 72201        CheckErrorOnEntities();
 72202    }
 203
 204    private void CheckErrorOnEntities()
 205    {
 240206        foreach (BIWEntity entity in convertedEntities.Values)
 207        {
 48208            entity.CheckErrors();
 48209            if (entity.hasMissingCatalogItemError)
 48210                creatorController.CreateErrorOnEntity(entity);
 211        }
 72212    }
 213
 214    public bool IsPointerInSelectedEntity()
 215    {
 2216        BIWEntity entityInPointer = raycastController.GetEntityOnPointer();
 2217        if (entityInPointer == null)
 1218            return false;
 219
 3220        foreach (BIWEntity entity in selectedEntities)
 221        {
 1222            if (entityInPointer == entity)
 1223                return true;
 224        }
 225
 0226        return false;
 1227    }
 228
 229    private void DeleteSelectedEntitiesInput()
 230    {
 0231        if (selectedEntities.Count > 0)
 0232            DeleteSelectedEntities();
 0233    }
 234
 235    private void DuplicateSelectedEntitiesInput()
 236    {
 0237        if (selectedEntities.Count <= 0 || isSecondayClickPressed)
 0238            return;
 239
 0240        DuplicateSelectedEntities();
 0241    }
 242
 243    public override void ExitEditMode()
 244    {
 0245        base.ExitEditMode();
 0246        DeselectEntities();
 247
 0248        foreach (BIWEntity entity in convertedEntities.Values)
 249        {
 0250            entity.Dispose();
 251        }
 252
 0253        convertedEntities.Clear();
 0254    }
 255
 256    internal void ChangeEntitySelectionFromList(BIWEntity entityToEdit)
 257    {
 1258        if (!selectedEntities.Contains(entityToEdit))
 1259            SelectFromList(entityToEdit);
 260        else
 0261            DeselectEntity(entityToEdit);
 0262    }
 263
 264    private void SelectFromList(BIWEntity entityToEdit)
 265    {
 1266        if (!isMultiSelectionActive)
 1267            DeselectEntities();
 1268        if (SelectEntity(entityToEdit))
 269        {
 1270            if (!isMultiSelectionActive)
 1271                outlinerController.OutlineEntity(entityToEdit);
 272            else
 0273                outlinerController.OutlineEntities(selectedEntities);
 274        }
 0275    }
 276
 277    public void DeselectEntity(BIWEntity entity)
 278    {
 12279        if (!selectedEntities.Contains(entity))
 0280            return;
 281
 12282        entity.Deselect();
 283
 12284        outlinerController.CancelEntityOutline(entity);
 12285        selectedEntities.Remove(entity);
 12286        hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 12287        currentActiveMode?.EntityDeselected(entity);
 12288        if (selectedEntities.Count <= 0 &&
 289            hudController != null)
 12290            hudController.HideEntityInformation();
 291
 12292        OnEntityDeselected?.Invoke(entity);
 0293    }
 294
 295    public void DeselectEntities()
 296    {
 40297        if (selectedEntities.Count <= 0)
 31298            return;
 299
 9300        int amountToDeselect = selectedEntities.Count;
 36301        for (int i = 0; i < amountToDeselect; i++)
 302        {
 9303            DeselectEntity(selectedEntities[0]);
 304        }
 305
 9306        currentActiveMode?.OnDeselectedEntities();
 307
 9308        Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
 9309    }
 310
 311    public void EntityClicked(BIWEntity entityToSelect)
 312    {
 3313        if (entityToSelect != null)
 314        {
 3315            if (!isMultiSelectionActive)
 3316                DeselectEntities();
 317
 3318            if (!entityToSelect.isLocked)
 3319                ChangeEntitySelectStatus(entityToSelect);
 320
 3321            if (entityToSelect == lastClickedEntity && (lastTimeEntityClicked + BIWSettings.MOUSE_MS_DOUBLE_CLICK_THRESH
 1322                modeController.EntityDoubleClick(entityToSelect);
 323
 3324            lastClickedEntity = entityToSelect;
 3325            lastTimeEntityClicked = Time.realtimeSinceStartup;
 3326        }
 0327        else if (!isMultiSelectionActive)
 328        {
 0329            DeselectEntities();
 330        }
 0331    }
 332
 333    internal void ReSelectEntities()
 334    {
 13335        List<BIWEntity> entitiesToReselect = new List<BIWEntity>();
 28336        foreach (BIWEntity entity in selectedEntities)
 337        {
 1338            entitiesToReselect.Add(entity);
 339        }
 340
 13341        DeselectEntities();
 342
 28343        foreach (BIWEntity entity in entitiesToReselect)
 344        {
 1345            SelectEntity(entity);
 346        }
 13347    }
 348
 349    internal void ChangeEntitySelectStatus(BIWEntity entityCliked)
 350    {
 3351        if (entityCliked.isSelected)
 0352            DeselectEntity(entityCliked);
 353        else
 3354            SelectEntity(entityCliked);
 3355    }
 356
 357    public void CancelSelection()
 358    {
 1359        if (selectedEntities.Count == 0)
 0360            return;
 361
 1362        DestroyLastCreatedEntities();
 1363        DeselectEntities();
 1364    }
 365
 366    public void ChangeLockStateSelectedEntities()
 367    {
 4368        foreach (BIWEntity entity in selectedEntities)
 369        {
 1370            entity.ToggleLockStatus();
 371        }
 372
 1373        DeselectEntities();
 1374    }
 375
 376    public void ShowAllEntities()
 377    {
 4378        foreach (BIWEntity entity in convertedEntities.Values)
 379        {
 1380            if (!entity.isVisible)
 1381                entity.ToggleShowStatus();
 382        }
 1383    }
 384
 385    public void ChangeShowStateSelectedEntities()
 386    {
 1387        List<BIWEntity> entitiesToHide = new List<BIWEntity>(selectedEntities);
 388
 4389        foreach (BIWEntity entity in entitiesToHide)
 390        {
 1391            if (entity.isVisible && entity.isSelected)
 1392                DeselectEntity(entity);
 1393            entity.ToggleShowStatus();
 394        }
 1395    }
 396
 397    public void Select(IDCLEntity entity)
 398    {
 8399        BIWEntity entityEditable = GetConvertedEntity(entity);
 8400        if (entityEditable == null)
 0401            return;
 402
 8403        SelectEntity(entityEditable, true);
 8404    }
 405
 406    public bool SelectEntity(BIWEntity entityEditable, bool selectedFromCatalog = false)
 407    {
 27408        if (entityEditable.isLocked)
 1409            return false;
 410
 26411        if (entityEditable.isSelected)
 0412            return false;
 413
 26414        entityEditable.Select();
 415
 26416        selectedEntities.Add(entityEditable);
 417
 26418        currentActiveMode?.SelectedEntity(entityEditable);
 419
 26420        if ( context.editorContext.editorHUD != null)
 421        {
 26422            hudController.UpdateEntitiesSelection(selectedEntities.Count);
 26423            hudController.ShowEntityInformation(selectedFromCatalog);
 26424            hudController.EntityInformationSetEntity(entityEditable, sceneToEdit);
 425        }
 426
 26427        outlinerController.CancelAllOutlines();
 428
 26429        OnEntitySelected?.Invoke();
 430
 26431        return true;
 432    }
 433
 434    public List<BIWEntity> GetAllVoxelsEntities()
 435    {
 1436        List<BIWEntity> voxelEntities = new List<BIWEntity>();
 4437        foreach (BIWEntity entity in convertedEntities.Values)
 438        {
 1439            if (entity.rootEntity.scene == sceneToEdit && entity.isVoxel)
 1440                voxelEntities.Add(entity);
 441        }
 442
 1443        return voxelEntities;
 444    }
 445
 446    public List<BIWEntity> GetAllEntitiesFromCurrentScene()
 447    {
 65448        List<BIWEntity> entities = new List<BIWEntity>();
 274449        foreach (BIWEntity entity in convertedEntities.Values)
 450        {
 72451            if (entity.rootEntity.scene == sceneToEdit)
 72452                entities.Add(entity);
 453        }
 454
 65455        return entities;
 456    }
 457
 458    public BIWEntity GetConvertedEntity(long entityId)
 459    {
 6460        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entityId)))
 6461            return convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 462
 0463        return null;
 464    }
 465
 466    public BIWEntity GetConvertedEntity(IDCLEntity entity)
 467    {
 19468        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entity)))
 16469            return convertedEntities[GetConvertedUniqueKeyForEntity(entity)];
 470
 3471        return null;
 472    }
 473
 474    public void DuplicateSelectedEntities()
 475    {
 2476        BIWCompleteAction buildAction = new BIWCompleteAction();
 2477        buildAction.actionType = IBIWCompleteAction.ActionType.CREATE;
 478
 2479        List<BIWEntityAction> entityActionList = new List<BIWEntityAction>();
 2480        List<BIWEntity> entitiesToDuplicate = new List<BIWEntity>(selectedEntities);
 2481        DeselectEntities();
 482
 8483        foreach (BIWEntity entityToDuplicate in entitiesToDuplicate)
 484        {
 2485            if (entityToDuplicate.isNFT)
 486                continue;
 487
 2488            var entityDuplicated = DuplicateEntity(entityToDuplicate);
 489
 490            // We move the entity before completing the action to save its position too
 2491            entityDuplicated.rootEntity.gameObject.transform.position += Vector3.right * DUPLICATE_OFFSET;
 492
 2493            BIWEntityAction biwEntityAction = new BIWEntityAction(entityDuplicated.rootEntity, entityDuplicated.rootEnti
 2494            entityActionList.Add(biwEntityAction);
 2495            SelectEntity(entityDuplicated);
 496        }
 497
 2498        buildAction.CreateActionType(entityActionList, IBIWCompleteAction.ActionType.CREATE);
 2499        actionController.AddAction(buildAction);
 2500    }
 501
 502    public BIWEntity DuplicateEntity(BIWEntity entityToDuplicate)
 503    {
 3504        IDCLEntity entity = BIWUtils.DuplicateEntity(sceneToEdit, entityToDuplicate.rootEntity);
 505        //Note: If the entity contains the name component or DCLLockedOnEdit, we don't want to copy them
 3506        sceneToEdit.componentsManagerLegacy.RemoveSharedComponent(entity, typeof(DCLName), false);
 3507        sceneToEdit.componentsManagerLegacy.RemoveSharedComponent(entity, typeof(DCLLockedOnEdit), false);
 508
 3509        BIWUtils.CopyGameObjectStatus(entityToDuplicate.rootEntity.gameObject, entity.gameObject, false, false);
 3510        BIWEntity convertedEntity = SetupEntityToEdit(entity);
 511
 3512        NotifyEntityIsCreated(entity);
 3513        EntityListChanged();
 3514        return convertedEntity;
 515    }
 516
 517    public IDCLEntity CreateEntityFromJSON(string entityJson)
 518    {
 3519        EntityData data = BIWUtils.ConvertJSONToEntityData(entityJson);
 520
 3521        IDCLEntity newEntity = sceneToEdit.CreateEntity(data.entityId);
 522
 3523        if (data.transformComponent != null)
 524        {
 1525            DCLTransform.Model model = new DCLTransform.Model();
 1526            model.position = data.transformComponent.position;
 1527            model.rotation = Quaternion.Euler(data.transformComponent.rotation);
 1528            model.scale = data.transformComponent.scale;
 529
 1530            EntityComponentsUtils.AddTransformComponent(sceneToEdit, newEntity, model);
 531        }
 532
 6533        foreach (ProtocolV2.GenericComponent component in data.components)
 534        {
 0535            sceneToEdit.componentsManagerLegacy.EntityComponentCreateOrUpdate(newEntity.entityId, (CLASS_ID_COMPONENT) c
 536        }
 537
 10538        foreach (ProtocolV2.GenericComponent component in data.sharedComponents)
 539        {
 2540            sceneToEdit.componentsManagerLegacy.SceneSharedComponentAttach(newEntity.entityId, component.classId);
 541        }
 542
 3543        if (data.nftComponent != null)
 544        {
 1545            NFTShape.Model model = new NFTShape.Model();
 1546            model.color = data.nftComponent.color.ToColor();
 1547            model.src = data.nftComponent.src;
 1548            model.assetId = data.nftComponent.assetId;
 549
 1550            EntityComponentsUtils.AddNFTShapeComponent(sceneToEdit, newEntity, model, data.nftComponent.id);
 551        }
 552
 3553        var convertedEntity = SetupEntityToEdit(newEntity, true);
 554
 3555        if(!convertedEntity.isLoaded)
 2556            creatorController.CreateLoadingObject(convertedEntity);
 557
 3558        var rootEntity = convertedEntity.rootEntity;
 3559        if (sceneToEdit.componentsManagerLegacy.TryGetSharedComponent(rootEntity, CLASS_ID.GLTF_SHAPE, out var gltfCompo
 0560            gltfComponent.CallWhenReady(convertedEntity.ShapeLoadFinish);
 561
 3562        if (sceneToEdit.componentsManagerLegacy.TryGetSharedComponent(rootEntity, CLASS_ID.NFT_SHAPE, out var nftCompone
 1563            nftComponent.CallWhenReady(convertedEntity.ShapeLoadFinish);
 564
 3565        EntityListChanged();
 3566        return newEntity;
 567    }
 568
 569    public BIWEntity CreateEmptyEntity(IParcelScene parcelScene, Vector3 entryPoint, Vector3 editionGOPosition, bool not
 570    {
 30571        var sceneController = Environment.i.world.sceneController;
 30572        IDCLEntity newEntity =
 573            parcelScene.CreateEntity(
 574                sceneController.entityIdHelper.EntityFromLegacyEntityString(Guid.NewGuid().ToString()));
 30575        DCLTransform.Model transformModel = new DCLTransform.Model();
 30576        transformModel.position = WorldStateUtils.ConvertUnityToScenePosition(entryPoint, parcelScene);
 577
 30578        Camera camera = context.sceneReferences.mainCamera;
 30579        Vector3 pointToLookAt = camera != null ? camera.transform.position : Vector3.zero;
 30580        pointToLookAt.y = editionGOPosition.y;
 30581        Quaternion lookOnLook = Quaternion.LookRotation(editionGOPosition - pointToLookAt);
 582
 30583        transformModel.rotation = lookOnLook;
 30584        transformModel.scale = newEntity.gameObject.transform.lossyScale;
 585
 30586        EntityComponentsUtils.AddTransformComponent(parcelScene, newEntity, transformModel);
 587
 30588        BIWEntity convertedEntity = SetupEntityToEdit(newEntity, true);
 30589        hudController?.UpdateSceneLimitInfo();
 590
 30591        if (notifyEntityList)
 11592            EntityListChanged();
 30593        return convertedEntity;
 594    }
 595
 596    private void SetupAllEntities()
 597    {
 240598        foreach (IDCLEntity entity in sceneToEdit.entities.Values)
 599        {
 48600            SetupEntityToEdit(entity);
 601        }
 72602    }
 603
 604    public void DestroyLastCreatedEntities()
 605    {
 2606        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 8607        foreach (BIWEntity entity in selectedEntities)
 608        {
 2609            if (entity.isSelected && entity.isNew)
 1610                entitiesToRemove.Add(entity);
 611        }
 612
 2613        if (entitiesToRemove.Count == 0)
 1614            return;
 615
 1616        modeController.UndoEditionGOLastStep();
 617
 4618        foreach (BIWEntity entity in entitiesToRemove)
 619        {
 1620            DeleteEntity(entity, false);
 621        }
 622
 1623        saveController.TryToSave();
 1624        hudController?.HideEntityInformation();
 1625    }
 626
 627    public void EntityListChanged()
 628    {
 117629        if ( context.editorContext.editorHUD == null)
 0630            return;
 117631        hudController.SetEntityList(GetEntitiesInCurrentScene());
 117632    }
 633
 2634    public int GetCurrentSceneEntityCount() { return GetEntitiesInCurrentScene().Count; }
 635
 636    List<BIWEntity> GetEntitiesInCurrentScene()
 637    {
 119638        List<BIWEntity> currentEntitiesInScene = new List<BIWEntity>();
 446639        foreach (BIWEntity entity in convertedEntities.Values)
 640        {
 104641            if (entity.rootEntity.scene == sceneToEdit)
 104642                currentEntitiesInScene.Add(entity);
 643        }
 644
 119645        return currentEntitiesInScene;
 646    }
 647
 648    BIWEntity SetupEntityToEdit(IDCLEntity entity, bool hasBeenCreated = false)
 649    {
 84650        string biwEntityId = GetConvertedUniqueKeyForEntity(entity);
 651
 84652        if (convertedEntities.ContainsKey(biwEntityId))
 2653            return convertedEntities[biwEntityId];
 654
 82655        BIWEntity entityToEdit = new BIWEntity();
 82656        entityToEdit.Initialize(entity, editMaterial);
 82657        convertedEntities.Add(entityToEdit.entityUniqueId, entityToEdit);
 82658        entity.OnRemoved += RemoveConvertedEntity;
 82659        entityToEdit.isNew = hasBeenCreated;
 660
 82661        string entityName = entityToEdit.GetDescriptiveName();
 82662        var catalogItem = entityToEdit.GetCatalogItemAssociated();
 663
 82664        if ((string.IsNullOrEmpty(entityName) || entityNameList.Contains(entityName)) && catalogItem != null)
 665        {
 0666            entityName = GetNewNameForEntity(catalogItem);
 0667            SetEntityName(entityToEdit, entityName);
 0668        }
 82669        else if (!string.IsNullOrEmpty(entityName) && !entityNameList.Contains(entityName))
 670        {
 0671            entityNameList.Add(entityName);
 672        }
 673
 82674        return entityToEdit;
 675    }
 676
 677    internal void ChangeEntityBoundsCheckerStatus(IDCLEntity entity, bool isInsideBoundaries)
 678    {
 4679        var convertedEntity = GetConvertedEntity(entity);
 4680        if (convertedEntity == null)
 3681            return;
 682
 1683        convertedEntity.SetEntityBoundariesError(isInsideBoundaries);
 1684    }
 685
 1686    public string GetNewNameForEntity(CatalogItem sceneObject) { return GetNewNameForEntity(sceneObject.name); }
 687
 688    public string GetNewNameForEntity(string name)
 689    {
 3690        int i = 1;
 3691        if (!entityNameList.Contains(name))
 1692            return name;
 693
 2694        string newName = name + " " + i;
 2695        while (entityNameList.Contains(newName))
 696        {
 0697            i++;
 0698            newName = name + " " + i;
 699        }
 700
 2701        return newName;
 702    }
 703
 704    public void DeleteFloorEntities()
 705    {
 4706        List<BIWEntity> entitiesToDelete = new List<BIWEntity>();
 707
 22708        foreach (BIWEntity entity in convertedEntities.Values)
 709        {
 7710            if (entity.isFloor)
 711            {
 4712                entitiesToDelete.Add(entity);
 713            }
 714        }
 715
 16716        foreach (BIWEntity entity in entitiesToDelete)
 4717            DeleteEntity(entity, false);
 718
 4719        saveController.TryToSave();
 4720    }
 721
 722    public void DeleteEntity(long entityId)
 723    {
 3724        BIWEntity entity = convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 3725        DeleteEntity(entity, true);
 3726    }
 727
 8728    public void DeleteEntity(BIWEntity entityToDelete) { DeleteEntity(entityToDelete, true); }
 729
 730    public void DeleteEntity(BIWEntity entityToDelete, bool checkSelection)
 731    {
 13732        if (entityToDelete.isSelected && checkSelection)
 0733            DeselectEntity(entityToDelete);
 734
 13735        if (selectedEntities.Contains(entityToDelete))
 736        {
 1737            selectedEntities.Remove(entityToDelete);
 1738            hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 739        }
 740
 13741        string entityName = entityToDelete.GetDescriptiveName();
 742
 13743        if (entityNameList.Contains(entityName))
 4744            entityNameList.Remove(entityName);
 745
 13746        RemoveConvertedEntity(entityToDelete.rootEntity);
 13747        entityToDelete.rootEntity.OnRemoved -= RemoveConvertedEntity;
 13748        entityToDelete.Delete();
 13749        long idToRemove = entityToDelete.rootEntity.entityId;
 13750        OnEntityDeleted?.Invoke(entityToDelete);
 13751        creatorController.RemoveLoadingObjectInmediate(entityToDelete.rootEntity.entityId);
 13752        if (sceneToEdit.entities.ContainsKey(idToRemove))
 13753            sceneToEdit.RemoveEntity(idToRemove, true);
 754
 13755        hudController?.RefreshCatalogAssetPack();
 13756        EntityListChanged();
 757
 13758        if ( bridge != null )
 0759            bridge.RemoveEntityOnKernel(idToRemove, sceneToEdit);
 13760    }
 761
 762    public void DeleteSingleEntity(BIWEntity entityToDelete)
 763    {
 1764        actionController.CreateActionEntityDeleted(entityToDelete);
 1765        DeleteEntity(entityToDelete, true);
 1766        saveController.TryToSave();
 1767    }
 768
 769    public void DeleteSelectedEntities()
 770    {
 2771        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 772
 8773        for (int i = 0; i < selectedEntities.Count; i++)
 774        {
 2775            entitiesToRemove.Add(selectedEntities[i]);
 776        }
 777
 2778        actionController.CreateActionEntityDeleted(entitiesToRemove);
 779
 2780        DeselectEntities();
 781
 8782        foreach (BIWEntity entity in entitiesToRemove)
 783        {
 2784            DeleteEntity(entity);
 785        }
 786
 2787        OnDeleteSelectedEntities?.Invoke(entitiesToRemove);
 2788        saveController.TryToSave();
 2789    }
 790
 791    public void DeleteEntitiesOutsideSceneBoundaries()
 792    {
 1793        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 6794        foreach (BIWEntity entity in convertedEntities.Values)
 795        {
 2796            if (entity.rootEntity.scene == sceneToEdit)
 797            {
 2798                if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityMeshInsideSceneBoundaries(entity.rootEntity))
 799                {
 2800                    entitiesToRemove.Add(entity);
 801                }
 802            }
 803        }
 804
 6805        foreach (BIWEntity entity in entitiesToRemove)
 806        {
 2807            DeleteEntity(entity);
 808        }
 809
 1810        saveController.TryToSave();
 1811    }
 812
 813    private void DestroyCollidersForAllEntities()
 814    {
 228815        foreach (BIWEntity entity in convertedEntities.Values)
 816        {
 58817            entity.DestroyColliders();
 818        }
 56819    }
 820
 164821    private void RemoveConvertedEntity(IDCLEntity entity) { convertedEntities.Remove(GetConvertedUniqueKeyForEntity(enti
 822
 823    public void NotifyEntityIsCreated(IDCLEntity entity)
 824    {
 18825        if (bridge != null)
 0826            bridge.AddEntityOnKernel(entity, sceneToEdit);
 18827    }
 828
 829    [ExcludeFromCodeCoverage]
 830    public void UpdateSmartItemComponentInKernel(BIWEntity entityToUpdate)
 831    {
 832        if ( bridge != null )
 833            bridge.UpdateSmartItemComponent(entityToUpdate, sceneToEdit);
 834    }
 835
 4836    public void SetEntityName(BIWEntity entityToApply, string newName) { SetEntityName(entityToApply, newName, true); }
 837
 838    public void SetEntityName(BIWEntity entityToApply, string newName, bool sendUpdateToKernel = true)
 839    {
 17840        string currentName = entityToApply.GetDescriptiveName();
 841
 17842        if (currentName == newName)
 0843            return;
 844
 17845        if (entityNameList.Contains(newName))
 2846            newName = GetNewNameForEntity(newName);
 847
 17848        if (entityNameList.Contains(currentName))
 0849            entityNameList.Remove(currentName);
 850
 17851        entityToApply.SetDescriptiveName(newName);
 17852        entityNameList.Add(newName);
 853
 17854        if (sendUpdateToKernel && bridge != null)
 0855            bridge.ChangedEntityName(entityToApply, sceneToEdit);
 17856    }
 857
 858    internal void ChangeEntityVisibilityStatus(BIWEntity entityToApply)
 859    {
 1860        entityToApply.ToggleShowStatus();
 1861        if (!entityToApply.isVisible && selectedEntities.Contains(entityToApply))
 1862            DeselectEntity(entityToApply);
 1863    }
 864
 865    internal void ChangeEntityLockStatus(BIWEntity entityToApply)
 866    {
 1867        entityToApply.ToggleLockStatus();
 1868        if (entityToApply.isLocked && selectedEntities.Contains(entityToApply))
 0869            DeselectEntity(entityToApply);
 870
 1871        if (bridge != null)
 0872            bridge.ChangeEntityLockStatus(entityToApply, sceneToEdit);
 1873    }
 874
 15875    private string GetConvertedUniqueKeyForEntity(long entityID) { return sceneToEdit.sceneData.id + entityID; }
 876
 201877    private string GetConvertedUniqueKeyForEntity(IDCLEntity entity) { return entity.scene.sceneData.id + entity.entityI
 878
 879    public bool AreAllEntitiesInsideBoundaries()
 880    {
 5881        bool areAllIn = true;
 14882        foreach (BIWEntity entity in convertedEntities.Values)
 883        {
 3884            if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityMeshInsideSceneBoundaries(entity.rootEntity))
 885            {
 2886                areAllIn = false;
 2887                break;
 888            }
 889        }
 890
 5891        return areAllIn;
 892    }
 893}

Methods/Properties

BIWEntityHandler()
Initialize(DCL.Builder.IContext)
OnInputMouseDown(System.Int32, UnityEngine.Vector3)
OnInputMouseUp(System.Int32, UnityEngine.Vector3)
Dispose()
Update()
ReportTransform(System.Boolean)
GetLastTimeReport()
GetSelectedEntityList()
IsAnyEntitySelected()
SetActiveMode(IBIWMode)
SetMultiSelectionActive(System.Boolean)
EnterEditMode(DCL.Builder.IBuilderScene)
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.Int64)
GetConvertedEntity(DCL.Models.IDCLEntity)
DuplicateSelectedEntities()
DuplicateEntity(BIWEntity)
CreateEntityFromJSON(System.String)
CreateEmptyEntity(DCL.Controllers.IParcelScene, 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.Int64)
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.Int64)
GetConvertedUniqueKeyForEntity(DCL.Models.IDCLEntity)
AreAllEntitiesInsideBoundaries()