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()
{
this.layerMask = LayerMask.GetMask("Player", "TalkingZone");
//Ignore player and TalkingZone
this.layerMask = ~this.layerMask;
}
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;
Vector3 mousePos = new Vector3(0, 0, 0);
//************************************************
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);
int rayCastMask = 0;
//************************************************
bool a = false;
if (UIconfig.InputManagerVersion == 1)
{
//print("123 "+ this.deactivateSnapKey); ToggleCurserSnap leftCtrl
if (Input.GetButton(this.deactivateSnapKey))
{
a = true;
}
}
if (UIconfig.InputManagerVersion == 2 || UIconfig.InputManagerVersion == 3)
{
if (Input.GetButton(this.deactivateSnapKey))
{
a = true;
}
}
if (a)
Marco Zimmer
committed
rayCastMask = this.layerMask & ~this.snapLayerMask.value;
else
rayCastMask = this.layerMask;
//************************************************
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)))
{
Boolean deactSnapKey=false;
if (UIconfig.InputManagerVersion == 1)
{
Input.GetButton(this.deactivateSnapKey);
}
Stefan Richter
committed
if ((Hit.collider.transform.CompareTag("SnapZone") || Hit.collider.transform.CompareTag("Selectable"))
Stefan Richter
committed
&& !deactSnapKey )
if (Hit.collider.gameObject.layer == LayerMask.NameToLayer("Ray")
Marco Zimmer
committed
|| Hit.collider.gameObject.layer == LayerMask.NameToLayer("Line"))
{
var id = Hit.collider.gameObject.GetComponent<FactObject>().URI;
Marco Zimmer
committed
AbstractLineFact lineFact = StageStatic.stage.factState[id] as AbstractLineFact;
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.position = Hit.point;
transform.up = Hit.normal;
}
else
{
transform.position = Hit.point;
transform.up = Hit.normal;
transform.position += .01f * Hit.normal;
}
//Link to CheckMouseButtonHandler
if(whichCheckMouseButton==0){ CheckMouseButtons(); }
if(whichCheckMouseButton==1){ CheckMouseButtons1(); }
//for Debugging:
//print("Maus: ");
//print(Cursor.lockState);
Stefan Richter
committed
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
void updateMaxRange()
{
switch (UIconfig.GameplayMode) {
case 2:
UIconfig.interactingRangeMode = InteractingRangeMode.fromObserverView;
break;
case 5:
UIconfig.interactingRangeMode = InteractingRangeMode.fromCharacterView;
break;
case 6:
UIconfig.interactingRangeMode = InteractingRangeMode.fromCharacterView;
break;
default:
break;
}
switch (UIconfig.interactingRangeMode)
{
case InteractingRangeMode.fromCharacterView:
MaxRange_ = MaxRange;
break;
case InteractingRangeMode.fromObserverView:
MaxRange_ = cursorMaxRange_fromObeserverView;
break;
default:
//MaxRange_ = cursorMaxRange_fromFirstPersonView
MaxRange_ = MaxRange;
break;
}
}
John Schihada
committed
//Check if left Mouse-Button was pressed and handle it
void CheckMouseButtons()
John Schihada
committed
{
if (Input.GetMouseButtonDown(0))
{
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);
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)
{
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.GetType() == typeof(UnityEngine.InputSystem.Pointer))
{
if (!onLine) Hit.collider.enabled = false;
CommunicationEvents.TriggerEvent.Invoke(Hit);
// CommunicationEvents.SnapEvent.Invoke(Hit);
}
}
}
Stefan Richter
committed
private bool checkLayerAndTags()
{
if (Hit.transform.gameObject.layer == LayerMask.NameToLayer("Water")) return false; // not allowed to meassure on water
if (Hit.collider.transform.CompareTag("NPC1_text")) return false; // not allowed to meassure on textfields
return true;
}
private bool IsPointerOverUIObject()
{
PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
return results.Count > 0;
}
public bool checkClickPermission()
{
if (UIconfig.CanvasOnOff_Array[14] > 0)
{
return true;
}
//return false; //todo
return true;
}