//------------------------------------------------- private void UpdateTextHint(ButtonHintInfo hintInfo) { Transform playerTransform = player.hmdTransform; Vector3 vDir = playerTransform.position - hintInfo.canvasOffset.position; Quaternion standardLookat = Quaternion.LookRotation(vDir, Vector3.up); Quaternion upsideDownLookat = Quaternion.LookRotation(vDir, playerTransform.up); float flInterp; if (playerTransform.forward.y > 0.0f) { flInterp = Util.RemapNumberClamped(playerTransform.forward.y, 0.6f, 0.4f, 1.0f, 0.0f); } else { flInterp = Util.RemapNumberClamped(playerTransform.forward.y, -0.8f, -0.6f, 1.0f, 0.0f); } hintInfo.canvasOffset.rotation = Quaternion.Slerp(standardLookat, upsideDownLookat, flInterp); Transform lineTransform = hintInfo.line.transform; hintInfo.line.useWorldSpace = false; hintInfo.line.SetPosition(0, lineTransform.InverseTransformPoint(hintInfo.textStartAnchor.position)); hintInfo.line.SetPosition(1, lineTransform.InverseTransformPoint(hintInfo.textEndAnchor.position)); }
//------------------------------------------------- private void ShowText(EVRButtonId button, string text, bool highlightButton = true) { if (buttonHintInfos.ContainsKey(button)) { ButtonHintInfo hintInfo = buttonHintInfos[button]; hintInfo.textHintObject.SetActive(true); hintInfo.textHintActive = true; if (hintInfo.text != null) { hintInfo.text.text = text; } if (hintInfo.textMesh != null) { hintInfo.textMesh.text = text; } UpdateTextHint(hintInfo); if (highlightButton) { ShowButtonHint(button); } renderModel.gameObject.SetActive(true); } }
//------------------------------------------------- private void ShowButtonHint(params EVRButtonId[] buttons) { renderModel.gameObject.SetActive(true); renderModel.GetComponentsInChildren <MeshRenderer>(renderers); for (int i = 0; i < renderers.Count; i++) { Texture mainTexture = renderers[i].material.mainTexture; renderers[i].sharedMaterial = controllerMaterial; renderers[i].material.mainTexture = mainTexture; // This is to poke unity into setting the correct render queue for the model renderers[i].material.renderQueue = controllerMaterial.shader.renderQueue; } for (int i = 0; i < buttons.Length; i++) { if (buttonHintInfos.ContainsKey(buttons[i])) { ButtonHintInfo hintInfo = buttonHintInfos[buttons[i]]; foreach (MeshRenderer renderer in hintInfo.renderers) { if (!flashingRenderers.Contains(renderer)) { flashingRenderers.Add(renderer); } } } } startTime = Time.realtimeSinceStartup; tickCount = 0.0f; }
//------------------------------------------------- private void HideText(EVRButtonId button) { if (buttonHintInfos.ContainsKey(button)) { ButtonHintInfo hintInfo = buttonHintInfos[button]; hintInfo.textHintObject.SetActive(false); hintInfo.textHintActive = false; HideButtonHint(button); } }
//------------------------------------------------- private string GetActiveHintText(EVRButtonId button) { if (buttonHintInfos.ContainsKey(button)) { ButtonHintInfo hintInfo = buttonHintInfos[button]; if (hintInfo.textHintActive) { return(hintInfo.text.text); } } return(string.Empty); }
//------------------------------------------------- private bool IsButtonHintActive(EVRButtonId button) { if (buttonHintInfos.ContainsKey(button)) { ButtonHintInfo hintInfo = buttonHintInfos[button]; foreach (MeshRenderer buttonRenderer in hintInfo.renderers) { if (flashingRenderers.Contains(buttonRenderer)) { return(true); } } } return(false); }
//------------------------------------------------- private void HideButtonHint(params EVRButtonId[] buttons) { Color baseColor = controllerMaterial.GetColor(colorID); for (int i = 0; i < buttons.Length; i++) { if (buttonHintInfos.ContainsKey(buttons[i])) { ButtonHintInfo hintInfo = buttonHintInfos[buttons[i]]; foreach (MeshRenderer renderer in hintInfo.renderers) { renderer.material.color = baseColor; flashingRenderers.Remove(renderer); } } } if (flashingRenderers.Count == 0) { renderModel.gameObject.SetActive(false); } }
//------------------------------------------------- private void CreateAndAddButtonInfo(EVRButtonId buttonID) { Transform buttonTransform = null; List <MeshRenderer> buttonRenderers = new List <MeshRenderer>(); string buttonDebug = "Looking for button: " + buttonID; EVRButtonId searchButtonID = buttonID; if (buttonID == EVRButtonId.k_EButton_Grip && SteamVR.instance.hmd_TrackingSystemName.ToLowerInvariant().Contains("oculus")) { searchButtonID = EVRButtonId.k_EButton_Axis2; } ulong buttonMaskForID = (1ul << (int)searchButtonID); foreach (KeyValuePair <string, ulong> componentButtonMask in componentButtonMasks) { if ((componentButtonMask.Value & buttonMaskForID) == buttonMaskForID) { buttonDebug += "\nFound component: " + componentButtonMask.Key + " " + componentButtonMask.Value; Transform componentTransform = renderModel.FindComponent(componentButtonMask.Key); buttonTransform = componentTransform; buttonDebug += "\nFound componentTransform: " + componentTransform + " buttonTransform: " + buttonTransform; buttonRenderers.AddRange(componentTransform.GetComponentsInChildren <MeshRenderer>()); } } buttonDebug += "\nFound " + buttonRenderers.Count + " renderers for " + buttonID; foreach (MeshRenderer renderer in buttonRenderers) { buttonDebug += "\n\t" + renderer.name; } HintDebugLog(buttonDebug); if (buttonTransform == null) { HintDebugLog("Couldn't find buttonTransform for " + buttonID); return; } ButtonHintInfo hintInfo = new ButtonHintInfo(); buttonHintInfos.Add(buttonID, hintInfo); hintInfo.componentName = buttonTransform.name; hintInfo.renderers = buttonRenderers; //Get the local transform for the button hintInfo.localTransform = buttonTransform.Find(SteamVR_RenderModel.k_localTransformName); OffsetType offsetType = OffsetType.Right; switch (buttonID) { case EVRButtonId.k_EButton_SteamVR_Trigger: { offsetType = OffsetType.Right; } break; case EVRButtonId.k_EButton_ApplicationMenu: { offsetType = OffsetType.Right; } break; case EVRButtonId.k_EButton_System: { offsetType = OffsetType.Right; } break; case Valve.VR.EVRButtonId.k_EButton_Grip: { offsetType = OffsetType.Forward; } break; case Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad: { offsetType = OffsetType.Up; } break; } //Offset for the text end transform switch (offsetType) { case OffsetType.Forward: hintInfo.textEndOffsetDir = hintInfo.localTransform.forward; break; case OffsetType.Back: hintInfo.textEndOffsetDir = -hintInfo.localTransform.forward; break; case OffsetType.Right: hintInfo.textEndOffsetDir = hintInfo.localTransform.right; break; case OffsetType.Up: hintInfo.textEndOffsetDir = hintInfo.localTransform.up; break; } //Create the text hint object Vector3 hintStartPos = hintInfo.localTransform.position + (hintInfo.localTransform.forward * 0.01f); hintInfo.textHintObject = GameObject.Instantiate(textHintPrefab, hintStartPos, Quaternion.identity) as GameObject; hintInfo.textHintObject.name = "Hint_" + hintInfo.componentName + "_Start"; hintInfo.textHintObject.transform.SetParent(textHintParent); hintInfo.textHintObject.layer = gameObject.layer; hintInfo.textHintObject.tag = gameObject.tag; //Get all the relevant child objects hintInfo.textStartAnchor = hintInfo.textHintObject.transform.Find("Start"); hintInfo.textEndAnchor = hintInfo.textHintObject.transform.Find("End"); hintInfo.canvasOffset = hintInfo.textHintObject.transform.Find("CanvasOffset"); hintInfo.line = hintInfo.textHintObject.transform.Find("Line").GetComponent <LineRenderer>(); hintInfo.textCanvas = hintInfo.textHintObject.GetComponentInChildren <Canvas>(); hintInfo.text = hintInfo.textCanvas.GetComponentInChildren <Text>(); hintInfo.textMesh = hintInfo.textCanvas.GetComponentInChildren <TextMesh>(); hintInfo.textHintObject.SetActive(false); hintInfo.textStartAnchor.position = hintStartPos; if (hintInfo.text != null) { hintInfo.text.text = hintInfo.componentName; } if (hintInfo.textMesh != null) { hintInfo.textMesh.text = hintInfo.componentName; } centerPosition += hintInfo.textStartAnchor.position; // Scale hint components to match player size hintInfo.textCanvas.transform.localScale = Vector3.Scale(hintInfo.textCanvas.transform.localScale, player.transform.localScale); hintInfo.textStartAnchor.transform.localScale = Vector3.Scale(hintInfo.textStartAnchor.transform.localScale, player.transform.localScale); hintInfo.textEndAnchor.transform.localScale = Vector3.Scale(hintInfo.textEndAnchor.transform.localScale, player.transform.localScale); hintInfo.line.transform.localScale = Vector3.Scale(hintInfo.line.transform.localScale, player.transform.localScale); }
} // 0x0000000180FBEE40-0x0000000180FBF240 private void UpdateTextHint(ButtonHintInfo hintInfo) { } // 0x0000000180FBEA60-0x0000000180FBEE40