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; }
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; } }
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); }
void ConvertOrientation(ref GlmSharp.vec3 p_vec) => p_vec = -0.001f * p_vec.swizzle.xzy;
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); }
public void SetHandPresence(bool p_presence, GlmSharp.vec3 p_tipPos) { m_handPresence = p_presence; m_tipPositionLocal = p_tipPos; }
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)); }
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; }