/************************************************************************************
|
|
Filename : ONSPReflectionZone.cs
|
|
Content : Add reflection zone volumes to set reflection parameters via snapshots.
|
|
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
|
|
Licensed under the Oculus SDK Version 3.5 (the "License");
|
|
you may not use the Oculus SDK except in compliance with the License,
|
|
which is provided at the time of installation or download, or which
|
|
otherwise accompanies this software in either electronic or hard copy form.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
https://developer.oculus.com/licenses/sdk-3.5/
|
|
|
|
Unless required by applicable law or agreed to in writing, the Oculus SDK
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
************************************************************************************/
|
|
using UnityEngine;
|
|
using UnityEngine.Audio;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
public struct ReflectionSnapshot
|
|
{
|
|
public AudioMixerSnapshot mixerSnapshot;
|
|
public float fadeTime;
|
|
}
|
|
|
|
public class ONSPReflectionZone : MonoBehaviour
|
|
{
|
|
public AudioMixerSnapshot mixerSnapshot = null;
|
|
public float fadeTime = 0.0f;
|
|
|
|
// Push/pop list
|
|
private static Stack<ReflectionSnapshot> snapshotList = new Stack<ReflectionSnapshot>();
|
|
private static ReflectionSnapshot currentSnapshot = new ReflectionSnapshot();
|
|
|
|
/// <summary>
|
|
/// Start this instance.
|
|
/// </summary>
|
|
void Start ()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update this instance.
|
|
/// </summary>
|
|
void Update ()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Raises the trigger enter event.
|
|
/// </summary>
|
|
/// <param name="other">Other.</param>
|
|
void OnTriggerEnter(Collider other)
|
|
{
|
|
if(CheckForAudioListener(other.gameObject) == true)
|
|
{
|
|
PushCurrentMixerShapshot();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Raises the trigger exit event.
|
|
/// </summary>
|
|
/// <param name="other">Other.</param>
|
|
void OnTriggerExit(Collider other)
|
|
{
|
|
if(CheckForAudioListener(other.gameObject) == true)
|
|
{
|
|
PopCurrentMixerSnapshot();
|
|
}
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * *
|
|
// Private functions
|
|
|
|
/// <summary>
|
|
/// Checks for audio listener.
|
|
/// </summary>
|
|
/// <returns><c>true</c>, if for audio listener was checked, <c>false</c> otherwise.</returns>
|
|
/// <param name="gameObject">Game object.</param>
|
|
bool CheckForAudioListener(GameObject gameObject)
|
|
{
|
|
AudioListener al = gameObject.GetComponentInChildren<AudioListener>();
|
|
if(al != null)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Pushs the current mixer snapshot onto the snapshot stack
|
|
/// </summary>
|
|
void PushCurrentMixerShapshot()
|
|
{
|
|
ReflectionSnapshot css = currentSnapshot;
|
|
snapshotList.Push(css);
|
|
|
|
// Set the zone reflection values
|
|
// NOTE: There will be conditions that might need resolution when dealing with volumes that
|
|
// overlap. Best practice is to never have volumes half-way inside other volumes; larger
|
|
// volumes should completely contain smaller volumes
|
|
SetReflectionValues();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Pops the current reflection values from reflectionsList stack.
|
|
/// </summary>
|
|
void PopCurrentMixerSnapshot()
|
|
{
|
|
ReflectionSnapshot snapshot = snapshotList.Pop();
|
|
|
|
// Set the popped reflection values
|
|
SetReflectionValues(ref snapshot);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the reflection values. This is done when entering a zone (use zone values).
|
|
/// </summary>
|
|
void SetReflectionValues()
|
|
{
|
|
if (mixerSnapshot != null)
|
|
{
|
|
Debug.Log("Setting off snapshot " + mixerSnapshot.name);
|
|
mixerSnapshot.TransitionTo(fadeTime);
|
|
|
|
// Set the current snapshot to be equal to this one
|
|
currentSnapshot.mixerSnapshot = mixerSnapshot;
|
|
currentSnapshot.fadeTime = fadeTime;
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Mixer snapshot not set - Please ensure play area has at least one encompassing snapshot.");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the reflection values. This is done when exiting a zone (use popped values).
|
|
/// </summary>
|
|
/// <param name="rm">Rm.</param>
|
|
void SetReflectionValues(ref ReflectionSnapshot mss)
|
|
{
|
|
if(mss.mixerSnapshot != null)
|
|
{
|
|
Debug.Log("Setting off snapshot " + mss.mixerSnapshot.name);
|
|
mss.mixerSnapshot.TransitionTo(mss.fadeTime);
|
|
|
|
// Set the current snapshot to be equal to this one
|
|
currentSnapshot.mixerSnapshot = mss.mixerSnapshot;
|
|
currentSnapshot.fadeTime = mss.fadeTime;
|
|
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Mixer snapshot not set - Please ensure play area has at least one encompassing snapshot.");
|
|
}
|
|
}
|
|
}
|