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); }