/// <summary> /// Clear the reference objects based on current flag /// </summary> /// <param name="flag"></param> private void ClearReferenceObjects(RefEventStatus flag) { switch (flag) { case RefEventStatus.OFF: break; case RefEventStatus.META_DATA: // Hide the title StartCoroutine(ReferenceMetaDataFade(ChildObjFadeStatus.CLOSE)); break; case RefEventStatus.PREVIEW: // Hide the reference. Flag: ON -> OFF. StartCoroutine(ReferencePreviewFade(ChildObjFadeStatus.CLOSE)); break; case RefEventStatus.FULL_PAPER: // Hide the full paper. StartCoroutine(ReferenceFullPaperFade(ChildObjFadeStatus.CLOSE)); break; case RefEventStatus.VIDEO: // Stop the video. StartCoroutine(PageOrg.VideoFade(VideoObj, ChildObjFadeStatus.CLOSE)); break; default: Debug.Log("unhandled levels:" + RefFlag); break; } }
public void CloseRefDocument() { if (RefFlag == RefEventStatus.FULL_PAPER) { // Close the full paper refAnimationCounter++; StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.CLOSE, RefFlag, refAnimationCounter)); ClearReferenceObjects(RefFlag); RefFlag = RefEventStatus.OFF; GazeGestureManager.Instance.Transition(GazeGestureManager.Instance.NavigationRecognizer); Debug.Log("Fullpaper closed by gesture."); } }
/// <summary> /// /// </summary> /// <param name="newDoc"></param> /// <param name="newRef"></param> /// <param name="normPosX">Normalized position X</param> /// <param name="normPosY">Normalized position Y</param> /// <param name="newRefType"></param> public void UpdateRefEvent(RefEventStatus newRefEvent, string newDoc = "", string newRef = "", float normPosX = 0, float normPosY = 0) { refAnimationCounter++; bool docDiff = (newDoc.Length > 0); bool refDiff = false; if (newRef.Length > 0 && newRef != refFileName) { refFileName = newRef; refDiff = true; if (PageOrganizer.DictDocuments.ContainsKey(refFileName)) { refDoc = PageOrganizer.DictDocuments[refFileName]; } else { refDoc = null; } } // Should update the canvas if the ref changed. bool shouldUpdate = docDiff || refDiff; Debug.Log(string.Format("parsing the events, name:{0}, current status:{1}, new status:{2}", refFileName, RefFlag, newRefEvent)); // Same Ref *Diff Type: if from OFF: open canvas, open new content, else: clear old, keep canvas, and open new content // Diff Ref *Diff Type: if from OFF: open canvas, open new content, else: clear old, modify canvas, open new // Diff Ref Same Type: modify canvas, close&open new // Check the level info from the pen, and update the _refFlag switch (newRefEvent) { case RefEventStatus.OFF: if (RefFlag != RefEventStatus.OFF) { ClearReferenceObjects(RefFlag); // Close (ON -> OFF) StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.CLOSE, RefFlag, refAnimationCounter)); RefFlag = RefEventStatus.OFF; } break; case RefEventStatus.META_DATA: if (RefFlag != RefEventStatus.META_DATA) { if (RefFlag == RefEventStatus.OFF) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.OPEN, newRefEvent, refAnimationCounter, normPosX, normPosY)); } else { ClearReferenceObjects(RefFlag); if (shouldUpdate) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.MODIFY, newRefEvent, refAnimationCounter, normPosX, normPosY)); } } StartCoroutine(ReferenceMetaDataFade(ChildObjFadeStatus.OPEN)); } else if (shouldUpdate) { // level didn't change, but contents changed StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.MODIFY, newRefEvent, refAnimationCounter, normPosX, normPosY)); StartCoroutine(ReferenceMetaDataFade(ChildObjFadeStatus.CLOSE_AND_OPEN)); } RefFlag = RefEventStatus.META_DATA; break; case RefEventStatus.PREVIEW: if (RefFlag != RefEventStatus.PREVIEW) { if (RefFlag == RefEventStatus.OFF) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.OPEN, newRefEvent, refAnimationCounter, normPosX, normPosY)); } else { ClearReferenceObjects(RefFlag); if (shouldUpdate) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.MODIFY, newRefEvent, refAnimationCounter, normPosX, normPosY)); } } StartCoroutine(ReferencePreviewFade(ChildObjFadeStatus.OPEN)); } else if (shouldUpdate) { // level didn't change, but contents changed StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.MODIFY, newRefEvent, refAnimationCounter, normPosX, normPosY)); StartCoroutine(ReferencePreviewFade(ChildObjFadeStatus.CLOSE_AND_OPEN)); } RefFlag = RefEventStatus.PREVIEW; break; case RefEventStatus.FULL_PAPER: if (RefFlag != RefEventStatus.FULL_PAPER) { if (RefFlag == RefEventStatus.OFF) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.OPEN, newRefEvent, refAnimationCounter, normPosX, normPosY)); } else { ClearReferenceObjects(RefFlag); if (shouldUpdate) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.MODIFY, newRefEvent, refAnimationCounter, normPosX, normPosY)); } } StartCoroutine(ReferenceFullPaperFade(ChildObjFadeStatus.OPEN)); } else if (shouldUpdate) { // level didn't change, but contents changed StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.MODIFY, newRefEvent, refAnimationCounter, normPosX, normPosY)); StartCoroutine(ReferenceFullPaperFade(ChildObjFadeStatus.CLOSE_AND_OPEN)); } RefFlag = RefEventStatus.FULL_PAPER; break; case RefEventStatus.VIDEO: if (RefFlag != RefEventStatus.VIDEO) { if (RefFlag == RefEventStatus.OFF) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.OPEN, newRefEvent, refAnimationCounter, normPosX, normPosY)); } else { ClearReferenceObjects(RefFlag); if (shouldUpdate) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.MODIFY, newRefEvent, refAnimationCounter, normPosX, normPosY)); } } if (refDoc != null && refDoc.videoLink.Length > 0) { StartCoroutine(PageOrg.VideoFade(VideoObj, ChildObjFadeStatus.OPEN, refDoc.videoLink)); } } else if (shouldUpdate) { if (refDoc != null && refDoc.videoLink.Length > 0) { StartCoroutine(ReferenceCanvasFade(CanvasFadeStatus.MODIFY, newRefEvent, refAnimationCounter, normPosX, normPosY)); StartCoroutine(PageOrg.VideoFade(VideoObj, ChildObjFadeStatus.CLOSE_AND_OPEN, refDoc.videoLink)); } } RefFlag = RefEventStatus.VIDEO; break; default: // negative values Debug.Log("UpdateRef: negative values: " + newRefEvent); break; } }
//public void Init () //{ // fullPaperGrid = FullPaperObj.GetComponent<HorizontalLayoutGroup>(); // bkgMetaData = MetaDataObj.GetComponent<CanvasGroup>(); // bkgMetaData.alpha = 0; // bkgPreview = PreviewObj.GetComponent<CanvasGroup>(); // bkgPreview.alpha = 0; // bkgFullPaper = FullPaperObj.GetComponent<CanvasGroup>(); // bkgFullPaper.alpha = 0; // VideoObj.SetActive(false); // YouTube Video panel not controlled by UI transparency //} #region Animations (IEnumerator) /// <summary> /// /// </summary> /// <param name="status"></param> /// <param name="newRefStatus"></param> /// <param name="refAnimationCounter"></param> /// <param name="normPosX">Normalized position X</param> /// <param name="normPosY">Normalized position Y</param> /// <returns></returns> private IEnumerator ReferenceCanvasFade(CanvasFadeStatus status, RefEventStatus newRefStatus, int refAnimationCounter, float normPosX = 0, float normPosY = 0) { // While closing, newRef is currRef. While opening or modifying, newRef is new, and _refFlag is old. float currHeight = RefCanvasHeight[(int)newRefStatus]; if (status == CanvasFadeStatus.CLOSE) { for (float i = CANVAS_CLOSE_TIME; i >= 0; i -= Time.deltaTime) { float percentage = i / CANVAS_CLOSE_TIME; gameObject.transform.localScale = Vector3.one * percentage; yield return(null); } } else if (status == CanvasFadeStatus.OPEN) { if (newRefStatus == RefEventStatus.FULL_PAPER) { // Dynamic ones: For full papers, the width currently stores value for single page PreloadRefPages(refFileName); } Vector3 moveUp = Vector3.zero; switch (PenOrganizer.PenControlCode) { case CONTROL_CODE.DEFAULT: //gameObject.transform.SetParent(PageOrg.transform); // Rotate based on view point Vector3 targetVec = PageOrg.CalcTargetEulerAngles(); gameObject.transform.localEulerAngles = targetVec; // Set starting position gameObject.transform.position = PageOrg.CurrDocObj.transform.position; // Move along right (x-axis of AR tag, RIGHT) gameObject.transform.Translate(PageOrg.CurrDocObj.transform.right * (normPosX * PAPER_WIDTH - 0.02f), Space.World); // Move along bottom (y-axis of AR tag, UP) gameObject.transform.Translate(PageOrg.CurrDocObj.transform.up * (normPosY * PAPER_HEIGHT - 0.02f - 0.06f * Mathf.Sin(targetVec.x * Mathf.Deg2Rad)), Space.World); // Set moving direction (world coordinate) moveUp = new Vector3(0, 0.06f * Mathf.Cos(targetVec.x * Mathf.Deg2Rad), 0); break; case CONTROL_CODE.SIDE_BY_SIDE: //gameObject.transform.SetParent(PageOrg.transform); // Flat on surface gameObject.transform.localEulerAngles = new Vector3(90, 0, 0); // Set starting position gameObject.transform.position = PageOrg.CurrDocObj.transform.position; // Move along right (x-axis of AR tag, RIGHT) to side by side gameObject.transform.Translate(PageOrg.CurrDocObj.transform.right * PAPER_WIDTH, Space.World); // Move along bottom (y-axis of AR tag, UP) to lower bottom gameObject.transform.Translate(PageOrg.CurrDocObj.transform.up * PAPER_HEIGHT * 0.65f, Space.World); break; case CONTROL_CODE.VERTICAL: //gameObject.transform.SetParent(PageOrg.transform); gameObject.transform.localEulerAngles = Vector3.zero; // Set starting position gameObject.transform.position = new Vector3(-0.1f, -0.15f, 0.8f); break; case CONTROL_CODE.HUD: //gameObject.transform.SetParent(PageOrg.hololensCamera.transform); gameObject.transform.localEulerAngles = new Vector3(PageOrg.hololensCamera.transform.localEulerAngles.x, PageOrg.hololensCamera.transform.localEulerAngles.y, 0); gameObject.transform.position = PageOrg.hololensCamera.transform.position; gameObject.transform.Translate(PageOrg.hololensCamera.transform.forward * HUD_FORWARD, Space.World); break; } // Scale up, move up for (float i = 0; i <= CANVAS_OPEN_TIME; i += Time.deltaTime) { float percentage = i / CANVAS_OPEN_TIME; if (PenOrganizer.PenControlCode != CONTROL_CODE.HUD) { gameObject.transform.Translate(moveUp * Time.deltaTime / CANVAS_OPEN_TIME, Space.World); } gameObject.transform.localScale = Vector3.one * percentage; yield return(null); } Debug.Log(string.Format("New Opened Reference position:{0}, euler angles:{1}", gameObject.transform.position, gameObject.transform.localEulerAngles)); } else if (status == CanvasFadeStatus.MODIFY) { if (newRefStatus == RefEventStatus.FULL_PAPER) { // Dynamic ones: For full papers, the width currently stores value for single page PreloadRefPages(refFileName); } Vector3 oldPos = gameObject.transform.position; Vector3 posDist = Vector3.zero; switch (PenOrganizer.PenControlCode) { case CONTROL_CODE.DEFAULT: // Rotate the canvas Vector3 targetVec = PageOrg.CalcTargetEulerAngles(); gameObject.transform.localEulerAngles = targetVec; gameObject.transform.position = PageOrg.CurrDocObj.transform.position; // Move along right (x-axis of AR tag, RIGHT) gameObject.transform.Translate(PageOrg.CurrDocObj.transform.right * (normPosX * PAPER_WIDTH - 0.02f), Space.World); // Move along bottom (y-axis of AR tag, UP) gameObject.transform.Translate(PageOrg.CurrDocObj.transform.up * (normPosY * PAPER_HEIGHT - 0.02f - 0.06f * Mathf.Sin(targetVec.x * Mathf.Deg2Rad)), Space.World); // Move up (world) gameObject.transform.Translate(0, 0.06f * Mathf.Cos(targetVec.x * Mathf.Deg2Rad), 0, Space.World); posDist = gameObject.transform.position - oldPos; break; case CONTROL_CODE.SIDE_BY_SIDE: // Set starting position gameObject.transform.position = PageOrg.CurrDocObj.transform.position; // Move along right (x-axis of AR tag, RIGHT) to side by side gameObject.transform.Translate(PageOrg.CurrDocObj.transform.right * PAPER_WIDTH, Space.World); // Move along bottom (y-axis of AR tag, UP) to lower bottom gameObject.transform.Translate(PageOrg.CurrDocObj.transform.up * PAPER_HEIGHT * 0.65f, Space.World); posDist = gameObject.transform.position - oldPos; break; case CONTROL_CODE.HUD: // Directly go to the new place gameObject.transform.localEulerAngles = new Vector3(PageOrg.hololensCamera.transform.localEulerAngles.x, PageOrg.hololensCamera.transform.localEulerAngles.y, 0); gameObject.transform.position = PageOrg.hololensCamera.transform.position; gameObject.transform.Translate(PageOrg.hololensCamera.transform.forward * HUD_FORWARD, Space.World); break; } if (PenOrganizer.PenControlCode != CONTROL_CODE.HUD) { for (float i = 0; i <= CANVAS_OPEN_TIME; i += Time.deltaTime) { float percentage = i / CANVAS_OPEN_TIME; gameObject.transform.position = oldPos + posDist * percentage; //gameObject.transform.localEulerAngles += anglePerSec * Time.deltaTime; yield return(null); } } Debug.Log(string.Format("Modified Reference position:{0}, euler angles:{1}", gameObject.transform.position, gameObject.transform.localEulerAngles)); } }