Example #1
0
 public void SetWorldTransform(GlmSharp.mat4 p_mat)
 {
     m_position  = (p_mat * GlmSharp.vec4.UnitW).xyz;
     m_rotation  = p_mat.ToQuaternion * ms_rotationOffset;
     m_direction = m_rotation * -GlmSharp.vec3.UnitZ;
     m_position += m_rotation * ms_positionOffset;
 }
Example #2
0
        public void SetHandPresence(Hand p_hand, bool p_state, GlmSharp.vec3 p_tipPos)
        {
            switch (p_hand)
            {
            case Hand.Left:
            {
                m_leftHandOverlay.SetHandPresence(p_state, p_tipPos);

                Valve.VR.HmdMatrix34_t l_matrix = new Valve.VR.HmdMatrix34_t();
                (m_headTransform * GlmSharp.mat4.Translate(p_tipPos)).Convert(ref l_matrix);
                Valve.VR.OpenVR.Overlay.SetOverlayTransformAbsolute(m_leftFingerOverlay, Valve.VR.ETrackingUniverseOrigin.TrackingUniverseRawAndUncalibrated, ref l_matrix);
            }
            break;

            case Hand.Right:
            {
                m_rightHandOverlay.SetHandPresence(p_state, p_tipPos);

                Valve.VR.HmdMatrix34_t l_matrix = new Valve.VR.HmdMatrix34_t();
                (m_headTransform * GlmSharp.mat4.Translate(p_tipPos)).Convert(ref l_matrix);
                Valve.VR.OpenVR.Overlay.SetOverlayTransformAbsolute(m_rightFingerOverlay, Valve.VR.ETrackingUniverseOrigin.TrackingUniverseRawAndUncalibrated, ref l_matrix);
            }
            break;
            }
        }
Example #3
0
        public void Load()
        {
            GlmSharp.vec3 l_point = GlmSharp.vec3.Zero;
            float         l_angle = 0f;

            try
            {
                XmlDocument l_xml = new XmlDocument();
                l_xml.Load("../../resources/settings.xml");
                XmlElement l_rootNode = l_xml["settings"];
                if (l_rootNode != null)
                {
                    for (XmlNode l_node = l_rootNode["setting"]; l_node != null; l_node = l_node.NextSibling)
                    {
                        XmlAttribute l_attribName  = l_node.Attributes?["name"];
                        XmlAttribute l_attribValue = l_node.Attributes?["value"];
                        if ((l_attribName != null) && (l_attribValue != null))
                        {
                            if (l_attribName.Value == "rootOffset")
                            {
                                float[] l_values = l_attribValue.Value.Split().Select(x => float.Parse(x, System.Globalization.CultureInfo.InvariantCulture)).ToArray();
                                if (l_values.Count() >= 3)
                                {
                                    for (int i = 0; i < 3; i++)
                                    {
                                        l_point[i] = l_values[i];
                                    }
                                }
                                continue;
                            }

                            if (l_attribName.Value == "rootAngle")
                            {
                                l_angle = float.Parse(l_attribValue.Value, System.Globalization.CultureInfo.InvariantCulture);
                                continue;
                            }
                        }
                    }
                }
            }
            catch (Exception) { }

            m_rootTransform = GlmSharp.mat4.Translate(l_point) * GlmSharp.mat4.RotateX(l_angle);
        }
Example #4
0
 void ConvertOrientation(ref GlmSharp.vec3 p_vec) => p_vec = -0.001f * p_vec.swizzle.xzy;
Example #5
0
        public void Update(GlmSharp.mat4 p_headTransform)
        {
            // Reset controls
            foreach (ControlButton l_controlButton in m_controlButtons)
            {
                l_controlButton.ResetUpdate();
            }

            GlmSharp.vec3 l_tipPositionGlobal = ((p_headTransform * GlmSharp.mat4.Translate(m_tipPositionLocal)) * GlmSharp.vec4.UnitW).xyz;

            // Update overlays transform
            GlmSharp.mat4 l_matrix = (GlmSharp.mat4.Translate(m_position) * m_rotation.ToMat4);
            l_matrix.Convert(ref m_vrMatrix);
            Valve.VR.OpenVR.Overlay.SetOverlayTransformAbsolute(m_overlay, Valve.VR.ETrackingUniverseOrigin.TrackingUniverseRawAndUncalibrated, ref m_vrMatrix);

            GlmSharp.vec3 l_cursorPosition = ((l_matrix.Inverse * GlmSharp.mat4.Translate(l_tipPositionGlobal)) * GlmSharp.vec4.UnitW).xyz;
            if (m_handPresence && !m_locked && l_cursorPosition.IsInRange(-ms_overlayWidthHalf, ms_overlayWidthHalf) && (l_cursorPosition.z > -0.025f))
            {
                m_cursorShape.FillColor = ((l_cursorPosition.z <= ms_touchDistance) ? ms_touchColor : ms_activeColor);
                m_cursorPlanePosition.x = ((l_cursorPosition.x + ms_overlayWidthHalf) / ms_overlayWidth) * 512f;
                m_cursorPlanePosition.y = ((-l_cursorPosition.y + ms_overlayWidthHalf) / ms_overlayWidth) * 512f;
                m_cursorShape.Position  = new SFML.System.Vector2f(m_cursorPlanePosition.x - 5f, m_cursorPlanePosition.y - 5f);

                if (l_cursorPosition.z <= ms_touchDistance)
                {
                    // Check for axes
                    if (m_thumbstickShape.GetGlobalBounds().Contains(m_cursorPlanePosition.x, m_cursorPlanePosition.y))
                    {
                        m_thumbstickAxisShape.FillColor = (l_cursorPosition.z <= ms_clickDistance ? ms_axisColorClick : ms_axisColorTouch);
                        m_thumbstickAxisShape.Position  = new SFML.System.Vector2f(m_cursorPlanePosition.x - 7.5f, m_cursorPlanePosition.y - 7.5f);

                        GlmSharp.vec2 l_axes = (m_cursorPlanePosition.xy - 145f) / 105f;
                        l_axes.y *= -1f;

                        m_controlButtons[(int)ButtonIndex.Thumbstick].SetState(l_cursorPosition.z <= ms_clickDistance ? ControlButton.ButtonState.Clicked : ControlButton.ButtonState.Touched);
                        m_controlButtons[(int)ButtonIndex.Thumbstick].SetAxes(l_axes);
                    }
                    else
                    {
                        m_controlButtons[(int)ButtonIndex.Thumbstick].SetState(ControlButton.ButtonState.None);
                        m_controlButtons[(int)ButtonIndex.Thumbstick].SetAxes(GlmSharp.vec2.Zero);
                    }

                    if (m_touchpadShape.GetGlobalBounds().Contains(m_cursorPlanePosition.x, m_cursorPlanePosition.y))
                    {
                        m_touchpadAxisShape.FillColor = (l_cursorPosition.z <= ms_clickDistance ? ms_axisColorClick : ms_axisColorTouch);
                        m_touchpadAxisShape.Position  = new SFML.System.Vector2f(m_cursorPlanePosition.x - 7.5f, m_cursorPlanePosition.y - 7.5f);

                        GlmSharp.vec2 l_axes = (m_cursorPlanePosition.xy - new GlmSharp.vec2(145f, 375f)) / 105f;
                        l_axes.y *= -1f;
                        m_controlButtons[(int)ButtonIndex.Touchpad].SetState(l_cursorPosition.z <= ms_clickDistance ? ControlButton.ButtonState.Clicked : ControlButton.ButtonState.Touched);
                        m_controlButtons[(int)ButtonIndex.Touchpad].SetAxes(l_axes);
                    }
                    else
                    {
                        m_controlButtons[(int)ButtonIndex.Touchpad].SetState(ControlButton.ButtonState.None);
                        m_controlButtons[(int)ButtonIndex.Touchpad].SetAxes(GlmSharp.vec2.Zero);
                    }

                    // Check for buttons
                    if (m_buttonA.GetGlobalBounds().Contains(m_cursorPlanePosition.x, m_cursorPlanePosition.y))
                    {
                        m_buttonA.Color = (l_cursorPosition.z <= ms_clickDistance ? ms_axisColorClick : ms_axisColorTouch);
                        m_controlButtons[(int)ButtonIndex.A].SetState((l_cursorPosition.z <= ms_clickDistance) ? ControlButton.ButtonState.Clicked : ControlButton.ButtonState.Touched);
                    }
                    else
                    {
                        m_buttonA.Color = ms_inactiveColor;
                        m_controlButtons[(int)ButtonIndex.A].SetState(ControlButton.ButtonState.None);
                    }

                    if (m_buttonB.GetGlobalBounds().Contains(m_cursorPlanePosition.x, m_cursorPlanePosition.y))
                    {
                        m_buttonB.Color = (l_cursorPosition.z <= ms_clickDistance ? ms_axisColorClick : ms_axisColorTouch);
                        m_controlButtons[(int)ButtonIndex.B].SetState((l_cursorPosition.z <= ms_clickDistance) ? ControlButton.ButtonState.Clicked : ControlButton.ButtonState.Touched);
                    }
                    else
                    {
                        m_buttonB.Color = ms_inactiveColor;
                        m_controlButtons[(int)ButtonIndex.B].SetState(ControlButton.ButtonState.None);
                    }

                    if (m_buttonSystem.GetGlobalBounds().Contains(m_cursorPlanePosition.x, m_cursorPlanePosition.y))
                    {
                        m_buttonSystem.Color = (l_cursorPosition.z <= ms_clickDistance ? ms_axisColorClick : ms_axisColorTouch);
                        m_controlButtons[(int)ButtonIndex.System].SetState((l_cursorPosition.z <= ms_clickDistance) ? ControlButton.ButtonState.Clicked : ControlButton.ButtonState.Touched);
                    }
                    else
                    {
                        m_buttonSystem.Color = ms_inactiveColor;
                        m_controlButtons[(int)ButtonIndex.System].SetState(ControlButton.ButtonState.None);
                    }
                }
                else
                {
                    m_controlButtons[(int)ButtonIndex.Thumbstick].SetState(ControlButton.ButtonState.None);
                    m_controlButtons[(int)ButtonIndex.Thumbstick].SetAxes(GlmSharp.vec2.Zero);
                    m_controlButtons[(int)ButtonIndex.Touchpad].SetState(ControlButton.ButtonState.None);
                    m_controlButtons[(int)ButtonIndex.Touchpad].SetAxes(GlmSharp.vec2.Zero);

                    m_buttonA.Color = ms_inactiveColor;
                    m_controlButtons[(int)ButtonIndex.A].SetState(ControlButton.ButtonState.None);

                    m_buttonB.Color = ms_inactiveColor;
                    m_controlButtons[(int)ButtonIndex.B].SetState(ControlButton.ButtonState.None);

                    m_buttonSystem.Color = ms_inactiveColor;
                    m_controlButtons[(int)ButtonIndex.System].SetState(ControlButton.ButtonState.None);
                }

                // Presure indicator
                float l_presure = 1f - GlmSharp.glm.Clamp(GlmSharp.glm.Clamp(l_cursorPosition.z, 0f, float.MaxValue) / ms_overlayWidthHalf, 0f, 1f);
                m_presureFillRectangle.Size      = new SFML.System.Vector2f(m_presureFillRectangle.Size.X, -320f * l_presure);
                m_presureFillRectangle.FillColor = ((l_presure >= 0.5f) ? ((l_presure >= 0.75f) ? ms_axisColorClick : ms_axisColorTouch) : ms_activeColor);

                m_inRange = true;
            }
            else
            {
                m_inRange = false;
            }

            // Draw
            if (m_renderTexture.SetActive(true))
            {
                m_renderTexture.Clear(ms_emptyColor);
                m_renderTexture.Draw(m_backgroundSprite);
                m_renderTexture.Draw(m_thumbstickShape);
                m_renderTexture.Draw(m_touchpadShape);
                m_renderTexture.Draw(m_buttonA);
                m_renderTexture.Draw(m_buttonB);
                m_renderTexture.Draw(m_buttonSystem);
                m_renderTexture.Draw(m_presureRectangle);

                if (m_inRange)
                {
                    m_renderTexture.Draw(m_presureFillRectangle);
                    m_renderTexture.Draw(m_thumbstickAxisShape);
                    m_renderTexture.Draw(m_touchpadAxisShape);
                    m_renderTexture.Draw(m_cursorShape);
                }

                m_renderTexture.Display();
                m_renderTexture.SetActive(false);
            }

            // Update overlay
            m_rangeOpacity = GlmSharp.glm.Lerp(m_rangeOpacity, m_locked ? 0f : 0.5f, 0.25f);
            m_opacity      = GlmSharp.glm.Lerp(m_opacity, m_inRange ? 1f : m_rangeOpacity, 0.25f);
            Valve.VR.OpenVR.Overlay.SetOverlayTexture(m_overlay, ref m_overlayTexture);
            Valve.VR.OpenVR.Overlay.SetOverlayAlpha(m_overlay, m_opacity);
        }
Example #6
0
 public void SetHandPresence(bool p_presence, GlmSharp.vec3 p_tipPos)
 {
     m_handPresence     = p_presence;
     m_tipPositionLocal = p_tipPos;
 }
Example #7
0
 public static bool IsInRange(this GlmSharp.vec3 p_vec, float p_min, float p_max)
 {
     return(InRange(p_vec.x, p_min, p_max) && InRange(p_vec.y, p_min, p_max) && InRange(p_vec.z, p_min, p_max));
 }
Example #8
0
 public static void Convert(this Leap.Vector p_src, ref GlmSharp.vec3 p_dst)
 {
     p_dst.x = p_src.x;
     p_dst.y = p_src.y;
     p_dst.z = p_src.z;
 }