Skip to content
Snippets Groups Projects
WorldCursor.cs 3.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • using System.Globalization;
    
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.Events;
    
    Richard Marcus's avatar
    Richard Marcus committed
    using UnityEngine.EventSystems;
    
    using static GadgetManager;
    
    
    public class WorldCursor : MonoBehaviour
    {
    
        public RaycastHit Hit;
    
        private int layerMask;
    
        public float MaxRange = 10f;
        public bool useCamCurser = false;
    
    
        private void Awake()
        {
            this.layerMask = LayerMask.GetMask("Player", "TalkingZone");
            //Ignore player and TalkingZone
            this.layerMask = ~this.layerMask;
        }
    
    Richard Marcus's avatar
    Richard Marcus committed
    
    
        void Start()
        {
            Cam = Camera.main;
    
            //Set MarkPointMode as the default ActiveToolMode
    
    Richard Marcus's avatar
    Richard Marcus committed
           // ActiveToolMode = ToolMode.ExtraMode;//ToolMode.MarkPointMode;
    
           // CommunicationEvents.ToolModeChangedEvent.Invoke(activeGadget.id);
    
            CultureInfo.CurrentCulture = new CultureInfo("en-US");
    
        public void setLayerMask(int layerMask) {
            this.layerMask = layerMask;
        }
    
    
            Ray ray = useCamCurser ? new Ray(Cam.transform.position, Cam.transform.forward) : Cam.ScreenPointToRay(Input.mousePosition);
    
            this.Hit = new RaycastHit();
            transform.up = Cam.transform.forward;
            transform.position = ray.GetPoint(GlobalBehaviour.GadgetPhysicalDistance);
    
    Richard Marcus's avatar
    Richard Marcus committed
    
    
            int rayCastMask;
            if (Input.GetButton(this.deactivateSnapKey))
                rayCastMask = this.layerMask & ~this.snapLayerMask.value;
            else
                rayCastMask = this.layerMask;
    
    
            if (Physics.Raycast(ray, out Hit, MaxRange, rayCastMask)
                || (MaxRange <= GlobalBehaviour.GadgetPhysicalDistance 
                && Physics.Raycast(transform.position, Vector3.down, out Hit, GlobalBehaviour.GadgetPhysicalDistance, rayCastMask)))
            {
    
                if ((Hit.collider.transform.CompareTag("SnapZone") || Hit.collider.transform.CompareTag("Selectable")) 
                    && !Input.GetButton(this.deactivateSnapKey))
    
                    if(Hit.collider.gameObject.layer == LayerMask.NameToLayer("Ray")
                        || Hit.collider.gameObject.layer == LayerMask.NameToLayer("Line"))
                    {
    
                        var id = Hit.collider.gameObject.GetComponent<FactObject>().URI;
    
                        AbstractLineFact lineFact = StageStatic.stage.factState[id] as AbstractLineFact;
                        PointFact p1 =  StageStatic.stage.factState[lineFact.Pid1] as PointFact;
    
                        Hit.point = Math3d.ProjectPointOnLine(p1.Point, lineFact.Dir, Hit.point);
    
                    }
                    else
                    {
                        Hit.point = Hit.collider.transform.position;
                        Hit.normal = Vector3.up;
                    }
    
    
                    transform.position = Hit.point;
                    transform.up = Hit.normal;
    
    
                }
                else
                {
                    transform.position = Hit.point;
                    transform.up = Hit.normal;
                    transform.position += .01f * Hit.normal;
                }
    
    
        //Check if left Mouse-Button was pressed and handle it
    
        void CheckMouseButtons()
    
                if (EventSystem.current.IsPointerOverGameObject() //this prevents rays from shooting through ui
                    || Hit.transform.gameObject.layer == LayerMask.NameToLayer("Water")) // not allowed to meassure on water
                    return;
    
                CommunicationEvents.TriggerEvent.Invoke(Hit);
    
    Richard Marcus's avatar
    Richard Marcus committed