< Summary

Class:BuilderInWorldEntityHandler
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/Controllers/BuilderInWorldEntityHandler.cs
Covered lines:197
Uncovered lines:234
Coverable lines:431
Total lines:892
Line coverage:45.7% (197 of 431)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BuilderInWorldEntityHandler()0%110100%
Start()0%2100%
Init()0%2.592047.06%
OnInputMouseDown(...)0%6200%
OnInputMouseUp(...)0%6200%
OnDestroy()0%6200%
FrameUpdate()0%12300%
ReportTransform(...)0%42600%
GetSelectedEntityList()0%2100%
IsAnyEntitySelected()0%2100%
SetActiveMode(...)0%110100%
SetMultiSelectionActive(...)0%2100%
EnterEditMode(...)0%110100%
CheckErrorOnEntities()0%330100%
IsPointerInSelectedEntity()0%20400%
DeleteSelectedEntitiesInput()0%6200%
DuplicateSelectedEntitiesInput()0%12300%
ExitEditMode()0%6200%
ChangeEntitySelectionFromList(...)0%6200%
SelectFromList(...)0%20400%
DeselectEntity(...)0%7.997072.73%
DeselectEntities()0%440100%
GetEntityOnPointer()0%20400%
EntityClicked(...)0%56700%
ReSelectEntities()0%3.433063.64%
ChangeEntitySelectStatus(...)0%6200%
CancelSelection()0%6200%
ChangeLockStateSelectedEntities()0%6200%
ShowAllEntities()0%12300%
ChangeShowStateSelectedEntities()0%20400%
Select(...)0%2.032080%
SelectEntity(...)0%7.646064.29%
GetAllVoxelsEntities()0%20400%
GetAllEntitiesFromCurrentScene()0%330100%
GetConvertedEntity(...)0%2.152066.67%
GetConvertedEntity(...)0%2.152066.67%
DuplicateSelectedEntities()0%440100%
DuplicateEntity(...)0%110100%
CreateEntityFromJSON(...)0%14.437046.67%
CreateEmptyEntity(...)0%330100%
SetupAllEntities()0%220100%
DestroyLastCreatedEntities()0%42600%
EntityListChanged()0%2.52050%
GetCurrentSceneEntityCount()0%2100%
GetEntitiesInCurrentScene()0%12300%
SetupEntityToEdit(...)0%7.777075%
ChangeEntityBoundsCheckerStatus(...)0%6200%
GetNewNameForEntity(...)0%2100%
GetNewNameForEntity(...)0%3.023087.5%
DeleteFloorEntities()0%440100%
DeleteEntity(...)0%110100%
DeleteEntity(...)0%110100%
DeleteEntity(...)0%9.569080.95%
DeleteSingleEntity(...)0%2100%
DeleteSelectedEntities()0%4.014092.31%
DeleteEntitiesOutsideSceneBoundaries()0%30500%
DestroyCollidersForAllEntities()0%6200%
RemoveConvertedEntity(...)0%110100%
NotifyEntityIsCreated(...)0%2.52050%
UpdateSmartItemComponentInKernel(...)0%6200%
SetEntityName(...)0%110100%
SetEntityName(...)0%6.176083.33%
ChangeEntityVisibilityStatus(...)0%12300%
ChangeEntityLockStatus(...)0%12300%
GetConvertedUniqueKeyForEntity(...)0%110100%
GetConvertedUniqueKeyForEntity(...)0%110100%
AreAllSelectedEntitiesInsideBoundaries()0%12300%
AreAllEntitiesInsideBoundaries()0%330100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/Controllers/BuilderInWorldEntityHandler.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 UnityEngine;
 13using Environment = DCL.Environment;
 14
 15public class BuilderInWorldEntityHandler : BIWController
 16{
 17    [Header("Design variables")]
 19818    public float duplicateOffset = 2f;
 19
 20    [Header("Prefab References")]
 21    public BIWOutlinerController outlinerController;
 22
 23    public BIWModeController biwModeController;
 24    public ActionController actionController;
 25    public BuilderInWorldBridge builderInWorldBridge;
 26    public BIWCreatorController biwCreatorController;
 27
 28    [Header("Build References")]
 29    public Material editMaterial;
 30
 31    [SerializeField] internal LayerMask layerToRaycast;
 32
 33    [Header("InputActions")]
 34    [SerializeField]
 35    internal InputAction_Trigger hideSelectedEntitiesAction;
 36
 37    [SerializeField]
 38    internal InputAction_Trigger showAllEntitiesAction;
 39
 19840    private Dictionary<string, DCLBuilderInWorldEntity> convertedEntities = new Dictionary<string, DCLBuilderInWorldEnti
 19841    private List<DCLBuilderInWorldEntity> selectedEntities = new List<DCLBuilderInWorldEntity>();
 42
 43    private BuilderInWorldMode currentActiveMode;
 44    private bool isMultiSelectionActive = false;
 45    private bool isSecondayClickPressed = false;
 46
 47    private float lastTransformReportTime;
 48
 19849    private List<string> entityNameList = new List<string>();
 50
 51    private InputAction_Trigger.Triggered hideSelectedEntitiesDelegate;
 52    private InputAction_Trigger.Triggered showAllEntitiesDelegate;
 53
 54    private BuildModeHUDController hudController;
 55
 56    public event Action<DCLBuilderInWorldEntity> OnEntityDeselected;
 57    public event Action OnEntitySelected;
 58    public event Action<List<DCLBuilderInWorldEntity>> OnDeleteSelectedEntities;
 59    public event Action<DCLBuilderInWorldEntity> OnEntityDeleted;
 60
 61    private DCLBuilderInWorldEntity lastClickedEntity;
 62    private float lastTimeEntityClicked;
 63
 64    private void Start()
 65    {
 066        hideSelectedEntitiesDelegate = (action) => ChangeShowStateSelectedEntities();
 067        showAllEntitiesDelegate = (action) => ShowAllEntities();
 68
 069        hideSelectedEntitiesAction.OnTriggered += hideSelectedEntitiesDelegate;
 070        showAllEntitiesAction.OnTriggered += showAllEntitiesDelegate;
 071    }
 72
 73    public override void Init()
 74    {
 4275        base.Init();
 4276        if (HUDController.i.builderInWorldMainHud != null)
 77        {
 078            hudController = HUDController.i.builderInWorldMainHud;
 079            hudController.OnEntityDelete += DeleteSingleEntity;
 080            hudController.OnDuplicateSelectedAction += DuplicateSelectedEntitiesInput;
 081            hudController.OnDeleteSelectedAction += DeleteSelectedEntitiesInput;
 082            hudController.OnEntityClick += ChangeEntitySelectionFromList;
 083            hudController.OnEntityLock += ChangeEntityLockStatus;
 084            hudController.OnEntityChangeVisibility += ChangeEntityVisibilityStatus;
 085            hudController.OnEntityRename += SetEntityName;
 086            hudController.OnEntitySmartItemComponentUpdate += UpdateSmartItemComponentInKernel;
 87        }
 88
 4289        actionController.OnRedo += ReSelectEntities;
 4290        actionController.OnUndo += ReSelectEntities;
 91
 4292        BuilderInWorldInputWrapper.OnMouseDown += OnInputMouseDown;
 4293        BuilderInWorldInputWrapper.OnMouseUp += OnInputMouseUp;
 94
 4295        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged += ChangeEntityBoundsCheckerStatus
 4296    }
 97
 98    private void OnInputMouseDown(int buttonId, Vector3 mousePosition)
 99    {
 0100        if (buttonId == 1)
 0101            isSecondayClickPressed = true;
 0102    }
 103
 104    private void OnInputMouseUp(int buttonId, Vector3 mousePosition)
 105    {
 0106        if (buttonId == 1)
 0107            isSecondayClickPressed = false;
 0108    }
 109
 110    private void OnDestroy()
 111    {
 0112        DestroyCollidersForAllEntities();
 113
 0114        actionController.OnRedo -= ReSelectEntities;
 0115        actionController.OnUndo -= ReSelectEntities;
 116
 0117        hideSelectedEntitiesAction.OnTriggered -= hideSelectedEntitiesDelegate;
 0118        showAllEntitiesAction.OnTriggered -= showAllEntitiesDelegate;
 119
 0120        DCL.Environment.i.world.sceneBoundsChecker.OnEntityBoundsCheckerStatusChanged -= ChangeEntityBoundsCheckerStatus
 121
 0122        BuilderInWorldInputWrapper.OnMouseDown -= OnInputMouseDown;
 0123        BuilderInWorldInputWrapper.OnMouseUp -= OnInputMouseUp;
 124
 0125        if (hudController != null)
 126        {
 0127            hudController.OnEntityDelete -= DeleteSingleEntity;
 0128            hudController.OnDuplicateSelectedAction -= DuplicateSelectedEntitiesInput;
 0129            hudController.OnDeleteSelectedAction -= DeleteSelectedEntitiesInput;
 0130            hudController.OnEntityClick -= ChangeEntitySelectionFromList;
 0131            hudController.OnEntityLock -= ChangeEntityLockStatus;
 0132            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 0133            hudController.OnEntityChangeVisibility -= ChangeEntityVisibilityStatus;
 0134            hudController.OnEntityRename -= SetEntityName;
 0135            hudController.OnEntitySmartItemComponentUpdate -= UpdateSmartItemComponentInKernel;
 136        }
 0137    }
 138
 139    protected override void FrameUpdate()
 140    {
 0141        base.FrameUpdate();
 142
 0143        if (selectedEntities.Count == 0)
 0144            return;
 0145        if ((DCLTime.realtimeSinceStartup - lastTransformReportTime) <= BuilderInWorldSettings.ENTITY_POSITION_REPORTING
 0146            return;
 147
 0148        ReportTransform();
 0149    }
 150
 151    public void ReportTransform(bool forceReport = false)
 152    {
 0153        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 154        {
 0155            if (!entity.HasMovedSinceLastReport() &&
 156                !entity.HasScaledSinceLastReport() &&
 157                !entity.HasRotatedSinceLastReport() &&
 158                !forceReport)
 0159                return;
 0160            builderInWorldBridge.EntityTransformReport(entity.rootEntity, sceneToEdit);
 0161            entity.PositionReported();
 0162            entity.ScaleReported();
 0163            entity.RotationReported();
 164        }
 165
 0166        lastTransformReportTime = DCLTime.realtimeSinceStartup;
 0167    }
 168
 0169    public List<DCLBuilderInWorldEntity> GetSelectedEntityList() { return selectedEntities; }
 170
 0171    public bool IsAnyEntitySelected() { return selectedEntities.Count > 0; }
 172
 173    public void SetActiveMode(BuilderInWorldMode buildMode)
 174    {
 5175        currentActiveMode = buildMode;
 5176        DeselectEntities();
 5177    }
 178
 0179    public void SetMultiSelectionActive(bool isActive) { isMultiSelectionActive = isActive; }
 180
 181    public override void EnterEditMode(ParcelScene scene)
 182    {
 39183        base.EnterEditMode(scene);
 184
 39185        SetupAllEntities();
 39186        EntityListChanged();
 39187        CheckErrorOnEntities();
 39188    }
 189
 190    private void CheckErrorOnEntities()
 191    {
 114192        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 193        {
 18194            entity.CheckErrors();
 18195            if (entity.hasMissingCatalogItemError)
 18196                biwCreatorController.CreateErrorOnEntity(entity);
 197        }
 39198    }
 199
 200    public bool IsPointerInSelectedEntity()
 201    {
 0202        DCLBuilderInWorldEntity entityInPointer = GetEntityOnPointer();
 0203        if (entityInPointer == null)
 0204            return false;
 205
 0206        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 207        {
 0208            if (entityInPointer == entity)
 0209                return true;
 210        }
 211
 0212        return false;
 0213    }
 214
 215    private void DeleteSelectedEntitiesInput()
 216    {
 0217        if (selectedEntities.Count > 0)
 0218            DeleteSelectedEntities();
 0219    }
 220
 221    private void DuplicateSelectedEntitiesInput()
 222    {
 0223        if (selectedEntities.Count <= 0 || isSecondayClickPressed)
 0224            return;
 225
 0226        DuplicateSelectedEntities();
 0227    }
 228
 229    public override void ExitEditMode()
 230    {
 0231        base.ExitEditMode();
 0232        DeselectEntities();
 233
 0234        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 235        {
 0236            entity.Dispose();
 237        }
 238
 0239        convertedEntities.Clear();
 0240    }
 241
 242    private void ChangeEntitySelectionFromList(DCLBuilderInWorldEntity entityToEdit)
 243    {
 0244        if (!selectedEntities.Contains(entityToEdit))
 0245            SelectFromList(entityToEdit);
 246        else
 0247            DeselectEntity(entityToEdit);
 0248    }
 249
 250    private void SelectFromList(DCLBuilderInWorldEntity entityToEdit)
 251    {
 0252        if (!isMultiSelectionActive)
 0253            DeselectEntities();
 0254        if (SelectEntity(entityToEdit))
 255        {
 0256            if (!isMultiSelectionActive)
 0257                outlinerController.OutlineEntity(entityToEdit);
 258            else
 0259                outlinerController.OutlineEntities(selectedEntities);
 260        }
 0261    }
 262
 263    public void DeselectEntity(DCLBuilderInWorldEntity entity)
 264    {
 10265        if (!selectedEntities.Contains(entity))
 0266            return;
 267
 10268        entity.Deselect();
 269
 10270        outlinerController.CancelEntityOutline(entity);
 10271        selectedEntities.Remove(entity);
 10272        hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 10273        currentActiveMode?.EntityDeselected(entity);
 10274        if (selectedEntities.Count <= 0 &&
 275            hudController != null)
 0276            hudController.HideEntityInformation();
 277
 10278        OnEntityDeselected?.Invoke(entity);
 0279    }
 280
 281    public void DeselectEntities()
 282    {
 73283        if (selectedEntities.Count <= 0)
 64284            return;
 285
 9286        int amountToDeselect = selectedEntities.Count;
 36287        for (int i = 0; i < amountToDeselect; i++)
 288        {
 9289            DeselectEntity(selectedEntities[0]);
 290        }
 291
 9292        currentActiveMode?.OnDeselectedEntities();
 293
 9294        Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
 9295    }
 296
 297    public DCLBuilderInWorldEntity GetEntityOnPointer()
 298    {
 0299        Camera camera = Camera.main;
 300
 0301        if (camera == null)
 0302            return null;
 303
 304        RaycastHit hit;
 0305        UnityEngine.Ray ray = camera.ScreenPointToRay(biwModeController.GetMousePosition());
 0306        float distanceToSelect = biwModeController.GetMaxDistanceToSelectEntities();
 307
 0308        if (Physics.Raycast(ray, out hit, distanceToSelect, layerToRaycast))
 309        {
 0310            string entityID = hit.collider.gameObject.name;
 311
 0312            if (sceneToEdit.entities.ContainsKey(entityID))
 313            {
 0314                return GetConvertedEntity(sceneToEdit.entities[entityID]);
 315            }
 316        }
 317
 0318        return null;
 319    }
 320
 321    public void EntityClicked(DCLBuilderInWorldEntity entityToSelect)
 322    {
 0323        if (entityToSelect != null)
 324        {
 0325            if (!isMultiSelectionActive)
 0326                DeselectEntities();
 327
 0328            if (!entityToSelect.IsLocked)
 0329                ChangeEntitySelectStatus(entityToSelect);
 330
 0331            if (entityToSelect == lastClickedEntity && (lastTimeEntityClicked + BuilderInWorldSettings.MOUSE_MS_DOUBLE_C
 0332                biwModeController.EntityDoubleClick(entityToSelect);
 333
 0334            lastClickedEntity = entityToSelect;
 0335            lastTimeEntityClicked = Time.realtimeSinceStartup;
 0336        }
 0337        else if (!isMultiSelectionActive)
 338        {
 0339            DeselectEntities();
 340        }
 0341    }
 342
 343    void ReSelectEntities()
 344    {
 46345        List<DCLBuilderInWorldEntity> entitiesToReselect = new List<DCLBuilderInWorldEntity>();
 92346        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 347        {
 0348            entitiesToReselect.Add(entity);
 349        }
 350
 46351        DeselectEntities();
 352
 92353        foreach (DCLBuilderInWorldEntity entity in entitiesToReselect)
 354        {
 0355            SelectEntity(entity);
 356        }
 46357    }
 358
 359    void ChangeEntitySelectStatus(DCLBuilderInWorldEntity entityCliked)
 360    {
 0361        if (entityCliked.IsSelected)
 0362            DeselectEntity(entityCliked);
 363        else
 0364            SelectEntity(entityCliked);
 0365    }
 366
 367    public void CancelSelection()
 368    {
 0369        if (selectedEntities.Count == 0)
 0370            return;
 371
 0372        DestroyLastCreatedEntities();
 0373        DeselectEntities();
 0374    }
 375
 376    public void ChangeLockStateSelectedEntities()
 377    {
 0378        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 379        {
 0380            entity.ToggleLockStatus();
 381        }
 382
 0383        DeselectEntities();
 0384    }
 385
 386    public void ShowAllEntities()
 387    {
 0388        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 389        {
 0390            if (!entity.IsVisible)
 0391                entity.ToggleShowStatus();
 392        }
 0393    }
 394
 395    public void ChangeShowStateSelectedEntities()
 396    {
 0397        List<DCLBuilderInWorldEntity> entitiesToHide = new List<DCLBuilderInWorldEntity>(selectedEntities);
 398
 0399        foreach (DCLBuilderInWorldEntity entity in entitiesToHide)
 400        {
 0401            if (entity.IsVisible && entity.IsSelected)
 0402                DeselectEntity(entity);
 0403            entity.ToggleShowStatus();
 404        }
 0405    }
 406
 407    public void Select(IDCLEntity entity)
 408    {
 8409        DCLBuilderInWorldEntity entityEditable = GetConvertedEntity(entity);
 8410        if (entityEditable == null)
 0411            return;
 412
 8413        SelectEntity(entityEditable, true);
 8414    }
 415
 416    public bool SelectEntity(DCLBuilderInWorldEntity entityEditable, bool selectedFromCatalog = false)
 417    {
 11418        if (entityEditable.IsLocked)
 0419            return false;
 420
 11421        if (entityEditable.IsSelected)
 0422            return false;
 423
 11424        entityEditable.Select();
 425
 11426        selectedEntities.Add(entityEditable);
 427
 11428        currentActiveMode?.SelectedEntity(entityEditable);
 429
 11430        if (HUDController.i.builderInWorldMainHud != null)
 431        {
 0432            hudController.UpdateEntitiesSelection(selectedEntities.Count);
 0433            hudController.ShowEntityInformation(selectedFromCatalog);
 0434            hudController.EntityInformationSetEntity(entityEditable, sceneToEdit);
 435        }
 436
 11437        outlinerController.CancelAllOutlines();
 438
 11439        OnEntitySelected?.Invoke();
 440
 11441        return true;
 442    }
 443
 444    public List<DCLBuilderInWorldEntity> GetAllVoxelsEntities()
 445    {
 0446        List<DCLBuilderInWorldEntity> voxelEntities = new List<DCLBuilderInWorldEntity>();
 0447        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 448        {
 0449            if (entity.rootEntity.scene == sceneToEdit && entity.isVoxel)
 0450                voxelEntities.Add(entity);
 451        }
 452
 0453        return voxelEntities;
 454    }
 455
 456    public List<DCLBuilderInWorldEntity> GetAllEntitiesFromCurrentScene()
 457    {
 29458        List<DCLBuilderInWorldEntity> entities = new List<DCLBuilderInWorldEntity>();
 138459        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 460        {
 40461            if (entity.rootEntity.scene == sceneToEdit)
 40462                entities.Add(entity);
 463        }
 464
 29465        return entities;
 466    }
 467
 468    public DCLBuilderInWorldEntity GetConvertedEntity(string entityId)
 469    {
 6470        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entityId)))
 6471            return convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 472
 0473        return null;
 474    }
 475
 476    public DCLBuilderInWorldEntity GetConvertedEntity(IDCLEntity entity)
 477    {
 12478        if (convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entity)))
 12479            return convertedEntities[GetConvertedUniqueKeyForEntity(entity)];
 480
 0481        return null;
 482    }
 483
 484    public void DuplicateSelectedEntities()
 485    {
 1486        BuildInWorldCompleteAction buildAction = new BuildInWorldCompleteAction();
 1487        buildAction.actionType = BuildInWorldCompleteAction.ActionType.CREATE;
 488
 1489        List<BuilderInWorldEntityAction> entityActionList = new List<BuilderInWorldEntityAction>();
 1490        List<DCLBuilderInWorldEntity> entitiesToDuplicate = new List<DCLBuilderInWorldEntity>(selectedEntities);
 1491        DeselectEntities();
 492
 4493        foreach (DCLBuilderInWorldEntity entityToDuplicate in entitiesToDuplicate)
 494        {
 1495            if (entityToDuplicate.isNFT)
 496                continue;
 497
 1498            var entityDuplicated = DuplicateEntity(entityToDuplicate);
 1499            BuilderInWorldEntityAction builderInWorldEntityAction = new BuilderInWorldEntityAction(entityDuplicated.root
 1500            entityActionList.Add(builderInWorldEntityAction);
 1501            SelectEntity(entityDuplicated);
 502        }
 503
 1504        currentActiveMode?.SetDuplicationOffset(duplicateOffset);
 505
 1506        buildAction.CreateActionType(entityActionList, BuildInWorldCompleteAction.ActionType.CREATE);
 1507        actionController.AddAction(buildAction);
 1508    }
 509
 510    public DCLBuilderInWorldEntity DuplicateEntity(DCLBuilderInWorldEntity entityToDuplicate)
 511    {
 2512        IDCLEntity entity = SceneUtils.DuplicateEntity(sceneToEdit, entityToDuplicate.rootEntity);
 513        //Note: If the entity contains the name component or DCLLockedOnEdit, we don't want to copy them
 2514        entity.RemoveSharedComponent(typeof(DCLName), false);
 2515        entity.RemoveSharedComponent(typeof(DCLLockedOnEdit), false);
 516
 2517        BuilderInWorldUtils.CopyGameObjectStatus(entityToDuplicate.gameObject, entity.gameObject, false, false);
 2518        DCLBuilderInWorldEntity convertedEntity = SetupEntityToEdit(entity);
 519
 2520        NotifyEntityIsCreated(entity);
 2521        EntityListChanged();
 2522        return convertedEntity;
 523    }
 524
 525    public IDCLEntity CreateEntityFromJSON(string entityJson)
 526    {
 2527        EntityData data = BuilderInWorldUtils.ConvertJSONToEntityData(entityJson);
 528
 2529        IDCLEntity newEntity = sceneToEdit.CreateEntity(data.entityId);
 530
 531
 2532        if (data.transformComponent != null)
 533        {
 0534            DCLTransform.model.position = data.transformComponent.position;
 0535            DCLTransform.model.rotation = Quaternion.Euler(data.transformComponent.rotation);
 0536            DCLTransform.model.scale = data.transformComponent.scale;
 0537            sceneToEdit.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, CLASS_ID_COMPONENT.TRANSFORM, DCLTran
 538        }
 539
 4540        foreach (ProtocolV2.GenericComponent component in data.components)
 541        {
 0542            sceneToEdit.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, (CLASS_ID_COMPONENT) component.compon
 543        }
 544
 4545        foreach (ProtocolV2.GenericComponent component in data.sharedComponents)
 546        {
 0547            sceneToEdit.SharedComponentAttach(newEntity.entityId, component.classId);
 548        }
 549
 2550        if (data.nftComponent != null)
 551        {
 0552            NFTShape nftShape = (NFTShape) sceneToEdit.SharedComponentCreate(data.nftComponent.id, Convert.ToInt32(CLASS
 0553            nftShape.model = new NFTShape.Model();
 0554            nftShape.model.color = data.nftComponent.color.ToColor();
 0555            nftShape.model.src = data.nftComponent.src;
 0556            nftShape.model.assetId = data.nftComponent.assetId;
 557
 0558            sceneToEdit.SharedComponentAttach(newEntity.entityId, nftShape.id);
 559        }
 560
 2561        var convertedEntity = SetupEntityToEdit(newEntity, true);
 562
 2563        if (convertedEntity.rootEntity.TryGetSharedComponent(CLASS_ID.GLTF_SHAPE, out var gltfComponent))
 0564            gltfComponent.CallWhenReady(convertedEntity.ShapeLoadFinish);
 565
 2566        if (convertedEntity.rootEntity.TryGetSharedComponent(CLASS_ID.NFT_SHAPE, out var nftComponent))
 0567            nftComponent.CallWhenReady(convertedEntity.ShapeLoadFinish);
 568
 569
 2570        biwCreatorController.CreateLoadingObject(convertedEntity);
 2571        EntityListChanged();
 572
 2573        return newEntity;
 574    }
 575
 576    public DCLBuilderInWorldEntity CreateEmptyEntity(ParcelScene parcelScene, Vector3 entryPoint, Vector3 editionGOPosit
 577    {
 26578        IDCLEntity newEntity = parcelScene.CreateEntity(Guid.NewGuid().ToString());
 579
 26580        DCLTransform.model.position = WorldStateUtils.ConvertUnityToScenePosition(entryPoint, parcelScene);
 581
 26582        Vector3 pointToLookAt = Camera.main.transform.position;
 26583        pointToLookAt.y = editionGOPosition.y;
 26584        Quaternion lookOnLook = Quaternion.LookRotation(editionGOPosition - pointToLookAt);
 585
 26586        DCLTransform.model.rotation = lookOnLook;
 26587        DCLTransform.model.scale = newEntity.gameObject.transform.lossyScale;
 588
 26589        parcelScene.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, CLASS_ID_COMPONENT.TRANSFORM, DCLTransfor
 590
 26591        DCLBuilderInWorldEntity convertedEntity = SetupEntityToEdit(newEntity, true);
 26592        hudController?.UpdateSceneLimitInfo();
 593
 26594        if (notifyEntityList)
 11595            EntityListChanged();
 26596        return convertedEntity;
 597    }
 598
 599    private void SetupAllEntities()
 600    {
 114601        foreach (IDCLEntity entity in sceneToEdit.entities.Values)
 602        {
 18603            SetupEntityToEdit(entity);
 604        }
 39605    }
 606
 607    public void DestroyLastCreatedEntities()
 608    {
 0609        List<DCLBuilderInWorldEntity> entitiesToRemove = new List<DCLBuilderInWorldEntity>();
 0610        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 611        {
 0612            if (entity.IsSelected && entity.IsNew)
 0613                entitiesToRemove.Add(entity);
 614        }
 615
 0616        if (entitiesToRemove.Count == 0)
 0617            return;
 618
 0619        biwModeController.UndoEditionGOLastStep();
 620
 0621        foreach (DCLBuilderInWorldEntity entity in entitiesToRemove)
 622        {
 0623            DeleteEntity(entity, false);
 624        }
 625
 0626        hudController.HideEntityInformation();
 0627    }
 628
 629    public void EntityListChanged()
 630    {
 77631        if (HUDController.i.builderInWorldMainHud == null)
 77632            return;
 0633        hudController.SetEntityList(GetEntitiesInCurrentScene());
 0634    }
 635
 0636    public int GetCurrentSceneEntityCount() { return GetEntitiesInCurrentScene().Count; }
 637
 638    List<DCLBuilderInWorldEntity> GetEntitiesInCurrentScene()
 639    {
 0640        List<DCLBuilderInWorldEntity> currentEntitiesInScene = new List<DCLBuilderInWorldEntity>();
 0641        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 642        {
 0643            if (entity.rootEntity.scene == sceneToEdit)
 0644                currentEntitiesInScene.Add(entity);
 645        }
 646
 0647        return currentEntitiesInScene;
 648    }
 649
 650    DCLBuilderInWorldEntity SetupEntityToEdit(IDCLEntity entity, bool hasBeenCreated = false)
 651    {
 48652        if (!convertedEntities.ContainsKey(GetConvertedUniqueKeyForEntity(entity)))
 653        {
 47654            DCLBuilderInWorldEntity entityToEdit = entity.gameObject.AddComponent<DCLBuilderInWorldEntity>();
 47655            entityToEdit.Init(entity, editMaterial);
 47656            convertedEntities.Add(entityToEdit.entityUniqueId, entityToEdit);
 47657            entity.OnRemoved += RemoveConvertedEntity;
 47658            entityToEdit.IsNew = hasBeenCreated;
 659
 47660            string entityName = entityToEdit.GetDescriptiveName();
 47661            var catalogItem = entityToEdit.GetCatalogItemAssociated();
 662
 47663            if ((string.IsNullOrEmpty(entityName) || entityNameList.Contains(entityName)) && catalogItem != null)
 664            {
 0665                entityName = GetNewNameForEntity(catalogItem);
 0666                SetEntityName(entityToEdit, entityName);
 0667            }
 47668            else if (!string.IsNullOrEmpty(entityName) && !entityNameList.Contains(entityName))
 669            {
 0670                entityNameList.Add(entityName);
 671            }
 672
 47673            return entityToEdit;
 674        }
 675        else
 676        {
 1677            return convertedEntities[GetConvertedUniqueKeyForEntity(entity)];
 678        }
 679    }
 680
 681    private void ChangeEntityBoundsCheckerStatus(IDCLEntity entity, bool isInsideBoundaries)
 682    {
 0683        var convertedEntity = GetConvertedEntity(entity);
 0684        if (convertedEntity == null)
 0685            return;
 686
 0687        convertedEntity.SetEntityBoundariesError(isInsideBoundaries);
 0688    }
 689
 0690    public string GetNewNameForEntity(CatalogItem sceneObject) { return GetNewNameForEntity(sceneObject.name); }
 691
 692    public string GetNewNameForEntity(string name)
 693    {
 8694        int i = 1;
 8695        if (!entityNameList.Contains(name))
 0696            return name;
 697
 8698        string newName = name + " " + i;
 29699        while (entityNameList.Contains(newName))
 700        {
 21701            i++;
 21702            newName = name + " " + i;
 703        }
 704
 8705        return newName;
 706    }
 707
 708    public void DeleteFloorEntities()
 709    {
 4710        List<DCLBuilderInWorldEntity> entitiesToDelete = new List<DCLBuilderInWorldEntity>();
 711
 22712        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 713        {
 7714            if (entity.isFloor)
 715            {
 4716                entitiesToDelete.Add(entity);
 717            }
 718        }
 719
 16720        foreach (DCLBuilderInWorldEntity entity in entitiesToDelete)
 4721            DeleteEntity(entity, false);
 4722    }
 723
 724    public void DeleteEntity(string entityId)
 725    {
 3726        DCLBuilderInWorldEntity entity = convertedEntities[GetConvertedUniqueKeyForEntity(entityId)];
 3727        DeleteEntity(entity, true);
 3728    }
 729
 2730    public void DeleteEntity(DCLBuilderInWorldEntity entityToDelete) { DeleteEntity(entityToDelete, true); }
 731
 732    public void DeleteEntity(DCLBuilderInWorldEntity entityToDelete, bool checkSelection)
 733    {
 8734        if (entityToDelete.IsSelected && checkSelection)
 0735            DeselectEntity(entityToDelete);
 736
 8737        if (selectedEntities.Contains(entityToDelete))
 738        {
 0739            selectedEntities.Remove(entityToDelete);
 0740            hudController?.UpdateEntitiesSelection(selectedEntities.Count);
 741        }
 742
 8743        string entityName = entityToDelete.GetDescriptiveName();
 744
 8745        if (entityNameList.Contains(entityName))
 4746            entityNameList.Remove(entityName);
 747
 8748        RemoveConvertedEntity(entityToDelete.rootEntity);
 8749        entityToDelete.rootEntity.OnRemoved -= RemoveConvertedEntity;
 8750        entityToDelete.Delete();
 8751        string idToRemove = entityToDelete.rootEntity.entityId;
 8752        OnEntityDeleted?.Invoke(entityToDelete);
 8753        biwCreatorController.RemoveLoadingObjectInmediate(entityToDelete.rootEntity.entityId);
 8754        if (sceneToEdit.entities.ContainsKey(idToRemove))
 8755            sceneToEdit.RemoveEntity(idToRemove, true);
 8756        Destroy(entityToDelete);
 8757        hudController?.RefreshCatalogAssetPack();
 8758        EntityListChanged();
 8759        builderInWorldBridge?.RemoveEntityOnKernel(idToRemove, sceneToEdit);
 0760    }
 761
 762    public void DeleteSingleEntity(DCLBuilderInWorldEntity entityToDelete)
 763    {
 0764        actionController.CreateActionEntityDeleted(entityToDelete);
 0765        DeleteEntity(entityToDelete, true);
 0766    }
 767
 768    public void DeleteSelectedEntities()
 769    {
 1770        List<DCLBuilderInWorldEntity> entitiesToRemove = new List<DCLBuilderInWorldEntity>();
 771
 4772        for (int i = 0; i < selectedEntities.Count; i++)
 773        {
 1774            entitiesToRemove.Add(selectedEntities[i]);
 775        }
 776
 1777        actionController.CreateActionEntityDeleted(entitiesToRemove);
 778
 1779        DeselectEntities();
 780
 4781        foreach (DCLBuilderInWorldEntity entity in entitiesToRemove)
 782        {
 1783            DeleteEntity(entity);
 784        }
 785
 1786        OnDeleteSelectedEntities?.Invoke(entitiesToRemove);
 0787    }
 788
 789    public void DeleteEntitiesOutsideSceneBoundaries()
 790    {
 0791        List<DCLBuilderInWorldEntity> entitiesToRemove = new List<DCLBuilderInWorldEntity>();
 0792        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 793        {
 0794            if (entity.rootEntity.scene == sceneToEdit)
 795            {
 0796                if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityInsideSceneBoundaries(entity.rootEntity))
 797                {
 0798                    entitiesToRemove.Add(entity);
 799                }
 800            }
 801        }
 802
 0803        foreach (DCLBuilderInWorldEntity entity in entitiesToRemove)
 804        {
 0805            DeleteEntity(entity);
 806        }
 0807    }
 808
 809    private void DestroyCollidersForAllEntities()
 810    {
 0811        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 812        {
 0813            entity.DestroyColliders();
 814        }
 0815    }
 816
 94817    private void RemoveConvertedEntity(IDCLEntity entity) { convertedEntities.Remove(GetConvertedUniqueKeyForEntity(enti
 818
 17819    public void NotifyEntityIsCreated(IDCLEntity entity) { builderInWorldBridge?.AddEntityOnKernel(entity, sceneToEdit);
 820
 0821    public void UpdateSmartItemComponentInKernel(DCLBuilderInWorldEntity entityToUpdate) { builderInWorldBridge?.UpdateS
 822
 4823    public void SetEntityName(DCLBuilderInWorldEntity entityToApply, string newName) { SetEntityName(entityToApply, newN
 824
 825    public void SetEntityName(DCLBuilderInWorldEntity entityToApply, string newName, bool sendUpdateToKernel = true)
 826    {
 17827        string currentName = entityToApply.GetDescriptiveName();
 828
 17829        if (currentName == newName)
 0830            return;
 831
 17832        if (entityNameList.Contains(newName))
 8833            newName = GetNewNameForEntity(newName);
 834
 17835        if (entityNameList.Contains(currentName))
 0836            entityNameList.Remove(currentName);
 837
 17838        entityToApply.SetDescriptiveName(newName);
 17839        entityNameList.Add(newName);
 840
 17841        if (sendUpdateToKernel)
 2842            builderInWorldBridge?.ChangedEntityName(entityToApply, sceneToEdit);
 15843    }
 844
 845    private void ChangeEntityVisibilityStatus(DCLBuilderInWorldEntity entityToApply)
 846    {
 0847        entityToApply.ToggleShowStatus();
 0848        if (!entityToApply.IsVisible && selectedEntities.Contains(entityToApply))
 0849            DeselectEntity(entityToApply);
 0850    }
 851
 852    private void ChangeEntityLockStatus(DCLBuilderInWorldEntity entityToApply)
 853    {
 0854        entityToApply.ToggleLockStatus();
 0855        if (entityToApply.IsLocked && selectedEntities.Contains(entityToApply))
 0856            DeselectEntity(entityToApply);
 857
 0858        builderInWorldBridge.ChangeEntityLockStatus(entityToApply, sceneToEdit);
 0859    }
 860
 15861    private string GetConvertedUniqueKeyForEntity(string entityID) { return sceneToEdit.sceneData.id + entityID; }
 862
 120863    private string GetConvertedUniqueKeyForEntity(IDCLEntity entity) { return entity.scene.sceneData.id + entity.entityI
 864
 865    private bool AreAllSelectedEntitiesInsideBoundaries()
 866    {
 0867        foreach (DCLBuilderInWorldEntity entity in selectedEntities)
 868        {
 0869            if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityInsideSceneBoundaries(entity.rootEntity))
 870            {
 0871                return false;
 872            }
 873        }
 874
 0875        return true;
 0876    }
 877
 878    public bool AreAllEntitiesInsideBoundaries()
 879    {
 2880        bool areAllIn = true;
 7881        foreach (DCLBuilderInWorldEntity entity in convertedEntities.Values)
 882        {
 2883            if (!DCL.Environment.i.world.sceneBoundsChecker.IsEntityInsideSceneBoundaries(entity.rootEntity))
 884            {
 1885                areAllIn = false;
 1886                break;
 887            }
 888        }
 889
 2890        return areAllIn;
 891    }
 892}

Methods/Properties

BuilderInWorldEntityHandler()
Start()
Init()
OnInputMouseDown(System.Int32, UnityEngine.Vector3)
OnInputMouseUp(System.Int32, UnityEngine.Vector3)
OnDestroy()
FrameUpdate()
ReportTransform(System.Boolean)
GetSelectedEntityList()
IsAnyEntitySelected()
SetActiveMode(BuilderInWorldMode)
SetMultiSelectionActive(System.Boolean)
EnterEditMode(DCL.Controllers.ParcelScene)
CheckErrorOnEntities()
IsPointerInSelectedEntity()
DeleteSelectedEntitiesInput()
DuplicateSelectedEntitiesInput()
ExitEditMode()
ChangeEntitySelectionFromList(DCLBuilderInWorldEntity)
SelectFromList(DCLBuilderInWorldEntity)
DeselectEntity(DCLBuilderInWorldEntity)
DeselectEntities()
GetEntityOnPointer()
EntityClicked(DCLBuilderInWorldEntity)
ReSelectEntities()
ChangeEntitySelectStatus(DCLBuilderInWorldEntity)
CancelSelection()
ChangeLockStateSelectedEntities()
ShowAllEntities()
ChangeShowStateSelectedEntities()
Select(DCL.Models.IDCLEntity)
SelectEntity(DCLBuilderInWorldEntity, System.Boolean)
GetAllVoxelsEntities()
GetAllEntitiesFromCurrentScene()
GetConvertedEntity(System.String)
GetConvertedEntity(DCL.Models.IDCLEntity)
DuplicateSelectedEntities()
DuplicateEntity(DCLBuilderInWorldEntity)
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(DCLBuilderInWorldEntity)
DeleteEntity(DCLBuilderInWorldEntity, System.Boolean)
DeleteSingleEntity(DCLBuilderInWorldEntity)
DeleteSelectedEntities()
DeleteEntitiesOutsideSceneBoundaries()
DestroyCollidersForAllEntities()
RemoveConvertedEntity(DCL.Models.IDCLEntity)
NotifyEntityIsCreated(DCL.Models.IDCLEntity)
UpdateSmartItemComponentInKernel(DCLBuilderInWorldEntity)
SetEntityName(DCLBuilderInWorldEntity, System.String)
SetEntityName(DCLBuilderInWorldEntity, System.String, System.Boolean)
ChangeEntityVisibilityStatus(DCLBuilderInWorldEntity)
ChangeEntityLockStatus(DCLBuilderInWorldEntity)
GetConvertedUniqueKeyForEntity(System.String)
GetConvertedUniqueKeyForEntity(DCL.Models.IDCLEntity)
AreAllSelectedEntitiesInsideBoundaries()
AreAllEntitiesInsideBoundaries()