< Summary

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

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BIWEntityHandler()0%2100%
Initialize(...)0%12300%
OnInputMouseDown(...)0%6200%
OnInputMouseUp(...)0%6200%
Dispose()0%6200%
Update()0%12300%
ReportTransform(...)0%56700%
GetLastTimeReport()0%2100%
GetSelectedEntityList()0%2100%
IsAnyEntitySelected()0%2100%
SetActiveMode(...)0%2100%
SetMultiSelectionActive(...)0%2100%
EnterEditMode(...)0%2100%
CheckErrorOnEntities()0%12300%
IsPointerInSelectedEntity()0%20400%
DeleteSelectedEntitiesInput()0%6200%
DuplicateSelectedEntitiesInput()0%12300%
ExitEditMode()0%6200%
ChangeEntitySelectionFromList(...)0%6200%
SelectFromList(...)0%20400%
DeselectEntity(...)0%56700%
DeselectEntities()0%20400%
EntityClicked(...)0%56700%
ReSelectEntities()0%12300%
ChangeEntitySelectStatus(...)0%6200%
CancelSelection()0%6200%
ChangeLockStateSelectedEntities()0%6200%
ShowAllEntities()0%12300%
ChangeShowStateSelectedEntities()0%20400%
Select(...)0%6200%
SelectEntity(...)0%42600%
GetAllVoxelsEntities()0%20400%
GetAllEntitiesFromCurrentScene()0%12300%
GetConvertedEntity(...)0%6200%
GetConvertedEntity(...)0%6200%
DuplicateSelectedEntities()0%12300%
DuplicateEntity(...)0%2100%
CreateEntityFromJSON(...)0%72800%
CreateEmptyEntity(...)0%20400%
SetupAllEntities()0%6200%
DestroyLastCreatedEntities()0%56700%
EntityListChanged()0%6200%
GetCurrentSceneEntityCount()0%2100%
GetEntitiesInCurrentScene()0%12300%
SetupEntityToEdit(...)0%56700%
ChangeEntityBoundsCheckerStatus(...)0%6200%
GetNewNameForEntity(...)0%2100%
GetNewNameForEntity(...)0%12300%
DeleteFloorEntities()0%20400%
DeleteEntity(...)0%2100%
DeleteEntity(...)0%2100%
DeleteEntity(...)0%90900%
DeleteSingleEntity(...)0%2100%
DeleteSelectedEntities()0%20400%
DeleteEntitiesOutsideSceneBoundaries()0%30500%
DestroyCollidersForAllEntities()0%6200%
RemoveConvertedEntity(...)0%2100%
NotifyEntityIsCreated(...)0%6200%
SetEntityName(...)0%2100%
SetEntityName(...)0%42600%
ChangeEntityVisibilityStatus(...)0%12300%
ChangeEntityLockStatus(...)0%20400%
GetConvertedUniqueKeyForEntity(...)0%2100%
GetConvertedUniqueKeyForEntity(...)0%2100%
AreAllEntitiesInsideBoundaries()0%12300%

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
 036    private readonly Dictionary<string, BIWEntity> convertedEntities = new Dictionary<string, BIWEntity>();
 037    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
 045    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    {
 062        base.Initialize(context);
 063        if ( context.editorContext.editorHUD != null)
 64        {
 065            hudController = context.editorContext.editorHUD;
 066            hudController.OnEntityDelete += DeleteSingleEntity;
 067            hudController.OnDuplicateSelectedAction += DuplicateSelectedEntitiesInput;
 068            hudController.OnDeleteSelectedAction += DeleteSelectedEntitiesInput;
 069            hudController.OnEntityClick += ChangeEntitySelectionFromList;
 070            hudController.OnEntityLock += ChangeEntityLockStatus;
 071            hudController.OnEntityChangeVisibility += ChangeEntityVisibilityStatus;
 072            hudController.OnEntityRename += SetEntityName;
 073            hudController.OnEntitySmartItemComponentUpdate += UpdateSmartItemComponentInKernel;
 74        }
 75
 76
 077        BIWInputWrapper.OnMouseDown += OnInputMouseDown;
 078        BIWInputWrapper.OnMouseUp += OnInputMouseUp;
 79
 080        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged += ChangeEntityBoundsCheckerStatus
 81
 082        if ( context.sceneReferences.biwBridgeGameObject != null )
 083            bridge = context.sceneReferences.biwBridgeGameObject.GetComponent<BuilderInWorldBridge>();
 84
 085        outlinerController = context.editorContext.outlinerController;
 86
 087        modeController = context.editorContext.modeController;
 088        actionController = context.editorContext.actionController;
 089        creatorController = context.editorContext.creatorController;
 090        raycastController = context.editorContext.raycastController;
 091        saveController = context.editorContext.saveController;
 92
 093        editMaterial = context.projectReferencesAsset.editMaterial;
 94
 095        hideSelectedEntitiesAction = context.inputsReferencesAsset.hideSelectedEntitiesAction;
 096        showAllEntitiesAction = context.inputsReferencesAsset.showAllEntitiesAction;
 97
 098        hideSelectedEntitiesDelegate = (action) => ChangeShowStateSelectedEntities();
 099        showAllEntitiesDelegate = (action) => ShowAllEntities();
 100
 0101        hideSelectedEntitiesAction.OnTriggered += hideSelectedEntitiesDelegate;
 0102        showAllEntitiesAction.OnTriggered += showAllEntitiesDelegate;
 103
 0104        actionController.OnRedo += ReSelectEntities;
 0105        actionController.OnUndo += ReSelectEntities;
 0106    }
 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    {
 0116        if (buttonId == 1)
 0117            isSecondayClickPressed = false;
 0118    }
 119
 120    public override void Dispose()
 121    {
 0122        DestroyCollidersForAllEntities();
 123
 0124        actionController.OnRedo -= ReSelectEntities;
 0125        actionController.OnUndo -= ReSelectEntities;
 126
 0127        hideSelectedEntitiesAction.OnTriggered -= hideSelectedEntitiesDelegate;
 0128        showAllEntitiesAction.OnTriggered -= showAllEntitiesDelegate;
 129
 0130        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged -= ChangeEntityBoundsCheckerStatus
 131
 0132        BIWInputWrapper.OnMouseDown -= OnInputMouseDown;
 0133        BIWInputWrapper.OnMouseUp -= OnInputMouseUp;
 134
 0135        if (hudController != null)
 136        {
 0137            hudController.OnEntityDelete -= DeleteSingleEntity;
 0138            hudController.OnDuplicateSelectedAction -= DuplicateSelectedEntitiesInput;
 0139            hudController.OnDeleteSelectedAction -= DeleteSelectedEntitiesInput;
 0140            hudController.OnEntityClick -= ChangeEntitySelectionFromList;
 0141            hudController.OnEntityLock -= ChangeEntityLockStatus;
 0142            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 0143            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 0144            hudController.OnEntityRename -= SetEntityName;
 0145            hudController.OnEntitySmartItemComponentUpdate -= UpdateSmartItemComponentInKernel;
 146        }
 0147    }
 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    {
 0163        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
 0178        lastTransformReportTime = DCLTime.realtimeSinceStartup;
 0179    }
 180
 0181    public float GetLastTimeReport() { return lastTransformReportTime; }
 182
 0183    public List<BIWEntity> GetSelectedEntityList() { return selectedEntities; }
 184
 0185    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    {
 0197        base.EnterEditMode(scene);
 198
 0199        SetupAllEntities();
 0200        EntityListChanged();
 0201        CheckErrorOnEntities();
 0202    }
 203
 204    private void CheckErrorOnEntities()
 205    {
 0206        foreach (BIWEntity entity in convertedEntities.Values)
 207        {
 0208            entity.CheckErrors();
 0209            if (entity.hasMissingCatalogItemError)
 0210                creatorController.CreateErrorOnEntity(entity);
 211        }
 0212    }
 213
 214    public bool IsPointerInSelectedEntity()
 215    {
 0216        BIWEntity entityInPointer = raycastController.GetEntityOnPointer();
 0217        if (entityInPointer == null)
 0218            return false;
 219
 0220        foreach (BIWEntity entity in selectedEntities)
 221        {
 0222            if (entityInPointer == entity)
 0223                return true;
 224        }
 225
 0226        return false;
 0227    }
 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    {
 0258        if (!selectedEntities.Contains(entityToEdit))
 0259            SelectFromList(entityToEdit);
 260        else
 0261            DeselectEntity(entityToEdit);
 0262    }
 263
 264    private void SelectFromList(BIWEntity entityToEdit)
 265    {
 0266        if (!isMultiSelectionActive)
 0267            DeselectEntities();
 0268        if (SelectEntity(entityToEdit))
 269        {
 0270            if (!isMultiSelectionActive)
 0271                outlinerController.OutlineEntity(entityToEdit);
 272            else
 0273                outlinerController.OutlineEntities(selectedEntities);
 274        }
 0275    }
 276
 277    public void DeselectEntity(BIWEntity entity)
 278    {
 0279        if (!selectedEntities.Contains(entity))
 0280            return;
 281
 0282        entity.Deselect();
 283
 0284        outlinerController.CancelEntityOutline(entity);
 0285        selectedEntities.Remove(entity);
 0286        hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 0287        currentActiveMode?.EntityDeselected(entity);
 0288        if (selectedEntities.Count <= 0 &&
 289            hudController != null)
 0290            hudController.HideEntityInformation();
 291
 0292        OnEntityDeselected?.Invoke(entity);
 0293    }
 294
 295    public void DeselectEntities()
 296    {
 0297        if (selectedEntities.Count <= 0)
 0298            return;
 299
 0300        int amountToDeselect = selectedEntities.Count;
 0301        for (int i = 0; i < amountToDeselect; i++)
 302        {
 0303            DeselectEntity(selectedEntities[0]);
 304        }
 305
 0306        currentActiveMode?.OnDeselectedEntities();
 307
 0308        Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
 0309    }
 310
 311    public void EntityClicked(BIWEntity entityToSelect)
 312    {
 0313        if (entityToSelect != null)
 314        {
 0315            if (!isMultiSelectionActive)
 0316                DeselectEntities();
 317
 0318            if (!entityToSelect.isLocked)
 0319                ChangeEntitySelectStatus(entityToSelect);
 320
 0321            if (entityToSelect == lastClickedEntity && (lastTimeEntityClicked + BIWSettings.MOUSE_MS_DOUBLE_CLICK_THRESH
 0322                modeController.EntityDoubleClick(entityToSelect);
 323
 0324            lastClickedEntity = entityToSelect;
 0325            lastTimeEntityClicked = Time.realtimeSinceStartup;
 326        }
 0327        else if (!isMultiSelectionActive)
 328        {
 0329            DeselectEntities();
 330        }
 0331    }
 332
 333    internal void ReSelectEntities()
 334    {
 0335        List<BIWEntity> entitiesToReselect = new List<BIWEntity>();
 0336        foreach (BIWEntity entity in selectedEntities)
 337        {
 0338            entitiesToReselect.Add(entity);
 339        }
 340
 0341        DeselectEntities();
 342
 0343        foreach (BIWEntity entity in entitiesToReselect)
 344        {
 0345            SelectEntity(entity);
 346        }
 0347    }
 348
 349    internal void ChangeEntitySelectStatus(BIWEntity entityCliked)
 350    {
 0351        if (entityCliked.isSelected)
 0352            DeselectEntity(entityCliked);
 353        else
 0354            SelectEntity(entityCliked);
 0355    }
 356
 357    public void CancelSelection()
 358    {
 0359        if (selectedEntities.Count == 0)
 0360            return;
 361
 0362        DestroyLastCreatedEntities();
 0363        DeselectEntities();
 0364    }
 365
 366    public void ChangeLockStateSelectedEntities()
 367    {
 0368        foreach (BIWEntity entity in selectedEntities)
 369        {
 0370            entity.ToggleLockStatus();
 371        }
 372
 0373        DeselectEntities();
 0374    }
 375
 376    public void ShowAllEntities()
 377    {
 0378        foreach (BIWEntity entity in convertedEntities.Values)
 379        {
 0380            if (!entity.isVisible)
 0381                entity.ToggleShowStatus();
 382        }
 0383    }
 384
 385    public void ChangeShowStateSelectedEntities()
 386    {
 0387        List<BIWEntity> entitiesToHide = new List<BIWEntity>(selectedEntities);
 388
 0389        foreach (BIWEntity entity in entitiesToHide)
 390        {
 0391            if (entity.isVisible && entity.isSelected)
 0392                DeselectEntity(entity);
 0393            entity.ToggleShowStatus();
 394        }
 0395    }
 396
 397    public void Select(IDCLEntity entity)
 398    {
 0399        BIWEntity entityEditable = GetConvertedEntity(entity);
 0400        if (entityEditable == null)
 0401            return;
 402
 0403        SelectEntity(entityEditable, true);
 0404    }
 405
 406    public bool SelectEntity(BIWEntity entityEditable, bool selectedFromCatalog = false)
 407    {
 0408        if (entityEditable.isLocked)
 0409            return false;
 410
 0411        if (entityEditable.isSelected)
 0412            return false;
 413
 0414        entityEditable.Select();
 415
 0416        selectedEntities.Add(entityEditable);
 417
 0418        currentActiveMode?.SelectedEntity(entityEditable);
 419
 0420        if ( context.editorContext.editorHUD != null)
 421        {
 0422            hudController.UpdateEntitiesSelection(selectedEntities.Count);
 0423            hudController.ShowEntityInformation(selectedFromCatalog);
 0424            hudController.EntityInformationSetEntity(entityEditable, sceneToEdit);
 425        }
 426
 0427        outlinerController.CancelAllOutlines();
 428
 0429        OnEntitySelected?.Invoke();
 430
 0431        return true;
 432    }
 433
 434    public List<BIWEntity> GetAllVoxelsEntities()
 435    {
 0436        List<BIWEntity> voxelEntities = new List<BIWEntity>();
 0437        foreach (BIWEntity entity in convertedEntities.Values)
 438        {
 0439            if (entity.rootEntity.scene == sceneToEdit && entity.isVoxel)
 0440                voxelEntities.Add(entity);
 441        }
 442
 0443        return voxelEntities;
 444    }
 445
 446    public List<BIWEntity> GetAllEntitiesFromCurrentScene()
 447    {
 0448        List<BIWEntity> entities = new List<BIWEntity>();
 0449        foreach (BIWEntity entity in convertedEntities.Values)
 450        {
 0451            if (entity.rootEntity.scene == sceneToEdit)
 0452                entities.Add(entity);
 453        }
 454
 0455        return entities;
 456    }
 457
 458    public BIWEntity GetConvertedEntity(long entityId)
 459    {
 0460        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entityId)))
 0461            return convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 462
 0463        return null;
 464    }
 465
 466    public BIWEntity GetConvertedEntity(IDCLEntity entity)
 467    {
 0468        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entity)))
 0469            return convertedEntities[GetConvertedUniqueKeyForEntity(entity)];
 470
 0471        return null;
 472    }
 473
 474    public void DuplicateSelectedEntities()
 475    {
 0476        BIWCompleteAction buildAction = new BIWCompleteAction();
 0477        buildAction.actionType = IBIWCompleteAction.ActionType.CREATE;
 478
 0479        List<BIWEntityAction> entityActionList = new List<BIWEntityAction>();
 0480        List<BIWEntity> entitiesToDuplicate = new List<BIWEntity>(selectedEntities);
 0481        DeselectEntities();
 482
 0483        foreach (BIWEntity entityToDuplicate in entitiesToDuplicate)
 484        {
 0485            if (entityToDuplicate.isNFT)
 486                continue;
 487
 0488            var entityDuplicated = DuplicateEntity(entityToDuplicate);
 489
 490            // We move the entity before completing the action to save its position too
 0491            entityDuplicated.rootEntity.gameObject.transform.position += Vector3.right * DUPLICATE_OFFSET;
 492
 0493            BIWEntityAction biwEntityAction = new BIWEntityAction(entityDuplicated.rootEntity, entityDuplicated.rootEnti
 0494            entityActionList.Add(biwEntityAction);
 0495            SelectEntity(entityDuplicated);
 496        }
 497
 0498        buildAction.CreateActionType(entityActionList, IBIWCompleteAction.ActionType.CREATE);
 0499        actionController.AddAction(buildAction);
 0500    }
 501
 502    public BIWEntity DuplicateEntity(BIWEntity entityToDuplicate)
 503    {
 0504        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
 0506        sceneToEdit.componentsManagerLegacy.RemoveSharedComponent(entity, typeof(DCLName), false);
 0507        sceneToEdit.componentsManagerLegacy.RemoveSharedComponent(entity, typeof(DCLLockedOnEdit), false);
 508
 0509        BIWUtils.CopyGameObjectStatus(entityToDuplicate.rootEntity.gameObject, entity.gameObject, false, false);
 0510        BIWEntity convertedEntity = SetupEntityToEdit(entity);
 511
 0512        NotifyEntityIsCreated(entity);
 0513        EntityListChanged();
 0514        return convertedEntity;
 515    }
 516
 517    public IDCLEntity CreateEntityFromJSON(string entityJson)
 518    {
 0519        EntityData data = BIWUtils.ConvertJSONToEntityData(entityJson);
 520
 0521        IDCLEntity newEntity = sceneToEdit.CreateEntity(data.entityId);
 522
 0523        if (data.transformComponent != null)
 524        {
 0525            DCLTransform.Model model = new DCLTransform.Model();
 0526            model.position = data.transformComponent.position;
 0527            model.rotation = Quaternion.Euler(data.transformComponent.rotation);
 0528            model.scale = data.transformComponent.scale;
 529
 0530            EntityComponentsUtils.AddTransformComponent(sceneToEdit, newEntity, model);
 531        }
 532
 0533        foreach (ProtocolV2.GenericComponent component in data.components)
 534        {
 0535            sceneToEdit.componentsManagerLegacy.EntityComponentCreateOrUpdate(newEntity.entityId, (CLASS_ID_COMPONENT) c
 536        }
 537
 0538        foreach (ProtocolV2.GenericComponent component in data.sharedComponents)
 539        {
 0540            sceneToEdit.componentsManagerLegacy.SceneSharedComponentAttach(newEntity.entityId, component.classId);
 541        }
 542
 0543        if (data.nftComponent != null)
 544        {
 0545            NFTShape.Model model = new NFTShape.Model();
 0546            model.color = data.nftComponent.color.ToColor();
 0547            model.src = data.nftComponent.src;
 0548            model.assetId = data.nftComponent.assetId;
 549
 0550            EntityComponentsUtils.AddNFTShapeComponent(sceneToEdit, newEntity, model, data.nftComponent.id);
 551        }
 552
 0553        var convertedEntity = SetupEntityToEdit(newEntity, true);
 554
 0555        if(!convertedEntity.isLoaded)
 0556            creatorController.CreateLoadingObject(convertedEntity);
 557
 0558        var rootEntity = convertedEntity.rootEntity;
 0559        if (sceneToEdit.componentsManagerLegacy.TryGetSharedComponent(rootEntity, CLASS_ID.GLTF_SHAPE, out var gltfCompo
 0560            gltfComponent.CallWhenReady(convertedEntity.ShapeLoadFinish);
 561
 0562        if (sceneToEdit.componentsManagerLegacy.TryGetSharedComponent(rootEntity, CLASS_ID.NFT_SHAPE, out var nftCompone
 0563            nftComponent.CallWhenReady(convertedEntity.ShapeLoadFinish);
 564
 0565        EntityListChanged();
 0566        return newEntity;
 567    }
 568
 569    public BIWEntity CreateEmptyEntity(IParcelScene parcelScene, Vector3 entryPoint, Vector3 editionGOPosition, bool not
 570    {
 0571        var sceneController = Environment.i.world.sceneController;
 0572        IDCLEntity newEntity =
 573            parcelScene.CreateEntity(
 574                sceneController.entityIdHelper.EntityFromLegacyEntityString(Guid.NewGuid().ToString()));
 0575        DCLTransform.Model transformModel = new DCLTransform.Model();
 0576        transformModel.position = WorldStateUtils.ConvertUnityToScenePosition(entryPoint, parcelScene);
 577
 0578        Camera camera = context.sceneReferences.mainCamera;
 0579        Vector3 pointToLookAt = camera != null ? camera.transform.position : Vector3.zero;
 0580        pointToLookAt.y = editionGOPosition.y;
 0581        Quaternion lookOnLook = Quaternion.LookRotation(editionGOPosition - pointToLookAt);
 582
 0583        transformModel.rotation = lookOnLook;
 0584        transformModel.scale = newEntity.gameObject.transform.lossyScale;
 585
 0586        EntityComponentsUtils.AddTransformComponent(parcelScene, newEntity, transformModel);
 587
 0588        BIWEntity convertedEntity = SetupEntityToEdit(newEntity, true);
 0589        hudController?.UpdateSceneLimitInfo();
 590
 0591        if (notifyEntityList)
 0592            EntityListChanged();
 0593        return convertedEntity;
 594    }
 595
 596    private void SetupAllEntities()
 597    {
 0598        foreach (IDCLEntity entity in sceneToEdit.entities.Values)
 599        {
 0600            SetupEntityToEdit(entity);
 601        }
 0602    }
 603
 604    public void DestroyLastCreatedEntities()
 605    {
 0606        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 0607        foreach (BIWEntity entity in selectedEntities)
 608        {
 0609            if (entity.isSelected && entity.isNew)
 0610                entitiesToRemove.Add(entity);
 611        }
 612
 0613        if (entitiesToRemove.Count == 0)
 0614            return;
 615
 0616        modeController.UndoEditionGOLastStep();
 617
 0618        foreach (BIWEntity entity in entitiesToRemove)
 619        {
 0620            DeleteEntity(entity, false);
 621        }
 622
 0623        saveController.TryToSave();
 0624        hudController?.HideEntityInformation();
 0625    }
 626
 627    public void EntityListChanged()
 628    {
 0629        if ( context.editorContext.editorHUD == null)
 0630            return;
 0631        hudController.SetEntityList(GetEntitiesInCurrentScene());
 0632    }
 633
 0634    public int GetCurrentSceneEntityCount() { return GetEntitiesInCurrentScene().Count; }
 635
 636    List<BIWEntity> GetEntitiesInCurrentScene()
 637    {
 0638        List<BIWEntity> currentEntitiesInScene = new List<BIWEntity>();
 0639        foreach (BIWEntity entity in convertedEntities.Values)
 640        {
 0641            if (entity.rootEntity.scene == sceneToEdit)
 0642                currentEntitiesInScene.Add(entity);
 643        }
 644
 0645        return currentEntitiesInScene;
 646    }
 647
 648    BIWEntity SetupEntityToEdit(IDCLEntity entity, bool hasBeenCreated = false)
 649    {
 0650        string biwEntityId = GetConvertedUniqueKeyForEntity(entity);
 651
 0652        if (convertedEntities.ContainsKey(biwEntityId))
 0653            return convertedEntities[biwEntityId];
 654
 0655        BIWEntity entityToEdit = new BIWEntity();
 0656        entityToEdit.Initialize(entity, editMaterial);
 0657        convertedEntities.Add(entityToEdit.entityUniqueId, entityToEdit);
 0658        entity.OnRemoved += RemoveConvertedEntity;
 0659        entityToEdit.isNew = hasBeenCreated;
 660
 0661        string entityName = entityToEdit.GetDescriptiveName();
 0662        var catalogItem = entityToEdit.GetCatalogItemAssociated();
 663
 0664        if ((string.IsNullOrEmpty(entityName) || entityNameList.Contains(entityName)) && catalogItem != null)
 665        {
 0666            entityName = GetNewNameForEntity(catalogItem);
 0667            SetEntityName(entityToEdit, entityName);
 668        }
 0669        else if (!string.IsNullOrEmpty(entityName) && !entityNameList.Contains(entityName))
 670        {
 0671            entityNameList.Add(entityName);
 672        }
 673
 0674        return entityToEdit;
 675    }
 676
 677    internal void ChangeEntityBoundsCheckerStatus(IDCLEntity entity, bool isInsideBoundaries)
 678    {
 0679        var convertedEntity = GetConvertedEntity(entity);
 0680        if (convertedEntity == null)
 0681            return;
 682
 0683        convertedEntity.SetEntityBoundariesError(isInsideBoundaries);
 0684    }
 685
 0686    public string GetNewNameForEntity(CatalogItem sceneObject) { return GetNewNameForEntity(sceneObject.name); }
 687
 688    public string GetNewNameForEntity(string name)
 689    {
 0690        int i = 1;
 0691        if (!entityNameList.Contains(name))
 0692            return name;
 693
 0694        string newName = name + " " + i;
 0695        while (entityNameList.Contains(newName))
 696        {
 0697            i++;
 0698            newName = name + " " + i;
 699        }
 700
 0701        return newName;
 702    }
 703
 704    public void DeleteFloorEntities()
 705    {
 0706        List<BIWEntity> entitiesToDelete = new List<BIWEntity>();
 707
 0708        foreach (BIWEntity entity in convertedEntities.Values)
 709        {
 0710            if (entity.isFloor)
 711            {
 0712                entitiesToDelete.Add(entity);
 713            }
 714        }
 715
 0716        foreach (BIWEntity entity in entitiesToDelete)
 0717            DeleteEntity(entity, false);
 718
 0719        saveController.TryToSave();
 0720    }
 721
 722    public void DeleteEntity(long entityId)
 723    {
 0724        BIWEntity entity = convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 0725        DeleteEntity(entity, true);
 0726    }
 727
 0728    public void DeleteEntity(BIWEntity entityToDelete) { DeleteEntity(entityToDelete, true); }
 729
 730    public void DeleteEntity(BIWEntity entityToDelete, bool checkSelection)
 731    {
 0732        if (entityToDelete.isSelected && checkSelection)
 0733            DeselectEntity(entityToDelete);
 734
 0735        if (selectedEntities.Contains(entityToDelete))
 736        {
 0737            selectedEntities.Remove(entityToDelete);
 0738            hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 739        }
 740
 0741        string entityName = entityToDelete.GetDescriptiveName();
 742
 0743        if (entityNameList.Contains(entityName))
 0744            entityNameList.Remove(entityName);
 745
 0746        RemoveConvertedEntity(entityToDelete.rootEntity);
 0747        entityToDelete.rootEntity.OnRemoved -= RemoveConvertedEntity;
 0748        entityToDelete.Delete();
 0749        long idToRemove = entityToDelete.rootEntity.entityId;
 0750        OnEntityDeleted?.Invoke(entityToDelete);
 0751        creatorController.RemoveLoadingObjectInmediate(entityToDelete.rootEntity.entityId);
 0752        if (sceneToEdit.entities.ContainsKey(idToRemove))
 0753            sceneToEdit.RemoveEntity(idToRemove, true);
 754
 0755        hudController?.RefreshCatalogAssetPack();
 0756        EntityListChanged();
 757
 0758        if ( bridge != null )
 0759            bridge.RemoveEntityOnKernel(idToRemove, sceneToEdit);
 0760    }
 761
 762    public void DeleteSingleEntity(BIWEntity entityToDelete)
 763    {
 0764        actionController.CreateActionEntityDeleted(entityToDelete);
 0765        DeleteEntity(entityToDelete, true);
 0766        saveController.TryToSave();
 0767    }
 768
 769    public void DeleteSelectedEntities()
 770    {
 0771        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 772
 0773        for (int i = 0; i < selectedEntities.Count; i++)
 774        {
 0775            entitiesToRemove.Add(selectedEntities[i]);
 776        }
 777
 0778        actionController.CreateActionEntityDeleted(entitiesToRemove);
 779
 0780        DeselectEntities();
 781
 0782        foreach (BIWEntity entity in entitiesToRemove)
 783        {
 0784            DeleteEntity(entity);
 785        }
 786
 0787        OnDeleteSelectedEntities?.Invoke(entitiesToRemove);
 0788        saveController.TryToSave();
 0789    }
 790
 791    public void DeleteEntitiesOutsideSceneBoundaries()
 792    {
 0793        List<BIWEntity> entitiesToRemove = new List<BIWEntity>();
 0794        foreach (BIWEntity entity in convertedEntities.Values)
 795        {
 0796            if (entity.rootEntity.scene == sceneToEdit)
 797            {
 0798                if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityMeshInsideSceneBoundaries(entity.rootEntity))
 799                {
 0800                    entitiesToRemove.Add(entity);
 801                }
 802            }
 803        }
 804
 0805        foreach (BIWEntity entity in entitiesToRemove)
 806        {
 0807            DeleteEntity(entity);
 808        }
 809
 0810        saveController.TryToSave();
 0811    }
 812
 813    private void DestroyCollidersForAllEntities()
 814    {
 0815        foreach (BIWEntity entity in convertedEntities.Values)
 816        {
 0817            entity.DestroyColliders();
 818        }
 0819    }
 820
 0821    private void RemoveConvertedEntity(IDCLEntity entity) { convertedEntities.Remove(GetConvertedUniqueKeyForEntity(enti
 822
 823    public void NotifyEntityIsCreated(IDCLEntity entity)
 824    {
 0825        if (bridge != null)
 0826            bridge.AddEntityOnKernel(entity, sceneToEdit);
 0827    }
 828
 829    [ExcludeFromCodeCoverage]
 830    public void UpdateSmartItemComponentInKernel(BIWEntity entityToUpdate)
 831    {
 832        if ( bridge != null )
 833            bridge.UpdateSmartItemComponent(entityToUpdate, sceneToEdit);
 834    }
 835
 0836    public void SetEntityName(BIWEntity entityToApply, string newName) { SetEntityName(entityToApply, newName, true); }
 837
 838    public void SetEntityName(BIWEntity entityToApply, string newName, bool sendUpdateToKernel = true)
 839    {
 0840        string currentName = entityToApply.GetDescriptiveName();
 841
 0842        if (currentName == newName)
 0843            return;
 844
 0845        if (entityNameList.Contains(newName))
 0846            newName = GetNewNameForEntity(newName);
 847
 0848        if (entityNameList.Contains(currentName))
 0849            entityNameList.Remove(currentName);
 850
 0851        entityToApply.SetDescriptiveName(newName);
 0852        entityNameList.Add(newName);
 853
 0854        if (sendUpdateToKernel && bridge != null)
 0855            bridge.ChangedEntityName(entityToApply, sceneToEdit);
 0856    }
 857
 858    internal void ChangeEntityVisibilityStatus(BIWEntity entityToApply)
 859    {
 0860        entityToApply.ToggleShowStatus();
 0861        if (!entityToApply.isVisible && selectedEntities.Contains(entityToApply))
 0862            DeselectEntity(entityToApply);
 0863    }
 864
 865    internal void ChangeEntityLockStatus(BIWEntity entityToApply)
 866    {
 0867        entityToApply.ToggleLockStatus();
 0868        if (entityToApply.isLocked && selectedEntities.Contains(entityToApply))
 0869            DeselectEntity(entityToApply);
 870
 0871        if (bridge != null)
 0872            bridge.ChangeEntityLockStatus(entityToApply, sceneToEdit);
 0873    }
 874
 0875    private string GetConvertedUniqueKeyForEntity(long entityID) { return sceneToEdit.sceneData.sceneNumber.ToString() +
 876
 0877    private string GetConvertedUniqueKeyForEntity(IDCLEntity entity) { return entity.scene.sceneData.sceneNumber.ToStrin
 878
 879    public bool AreAllEntitiesInsideBoundaries()
 880    {
 0881        bool areAllIn = true;
 0882        foreach (BIWEntity entity in convertedEntities.Values)
 883        {
 0884            if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityMeshInsideSceneBoundaries(entity.rootEntity))
 885            {
 0886                areAllIn = false;
 0887                break;
 888            }
 889        }
 890
 0891        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()