/// Called by code that captures save icons without user intervention.
        public void ProgrammaticCaptureSaveIcon(Vector3 pos, Quaternion rot)
        {
            bool wasActive = CameraRig.gameObject.activeSelf;

            CameraRig.gameObject.SetActive(true);
            var state = new SaveIconTool.CameraRigState();

            state.SetLossyTransform(pos, rot);

            var prev = CurrentCameraRigState;

            CurrentCameraRigState = state;

            // TODO XXX: Why is this Render() necessary?
            m_SaveIconScreenshotManager.LeftEye.Render();

            //snapshot the current scene and push it to the preview window
            RenderWrapper wrapper     = m_SaveIconScreenshotManager.gameObject.GetComponent <RenderWrapper>();
            float         ssaaRestore = wrapper.SuperSampling;

            wrapper.SuperSampling = m_superSampling;
            m_SaveIconScreenshotManager.RenderToTexture(
                SaveLoadScript.m_Instance.GetSaveIconRenderTexture());
            // save off camera transform from the position we took the snapshot
            wrapper.SuperSampling    = ssaaRestore;
            m_LastSaveCameraRigState = CurrentCameraRigState;

            CurrentCameraRigState = prev;
            CameraRig.gameObject.SetActive(wasActive);
        }
        override public void UpdateTool()
        {
            base.UpdateTool();

            bool bCanTakePicture = m_CurrentState == State.WaitingForPicture;

            if (bCanTakePicture && !m_EatInput && !m_ToolHidden &&
                InputManager.m_Instance.GetCommandDown(InputManager.SketchCommands.Activate))
            {
                //snapshot the current scene and push it to the preview window
                RenderWrapper wrapper     = m_SaveIconScreenshotManager.gameObject.GetComponent <RenderWrapper>();
                float         ssaaRestore = wrapper.SuperSampling;
                wrapper.SuperSampling = m_superSampling;
                m_SaveIconScreenshotManager.RenderToTexture(
                    SaveLoadScript.m_Instance.GetSaveIconRenderTexture());
                wrapper.SuperSampling = ssaaRestore;

                // save off camera transform from the position we took the snapshot
                m_LastSaveCameraRigState = CurrentCameraRigState;

                AudioManager.m_Instance.PlaySaveSound(InputManager.Brush.m_Position);
                SketchControlsScript.m_Instance.IssueGlobalCommand(SketchControlsScript.GlobalCommands.SaveNew);

                m_CurrentState = State.Off;
                m_RequestExit  = true;
            }
            else if (InputManager.m_Instance.GetCommandDown(InputManager.SketchCommands.MenuContextClick))
            {
                m_RequestExit = true;
            }

            //repeated buzz on wand controller to notify user the dialog has popped up
            if (m_HapticCounterWand < m_HapticCountTotal)
            {
                m_HapticTimerWand -= Time.deltaTime;
                if (m_HapticTimerWand <= 0.0f)
                {
                    ++m_HapticCounterWand;

                    m_HapticTimerWand = m_HapticInterval;
                    InputManager.m_Instance.TriggerHaptics(InputManager.ControllerName.Wand, m_HapticBuzzLength);
                }
            }
            if (m_HapticCounterBrush < m_HapticCountTotal)
            {
                m_HapticTimerBrush -= Time.deltaTime;
                if (m_HapticTimerBrush <= 0.0f)
                {
                    ++m_HapticCounterBrush;

                    m_HapticTimerBrush = m_HapticInterval;
                    InputManager.m_Instance.TriggerHaptics(InputManager.ControllerName.Brush, m_HapticBuzzLength);
                }
            }
        }