CursorRendererWorldSpace.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using UnityEngine;
  2. namespace ZenFulcrum.EmbeddedBrowser {
  3. /// <summary>
  4. /// Renders a browser's cursor by add polygons to the scene offset from browser's face.
  5. /// </summary>
  6. public class CursorRendererWorldSpace : CursorRendererBase {
  7. [Tooltip("How far to keep the cursor from the surface of the browser. Set it as low as you can without causing z-fighting." +
  8. " (Note: The default cursor material will always render on top of everything, this is more useful if you use a different material.")]
  9. public float zOffset = .005f;
  10. [Tooltip("How large should the cursor be when rendered? (meters)")]
  11. public float size = .1f;
  12. private GameObject cursorHolder, cursorImage;
  13. private PointerUIBase pointerUI;
  14. private bool cursorVisible;
  15. public void Awake() {
  16. pointerUI = GetComponent<PointerUIBase>();
  17. cursorHolder = new GameObject("Cursor for " + name);
  18. cursorHolder.transform.localScale = new Vector3(size, size, size);
  19. //If we place it in the parent, the scale can get wonky in some cases.
  20. //so don't cursorHolder.transform.parent = transform;
  21. cursorImage = GameObject.CreatePrimitive(PrimitiveType.Quad);
  22. cursorImage.name = "Cursor Image";
  23. cursorImage.transform.parent = cursorHolder.transform;
  24. var mr = cursorImage.GetComponent<MeshRenderer>();
  25. mr.sharedMaterial = Resources.Load<Material>("Browser/CursorDecal");
  26. Destroy(cursorImage.GetComponent<Collider>());
  27. cursorImage.transform.SetParent(cursorHolder.transform, false);
  28. cursorImage.transform.localScale = new Vector3(1, 1, 1);
  29. cursorHolder.SetActive(false);
  30. }
  31. protected override void CursorChange() {
  32. if (cursor.HasMouse && cursor.Texture) {
  33. cursorVisible = true;
  34. var cursorRenderer = cursorImage.GetComponent<Renderer>();
  35. cursorRenderer.material.mainTexture = cursor.Texture;
  36. var hs = cursor.Hotspot;
  37. cursorRenderer.transform.localPosition = new Vector3(
  38. .5f - hs.x / cursor.Texture.width,
  39. -.5f + hs.y / cursor.Texture.height,
  40. 0
  41. );
  42. } else {
  43. cursorVisible = false;
  44. }
  45. }
  46. public void LateUpdate() {
  47. Vector3 pos;
  48. Quaternion rot;
  49. pointerUI.GetCurrentHitLocation(out pos, out rot);
  50. if (float.IsNaN(pos.x)) {
  51. cursorHolder.SetActive(false);
  52. } else {
  53. cursorHolder.SetActive(cursorVisible);
  54. cursorHolder.transform.position = pos + rot * new Vector3(0, 0, -zOffset);
  55. cursorHolder.transform.rotation = rot;
  56. }
  57. }
  58. }
  59. }