Newer
Older
John Schihada
committed
using System;
John Schihada
committed
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using static GadgetManager;
Stefan Richter
committed
using static UIconfig;
public class WorldCursor : MonoBehaviour
{
Marco Zimmer
committed
public string deactivateSnapKey;
Marco Zimmer
committed
public LayerMask snapLayerMask;
public float MaxRange = 10f;
Stefan Richter
committed
private float MaxRange_ = 10f;
public bool useCamCurser = false;
private int whichCheckMouseButton = 1;
private void Awake()
{
//Ignore player and TalkingZone
this.layerMask = ~LayerMask.GetMask("Player", "TalkingZone");
void Start()
{
Cam = Camera.main;
John Schihada
committed
//Set MarkPointMode as the default ActiveToolMode
// ActiveToolMode = ToolMode.ExtraMode;//ToolMode.MarkPointMode;
// CommunicationEvents.ToolModeChangedEvent.Invoke(activeGadget.id);
CultureInfo.CurrentCulture = new CultureInfo("en-US");
public void setLayerMask(int layerMask)
{
this.layerMask = layerMask;
}
Stefan Richter
committed
updateMaxRange();
Cam = Camera.main; //WARN: Should not called every Update;
//************************************************
if (UIconfig.InputManagerVersion == 1)
{
mousePos = Input.mousePosition;
}
if (UIconfig.InputManagerVersion == 2)
{
//mousePos = Mouse.current.position.ReadValue();
mousePos = Input.mousePosition;
}
if (UIconfig.InputManagerVersion == 3)
{
//mousePos = Mouse.current.position.ReadValue();
mousePos = Input.mousePosition;
}
//****************************************************
//Ray ray = useCamCurser ? new Ray(Cam.transform.position, Cam.transform.forward) : Cam.ScreenPointToRay(Input.mousePosition);
Ray ray = useCamCurser ? new Ray(Cam.transform.position, Cam.transform.forward) : Cam.ScreenPointToRay(mousePos);
this.Hit = new RaycastHit();
transform.up = Cam.transform.forward;
transform.position = ray.GetPoint(GlobalBehaviour.GadgetPhysicalDistance);
//************************************************
if (Input.GetButton(this.deactivateSnapKey)
&& UIconfig.InputManagerVersion >= 1 && UIconfig.InputManagerVersion <= 3)
rayCastMask &= ~this.snapLayerMask.value;
//************************************************
Marco Zimmer
committed
Stefan Richter
committed
if (Physics.Raycast(ray, out Hit, MaxRange_, rayCastMask)
|| (MaxRange_ <= GlobalBehaviour.GadgetPhysicalDistance
&& Physics.Raycast(transform.position, Vector3.down, out Hit, GlobalBehaviour.GadgetPhysicalDistance, rayCastMask)))
{
if (UIconfig.InputManagerVersion == 1)
{
Input.GetButton(this.deactivateSnapKey);
}
if ((Hit.collider.transform.CompareTag("SnapZone") || Hit.collider.transform.CompareTag("Selectable"))
&& !deactSnapKey)
if (Hit.transform.TryGetComponent<FactObject>(out var obj)
&& StageStatic.stage.factState[obj.URI] is AbstractLineFact lineFact)
Marco Zimmer
committed
{
PointFact p1 = StageStatic.stage.factState[lineFact.Pid1] as PointFact;
Marco Zimmer
committed
Hit.point = Math3d.ProjectPointOnLine(p1.Point, lineFact.Dir, Hit.point);
}
else
{
Hit.point = Hit.collider.transform.position;
Hit.normal = Vector3.up;
}
transform.up = Hit.normal;
transform.position = Hit.point + .01f * Hit.normal;
//Link to CheckMouseButtonHandler
if (whichCheckMouseButton == 0) { CheckMouseButtons(); }
if (whichCheckMouseButton == 1) { CheckMouseButtons1(); }
Stefan Richter
committed
void updateMaxRange()
{
Stefan Richter
committed
case 2:
UIconfig.interactingRangeMode = InteractingRangeMode.fromObserverView;
break;
case 5:
case 6:
UIconfig.interactingRangeMode = InteractingRangeMode.fromCharacterView;
break;
default:
break;
}
MaxRange_ = UIconfig.interactingRangeMode switch
Stefan Richter
committed
{
InteractingRangeMode.fromObserverView =>
cursorMaxRange_fromObeserverView,
InteractingRangeMode.fromCharacterView or _ =>
MaxRange,
};
Stefan Richter
committed
}
John Schihada
committed
//Check if left Mouse-Button was pressed and handle it
void CheckMouseButtons()
John Schihada
committed
{
if (Input.GetMouseButtonDown(0)
&& !EventSystem.current.IsPointerOverGameObject() //this prevents rays from shooting through ui
&& Hit.transform.gameObject.layer != LayerMask.NameToLayer("Water")) // not allowed to meassure on water
CommunicationEvents.TriggerEvent.Invoke(Hit);
John Schihada
committed
}
//Check if left Mouse-Button was pressed and handle it
//Alternative Version
void CheckMouseButtons1(bool OnSnap = false, bool onLine = false)
{
if (Input.GetMouseButtonDown(0) && checkClickPermission())
{
Stefan Richter
committed
//other Things todo first?
if (Hit.collider.transform.CompareTag("NPC1_text") && nextDialogPlease < 2)
Stefan Richter
committed
{
nextDialogPlease++;
}
//if (EventSystem.current.IsPointerOverGameObject()) return; //this prevents rays from shooting through ui
if (IsPointerOverUIObject()) return; //Needed for Android
Stefan Richter
committed
if (!checkLayerAndTags()) return; // not allowed to meassure on water
//if (Hit.transform.gameObject.layer == LayerMask.NameToLayer("TransparentFX")) return; // not allowed to meassure on TransparentFX
if (!OnSnap)
{
CommunicationEvents.TriggerEvent.Invoke(Hit);
}
else if (GadgetManager.ActiveGadget is Pointer)
{
if (!onLine) Hit.collider.enabled = false;
CommunicationEvents.TriggerEvent.Invoke(Hit);
// CommunicationEvents.SnapEvent.Invoke(Hit);
}
}
}
Stefan Richter
committed
private bool checkLayerAndTags()
=> Hit.transform.gameObject.layer != LayerMask.NameToLayer("Water") // not allowed to meassure on water
&& !Hit.collider.transform.CompareTag("NPC1_text"); // not allowed to meassure on textfields
private bool IsPointerOverUIObject()
{
PointerEventData eventDataCurrentPosition = new(EventSystem.current)
{
position = new Vector2(Input.mousePosition.x, Input.mousePosition.y)
};
List<RaycastResult> results = new();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
return results.Count > 0;
}
public bool checkClickPermission() => true;
//{
// if (UIconfig.CanvasOnOff_Array[14] > 0)
// return true;
// //return false; //todo
// return true;
//}