private void CheckOutline()
    {
        if (outlinerOptimizationCounter >= 10 && isOutlineCheckActive)
        {
            if (!BuilderInWorldUtils.IsPointerOverUIElement())
            {
                DCLBuilderInWorldEntity entity = GetEntityOnPointer();
                if (!isMultiSelectionActive)
                {
                    outlinerController.CancelAllOutlines();
                }
                else
                {
                    outlinerController.CancelUnselectedOutlines();
                }

                if (entity != null && !entity.IsSelected)
                {
                    outlinerController.OutlineEntity(entity);
                }
            }

            outlinerOptimizationCounter = 0;
        }
        else
        {
            outlinerOptimizationCounter++;
        }
    }
Exemple #2
0
    private void Awake()
    {
        for (int i = 0; i < shortcutsButtons.Length; i++)
        {
            int buttonIndex = i;
            shortcutsButtons[buttonIndex].onClick.AddListener(() => QuickBarObjectSelected(buttonIndex));
        }

        for (int i = 0; i < shortcutsEventTriggers.Length; i++)
        {
            int triggerIndex = i;
            BuilderInWorldUtils.ConfigureEventTrigger(shortcutsEventTriggers[triggerIndex], EventTriggerType.Drop, (eventData) =>
            {
                SetIndexToDrop(triggerIndex);
                SceneObjectDropped(eventData);
            });
        }

        quickBar1InputAction.OnTriggered += OnQuickBar1InputTriggedered;
        quickBar2InputAction.OnTriggered += OnQuickBar2InputTriggedered;
        quickBar3InputAction.OnTriggered += OnQuickBar3InputTriggedered;
        quickBar4InputAction.OnTriggered += OnQuickBar4InputTriggedered;
        quickBar5InputAction.OnTriggered += OnQuickBar5InputTriggedered;
        quickBar6InputAction.OnTriggered += OnQuickBar6InputTriggedered;
        quickBar7InputAction.OnTriggered += OnQuickBar7InputTriggedered;
        quickBar8InputAction.OnTriggered += OnQuickBar8InputTriggedered;
        quickBar9InputAction.OnTriggered += OnQuickBar9InputTriggedered;
    }
 void RotateSelection(float angleToRotate)
 {
     currentYRotationAdded += angleToRotate;
     editionGO.transform.Rotate(Vector3.up, angleToRotate);
     snapGO.transform.Rotate(Vector3.up, angleToRotate);
     snapGO.transform.rotation = Quaternion.Euler(BuilderInWorldUtils.SnapFilterEulerAngles(snapGO.transform.rotation.eulerAngles, snapRotationDegresFactor));
 }
Exemple #4
0
    private void MouseClick(int buttonID, Vector3 position)
    {
        if (!isEditModeActive)
        {
            return;
        }

        if (Time.timeSinceLevelLoad < nexTimeToReceiveInput)
        {
            return;
        }

        if (!BuilderInWorldUtils.IsPointerOverUIElement())
        {
            HUDController.i.builderInWorldMainHud.HideExtraBtns();
        }

        if (Utils.isCursorLocked || biwModeController.IsGodModeActive())
        {
            if (buttonID == 0)
            {
                MouseClickDetected();
                InputDone();
                return;
            }
            outlinerController.CheckOutline();
        }
    }
Exemple #5
0
    public void LookAtEntity(IDCLEntity entity)
    {
        if (entity.meshRootGameObject == null ||
            entity.meshesInfo == null ||
            BuilderInWorldUtils.IsBoundInsideCamera(entity.meshesInfo.mergedBounds))
        {
            return;
        }

        Vector3 pointToLook = entity.gameObject.transform.position;

        if (entity.meshesInfo.renderers.Length > 0)
        {
            Vector3 midPointFromEntityMesh = Vector3.zero;
            foreach (Renderer render in entity.renderers)
            {
                midPointFromEntityMesh += render.bounds.center;
            }

            midPointFromEntityMesh /= entity.renderers.Length;
            pointToLook             = midPointFromEntityMesh;
        }

        freeCameraController.SmoothLookAt(pointToLook);
    }
Exemple #6
0
 private void Awake()
 {
     mainButton.onClick.AddListener(() => OnPointerClick(dummyActionTrigger));
     toggleCatalogInputAction.OnTriggered += OnPointerClick;
     BuilderInWorldUtils.ConfigureEventTrigger(catalogButtonEventTrigger, EventTriggerType.PointerEnter, (eventData) => OnPointerEnter((PointerEventData)eventData));
     BuilderInWorldUtils.ConfigureEventTrigger(catalogButtonEventTrigger, EventTriggerType.PointerExit, (eventData) => OnPointerExit());
 }
Exemple #7
0
    public void Init()
    {
        if (isInit)
        {
            return;
        }

        isInit = true;

        InitGameObjects();

        HUDConfiguration hudConfig = new HUDConfiguration();

        hudConfig.active  = true;
        hudConfig.visible = false;
        HUDController.i.CreateHudElement <BuildModeHUDController>(hudConfig, HUDController.HUDElementID.BUILDER_IN_WORLD_MAIN);
        HUDController.i.CreateHudElement <BuilderInWorldInititalHUDController>(hudConfig, HUDController.HUDElementID.BUILDER_IN_WORLD_INITIAL);
        HUDController.i.builderInWorldMainHud.Initialize();

        HUDController.i.builderInWorldInititalHud.OnEnterEditMode += TryStartEnterEditMode;
        HUDController.i.builderInWorldMainHud.OnTutorialAction    += StartTutorial;
        HUDController.i.builderInWorldMainHud.OnLogoutAction      += ExitEditMode;

        ConfigureLoadingController();
        InitControllers();

        CommonScriptableObjects.builderInWorldNotNecessaryUIVisibilityStatus.Set(true);

        catalogAsyncOp   = BuilderInWorldUtils.MakeGetCall(BuilderInWorldSettings.BASE_URL_ASSETS_PACK, CatalogReceived);
        isCatalogLoading = true;
        BuilderInWorldNFTController.i.Initialize();
        BuilderInWorldNFTController.i.OnNFTUsageChange += OnNFTUsageChange;
    }
Exemple #8
0
 private void OnDestroy()
 {
     mainButton.onClick.RemoveAllListeners();
     toggleCatalogInputAction.OnTriggered -= OnPointerClick;
     BuilderInWorldUtils.RemoveEventTrigger(catalogButtonEventTrigger, EventTriggerType.PointerEnter);
     BuilderInWorldUtils.RemoveEventTrigger(catalogButtonEventTrigger, EventTriggerType.PointerExit);
 }
Exemple #9
0
    private void EndBoundMultiSelection()
    {
        isDoingSquareMultiSelection = false;
        mousePressed = false;
        freeCameraController.SetCameraCanMove(true);
        List <DCLBuilderInWorldEntity> allEntities = null;

        if (!isVoxelBoundMultiSelection)
        {
            allEntities = builderInWorldEntityHandler.GetAllEntitiesFromCurrentScene();
        }
        else
        {
            allEntities = builderInWorldEntityHandler.GetAllVoxelsEntities();
        }

        foreach (DCLBuilderInWorldEntity entity in allEntities)
        {
            if (entity.isVoxel && !isVoxelBoundMultiSelection)
            {
                continue;
            }
            if (entity.rootEntity.meshRootGameObject && entity.rootEntity.meshesInfo.renderers.Length > 0)
            {
                if (BuilderInWorldUtils.IsWithInSelectionBounds(entity.rootEntity.meshesInfo.mergedBounds.center, lastMousePosition, Input.mousePosition))
                {
                    builderInWorldEntityHandler.SelectEntity(entity);
                }
            }
        }

        outlinerController.SetOutlineCheckActive(true);
        outlinerController.CancelAllOutlines();
    }
    public void SetContent(List <DCLBuilderInWorldEntity> entityList)
    {
        this.entityList = entityList;
        filteredList    = BuilderInWorldUtils.FilterEntitiesBySmartItemComponentAndActions(entityList);

        GenerateEntityDropdownContent();
        SelectedEntity(0);
    }
Exemple #11
0
    public void SetContent(SmartItemActionEvent actionEvent)
    {
        this.actionEvent = actionEvent;
        filteredList     = BuilderInWorldUtils.FilterEntitiesBySmartItemComponentAndActions(actionEvent.entityList);

        GenerateEntityDropdownContent();
        SelectedEntity(0);
    }
Exemple #12
0
    private void Update()
    {
        if (isPlacingNewObject)
        {
            if (!voxelController.IsActive())
            {
                SetEditObjectAtMouse();
            }
            else
            {
                voxelController.SetEditObjectLikeVoxel();
            }
        }
        else if (isSquareMultiSelectionInputActive && isMouseDragging)
        {
            List <DCLBuilderInWorldEntity> allEntities = null;
            if (!isTypeOfBoundSelectionSelected || !isVoxelBoundMultiSelection)
            {
                allEntities = builderInWorldEntityHandler.GetAllEntitiesFromCurrentScene();
            }
            else if (isVoxelBoundMultiSelection)
            {
                allEntities = builderInWorldEntityHandler.GetAllVoxelsEntities();
            }

            foreach (DCLBuilderInWorldEntity entity in allEntities)
            {
                if (entity.isVoxel && !isVoxelBoundMultiSelection && isTypeOfBoundSelectionSelected)
                {
                    continue;
                }
                if (entity.rootEntity.meshRootGameObject && entity.rootEntity.meshesInfo.renderers.Length > 0)
                {
                    if (BuilderInWorldUtils.IsWithInSelectionBounds(entity.rootEntity.meshesInfo.mergedBounds.center, lastMousePosition, Input.mousePosition))
                    {
                        if (!isTypeOfBoundSelectionSelected && !entity.IsLocked)
                        {
                            if (entity.isVoxel)
                            {
                                isVoxelBoundMultiSelection = true;
                            }
                            else
                            {
                                isVoxelBoundMultiSelection = false;
                            }
                            isTypeOfBoundSelectionSelected = true;
                        }

                        outlinerController.OutlineEntity(entity);
                    }
                    else
                    {
                        outlinerController.CancelEntityOutline(entity);
                    }
                }
            }
        }
    }
    public void AddEventAction()
    {
        List <DCLBuilderInWorldEntity> alreadyFilterList = BuilderInWorldUtils.FilterEntitiesBySmartItemComponentAndActions(entitiesList);

        if (alreadyFilterList.Count > 0)
        {
            actionsListView.AddActionEventAdapter(entitiesList);
        }
    }
    public void UndoEditionGOLastStep()
    {
        if (undoGO == null || editionGO == null)
        {
            return;
        }

        BuilderInWorldUtils.CopyGameObjectStatus(undoGO, editionGO, false, false);
    }
Exemple #15
0
 private void OnGUI()
 {
     if (mousePressed && isDoingSquareMultiSelection)
     {
         var rect = BuilderInWorldUtils.GetScreenRect(lastMousePosition, Input.mousePosition);
         BuilderInWorldUtils.DrawScreenRect(rect, new Color(1f, 1f, 1f, 0.5f));
         BuilderInWorldUtils.DrawScreenRectBorder(rect, 1, Color.white);
     }
 }
Exemple #16
0
    private void EndBoundMultiSelection()
    {
        freeCameraController.SetCameraCanMove(true);
        List <DCLBuilderInWorldEntity> allEntities = null;

        if (!isVoxelBoundMultiSelection)
        {
            allEntities = builderInWorldEntityHandler.GetAllEntitiesFromCurrentScene();
        }
        else
        {
            allEntities = builderInWorldEntityHandler.GetAllVoxelsEntities();
        }

        List <DCLBuilderInWorldEntity> selectedInsideBoundsEntities = new List <DCLBuilderInWorldEntity>();
        int alreadySelectedEntities = 0;

        if (!isMultiSelectionActive)
        {
            builderInWorldEntityHandler.DeselectEntities();
        }

        foreach (DCLBuilderInWorldEntity entity in allEntities)
        {
            if ((entity.isVoxel && !isVoxelBoundMultiSelection) ||
                !entity.IsVisible)
            {
                continue;
            }

            if (entity.rootEntity.meshRootGameObject && entity.rootEntity.meshesInfo.renderers.Length > 0)
            {
                if (BuilderInWorldUtils.IsWithInSelectionBounds(entity.rootEntity.meshesInfo.mergedBounds.center, lastMousePosition, Input.mousePosition) &&
                    !entity.IsLocked)
                {
                    if (entity.IsSelected)
                    {
                        alreadySelectedEntities++;
                    }

                    builderInWorldEntityHandler.SelectEntity(entity);
                    selectedInsideBoundsEntities.Add(entity);
                }
            }
        }
        if (selectedInsideBoundsEntities.Count == alreadySelectedEntities && alreadySelectedEntities > 0)
        {
            foreach (DCLBuilderInWorldEntity entity in selectedInsideBoundsEntities)
            {
                builderInWorldEntityHandler.DeselectEntity(entity);
            }
        }

        outlinerController.CancelAllOutlines();
    }
Exemple #17
0
    private void Awake()
    {
        CreateSlotToDrag();

        for (int i = 0; i < shortcutsButtons.Length; i++)
        {
            int buttonIndex = i;
            shortcutsButtons[buttonIndex].onClick.AddListener(() => QuickBarObjectSelected(buttonIndex));
        }

        for (int i = 0; i < shortcutsEventTriggers.Length; i++)
        {
            int triggerIndex = i;

            BuilderInWorldUtils.ConfigureEventTrigger(shortcutsEventTriggers[triggerIndex], EventTriggerType.BeginDrag, (eventData) =>
            {
                BeginDragSlot(triggerIndex);
            });

            BuilderInWorldUtils.ConfigureEventTrigger(shortcutsEventTriggers[triggerIndex], EventTriggerType.Drag, (eventData) =>
            {
                DragSlot(eventData, triggerIndex);
            });

            BuilderInWorldUtils.ConfigureEventTrigger(shortcutsEventTriggers[triggerIndex], EventTriggerType.EndDrag, (eventData) =>
            {
                EndDragSlot(triggerIndex);
            });

            BuilderInWorldUtils.ConfigureEventTrigger(shortcutsEventTriggers[triggerIndex], EventTriggerType.Drop, (eventData) =>
            {
                SetIndexToDrop(triggerIndex);

                if (lastIndexToBeginDrag != -1)
                {
                    SceneObjectDroppedFromQuickBar(lastIndexToBeginDrag, triggerIndex, shortcutsImgs[lastIndexToBeginDrag].image.texture);
                    CancelCurrentDragging();
                }
                else
                {
                    SceneObjectDroppedFromCatalog(eventData);
                }
            });
        }

        quickBar1InputAction.OnTriggered += OnQuickBar1InputTriggedered;
        quickBar2InputAction.OnTriggered += OnQuickBar2InputTriggedered;
        quickBar3InputAction.OnTriggered += OnQuickBar3InputTriggedered;
        quickBar4InputAction.OnTriggered += OnQuickBar4InputTriggedered;
        quickBar5InputAction.OnTriggered += OnQuickBar5InputTriggedered;
        quickBar6InputAction.OnTriggered += OnQuickBar6InputTriggedered;
        quickBar7InputAction.OnTriggered += OnQuickBar7InputTriggedered;
        quickBar8InputAction.OnTriggered += OnQuickBar8InputTriggedered;
        quickBar9InputAction.OnTriggered += OnQuickBar9InputTriggedered;
    }
Exemple #18
0
 private void MouseWheel(float axisValue)
 {
     if (!canInputBeMade)
     {
         return;
     }
     if (!BuilderInWorldUtils.IsPointerOverUIElement())
     {
         OnMouseWheel?.Invoke(axisValue);
     }
 }
Exemple #19
0
    private bool CanDrag()
    {
        if (!canInputBeMade ||
            currentClickIsOnUi ||
            BuilderInWorldUtils.IsPointerOverUIElement())
        {
            return(false);
        }

        return(true);
    }
Exemple #20
0
    public DCLBuilderInWorldEntity DuplicateEntity(DCLBuilderInWorldEntity entityToDuplicate)
    {
        IDCLEntity entity = SceneUtils.DuplicateEntity(sceneToEdit, entityToDuplicate.rootEntity);

        BuilderInWorldUtils.CopyGameObjectStatus(entityToDuplicate.gameObject, entity.gameObject, false, false);
        DCLBuilderInWorldEntity convertedEntity = SetupEntityToEdit(entity);

        NotifyEntityIsCreated(entity);
        EntityListChanged();
        return(convertedEntity);
    }
Exemple #21
0
 private void MouseDrag(int buttonId, Vector3 mousePosition, float axisX, float axisY)
 {
     if (!canInputBeMade)
     {
         return;
     }
     if (!BuilderInWorldUtils.IsPointerOverUIElement())
     {
         OnMouseDrag?.Invoke(buttonId, mousePosition, axisX, axisY);
     }
 }
    public override void SelectedEntity(DCLBuilderInWorldEntity selectedEntity)
    {
        base.SelectedEntity(selectedEntity);

        initialRotation = editionGO.transform.rotation;

        SetObjectIfSnapOrNot();

        currentYRotationAdded = 0;
        BuilderInWorldUtils.CopyGameObjectStatus(editionGO, snapGO, false);
    }
Exemple #23
0
    public DecentralandEntity DuplicateEntity(DCLBuilderInWorldEntity entityToDuplicate)
    {
        DecentralandEntity entity = sceneToEdit.DuplicateEntity(entityToDuplicate.rootEntity);

        BuilderInWorldUtils.CopyGameObjectStatus(entityToDuplicate.gameObject, entity.gameObject, false, false);
        SetupEntityToEdit(entity);

        NotifyEntityIsCreated(entity);
        EntityListChanged();
        return(entity);
    }
    public void SetContent(SmartItemActionEvent actionEvent)
    {
        this.actionEvent = actionEvent;
        filteredList     = BuilderInWorldUtils.FilterEntitiesBySmartItemComponentAndActions(actionEvent.entityList);

        GenerateEntityDropdownContent();
        foreach (DCLBuilderInWorldEntity entity in filteredList)
        {
            GetThumbnail(entity);
        }
        SelectedEntity(entityDropDown.value);
    }
Exemple #25
0
    public IEnumerator SceneObjectFloorObject()
    {
        SceneObject sceneObject = BuilderInWorldUtils.CreateFloorSceneObject();

        LoadParcelScenesMessage.UnityParcelScene data = scene.sceneData;
        data.contents = new List <ContentServerUtils.MappingPair>();
        data.baseUrl  = BuilderInWorldSettings.BASE_URL_CATALOG;

        foreach (KeyValuePair <string, string> content in sceneObject.contents)
        {
            ContentServerUtils.MappingPair mappingPair = new ContentServerUtils.MappingPair();
            mappingPair.file = content.Key;
            mappingPair.hash = content.Value;
            bool found = false;
            foreach (ContentServerUtils.MappingPair mappingPairToCheck in data.contents)
            {
                if (mappingPairToCheck.file == mappingPair.file)
                {
                    found = true;
                    break;
                }
            }

            if (!found)
            {
                data.contents.Add(mappingPair);
            }
        }

        Environment.i.world.sceneController.UpdateParcelScenesExecute(data);


        string entityId = "1";

        TestHelpers.CreateSceneEntity(scene, entityId);

        TestHelpers.CreateAndSetShape(scene, entityId, DCL.Models.CLASS_ID.GLTF_SHAPE, JsonConvert.SerializeObject(
                                          new
        {
            assetId = BuilderInWorldSettings.FLOOR_TEXTURE_VALUE,
            src     = BuilderInWorldSettings.FLOOR_MODEL
        }));;

        LoadWrapper gltfShape = GLTFShape.GetLoaderForEntity(scene.entities[entityId]);

        yield return(new WaitUntil(() => gltfShape.alreadyLoaded));

        Assert.IsTrue(
            scene.entities[entityId].gameObject.GetComponentInChildren <UnityGLTF.InstantiatedGLTFObject>() != null,
            "Floor should be loaded, is the SceneObject not working anymore?");
    }
    public void EnterEditMode()
    {
        BuilderInWorldNFTController.i.ClearNFTs();

        ParcelSettings.VISUAL_LOADING_ENABLED = false;

        inputController.isBuildModeActivate = true;

        FindSceneToEdit();

        sceneToEdit.SetEditMode(true);
        cursorGO.SetActive(false);
        parcelUnityMiddlePoint = BuilderInWorldUtils.CalculateUnityMiddlePoint(sceneToEdit);

        if (HUDController.i.builderInWorldMainHud != null)
        {
            HUDController.i.builderInWorldMainHud.SetVisibility(true);
            HUDController.i.builderInWorldMainHud.SetParcelScene(sceneToEdit);
            HUDController.i.builderInWorldMainHud.RefreshCatalogContent();
            HUDController.i.builderInWorldMainHud.RefreshCatalogAssetPack();
        }

        CommonScriptableObjects.builderInWorldNotNecessaryUIVisibilityStatus.Set(false);

        DCLCharacterController.OnPositionSet += ExitAfterCharacterTeleport;

        StartBiwControllers();
        Environment.i.world.sceneController.ActivateBuilderInWorldEditScene();

        if (IsNewScene())
        {
            SetupNewScene();
            biwFloorHandler.OnAllParcelsFloorLoaded -= OnAllParcelsFloorLoaded;
            biwFloorHandler.OnAllParcelsFloorLoaded += OnAllParcelsFloorLoaded;
        }
        else
        {
            initialLoadingController.Hide();
            inputController.isInputActive = true;
        }

        isBuilderInWorldActivated = true;

        foreach (var groundVisual in groundVisualsGO)
        {
            groundVisual.SetActive(false);
        }
        previousSkyBoxMaterial = RenderSettings.skybox;
        RenderSettings.skybox  = skyBoxMaterial;
    }
    public void EndMultiVoxelSelection()
    {
        List <DCLBuilderInWorldEntity> voxelEntities = builderInWorldEntityHandler.GetAllVoxelsEntities();

        foreach (DCLBuilderInWorldEntity voxelEntity in voxelEntities)
        {
            if (BuilderInWorldUtils.IsWithInSelectionBounds(voxelEntity.gameObject.transform, lastMousePosition, Input.mousePosition))
            {
                builderInWorldEntityHandler.SelectEntity(voxelEntity);
            }
        }
        outlinerController.SetOutlineCheckActive(true);
        outlinerController.CancelAllOutlines();
    }
Exemple #28
0
    private void MouseDown(int buttonId, Vector3 mousePosition)
    {
        lastTimeMouseDown = Time.unscaledTime;
        lastMousePosition = mousePosition;

        if (!canInputBeMade)
        {
            return;
        }
        if (!BuilderInWorldUtils.IsPointerOverUIElement() && !BuilderInWorldUtils.IsPointerOverMaskElement(layerToStopClick))
        {
            OnMouseDown?.Invoke(buttonId, mousePosition);
        }
    }
Exemple #29
0
    private void MouseDown(int buttonId, Vector3 mousePosition)
    {
        lastTimeMouseDown  = Time.unscaledTime;
        lastMousePosition  = mousePosition;
        currentClickIsOnUi = BuilderInWorldUtils.IsPointerOverUIElement();

        if (!canInputBeMade)
        {
            return;
        }
        if (!currentClickIsOnUi)
        {
            OnMouseDown?.Invoke(buttonId, mousePosition);
        }
    }
Exemple #30
0
    public IDCLEntity CreateEntityFromJSON(string entityJson)
    {
        EntityData data = BuilderInWorldUtils.ConvertJSONToEntityData(entityJson);

        IDCLEntity newEntity = sceneToEdit.CreateEntity(data.entityId);


        if (data.transformComponent != null)
        {
            DCLTransform.model.position = data.transformComponent.position;
            DCLTransform.model.rotation = Quaternion.Euler(data.transformComponent.rotation);
            DCLTransform.model.scale    = data.transformComponent.scale;
            sceneToEdit.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, CLASS_ID_COMPONENT.TRANSFORM, DCLTransform.model);
        }

        foreach (ProtocolV2.GenericComponent component in data.components)
        {
            sceneToEdit.EntityComponentCreateOrUpdateWithModel(newEntity.entityId, (CLASS_ID_COMPONENT)component.componentId, component.data);
        }


        foreach (ProtocolV2.GenericComponent component in data.sharedComponents)
        {
            sceneToEdit.SharedComponentAttach(newEntity.entityId, component.classId);
        }


        if (data.nftComponent != null)
        {
            NFTShape nftShape = (NFTShape)sceneToEdit.SharedComponentCreate(data.nftComponent.id, Convert.ToInt32(CLASS_ID.NFT_SHAPE));
            nftShape.model         = new NFTShape.Model();
            nftShape.model.color   = data.nftComponent.color.ToColor();
            nftShape.model.src     = data.nftComponent.src;
            nftShape.model.assetId = data.nftComponent.assetId;

            sceneToEdit.SharedComponentAttach(newEntity.entityId, nftShape.id);
        }

        SetupEntityToEdit(newEntity, true);
        EntityListChanged();

        return(newEntity);
    }