25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

954 lines
38 KiB

  1. using SUISS.Core;
  2. using UnityEngine;
  3. namespace SUISSEngine
  4. {
  5. public class IslandInput : MonoBehaviour
  6. {
  7. private enum FingerPhase
  8. {
  9. Began,
  10. Moved,
  11. Ended
  12. }
  13. private struct Finger
  14. {
  15. public int id;
  16. public FingerPhase phase;
  17. public Vector2 startPosition;
  18. public float startPositionTime;
  19. public Vector2 previousPosition;
  20. public float previousPositionTime;
  21. public Vector2 currentPosition;
  22. public float currentPositionTime;
  23. public Vector2[] velocities;
  24. public int velocityIndex;
  25. public int velocityCount;
  26. public float distance;
  27. public bool hasMoved;
  28. public int lastSeenFrameIndex;
  29. }
  30. private enum State
  31. {
  32. Idle,
  33. Panning,
  34. Pinching,
  35. BuildingPanning
  36. }
  37. private enum CameraAnimation
  38. {
  39. None,
  40. Target,
  41. Deceleration
  42. }
  43. private const int InvalidFingerID = -1;
  44. private const int MouseFingerID = int.MaxValue;
  45. private const float MinMovementDistance = 0.15f;
  46. private const int VelocityBufferSize = 5;
  47. private const float MouseScrollSensitivity = 1.5f;
  48. public IsometricIsland island;
  49. [SerializeField]
  50. private float _maxOrthographicSizeFactorTablet = 0.9f;
  51. [SerializeField]
  52. private float _maxOrthographicSizeFactorPhone = 0.8f;
  53. private bool newTouchDetected;
  54. private bool _hasTouch;
  55. private int fingerCount;
  56. private Finger[] fingers;
  57. private State state;
  58. private int panningFingerID;
  59. private int pinchingFingerID;
  60. private Vector2 buildingPanningOffset;
  61. private int currentFrameIndex;
  62. private CameraAnimation cameraAnimation;
  63. private Vector2 cameraAnimationSource;
  64. private Vector2 cameraAnimationDestination;
  65. private float cameraAnimationStart;
  66. private float cameraAnimationDuration;
  67. private AnimationCurve cameraAnimationCurve;
  68. private Vector2 cameraAnimationVelocity;
  69. private float _maxOrthographicSizeFactor;
  70. private float _minPixelsPerInch;
  71. private float _maxPixelsPerInch;
  72. private int _mouseSkewGauge;
  73. protected bool _activeTouches;
  74. protected bool _activeMouse;
  75. protected virtual void Awake()
  76. {
  77. newTouchDetected = false;
  78. _activeTouches = false;
  79. _activeMouse = false;
  80. fingerCount = 0;
  81. fingers = new Finger[2];
  82. for (int i = 0; i < fingers.Length; i++)
  83. {
  84. fingers[i].id = -1;
  85. fingers[i].velocities = new Vector2[5];
  86. }
  87. state = State.Idle;
  88. panningFingerID = -1;
  89. pinchingFingerID = -1;
  90. _mouseSkewGauge = 0;
  91. cameraAnimation = CameraAnimation.None;
  92. {
  93. _maxOrthographicSizeFactor = _maxOrthographicSizeFactorTablet;
  94. }
  95. _hasTouch = true;
  96. IsometricIsland.IslandLoadedEvent += OnIslandLoadedEvent;
  97. IsometricIsland.IslandUnloadedEvent += OnIslandUnloadedEvent;
  98. if (IsometricIsland.Current != null)
  99. {
  100. OnIslandLoadedEvent(IsometricIsland.Current);
  101. }
  102. }
  103. protected virtual void OnDestroy()
  104. {
  105. IsometricIsland.IslandLoadedEvent -= OnIslandLoadedEvent;
  106. IsometricIsland.IslandUnloadedEvent -= OnIslandUnloadedEvent;
  107. }
  108. protected void OnIslandLoadedEvent(IsometricIsland island)
  109. {
  110. this.island = island;
  111. UpdateMinMaxPerInch();
  112. SetInitialCameraBounds();
  113. }
  114. protected void OnIslandUnloadedEvent()
  115. {
  116. island = null;
  117. CameraAnimation cameraAnimation = this.cameraAnimation;
  118. if (cameraAnimation == CameraAnimation.Target || cameraAnimation == CameraAnimation.Deceleration)
  119. {
  120. this.cameraAnimation = CameraAnimation.None;
  121. if (SingletonMonobehaviour<FPSLimiter>.IsAvailable)
  122. {
  123. SingletonMonobehaviour<FPSLimiter>.Instance.PopUnlimitedFPSRequest(this);
  124. }
  125. }
  126. }
  127. protected virtual void Update()
  128. {
  129. currentFrameIndex++;
  130. if (ShouldProcessInput())
  131. {
  132. ProcessInput();
  133. }
  134. if (cameraAnimation == CameraAnimation.Target)
  135. {
  136. Camera islandCamera = island.islandCamera;
  137. Vector3 position = islandCamera.transform.position;
  138. float num = cameraAnimationCurve.Evaluate(Time.realtimeSinceStartup);
  139. if (num >= 1f)
  140. {
  141. position.x = cameraAnimationDestination.x;
  142. position.y = cameraAnimationDestination.y;
  143. cameraAnimation = CameraAnimation.None;
  144. SingletonMonobehaviour<FPSLimiter>.Instance.PopUnlimitedFPSRequest(this);
  145. }
  146. else
  147. {
  148. position.x = cameraAnimationSource.x + (cameraAnimationDestination.x - cameraAnimationSource.x) * num;
  149. position.y = cameraAnimationSource.y + (cameraAnimationDestination.y - cameraAnimationSource.y) * num;
  150. }
  151. islandCamera.transform.position = position;
  152. }
  153. if (!_activeTouches && cameraAnimation == CameraAnimation.Deceleration)
  154. {
  155. Camera islandCamera2 = island.islandCamera;
  156. float num2 = Time.realtimeSinceStartup - cameraAnimationStart;
  157. float num3 = Mathf.Pow(0.05f, num2);
  158. Vector3 extents = island.islandWorldBounds.extents;
  159. float num4 = extents.y / islandCamera2.orthographicSize;
  160. cameraAnimationVelocity *= num3;
  161. float num5 = Mathf.Sqrt(cameraAnimationVelocity.x * cameraAnimationVelocity.x + cameraAnimationVelocity.y * cameraAnimationVelocity.y);
  162. Vector3 position2 = islandCamera2.transform.position;
  163. position2.x += cameraAnimationVelocity.x / num4 * num2;
  164. position2.y += cameraAnimationVelocity.y / num4 * num2;
  165. islandCamera2.transform.position = position2;
  166. RestrictCameraToBounds();
  167. if (num5 < 10f)
  168. {
  169. cameraAnimation = CameraAnimation.None;
  170. SingletonMonobehaviour<FPSLimiter>.Instance.PopUnlimitedFPSRequest(this);
  171. }
  172. else
  173. {
  174. cameraAnimationStart = Time.realtimeSinceStartup;
  175. }
  176. }
  177. else if (newTouchDetected)
  178. {
  179. CancelCameraAnimation();
  180. }
  181. }
  182. public void SetInitialCameraBounds()
  183. {
  184. island.islandCamera.orthographicSize = island.preferedInitialZoomLevel;
  185. CenterViewOn(GetInitialCameraPosition(), animated: false);
  186. RestrictCameraToBounds();
  187. }
  188. public void RestrictCameraToBounds()
  189. {
  190. Camera islandCamera = island.islandCamera;
  191. float num = islandCamera.orthographicSize * 2f * island.pixelsPerUnit / islandCamera.pixelRect.height * island.dpi;
  192. if (num < _minPixelsPerInch)
  193. {
  194. islandCamera.orthographicSize = _minPixelsPerInch * islandCamera.pixelRect.height / (2f * island.pixelsPerUnit * island.dpi);
  195. }
  196. else if (num > _maxPixelsPerInch)
  197. {
  198. islandCamera.orthographicSize = _maxPixelsPerInch * islandCamera.pixelRect.height / (2f * island.pixelsPerUnit * island.dpi);
  199. }
  200. Bounds islandWorldBounds = island.islandWorldBounds;
  201. Vector3 position = islandCamera.transform.position;
  202. float num2 = position.x - islandCamera.orthographicSize * islandCamera.aspect;
  203. Vector3 min = islandWorldBounds.min;
  204. if (num2 < min.x)
  205. {
  206. Vector3 min2 = islandWorldBounds.min;
  207. position.x = min2.x + islandCamera.orthographicSize * islandCamera.aspect;
  208. }
  209. float num3 = position.y - islandCamera.orthographicSize;
  210. Vector3 min3 = islandWorldBounds.min;
  211. if (num3 < min3.y)
  212. {
  213. Vector3 min4 = islandWorldBounds.min;
  214. position.y = min4.y + islandCamera.orthographicSize;
  215. }
  216. float num4 = position.x + islandCamera.orthographicSize * islandCamera.aspect;
  217. Vector3 max = islandWorldBounds.max;
  218. if (num4 > max.x)
  219. {
  220. float num5 = islandCamera.orthographicSize * islandCamera.aspect;
  221. Vector3 extents = islandWorldBounds.extents;
  222. if (num5 > extents.x)
  223. {
  224. Vector3 center = islandWorldBounds.center;
  225. position.x = center.x;
  226. }
  227. else
  228. {
  229. Vector3 max2 = islandWorldBounds.max;
  230. position.x = max2.x - islandCamera.orthographicSize * islandCamera.aspect;
  231. }
  232. }
  233. float num6 = position.y + islandCamera.orthographicSize;
  234. Vector3 max3 = islandWorldBounds.max;
  235. if (num6 > max3.y)
  236. {
  237. float orthographicSize = islandCamera.orthographicSize;
  238. Vector3 extents2 = islandWorldBounds.extents;
  239. if (orthographicSize > extents2.y)
  240. {
  241. Vector3 center2 = islandWorldBounds.center;
  242. position.y = center2.y;
  243. }
  244. else
  245. {
  246. Vector3 max4 = islandWorldBounds.max;
  247. position.y = max4.y - islandCamera.orthographicSize;
  248. }
  249. }
  250. islandCamera.transform.position = position;
  251. }
  252. public void CenterViewOn(GridIndex index, bool animated)
  253. {
  254. GridPoint point = new GridPoint(index);
  255. point.u += 0.5f;
  256. point.v += 0.5f;
  257. CenterViewOn(point, animated);
  258. }
  259. public void CenterViewOn(GridPoint point, bool animated)
  260. {
  261. Vector2 target = (Vector2)island.grid.transform.position + island.grid.GetPositionForGridPoint(point);
  262. CenterViewOn(target, animated);
  263. }
  264. public void CenterViewOn(GameObject gameObject, bool animated)
  265. {
  266. SpriteRenderer component = gameObject.GetComponent<SpriteRenderer>();
  267. if (component == null)
  268. {
  269. CenterViewOn(gameObject.transform.position, animated);
  270. }
  271. else
  272. {
  273. CenterViewOn(component.bounds.center, animated);
  274. }
  275. }
  276. public void CenterViewOn(Vector2 target, bool animated)
  277. {
  278. if (state != 0)
  279. {
  280. return;
  281. }
  282. Camera islandCamera = island.islandCamera;
  283. Bounds islandWorldBounds = island.islandWorldBounds;
  284. Vector2 vector = default(Vector2);
  285. vector.x = islandCamera.orthographicSize * islandCamera.aspect;
  286. vector.y = islandCamera.orthographicSize;
  287. float x = vector.x;
  288. Vector3 extents = islandWorldBounds.extents;
  289. if (x > extents.x)
  290. {
  291. Vector3 center = islandWorldBounds.center;
  292. target.x = center.x;
  293. }
  294. else
  295. {
  296. float num = target.x - vector.x;
  297. Vector3 min = islandWorldBounds.min;
  298. if (num < min.x)
  299. {
  300. Vector3 min2 = islandWorldBounds.min;
  301. target.x = min2.x + vector.x;
  302. }
  303. else
  304. {
  305. float num2 = target.x + vector.x;
  306. Vector3 max = islandWorldBounds.max;
  307. if (num2 > max.x)
  308. {
  309. Vector3 max2 = islandWorldBounds.max;
  310. target.x = max2.x - vector.x;
  311. }
  312. }
  313. }
  314. float y = vector.y;
  315. Vector3 extents2 = islandWorldBounds.extents;
  316. if (y > extents2.y)
  317. {
  318. Vector3 center2 = islandWorldBounds.center;
  319. target.y = center2.y;
  320. }
  321. else
  322. {
  323. float num3 = target.y - vector.y;
  324. Vector3 min3 = islandWorldBounds.min;
  325. if (num3 < min3.y)
  326. {
  327. Vector3 min4 = islandWorldBounds.min;
  328. target.y = min4.y + vector.y;
  329. }
  330. else
  331. {
  332. float num4 = target.y + vector.y;
  333. Vector3 max3 = islandWorldBounds.max;
  334. if (num4 > max3.y)
  335. {
  336. Vector3 max4 = islandWorldBounds.max;
  337. target.y = max4.y - vector.y;
  338. }
  339. }
  340. }
  341. if (animated)
  342. {
  343. cameraAnimationSource = islandCamera.transform.position;
  344. cameraAnimationDestination = target;
  345. cameraAnimationStart = Time.realtimeSinceStartup;
  346. cameraAnimationDuration = 0.5f;
  347. cameraAnimationCurve = AnimationCurve.EaseInOut(cameraAnimationStart, 0f, cameraAnimationStart + cameraAnimationDuration, 1f);
  348. cameraAnimationCurve.preWrapMode = WrapMode.ClampForever;
  349. cameraAnimationCurve.postWrapMode = WrapMode.ClampForever;
  350. cameraAnimation = CameraAnimation.Target;
  351. SingletonMonobehaviour<FPSLimiter>.Instance.PushUnlimitedFPSRequest(this);
  352. }
  353. else
  354. {
  355. Vector3 position = islandCamera.transform.position;
  356. position.x = target.x;
  357. position.y = target.y;
  358. islandCamera.transform.position = position;
  359. }
  360. }
  361. public void CancelCameraAnimation()
  362. {
  363. cameraAnimation = CameraAnimation.None;
  364. SingletonMonobehaviour<FPSLimiter>.Instance.PopUnlimitedFPSRequest(this);
  365. }
  366. protected virtual bool ShouldProcessInput()
  367. {
  368. return true;
  369. }
  370. protected void ProcessInput()
  371. {
  372. ProcessTouches();
  373. ProcessMouse();
  374. ProcessFingers();
  375. EndFingers();
  376. }
  377. protected virtual bool HandleTapAt(Vector2 position)
  378. {
  379. if (island == null || island.islandCamera == null)
  380. {
  381. return false;
  382. }
  383. Vector2 vector = island.islandCamera.ScreenToWorldPoint(position);
  384. if (island.builder != null && (island.builder.isBuilding || island.builder.isBuildingRoad))
  385. {
  386. if (island.builder.isBuildingRoad && island.grid != null)
  387. {
  388. GridIndex index = island.grid.ConvertIslandCoordinateToGridIndex(vector);
  389. if (index.isInvalid)
  390. {
  391. return false;
  392. }
  393. island.builder.UpdateRoad(index);
  394. return true;
  395. }
  396. return false;
  397. }
  398. GameObject closestGameObjectAt = GetClosestGameObjectAt(vector);
  399. if (island.destroyer != null && island.destroyer.isSelecting && island.grid != null)
  400. {
  401. Building building = null;
  402. if (closestGameObjectAt != null)
  403. {
  404. building = closestGameObjectAt.GetComponent<Building>();
  405. }
  406. if (building != null)
  407. {
  408. island.destroyer.ClickedBuilding(building);
  409. return true;
  410. }
  411. GridIndex index2 = island.grid.ConvertIslandCoordinateToGridIndex(vector);
  412. if (!index2.isInvalid)
  413. {
  414. GridElement gridElement = island.grid[index2];
  415. if (gridElement != null && gridElement.Tile != null)
  416. {
  417. Road component = gridElement.Tile.GetComponent<Road>();
  418. if (component != null)
  419. {
  420. island.destroyer.ClickedRoad(component);
  421. return true;
  422. }
  423. building = gridElement.Tile.GetComponent<Building>();
  424. if (building != null)
  425. {
  426. island.destroyer.ClickedBuilding(building);
  427. return true;
  428. }
  429. }
  430. }
  431. }
  432. else if (closestGameObjectAt != null)
  433. {
  434. Clickable component2 = closestGameObjectAt.GetComponent<Clickable>();
  435. if (component2 != null)
  436. {
  437. component2.OnClick(component2.gameObject);
  438. return true;
  439. }
  440. }
  441. else if (island.builder != null && island.grid != null)
  442. {
  443. GridIndex index3 = island.grid.ConvertIslandCoordinateToGridIndex(vector);
  444. if (!index3.isInvalid)
  445. {
  446. GridElement gridElement2 = island.grid[index3];
  447. if (gridElement2 != null)
  448. {
  449. GridTile tile = gridElement2.Tile;
  450. if (tile != null)
  451. {
  452. Clickable component3 = tile.GetComponent<Clickable>();
  453. if (component3 != null)
  454. {
  455. component3.OnClick(tile.gameObject);
  456. return true;
  457. }
  458. }
  459. }
  460. }
  461. }
  462. Boid.RunAwayFrom(island.grid.ConvertIslandCoordinateToGridIndex(vector));
  463. return false;
  464. }
  465. protected GameObject GetClosestGameObjectAt(Vector2 position)
  466. {
  467. SpriteRenderer spriteRenderer = null;
  468. GameObject result = null;
  469. Collider2D[] array = Physics2D.OverlapPointAll(position);
  470. foreach (Collider2D collider2D in array)
  471. {
  472. SpriteRenderer componentInChildren = collider2D.GetComponentInChildren<SpriteRenderer>();
  473. if (componentInChildren == null)
  474. {
  475. return collider2D.gameObject;
  476. }
  477. if (spriteRenderer == null || componentInChildren.sortingOrder > spriteRenderer.sortingOrder)
  478. {
  479. spriteRenderer = componentInChildren;
  480. result = collider2D.gameObject;
  481. }
  482. }
  483. return result;
  484. }
  485. protected virtual float GetInitialCameraPPI()
  486. {
  487. return (_minPixelsPerInch + _maxPixelsPerInch) / 2f;
  488. }
  489. protected virtual Vector2 GetInitialCameraPosition()
  490. {
  491. return island.preferedInitialPosition;
  492. }
  493. private void ProcessTouches()
  494. {
  495. newTouchDetected = false;
  496. _activeTouches = false;
  497. if (UnityEngine.Input.touchCount > 0)
  498. {
  499. Touch[] touches = Input.touches;
  500. Touch[] array = touches;
  501. Vector2 vector = default(Vector2);
  502. for (int i = 0; i < array.Length; i++)
  503. {
  504. Touch touch = array[i];
  505. int num = -1;
  506. if (touch.phase == TouchPhase.Began)
  507. {
  508. newTouchDetected = true;
  509. _activeTouches = true;
  510. if (fingerCount < fingers.Length && island.islandCamera.pixelRect.Contains(touch.position))
  511. {
  512. num = fingerCount;
  513. fingers[num].id = touch.fingerId;
  514. fingers[num].phase = FingerPhase.Began;
  515. fingers[num].startPosition = touch.position;
  516. fingers[num].startPositionTime = Time.realtimeSinceStartup;
  517. fingers[num].previousPosition = touch.position;
  518. fingers[num].previousPositionTime = Time.realtimeSinceStartup;
  519. fingers[num].hasMoved = false;
  520. fingers[num].velocityIndex = -1;
  521. fingers[num].velocityCount = 0;
  522. fingerCount++;
  523. }
  524. }
  525. else if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)
  526. {
  527. num = IndexOfFingerID(touch.fingerId);
  528. if (num >= 0)
  529. {
  530. fingers[num].phase = FingerPhase.Ended;
  531. }
  532. }
  533. else
  534. {
  535. _activeTouches = true;
  536. num = IndexOfFingerID(touch.fingerId);
  537. }
  538. if (num < 0)
  539. {
  540. continue;
  541. }
  542. fingers[num].lastSeenFrameIndex = currentFrameIndex;
  543. fingers[num].currentPosition = touch.position;
  544. fingers[num].currentPositionTime = Time.realtimeSinceStartup;
  545. fingers[num].distance = (fingers[num].currentPosition - fingers[num].startPosition).magnitude;
  546. if (!fingers[num].hasMoved && fingers[num].distance > 0.15f * island.dpi)
  547. {
  548. fingers[num].hasMoved = true;
  549. if (fingers[num].phase == FingerPhase.Began)
  550. {
  551. fingers[num].phase = FingerPhase.Moved;
  552. }
  553. }
  554. float num2 = fingers[num].currentPositionTime - fingers[num].previousPositionTime;
  555. if (num2 > 0f)
  556. {
  557. vector.x = (fingers[num].currentPosition.x - fingers[num].previousPosition.x) / num2;
  558. vector.y = (fingers[num].currentPosition.y - fingers[num].previousPosition.y) / num2;
  559. fingers[num].velocityIndex = (fingers[num].velocityIndex + 1) % 5;
  560. fingers[num].velocities[fingers[num].velocityIndex] = vector;
  561. if (fingers[num].velocityCount < 5)
  562. {
  563. fingers[num].velocityCount++;
  564. }
  565. }
  566. }
  567. }
  568. if (!_hasTouch)
  569. {
  570. return;
  571. }
  572. for (int j = 0; j < fingerCount; j++)
  573. {
  574. if (fingers[j].id != int.MaxValue && currentFrameIndex - fingers[j].lastSeenFrameIndex > 0)
  575. {
  576. fingers[j].phase = FingerPhase.Ended;
  577. }
  578. }
  579. }
  580. private void ProcessMouse()
  581. {
  582. _activeMouse = false;
  583. if (_activeTouches || newTouchDetected)
  584. {
  585. return;
  586. }
  587. int num = -1;
  588. if (Input.GetMouseButtonDown(0))
  589. {
  590. SingletonMonobehaviour<FPSLimiter>.Instance.PushUnlimitedFPSRequest(this);
  591. if (fingerCount < fingers.Length && island.islandCamera.pixelRect.Contains(UnityEngine.Input.mousePosition))
  592. {
  593. _mouseSkewGauge++;
  594. num = fingerCount;
  595. fingers[num].id = int.MaxValue;
  596. fingers[num].phase = FingerPhase.Began;
  597. fingers[num].startPosition = UnityEngine.Input.mousePosition;
  598. fingers[num].startPositionTime = Time.realtimeSinceStartup;
  599. fingers[num].previousPosition = UnityEngine.Input.mousePosition;
  600. fingers[num].previousPositionTime = Time.realtimeSinceStartup;
  601. fingers[num].hasMoved = false;
  602. fingers[num].velocityIndex = -1;
  603. fingers[num].velocityCount = 0;
  604. fingerCount++;
  605. _activeMouse = true;
  606. }
  607. }
  608. if (Input.GetMouseButtonUp(0))
  609. {
  610. SingletonMonobehaviour<FPSLimiter>.Instance.PopUnlimitedFPSRequest(this);
  611. num = IndexOfFingerID(int.MaxValue);
  612. if (num >= 0)
  613. {
  614. _mouseSkewGauge--;
  615. fingers[num].phase = FingerPhase.Ended;
  616. }
  617. _activeMouse = false;
  618. }
  619. else if (Input.GetMouseButton(0))
  620. {
  621. num = IndexOfFingerID(int.MaxValue);
  622. _activeMouse = true;
  623. }
  624. else if (_mouseSkewGauge != 0)
  625. {
  626. _mouseSkewGauge = 0;
  627. num = IndexOfFingerID(int.MaxValue);
  628. if (num < 0)
  629. {
  630. UnityEngine.Debug.LogError("fingerIndex of MouseFingerID < 0");
  631. }
  632. else
  633. {
  634. fingers[num].phase = FingerPhase.Ended;
  635. }
  636. }
  637. Vector2 mouseScrollDelta = Input.mouseScrollDelta;
  638. float y = mouseScrollDelta.y;
  639. if (!Mathf.Approximately(0f, y))
  640. {
  641. Vector3 size = island.islandWorldBounds.size;
  642. float num2 = size.y * 0.5f;
  643. float num3 = island.islandCamera.orthographicSize / num2;
  644. float num4 = y * 1.5f * Time.unscaledDeltaTime;
  645. num3 -= num4;
  646. island.islandCamera.orthographicSize = num3 * num2;
  647. RestrictCameraToBounds();
  648. }
  649. if (num < 0)
  650. {
  651. return;
  652. }
  653. fingers[num].currentPosition = UnityEngine.Input.mousePosition;
  654. fingers[num].currentPositionTime = Time.realtimeSinceStartup;
  655. fingers[num].distance = (fingers[num].currentPosition - fingers[num].startPosition).magnitude;
  656. if (!fingers[num].hasMoved && fingers[num].distance >= 0.120000005f * island.dpi)
  657. {
  658. fingers[num].hasMoved = true;
  659. if (fingers[num].phase == FingerPhase.Began)
  660. {
  661. fingers[num].phase = FingerPhase.Moved;
  662. }
  663. }
  664. }
  665. private void ProcessFingers()
  666. {
  667. Camera islandCamera = island.islandCamera;
  668. bool flag = false;
  669. for (int i = 0; i < fingerCount; i++)
  670. {
  671. if (fingers[i].phase == FingerPhase.Moved)
  672. {
  673. switch (state)
  674. {
  675. case State.Idle:
  676. CancelCameraAnimation();
  677. state = State.Panning;
  678. SingletonMonobehaviour<FPSLimiter>.Instance.PushUnlimitedFPSRequest(this);
  679. panningFingerID = fingers[i].id;
  680. if (island.grid != null && island.builder != null && island.builder.isBuilding)
  681. {
  682. GameObject closestGameObjectAt = GetClosestGameObjectAt(islandCamera.ScreenToWorldPoint(fingers[i].startPosition));
  683. GridTile component;
  684. if (closestGameObjectAt != null && (component = closestGameObjectAt.GetComponent<GridTile>()) != null && component == island.builder.currentTile)
  685. {
  686. state = State.BuildingPanning;
  687. buildingPanningOffset = (Vector2)islandCamera.ScreenToWorldPoint(fingers[i].startPosition) - ((Vector2)component.grid.transform.position + component.element.Origin + new Vector2(0f, island.grid.elementSize.y * 0.5f));
  688. }
  689. }
  690. break;
  691. case State.Panning:
  692. if (fingers[i].id != panningFingerID)
  693. {
  694. state = State.Pinching;
  695. SingletonMonobehaviour<FPSLimiter>.Instance.PushUnlimitedFPSRequest(this);
  696. pinchingFingerID = fingers[i].id;
  697. }
  698. break;
  699. }
  700. }
  701. else
  702. {
  703. if (fingers[i].phase != FingerPhase.Ended)
  704. {
  705. continue;
  706. }
  707. switch (state)
  708. {
  709. case State.Panning:
  710. case State.BuildingPanning:
  711. {
  712. if (fingers[i].id != panningFingerID)
  713. {
  714. break;
  715. }
  716. state = State.Idle;
  717. panningFingerID = -1;
  718. if (fingers[i].velocityCount <= 0)
  719. {
  720. break;
  721. }
  722. Vector2 a = Vector2.zero;
  723. int num = 0;
  724. int velocityCount = fingers[i].velocityCount;
  725. for (int j = num; j < velocityCount; j++)
  726. {
  727. int num2 = fingers[i].velocityIndex - j;
  728. if (num2 < 0)
  729. {
  730. num2 += 5;
  731. }
  732. a += fingers[i].velocities[num2];
  733. }
  734. a /= velocityCount - num;
  735. if (a.magnitude / island.dpi > 0.2f)
  736. {
  737. cameraAnimation = CameraAnimation.Deceleration;
  738. cameraAnimationStart = Time.realtimeSinceStartup;
  739. cameraAnimationVelocity = -a;
  740. }
  741. else
  742. {
  743. SingletonMonobehaviour<FPSLimiter>.Instance.PopUnlimitedFPSRequest(this);
  744. }
  745. break;
  746. }
  747. case State.Pinching:
  748. if (fingers[i].id == panningFingerID)
  749. {
  750. state = State.Panning;
  751. panningFingerID = pinchingFingerID;
  752. pinchingFingerID = -1;
  753. }
  754. else if (fingers[i].id == pinchingFingerID)
  755. {
  756. state = State.Panning;
  757. pinchingFingerID = -1;
  758. }
  759. break;
  760. }
  761. if (!fingers[i].hasMoved && !HandleTapAt(fingers[i].currentPosition))
  762. {
  763. flag = true;
  764. }
  765. }
  766. }
  767. if (state == State.Panning || state == State.Pinching)
  768. {
  769. int num3 = IndexOfFingerID(panningFingerID);
  770. int num4 = (state != State.Pinching) ? (-1) : IndexOfFingerID(pinchingFingerID);
  771. Vector2 previousPosition = default(Vector2);
  772. Vector2 currentPosition = default(Vector2);
  773. if (state == State.Pinching)
  774. {
  775. previousPosition.x = (fingers[num3].previousPosition.x + fingers[num4].previousPosition.x) * 0.5f;
  776. previousPosition.y = (fingers[num3].previousPosition.y + fingers[num4].previousPosition.y) * 0.5f;
  777. currentPosition.x = (fingers[num3].currentPosition.x + fingers[num4].currentPosition.x) * 0.5f;
  778. currentPosition.y = (fingers[num3].currentPosition.y + fingers[num4].currentPosition.y) * 0.5f;
  779. }
  780. else
  781. {
  782. previousPosition = fingers[num3].previousPosition;
  783. currentPosition = fingers[num3].currentPosition;
  784. }
  785. Vector3 vector = default(Vector3);
  786. vector.x = (0f - (currentPosition.x - previousPosition.x)) / islandCamera.pixelRect.width * (islandCamera.orthographicSize * 2f * islandCamera.aspect);
  787. vector.y = (0f - (currentPosition.y - previousPosition.y)) / islandCamera.pixelRect.height * (islandCamera.orthographicSize * 2f);
  788. vector.z = 0f;
  789. islandCamera.transform.position += vector;
  790. if (state == State.Pinching)
  791. {
  792. float magnitude = (fingers[num3].previousPosition - fingers[num4].previousPosition).magnitude;
  793. float num5 = (fingers[num3].currentPosition - fingers[num4].currentPosition).magnitude;
  794. float num6 = islandCamera.orthographicSize * (magnitude / num5) * 2f * island.pixelsPerUnit / islandCamera.pixelRect.height * island.dpi;
  795. if (num6 < _minPixelsPerInch)
  796. {
  797. num5 = islandCamera.orthographicSize * 2f * magnitude * island.pixelsPerUnit * island.dpi / (_minPixelsPerInch * islandCamera.pixelRect.height);
  798. }
  799. else if (num6 > _maxPixelsPerInch)
  800. {
  801. num5 = islandCamera.orthographicSize * 2f * magnitude * island.pixelsPerUnit * island.dpi / (_maxPixelsPerInch * islandCamera.pixelRect.height);
  802. }
  803. islandCamera.orthographicSize *= magnitude / num5;
  804. float x = currentPosition.x;
  805. Vector2 center = islandCamera.pixelRect.center;
  806. vector.x = (x - center.x) / islandCamera.pixelRect.width * (islandCamera.orthographicSize * 2f * islandCamera.aspect) * ((num5 - magnitude) / magnitude);
  807. float y = currentPosition.y;
  808. Vector2 center2 = islandCamera.pixelRect.center;
  809. vector.y = (y - center2.y) / islandCamera.pixelRect.height * (islandCamera.orthographicSize * 2f) * ((num5 - magnitude) / magnitude);
  810. vector.z = 0f;
  811. islandCamera.transform.position += vector;
  812. }
  813. RestrictCameraToBounds();
  814. }
  815. else if (state == State.BuildingPanning)
  816. {
  817. int num7 = IndexOfFingerID(panningFingerID);
  818. GridIndex newIndex = island.grid.ConvertIslandCoordinateToGridIndex((Vector2)islandCamera.ScreenToWorldPoint(fingers[num7].currentPosition) - buildingPanningOffset);
  819. island.builder.UpdateBuild(newIndex);
  820. }
  821. else if (flag)
  822. {
  823. GameEvents.Invoke(new UnemiShouldCloseEvent(this));
  824. }
  825. }
  826. private void EndFingers()
  827. {
  828. int num = 0;
  829. while (num < fingerCount)
  830. {
  831. if (fingers[num].phase == FingerPhase.Ended)
  832. {
  833. for (int i = num; i < fingerCount - 1; i++)
  834. {
  835. fingers[i] = fingers[i + 1];
  836. }
  837. fingers[fingerCount - 1].id = -1;
  838. fingerCount--;
  839. }
  840. else
  841. {
  842. fingers[num].previousPosition = fingers[num].currentPosition;
  843. fingers[num].previousPositionTime = fingers[num].currentPositionTime;
  844. num++;
  845. }
  846. }
  847. }
  848. private int IndexOfFingerID(int id)
  849. {
  850. for (int i = 0; i < fingers.Length; i++)
  851. {
  852. if (fingers[i].id == id)
  853. {
  854. return i;
  855. }
  856. }
  857. return -1;
  858. }
  859. private void UpdateMinMaxPerInch()
  860. {
  861. Vector3 extents = island.islandBounds.extents;
  862. float x = extents.x;
  863. Vector3 extents2 = island.islandBounds.extents;
  864. float num = x / extents2.y;
  865. float num2 = island.islandCamera.pixelRect.width / island.islandCamera.pixelRect.height;
  866. float num3;
  867. if (num > num2)
  868. {
  869. Vector3 extents3 = island.islandBounds.extents;
  870. num3 = extents3.y;
  871. }
  872. else
  873. {
  874. Vector3 extents4 = island.islandBounds.extents;
  875. num3 = extents4.x / num2;
  876. }
  877. float num4 = num3 * _maxOrthographicSizeFactor;
  878. _maxPixelsPerInch = num4 * 2f * island.pixelsPerUnit / island.islandCamera.pixelRect.height * island.dpi;
  879. _minPixelsPerInch = _maxPixelsPerInch * 0.5f;
  880. }
  881. }
  882. }