Example #1
0
            // ---------------------------------------------------------------------------
            #region Get Mouse Position on Grid (with or without snap)
            // ---------------------------------------------------------------------------
            // Converts a position on the grid object into a position snapped to the grid
            public static Vector3 GetPositionOnGridClosestToMousePointer()
            {
                Physics.queriesHitBackfaces = true;

                // Create a ray starting from the current point the mouse is
                Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);

                // Raycast to grid layer
                Visualizer.visualizerOnGrid =
                    Physics.Raycast(ray.origin,
                                    ray.direction,
                                    out RaycastHit hit,
                                    Mathf.Infinity,
                                    theLayerTheGridIsOn);

                // Calculate closest grid position to hit
                float xPos, zPos;

                if (Settings.Data.placement.snapToGrid)
                {
                    xPos = RoundToNearestGridCenter(hit.point.x);
                    zPos = RoundToNearestGridCenter(hit.point.z);
                }
                // Return true position hit
                else
                {
                    xPos = hit.point.x;
                    zPos = hit.point.z;
                }

                // If raycast reached infinity *** Not sure if this will ever happen ***
                if (xPos == Mathf.Infinity || zPos == Mathf.Infinity)
                {
                    // Set position to x=0 z=0
                    xPos = 0;
                    zPos = 0;
                }

                // Calculate current placement position on the grid
                Vector3 placementPosition = new Vector3(xPos, Settings.Data.gui.grid.gridHeight * Settings.Data.gui.grid.yUnitSize, zPos);

                // Calculate placement position by raycast from current placement position
                if (PlacementRaycast.GetUseRaycast())
                {
                    placementPosition = GetRaycastPosition(placementPosition);
                }

                // Return the closest grid position
                return(placementPosition);
            }
Example #2
0
            // Get placement position based on raycast operation
            private static Vector3 GetRaycastPosition(Vector3 placementPosition)
            {
                // Get Raycast Direction
                Vector3 raycastDirection = new Vector3();

                switch (PlacementRaycast.GetDirection())
                {
                case DirectionVector.Down:      raycastDirection = Vector3.down;    break;

                case DirectionVector.Up:        raycastDirection = Vector3.up;      break;

                case DirectionVector.Left:      raycastDirection = Vector3.left;    break;

                case DirectionVector.Right:     raycastDirection = Vector3.right;   break;

                case DirectionVector.Forward:   raycastDirection = Vector3.forward; break;

                case DirectionVector.Back:      raycastDirection = Vector3.back;    break;
                }

                // Create a layer mask that excludes the grid
                int rayCastLayers = ~(1 << Const.Grid.gridLayer | 1 << Const.Placement.visualizerLayer);

                // If Raycast from current placement position is successful
                if (Physics.Raycast(placementPosition + PlacementRaycast.GetStartOffset(),
                                    raycastDirection, out RaycastHit hit, Mathf.Infinity, rayCastLayers))
                {
                    // If the raycast distance did not reach infinity *** Not sure if this will ever happen ***
                    if (hit.point.x != Mathf.Infinity && hit.point.y != Mathf.Infinity && hit.point.z != Mathf.Infinity)
                    {
                        // Get Placement Position from the raycast hit point
                        placementPosition = hit.point;
                    }
                }

                // Return with the Placement Position
                return(placementPosition);
            }