1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- 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);
- }
- }
- }
|