DynamicVignetting.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System.Linq;
  2. using Controller.Bicycle;
  3. using SicknessReduction.Visual.Rendering;
  4. using UnityEditor.Recorder.Input;
  5. using UnityEngine;
  6. using UnityEngine.Rendering.Universal;
  7. namespace SicknessReduction.Visual.Vignetting
  8. {
  9. public class DynamicVignetting : DynamicReductionSource
  10. {
  11. //TODO: cite https://www.researchgate.net/publication/326760789_Assessing_vignetting_as_a_means_to_reduce_VR_sickness_during_amplified_head_rotations
  12. //TODO: there is a patent for this https://patents.google.com/patent/US9645395B2/en
  13. //TODO: check Fernandes & Feiner
  14. [Header("Unity Objects")] public ForwardRendererData forwardRenderer;
  15. public Transform hmd;
  16. [Range(0, 1)] public float distInnerOuterRadius = .05f;
  17. //TODO: figure out what angular velocity means in my context
  18. private MaterialBlitFeature blitFeature;
  19. private Material blitFeatureMaterial;
  20. private bool blitFeatureAvailable;
  21. protected override void Start()
  22. {
  23. blitFeature = (MaterialBlitFeature) forwardRenderer.rendererFeatures.FirstOrDefault(f =>
  24. f is MaterialBlitFeature && f.name.Equals("VignetteBlitFilter"));
  25. blitFeatureAvailable = blitFeature != null;
  26. if (!blitFeatureAvailable) return;
  27. // ReSharper disable once PossibleNullReferenceException
  28. blitFeatureMaterial = blitFeature.settings.MaterialToBlit;
  29. base.Start();
  30. }
  31. protected override void Update()
  32. {
  33. if (!blitFeatureAvailable) return;
  34. base.Update();
  35. var correctedRestriction = Mathf.Clamp(currentValue + change, 0, 1);
  36. if (correctedRestriction > 0f)
  37. {
  38. blitFeature.SetActive(true);
  39. UpdateMaterial(correctedRestriction);
  40. return;
  41. }
  42. blitFeature.SetActive(false);
  43. }
  44. private void UpdateMaterial(float restriction)
  45. {
  46. currentValue = restriction;
  47. var r = Mathf.Clamp(1 - restriction, 0, 1);
  48. blitFeatureMaterial.SetFloat("_OFOV", r);
  49. blitFeatureMaterial.SetFloat("_IFOV", Mathf.Clamp(r - distInnerOuterRadius, 0, 1));
  50. }
  51. private void OnDestroy()
  52. {
  53. if (!blitFeatureAvailable) return;
  54. blitFeature.SetActive(false);
  55. }
  56. }
  57. }