void SetupBrushUI()
        {
            m_AnnotationPointer = ObjectUtils.CreateGameObjectWithComponent <AnnotationPointer>(rayOrigin, false);
            m_OriginalAnnotationPointerLocalScale = m_AnnotationPointer.transform.localScale;
            var brushSize = m_Preferences.brushSize;

            m_AnnotationPointer.Resize(brushSize);

            var brushSizeUi = this.InstantiateUI(m_BrushSizePrefab, rayOrigin: rayOrigin);

            m_BrushSizeUI = brushSizeUi.GetComponent <BrushSizeUI>();

            var transform = brushSizeUi.transform;
            var scale     = transform.localScale;

            transform.SetParent(alternateMenuOrigin, false);
            transform.localPosition = Vector3.zero;
            transform.localRotation = Quaternion.Euler(-90, 0, 0);
            transform.localScale    = scale;

            m_BrushSizeUI.onValueChanged = value =>
            {
                var sliderValue = Mathf.Lerp(MinBrushSize, MaxBrushSize, value);
                m_Preferences.brushSize = sliderValue;
                m_AnnotationPointer.Resize(sliderValue);
            };
            m_BrushSizeChanged = m_BrushSizeUI.ChangeSliderValue;
        }
        void HandleBrushSize(float value)
        {
            if (m_AnnotationPointer != null)
            {
                var brushSize = m_Preferences.brushSize;
                if (this.GetDeviceType() == DeviceType.Vive) // For vive controllers, use 1:1 touchpad setting.
                {
                    brushSize = Mathf.Lerp(MinBrushSize, MaxBrushSize, (value + 1) / 2f);
                }
                else // For touch and hydra, let the thumbstick gradually modify the width.
                {
                    brushSize += value * Time.unscaledDeltaTime * .1f;
                    brushSize  = Mathf.Clamp(brushSize, MinBrushSize, MaxBrushSize);
                }

                if (m_BrushSizeUI && m_BrushSizeChanged != null)
                {
                    var ratio = Mathf.InverseLerp(MinBrushSize, MaxBrushSize, brushSize);
                    m_BrushSizeChanged(ratio);
                }

                m_AnnotationPointer.Resize(brushSize);
                m_Preferences.brushSize = brushSize;
            }
        }
Beispiel #3
0
        public void ProcessInput(ActionMapInput input, ConsumeControlDelegate consumeControl)
        {
            if (m_Preferences == null)
            {
                return;
            }

            var annotationInput = (AnnotationInput)input;

            var draw = annotationInput.draw;

            var isOverUI = this.IsHoveringOverUI(rayOrigin);

            var isHeld = false;

            var rawInput = draw.rawValue;

            m_SmoothInput.Update(rawInput, Time.smoothDeltaTime);

            // We can only start drawing if we're not over UI
            if (!isOverUI || m_WasDrawing)
            {
                if (m_Preferences.pressureSensitive)
                {
                    var drawInput = Mathf.Lerp(rawInput, m_SmoothInput.predictedValue, m_Preferences.pressureSmoothing);
                    isHeld = drawInput > k_MinDrawStrength;

                    m_DrawStrength = (drawInput - k_MinDrawStrength) * k_DrawPressureScale;
                }
                else
                {
                    isHeld         = draw.isHeld;
                    m_DrawStrength = 1.0f;
                }
            }

            var isPressed  = !m_WasDrawing && isHeld;
            var isReleased = m_WasDrawing && !isHeld;

            m_WasDrawing = isHeld;

            if (primary)
            {
                if (!Mathf.Approximately(annotationInput.changeBrushSize.value, 0))
                {
                    HandleBrushSize(annotationInput.changeBrushSize.value);
                    consumeControl(annotationInput.changeBrushSize);
                    consumeControl(annotationInput.vertical);
                }

                if (isPressed)
                {
                    SetupAnnotation();
                    consumeControl(draw);
                }

                if (isHeld)
                {
                    UpdateAnnotation();
                    consumeControl(draw);
                }

                if (isReleased)
                {
                    FinalizeMesh();
                    consumeControl(draw);
                }

                var brushSize = m_Preferences.brushSize;
                if (isHeld)
                {
                    brushSize *= m_DrawStrength;
                }

                // ProcessInput is called once before Start, so m_AnnotationPointer will be null
                if (m_AnnotationPointer != null)
                {
                    m_AnnotationPointer.Resize(brushSize);
                }
            }

            if (isHeld)
            {
                return;
            }

            if (isOverUI != m_WasOverUI)
            {
                m_WasOverUI = isOverUI;
                this.RestartCoroutine(ref m_AnnotationPointerVisibilityCoroutine, SetAnnotationPointerVisibility(!isOverUI));
                if (isOverUI)
                {
                    this.RemoveRayVisibilitySettings(rayOrigin, this);
                }
                else
                {
                    this.AddRayVisibilitySettings(rayOrigin, this, false, false);
                }
            }
        }