DynamicVignetting.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.Linq;
  2. using Controller.Bicycle;
  3. using SicknessReduction.Visual.Rendering;
  4. using UnityEngine;
  5. using UnityEngine.Rendering.Universal;
  6. namespace SicknessReduction.Visual.Vignetting
  7. {
  8. public class DynamicVignetting : MonoBehaviour
  9. {
  10. //TODO: cite https://www.researchgate.net/publication/326760789_Assessing_vignetting_as_a_means_to_reduce_VR_sickness_during_amplified_head_rotations
  11. //TODO: there is a patent for this (WTF) https://patents.google.com/patent/US9645395B2/en
  12. //TODO: check Fernandes & Feiner
  13. private const float DIST_IFOV_OVOF = .2f;
  14. [Header("Unity Objects")] public ForwardRendererData forwardRenderer;
  15. public RbBicycleController bikeController;
  16. public Transform hmd;
  17. [Header("Restriction Data")] public float minRestriction = 0f; //from Fernandes & Feiner
  18. public float maxRestriction = 80f; //from Fernandes & Feiner
  19. public float angularVelocityThreshold = 20f; //deg/sec check in Fernandes & Feiner
  20. public float steerAngleThreshold = 15f; //deg/sec check in Fernandes & Feiner
  21. public float leanAngleThreshold = 20f; //deg/sec check in Fernandes & Feiner
  22. //TODO: figure out what angular velocity means in my context
  23. private MaterialBlitFeature blitFeature;
  24. private Material blitFeatureMaterial;
  25. private bool blitFeatureAvailable;
  26. private QueueBasedRestrictionSuggestor leaningAngleSuggestor;
  27. private QueueBasedRestrictionSuggestor hmdAngleSuggestor;
  28. private void Start()
  29. {
  30. blitFeature = (MaterialBlitFeature) forwardRenderer.rendererFeatures.FirstOrDefault(f =>
  31. f is MaterialBlitFeature && f.name.Equals("VignetteBlitFilter"));
  32. blitFeatureAvailable = blitFeature != null;
  33. if (!blitFeatureAvailable) return;
  34. blitFeatureMaterial = blitFeature.settings.MaterialToBlit;
  35. }
  36. private void Update()
  37. {
  38. if (!blitFeatureAvailable) return;
  39. if (Mathf.Abs(bikeController.CurrentSteerAngle) >= steerAngleThreshold)
  40. {
  41. blitFeature.SetActive(true);
  42. UpdateMaterial(.6f); //TODO: no magic number
  43. return;
  44. }
  45. //TODO: figure out how to combine everything
  46. blitFeature.SetActive(false);
  47. }
  48. private void UpdateMaterial(float restriction)
  49. {
  50. var r = Mathf.Clamp(1 - restriction, 0, 1);
  51. blitFeatureMaterial.SetFloat("_OFOV", r);
  52. blitFeatureMaterial.SetFloat("_IFOV", Mathf.Clamp(r - DIST_IFOV_OVOF, 0, 1));
  53. }
  54. private void OnDestroy()
  55. {
  56. if (!blitFeatureAvailable) return;
  57. blitFeature.SetActive(false);
  58. }
  59. }
  60. }