using CW.Common; using PaintCore; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; namespace game { [RequireComponent(typeof(CwHitPointers))] public class BrushPointerMouse : CwPointer { public Vector2 Offset { set { offset = value; } get { return offset; } } [SerializeField] private Vector2 offset = Vector2.zero; /// If you enable this, then a paint preview will be shown under the mouse as long as the RequiredKey is not pressed. public bool Preview { set { preview = value; } get { return preview; } } [SerializeField] private bool preview; /// This component will paint while any of the specified mouse buttons or keyboard keys are held. public List Keys { get { if (keys == null) { keys = new List(); } return keys; } } [SerializeField] private List keys; private readonly int PREVIEW_FINGER_INDEX = -1; private readonly int PAINT_FINGER_INDEX = 1; [System.NonSerialized] private bool oldHeld; public bool TryAddKey(KeyCode key) { if (Keys.Contains(key) == false) { keys.Add(key); return true; } return false; } public bool GetKeyHeld() { if (keys != null) { foreach (var key in keys) { if (CwInput.GetKeyIsHeld(key) == true) { return true; } } } return false; } #if UNITY_EDITOR protected virtual void Reset() { if (keys == null) { keys = new List(); } else { keys.Clear(); } keys.Add(KeyCode.Mouse0); } #endif protected virtual void Update() { var newHeld = false; var enablePreview = false; var enablePaint = false; bool isFollowing = false; Vector2 screenPosition = Vector2.zero; if (CwInput.GetMouseExists() == true) { CwInputManager.Finger finger; newHeld = GetKeyHeld(); enablePaint = newHeld == true || oldHeld == true; enablePreview = preview == true && enablePaint == false; Vector2 position = CwInput.GetMousePosition(); position += offset * CwInputManager.ScaleFactor; if (enablePreview == true) { GetFinger(PREVIEW_FINGER_INDEX, position, 1.0f, true, out finger); cachedHitPointers.HandleFingerUpdate(finger, false, false); screenPosition = position; isFollowing = true; } if (enablePaint == true) { if (EventSystem.current == null) return; if (EventSystem.current.IsPointerOverGameObject()) return; var down = GetFinger(PAINT_FINGER_INDEX, position, 1.0f, true, out finger); cachedHitPointers.HandleFingerUpdate(finger, down, newHeld == false); screenPosition = position; isFollowing = true; } } if (isFollowing) FishingYachtAct.Publish(new EventWashingGestureFollowPositionData(screenPosition, true)); else FishingYachtAct.Publish(new EventWashingGestureFollowPositionData(screenPosition, false)); if (enablePreview == false) { TryNullFinger(PREVIEW_FINGER_INDEX); } if (enablePaint == false) { TryNullFinger(PAINT_FINGER_INDEX); } oldHeld = newHeld; } } }