void FindTheARFloorBack()
        {
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;

            DestroyImmediate(placementStateData.arFloor);
            FindTheARFloor();
        }
        void ConfirmARAnchorPoint()
        {
            UIStateManager.current.m_PlacementRules.SetActive(false);
            m_Raycaster.ActiveScanning = false;
            m_Raycaster.DisableCursor();

            // calculate AR anchor point
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;

            PlanePlaneIntersection(out var unusedPoint, out var lineVec, placementStateData.firstARSelectedPlane.transform.up,
                                   placementStateData.firstARSelectedPlane.transform.position,
                                   placementStateData.secondARSelectedPlane.transform.up, placementStateData.secondARSelectedPlane.transform.position);
            // calculate intersect with bottom floor for now
            LinePlaneIntersection(out var anchorPoint, unusedPoint, lineVec, placementStateData.arFloor.transform.up, placementStateData.arFloor.transform.position);
            placementStateData.arPlacementLocation = anchorPoint;
            // calculate beam height
            placementStateData.beamHeight = Math.Max(placementStateData.firstARSelectedPlane.GetComponent <Renderer>().bounds.size.y,
                                                     placementStateData.secondARSelectedPlane.GetComponent <Renderer>().bounds.size.y);

            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetPlacementState, placementStateData));
            ARToolStateData toolState = ARToolStateData.defaultData;

            toolState.navigationEnabled       = false;
            toolState.okEnabled               = true;
            toolState.previousStepEnabled     = true;
            toolState.arWallIndicatorsEnabled = true;
            toolState.arAnchorPointsEnabled   = true;
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetARToolState, toolState));
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetStatusWithType,
                                                            new StatusMessageData()
            {
                text = m_InstructionConfirmARAnchorPoint, type = StatusMessageType.Instruction
            }));
        }
        void FindSecondARWallBack()
        {
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;

            DestroyImmediate(placementStateData.secondARSelectedPlane);
            FindSecondARWall();
        }
        void ConfirmAnchorPointNext()
        {
            // first record the previously selected plane as Wall B
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;
            var info = UIStateManager.current.projectStateData.objectSelectionInfo;

            placementStateData.secondSelectedPlane = info.CurrentSelectedObject().ClonePlaneSurface("secondWall", m_PlaneSelectionMaterial);
            // calculate anchor point position
            var floorContext  = placementStateData.modelFloor.GetComponent <PlaneSelectionContext>().SelectionContextList[0];
            var plane1Context = placementStateData.firstSelectedPlane.GetComponent <PlaneSelectionContext>().SelectionContextList[0];
            var plane2Context = placementStateData.secondSelectedPlane.GetComponent <PlaneSelectionContext>().SelectionContextList[0];

            PlanePlaneIntersection(out var unusedPoint, out var lineVec, plane1Context.SelectedPlane.normal, plane1Context.HitPoint,
                                   plane2Context.SelectedPlane.normal, plane2Context.HitPoint);
            // calculate intersect with bottom floor for now
            LinePlaneIntersection(out var anchorPoint, unusedPoint, lineVec, floorContext.SelectedPlane.normal, floorContext.HitPoint);
            placementStateData.modelPlacementLocation = anchorPoint;
            // calculate beam height
            placementStateData.beamHeight = Math.Max(placementStateData.firstSelectedPlane.GetComponent <Renderer>().bounds.size.y,
                                                     placementStateData.secondSelectedPlane.GetComponent <Renderer>().bounds.size.y);
            // update placement
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetPlacementState, placementStateData));
            var navigationState = UIStateManager.current.stateData.navigationState;

            navigationState.selectionUsageCount--;
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetNavigationState, navigationState));
            ConfirmAnchorPoint();
        }
        void ConfirmARAnchorPointNext()
        {
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;
            var meshObject = m_Raycaster.LastTarget.gameObject.CloneMeshObject("arSecondWall", m_PlaneSelectionMaterial);

            placementStateData.secondARSelectedPlane = meshObject;
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetPlacementState, placementStateData));
            ConfirmARAnchorPoint();
        }
        void FindFirstARWallNext()
        {
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;
            var meshObject = m_Raycaster.LastTarget.gameObject.CloneMeshObject("arFloor");

            placementStateData.arFloor = meshObject;
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetPlacementState, placementStateData));
            FindFirstARWall();
        }
        void FindSecondARWallNext()
        {
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;
            var meshObject = m_Raycaster.LastTarget.gameObject.CloneMeshObject("arFirstWall", m_PlaneSelectionMaterial);

            placementStateData.firstARSelectedPlane = meshObject;
            placementStateData.arPlacementAlignment = m_Raycaster.LastTarget.gameObject.transform.parent.forward;
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetPlacementState, placementStateData));
            FindSecondARWall();
        }
        void FindSecondWallNext()
        {
            // first record the previously selected plane as Wall A
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;
            var info = UIStateManager.current.projectStateData.objectSelectionInfo;

            placementStateData.firstSelectedPlane = info.CurrentSelectedObject().ClonePlaneSurface("firstWall", m_PlaneSelectionMaterial);
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetPlacementState, placementStateData));
            FindSecondWall();
        }
        void FindFirstWallNext()
        {
            // first record the previously selected plane as Mode floor
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;
            var info = UIStateManager.current.projectStateData.objectSelectionInfo;

            placementStateData.modelFloor = info.CurrentSelectedObject().ClonePlaneSurface("modelFloor", m_FloorSelectionMaterial);
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetPlacementState, placementStateData));
            FindFirstWall();
        }
Esempio n. 10
0
        public bool IsValid(ARPlacementStateData placementState, out ModalPopup.ModalPopupData errorMessage)
        {
            errorMessage = default;
            var selected = UIStateManager.current.projectStateData.objectSelectionInfo.CurrentSelectedObject();

            if (selected == null)
            {
                errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
                errorMessage.title = "Selection Error";
                errorMessage.text  = "Select a wall before changing to the next step.";
                return(false);
            }

            var selectedContext = selected.GetComponent <PlaneSelectionContext>();

            if (selectedContext == null)
            {
                errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
                errorMessage.title = "Selection Error";
                errorMessage.text  = "Selected object does not have a Plane Selection Context.";
                return(false);
            }

            var firstPlane = placementState.firstSelectedPlane;

            if (firstPlane == null)
            {
                errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
                errorMessage.title = "Placement Error";
                errorMessage.text  = "Placement State does not have a first plane selected.";
                return(false);
            }
            var firstPlaneContext = firstPlane.GetComponent <PlaneSelectionContext>();

            if (firstPlaneContext == null)
            {
                errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
                errorMessage.title = "Placement Error";
                errorMessage.text  = "First placement plane does not have a Plane Selection Context.";
                return(false);
            }

            var selectedNormal   = Vector3.ProjectOnPlane(selectedContext.LastContext.SelectedPlane.normal, Vector3.up);
            var firstPlaneNormal = Vector3.ProjectOnPlane(firstPlaneContext.LastContext.SelectedPlane.normal, Vector3.up);
            var dot = Mathf.Abs(Vector3.Dot(selectedNormal, firstPlaneNormal));

            if (dot > minPlaneNormalDot)
            {
                errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
                errorMessage.title = "Placement Error";
                errorMessage.text  = "Selected plane is not perpendicular to first plane.";
                return(false);
            }
            return(true);
        }
Esempio n. 11
0
 public UIARStateData(bool arEnabled, InstructionUIState instructionUIState, IInstructionUI currentInstructionUI, int numProxyInstances,
                      int instructionUIStep, bool placementGesturesEnabled, ARToolStateData arToolStateData, ARPlacementStateData placementStateData, ARMode arMode)
 {
     this.arEnabled            = arEnabled;
     this.instructionUIState   = instructionUIState;
     this.currentInstructionUI = currentInstructionUI;
     this.numProxyInstances    = numProxyInstances;
     this.instructionUIStep    = instructionUIStep;
     this.arToolStateData      = arToolStateData;
     this.placementStateData   = placementStateData;
     this.arMode = arMode;
 }
        void FindFirstWallBack()
        {
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;
            ARToolStateData      toolState          = ARToolStateData.defaultData;

            toolState.navigationEnabled     = false;
            toolState.previousStepEnabled   = true;
            toolState.okButtonValidator     = this;
            toolState.wallIndicatorsEnabled = true;
            toolState.anchorPointsEnabled   = false;
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetARToolState, toolState));
            DestroyImmediate(placementStateData.firstSelectedPlane);
            FindFirstWall();
        }
Esempio n. 13
0
 public bool IsValid(ARPlacementStateData placementState, out ModalPopup.ModalPopupData errorMessage)
 {
     errorMessage = default;
     if (placementState.firstSelectedPlane != null)
     {
         var renderer = placementState.firstSelectedPlane.GetComponent <MeshRenderer>();
         if (renderer == null)
         {
             errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
             errorMessage.title = "Placement Error";
             errorMessage.text  = "First placement plane does not have a renderer.";
             return(false);
         }
         if (renderer.bounds.size.magnitude < minBoundsMagnitude)
         {
             errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
             errorMessage.title = "Placement Error";
             errorMessage.text  = "First placement plane model is too small.";
             return(false);
         }
     }
     if (placementState.secondSelectedPlane != null)
     {
         var renderer = placementState.secondSelectedPlane.GetComponent <MeshRenderer>();
         if (renderer == null)
         {
             errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
             errorMessage.title = "Placement Error";
             errorMessage.text  = "Second placement plane does not have a renderer.";
             return(false);
         }
         if (renderer.bounds.size.magnitude < minBoundsMagnitude)
         {
             errorMessage       = UIStateManager.current.popUpManager.GetModalPopUpData();
             errorMessage.title = "Placement Error";
             errorMessage.text  = "Second placement plane model is too small.";
             return(false);
         }
     }
     return(true);
 }
        void FindSecondWallBack()
        {
            ARPlacementStateData placementStateData = UIStateManager.current.arStateData.placementStateData;

            placementStateData.modelPlacementLocation = Vector3.zero;
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetPlacementState, placementStateData));
            var navigationState = UIStateManager.current.stateData.navigationState;

            navigationState.selectionUsageCount++;
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetNavigationState, navigationState));
            ARToolStateData toolState = ARToolStateData.defaultData;

            toolState.navigationEnabled     = false;
            toolState.previousStepEnabled   = true;
            toolState.okButtonValidator     = this;
            toolState.wallIndicatorsEnabled = true;
            toolState.anchorPointsEnabled   = false;
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetARToolState, toolState));
            DestroyImmediate(placementStateData.secondSelectedPlane);
            FindSecondWall();
        }