using System.Linq; using Controller.Bicycle; using SicknessReduction.Visual.Rendering; using UnityEngine; using UnityEngine.Rendering.Universal; namespace SicknessReduction.Visual.Vignetting { public class DynamicVignetting : MonoBehaviour { //TODO: cite https://www.researchgate.net/publication/326760789_Assessing_vignetting_as_a_means_to_reduce_VR_sickness_during_amplified_head_rotations //TODO: there is a patent for this (WTF) https://patents.google.com/patent/US9645395B2/en //TODO: check Fernandes & Feiner private const float DIST_IFOV_OVOF = .2f; [Header("Unity Objects")] public ForwardRendererData forwardRenderer; public RbBicycleController bikeController; public Transform hmd; [Header("Restriction Data")] public float minRestriction = 0f; //from Fernandes & Feiner public float maxRestriction = 80f; //from Fernandes & Feiner public float angularVelocityThreshold = 20f; //deg/sec check in Fernandes & Feiner public float steerAngleThreshold = 15f; //deg/sec check in Fernandes & Feiner public float leanAngleThreshold = 20f; //deg/sec check in Fernandes & Feiner //TODO: figure out what angular velocity means in my context private MaterialBlitFeature blitFeature; private Material blitFeatureMaterial; private bool blitFeatureAvailable; private QueueBasedRestrictionSuggestor leaningAngleSuggestor; private QueueBasedRestrictionSuggestor hmdAngleSuggestor; private void Start() { blitFeature = (MaterialBlitFeature) forwardRenderer.rendererFeatures.FirstOrDefault(f => f is MaterialBlitFeature && f.name.Equals("VignetteBlitFilter")); blitFeatureAvailable = blitFeature != null; if (!blitFeatureAvailable) return; blitFeatureMaterial = blitFeature.settings.MaterialToBlit; } private void Update() { if (!blitFeatureAvailable) return; if (Mathf.Abs(bikeController.CurrentSteerAngle) >= steerAngleThreshold) { blitFeature.SetActive(true); UpdateMaterial(.6f); //TODO: no magic number return; } //TODO: figure out how to combine everything blitFeature.SetActive(false); } private void UpdateMaterial(float restriction) { var r = Mathf.Clamp(1 - restriction, 0, 1); blitFeatureMaterial.SetFloat("_OFOV", r); blitFeatureMaterial.SetFloat("_IFOV", Mathf.Clamp(r - DIST_IFOV_OVOF, 0, 1)); } private void OnDestroy() { if (!blitFeatureAvailable) return; blitFeature.SetActive(false); } } }