Exemplo n.º 1
0
        /// <summary>
        /// <see cref="ApplicationState{T}.Enter()"/> implementation.
        /// </summary>
        public override void Enter()
        {
            m_application.Logger.Debug("ApplicationStateScaleModel.Enter()");

            m_application.MaquettePreviewContext.SetActive(true);

            // Disable moving up/down.
            m_application.m_flySpeedUpDown = 0.0f;

            // Enable only R pickray.
            m_application.RPickRay.gameObject.SetActive(true);

            maquetteManipulationMode = ModelManipulationMode.None;

            UpdateModelLocationAndScale();
            UpdateTrackingSpacePosition();
        }
Exemplo n.º 2
0
        /// <summary>
        /// <see cref="ApplicationState{T}.Update()"/> implementation.
        /// </summary>
        public override void Update()
        {
            //WM.Logger.Debug("ApplicationStateScaleModel.Update()");

            UpdateControllerUI();

            if (m_application.ToggleActiveProject())
            {
                return;
            }

            //if (m_application.ToggleImmersionModeIfInputAndNetworkModeAllows())
            //{
            //    return;
            //}

            // Clients cannot toggle model layer visibility!
            if (m_application.NetworkMode != WM.Net.NetworkMode.Client)
            {
                // Toggle model layer visibility using picking.
                if (m_application.m_controllerInput.m_controllerState.rIndexTriggerDown)
                {
                    if (pickedLayer != null)
                    {
                        m_application.SetModelLayerVisible(pickedLayerIndex, !pickedLayer.activeSelf);
                    }
                    else
                    {
                        m_application.UnhideAllModelLayers();
                    }
                }
            }

            // Show name of picked model layer in right control text.
            m_application.m_rightControllerText.text = (pickedLayer == null) ? "" : pickedLayer.name;

            m_application.Fly();

            #region Maquette manipulation.

            // Clients cannot manipulate model!
            if (m_application.NetworkMode != WM.Net.NetworkMode.Client)
            {
                var cs = m_application.m_controllerInput.m_controllerState;

                float magnitudeRotateMaquette    = cs.lThumbStick.x;
                float magnitudeTranslateMaquette = cs.lThumbStick.y;

                #region Update MaquetteManipulationMode

                bool manipulating = (Mathf.Abs(magnitudeRotateMaquette) > 0.1f) || (Mathf.Abs(magnitudeTranslateMaquette) > 0.1f);

                if (maquetteManipulationMode == ModelManipulationMode.None)
                {
                    if (manipulating)
                    {
                        maquetteManipulationMode = (Mathf.Abs(magnitudeRotateMaquette) > Mathf.Abs(magnitudeTranslateMaquette))
                            ? ModelManipulationMode.Rotate
                            : ModelManipulationMode.Translate;
                    }
                    else
                    {
                        maquetteManipulationMode = ModelManipulationMode.None;
                    }
                }
                else
                {
                    if (!manipulating)
                    {
                        maquetteManipulationMode = ModelManipulationMode.None;
                    }
                }

                #endregion

                float positionOffset = _modelOffset;
                float rotationOffset = _modelRotation;

                switch (maquetteManipulationMode)
                {
                case ModelManipulationMode.Translate:
                {
                    positionOffset = Mathf.Clamp(_modelOffset + magnitudeTranslateMaquette * _modelMoveSpeed * Time.deltaTime, -1.0f, 0.6f);
                }
                break;

                case ModelManipulationMode.Rotate:
                {
                    rotationOffset += magnitudeRotateMaquette * _modelRotateSpeed * Time.deltaTime;
                }
                break;
                }

                if (maquetteManipulationMode != ModelManipulationMode.None)
                {
                    var command = new SetModelLocationCommand(positionOffset, rotationOffset);

                    if (m_application.NetworkMode == NetworkMode.Server)
                    {
                        m_application.Server.BroadcastCommand(command);
                    }
                    else
                    {
                        command.Execute(m_application);
                    }
                }
            }

            #endregion

            #region Updated picked model layer

            // Clients cannot pick model layers!
            if (m_application.NetworkMode != NetworkMode.Client)
            {
                var pickRay = m_application.RPickRay.GetRay();

                var hitInfo = new RaycastHit();
                hitInfo.distance = float.NaN;

                pickedLayer = null;

                foreach (var layer in m_application.GetLayers())
                {
                    UtilUnity.PickRecursively(
                        layer.Model,
                        pickRay,
                        layer.Model,
                        ref pickedLayer,
                        ref hitInfo);
                }

                if (pickedLayer == null)
                {
                    pickedLayerIndex = -1;
                }
                else
                {
                    int layerIndex = 0;
                    foreach (var layer in m_application.GetLayers())
                    {
                        if (pickedLayer == layer.Model)
                        {
                            pickedLayerIndex = layerIndex;
                            break;
                        }
                        ++layerIndex;
                    }
                    Debug.Assert(pickedLayerIndex != -1);
                }

                m_application.RPickRay.HitDistance = hitInfo.distance;
            }

            #endregion

            var controllerState = m_application.m_controllerInput.m_controllerState;

            // Pressing 'BackSpace' on the keyboard is a shortcut for returning to the default state.
            var returnToDefaultState = controllerState.lIndexTriggerDown || Input.GetKeyDown(KeyCode.Backspace);

            if (returnToDefaultState)
            {
                m_application.PopApplicationState();
            }
        }