Beispiel #1
0
        public IEnumerator OnPointerHoverFeedbackNotDisplayedOnInvisibles()
        {
            DecentralandEntity entity;
            BoxShape           shape;

            shape = TestHelpers.InstantiateEntityWithShape <BoxShape, BoxShape.Model>(
                scene,
                DCL.Models.CLASS_ID.BOX_SHAPE,
                Vector3.zero,
                out entity,
                new BoxShape.Model()
            {
            });

            TestHelpers.SetEntityTransform(scene, entity, new Vector3(8, 2, 10), Quaternion.identity, new Vector3(3, 3, 3));
            yield return(shape.routine);

            var OnPointerDownModel = new OnPointerDown.Model()
            {
                type = OnPointerDown.NAME,
                uuid = "pointerevent-1"
            };

            var component = TestHelpers.EntityComponentCreate <OnPointerDown, OnPointerDown.Model>(scene, entity,
                                                                                                   OnPointerDownModel, CLASS_ID_COMPONENT.UUID_CALLBACK);

            Assert.IsTrue(component != null);

            yield return(null);

            var cursorController = GameObject.FindObjectOfType <CursorController>();

            // Check cursor shows normal sprite
            Assert.AreEqual(cursorController.cursorImage.sprite, cursorController.normalCursor);

            DCLCharacterController.i.PauseGravity();
            DCLCharacterController.i.SetPosition(new Vector3(8, 1, 7f));

            // Rotate camera towards the interactive object
            cameraController.SetRotation(45, 0, 0);

            yield return(null);

            // Check cursor shows hover sprite
            Assert.AreEqual(cursorController.cursorImage.sprite, cursorController.hoverCursor);

            // Make shape invisible
            TestHelpers.UpdateShape(scene, shape.id, JsonConvert.SerializeObject(
                                        new
            {
                visible = false
            }));

            yield return(null);

            // Check cursor shows normal sprite
            Assert.AreEqual(cursorController.cursorImage.sprite, cursorController.normalCursor);

            DCLCharacterController.i.ResumeGravity();
        }
        public IEnumerator NotLeaveCollidersOnRecycledMeshes()
        {
            // 1. Instantiate entity and add an OnPointerDown component
            string entity1Id = "1";
            var    entity1   = TestHelpers.CreateSceneEntity(scene, entity1Id);

            string onPointerId         = "pointerevent-1";
            var    onPointerEventModel = new OnPointerDown.Model()
            {
                type = OnPointerDown.NAME,
                uuid = onPointerId
            };
            var onPointerDownComponent = TestHelpers.EntityComponentCreate <OnPointerDown, OnPointerDown.Model>(scene, entity1,
                                                                                                                onPointerEventModel, CLASS_ID_COMPONENT.UUID_CALLBACK);

            // 2. Attach a shape
            var shapeModel = new LoadableShape <LoadWrapper_GLTF, LoadableShape.Model> .Model();

            shapeModel.src = TestAssetsUtils.GetPath() + "/GLB/Lantern/Lantern.glb";
            var shapeComponentId = TestHelpers.CreateAndSetShape(scene, entity1Id, DCL.Models.CLASS_ID.GLTF_SHAPE, JsonConvert.SerializeObject(shapeModel));

            LoadWrapper gltfShapeLoader1 = GLTFShape.GetLoaderForEntity(scene.entities[entity1Id]);

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

            yield return(null);

            // 3. Save the mesh GO reference
            Transform shapeInstanceRootTransform = entity1.meshRootGameObject.transform.GetChild(0);

            Debug.Log("saved mesh GO: ", shapeInstanceRootTransform);

            // 4. Remove shape so that it returns to its pool
            entity1.RemoveSharedComponent(typeof(BaseShape));
            yield return(null);

            // 5. Check that the pooled mesh doesn't have the collider children and the onPointerEvent component
            // doesn't have any instantiated collider (since its entity doesn't have a mesh now)
            var childMeshColliders = shapeInstanceRootTransform.GetComponentsInChildren <MeshCollider>(true);

            foreach (MeshCollider collider in childMeshColliders)
            {
                Assert.IsTrue(collider.gameObject.layer != PhysicsLayers.onPointerEventLayer);
            }

            Assert.IsNull(onPointerDownComponent.pointerEventHandler.eventColliders.colliders);
        }
        public IEnumerator NotRecreateCollidersWhenShapeDoesntChange()
        {
            // 1. Instantiate entity and add an OnPointerDown component
            string entityId = "1";
            var    entity   = TestHelpers.CreateSceneEntity(scene, entityId);

            string onPointerId = "pointerevent-1";
            var    model       = new OnPointerDown.Model()
            {
                type = OnPointerDown.NAME,
                uuid = onPointerId
            };
            var onPointerDownComponent = TestHelpers.EntityComponentCreate <OnPointerDown, OnPointerDown.Model>(scene, entity,
                                                                                                                model, CLASS_ID_COMPONENT.UUID_CALLBACK);

            // 2. Attach a shape
            var shapeModel = new LoadableShape <LoadWrapper_GLTF, LoadableShape.Model> .Model();

            shapeModel.src = TestAssetsUtils.GetPath() + "/GLB/Lantern/Lantern.glb";
            var componentId = TestHelpers.CreateAndSetShape(scene, entityId, DCL.Models.CLASS_ID.GLTF_SHAPE, JsonConvert.SerializeObject(shapeModel));

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

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

            var pointerEventColliders = onPointerDownComponent.pointerEventHandler.eventColliders.colliders;

            Assert.IsTrue(pointerEventColliders != null || pointerEventColliders.Length > 0);

            // 3. Change a shape component property conserving the same glb
            shapeModel.visible = false;
            TestHelpers.UpdateShape(scene, componentId, JsonConvert.SerializeObject(shapeModel));
            yield return(null);

            // 4. Check the same colliders were kept
            Assert.IsTrue(pointerEventColliders == onPointerDownComponent.pointerEventHandler.eventColliders.colliders);
        }
        public IEnumerator OnPointerHoverFeedbackIsDisplayedCorrectly()
        {
            IDCLEntity entity;
            BoxShape   shape;

            shape = TestHelpers.InstantiateEntityWithShape <BoxShape, BoxShape.Model>(
                scene,
                DCL.Models.CLASS_ID.BOX_SHAPE,
                Vector3.zero,
                out entity,
                new BoxShape.Model()
            {
            });

            TestHelpers.SetEntityTransform(scene, entity, new Vector3(8, 2, 10), Quaternion.identity, new Vector3(3, 3, 3));
            yield return(shape.routine);

            var OnPointerDownModel = new OnPointerDown.Model()
            {
                type = OnPointerDown.NAME,
                uuid = "pointerevent-1"
            };

            var component = TestHelpers.EntityComponentCreate <OnPointerDown, OnPointerDown.Model>(scene, entity,
                                                                                                   OnPointerDownModel, CLASS_ID_COMPONENT.UUID_CALLBACK);

            Assert.IsTrue(component != null);

            yield return(null);

            var cursorController = GameObject.FindObjectOfType <CursorController>();

            // Check cursor shows normal sprite
            Assert.AreEqual(cursorController.cursorImage.sprite, cursorController.normalCursor);

            DCLCharacterController.i.PauseGravity();
            DCLCharacterController.i.SetPosition(new Vector3(8, 1, 7f));

            var cameraController = GameObject.FindObjectOfType <CameraController>();

            // Rotate camera towards the interactive object
            var cameraRotationPayload = new CameraController.SetRotationPayload()
            {
                x = 45,
                y = 0,
                z = 0
            };

            cameraController.SetRotation(JsonConvert.SerializeObject(cameraRotationPayload, Formatting.None, new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            }));

            yield return(null);

            // Check cursor shows hover sprite
            Assert.AreEqual(cursorController.cursorImage.sprite, cursorController.hoverCursor);

            // Rotate the camera away from the interactive object
            cameraRotationPayload = new CameraController.SetRotationPayload()
            {
                x            = 0,
                y            = 0,
                z            = 0,
                cameraTarget = (DCLCharacterController.i.transform.position - entity.gameObject.transform.position)
            };

            cameraController.SetRotation(JsonConvert.SerializeObject(cameraRotationPayload, Formatting.None, new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            }));

            yield return(null);

            // Check cursor shows normal sprite
            Assert.AreEqual(cursorController.cursorImage.sprite, cursorController.normalCursor);

            DCLCharacterController.i.ResumeGravity();
        }
        public IEnumerator OnPointerHoverFeedbackIsBlockedByUI()
        {
            IDCLEntity entity;
            BoxShape   shape;

            shape = TestHelpers.InstantiateEntityWithShape <BoxShape, BoxShape.Model>(
                scene,
                DCL.Models.CLASS_ID.BOX_SHAPE,
                Vector3.zero,
                out entity,
                new BoxShape.Model()
            {
            });

            TestHelpers.SetEntityTransform(scene, entity, new Vector3(8, 2, 10), Quaternion.identity, new Vector3(3, 3, 3));
            yield return(shape.routine);

            var onPointerDownModel = new OnPointerDown.Model()
            {
                type = OnPointerDown.NAME,
                uuid = "pointerevent-1"
            };
            var component = TestHelpers.EntityComponentCreate <OnPointerDown, OnPointerDown.Model>(scene, entity,
                                                                                                   onPointerDownModel, CLASS_ID_COMPONENT.UUID_CALLBACK);

            Assert.IsTrue(component != null);

            yield return(null);

            DCLCharacterController.i.SetPosition(new Vector3(8, 1, 7f));

            var cameraController = GameObject.FindObjectOfType <CameraController>();

            // Rotate camera towards the interactive object
            cameraController.SetRotation(45, 0, 0);

            yield return(null);

            var hoverCanvasController = InteractionHoverCanvasController.i;

            Assert.IsNotNull(hoverCanvasController);

            // Check hover feedback is enabled
            Assert.IsTrue(hoverCanvasController.canvas.enabled);

            // Put UI in the middle
            UIScreenSpace screenSpaceShape =
                TestHelpers.SharedComponentCreate <UIScreenSpace, UIScreenSpace.Model>(scene,
                                                                                       CLASS_ID.UI_SCREEN_SPACE_SHAPE);

            yield return(screenSpaceShape.routine);

            UIContainerRect uiContainerRectShape =
                TestHelpers.SharedComponentCreate <UIContainerRect, UIContainerRect.Model>(scene,
                                                                                           CLASS_ID.UI_CONTAINER_RECT);

            yield return(uiContainerRectShape.routine);

            yield return(null);

            // Check hover feedback is no longer enabled
            Assert.IsFalse(hoverCanvasController.canvas.enabled);

            DCLCharacterController.i.ResumeGravity();
        }
        public IEnumerator FeedbackIsNotDisplayedOnParent()
        {
            var cursorController = GameObject.FindObjectOfType <CursorController>();

            Assert.IsNotNull(cameraController, "camera is null?");

            // Create parent entity
            IDCLEntity blockingEntity;
            BoxShape   blockingShape = TestHelpers.InstantiateEntityWithShape <BoxShape, BoxShape.Model>(
                scene,
                DCL.Models.CLASS_ID.BOX_SHAPE,
                Vector3.zero,
                out blockingEntity,
                new BoxShape.Model()
            {
            });

            TestHelpers.SetEntityTransform(scene, blockingEntity, new Vector3(3, 3, 3), Quaternion.identity, new Vector3(1, 1, 1));
            yield return(blockingShape.routine);

            // Create target entity for click
            IDCLEntity clickTargetEntity;
            BoxShape   clickTargetShape = TestHelpers.InstantiateEntityWithShape <BoxShape, BoxShape.Model>(
                scene,
                DCL.Models.CLASS_ID.BOX_SHAPE,
                Vector3.zero,
                out clickTargetEntity,
                new BoxShape.Model()
            {
            });

            TestHelpers.SetEntityTransform(scene, clickTargetEntity, new Vector3(0, 0, 5), Quaternion.identity, new Vector3(1, 1, 1));
            yield return(clickTargetShape.routine);

            // Enparent target entity as a child of the blocking entity
            TestHelpers.SetEntityParent(scene, clickTargetEntity, blockingEntity);

            // Set character position and camera rotation
            DCLCharacterController.i.SetPosition(new Vector3(3, 2, 1));
            yield return(null);

            // Create pointer down component and add it to target entity
            string onPointerId        = "pointerevent-1";
            var    OnPointerDownModel = new OnPointerDown.Model()
            {
                type = OnPointerDown.NAME,
                uuid = onPointerId
            };
            var component = TestHelpers.EntityComponentCreate <OnPointerDown, OnPointerDown.Model>(scene, clickTargetEntity,
                                                                                                   OnPointerDownModel, CLASS_ID_COMPONENT.UUID_CALLBACK);

            Assert.IsTrue(component != null);

            // Check if target entity is triggered by looking at the parent entity
            Assert.AreEqual(cursorController.cursorImage.sprite, cursorController.normalCursor);

            // Move character in front of target entity and rotate camera
            DCLCharacterController.i.SetPosition(new Vector3(3, 2, 12));
            cameraController.SetRotation(0, 0, 0, new Vector3(0, 0, -1));

            yield return(null);

            // Check if target entity is triggered when looked at directly
            Assert.AreEqual(cursorController.cursorImage.sprite, cursorController.hoverCursor);
        }