//-------------------------------------------------
        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);
        }
Example #9
0
        }                                // 0x0000000180FBEE40-0x0000000180FBF240

        private void UpdateTextHint(ButtonHintInfo hintInfo)
        {
        }                                                               // 0x0000000180FBEA60-0x0000000180FBEE40