/// <summary>Activate an impulse event, so that it may begin broadcasting its signal</summary> /// Events will be automatically removed after they expire. /// You can tweak the ImpulseEvent fields dynamically if you keep a pointer to it. public void AddImpulseEvent(ImpulseEvent e) { if (m_ActiveEvents == null) { m_ActiveEvents = new List <ImpulseEvent>(); } if (e != null) { e.m_StartTime = CurrentTime; m_ActiveEvents.Add(e); } }
/// <summary>Get the signal perceived by a listener at a geven location</summary> /// <param name="listenerLocation">Where the listener is, in world coords</param> /// <param name="distance2D">True if distance calculation should ignore Z</param> /// <param name="channelMask">Only Impulse signals on channels in this mask will be considered</param> /// <param name="pos">The combined position impulse signal resulting from all signals active on the specified channels</param> /// <param name="rot">The combined rotation impulse signal resulting from all signals active on the specified channels</param> /// <returns>true if non-trivial signal is returned</returns> public bool GetImpulseAt( Vector3 listenerLocation, bool distance2D, int channelMask, out Vector3 pos, out Quaternion rot) { bool nontrivialResult = false; pos = Vector3.zero; rot = Quaternion.identity; if (m_ActiveEvents != null) { for (int i = m_ActiveEvents.Count - 1; i >= 0; --i) { ImpulseEvent e = m_ActiveEvents[i]; // Prune invalid or expired events if (e == null || e.Expired) { m_ActiveEvents.RemoveAt(i); if (e != null) { // Recycle it if (m_ExpiredEvents == null) { m_ExpiredEvents = new List <ImpulseEvent>(); } e.Clear(); m_ExpiredEvents.Add(e); } } else if ((e.m_Channel & channelMask) != 0) { Vector3 pos0 = Vector3.zero; Quaternion rot0 = Quaternion.identity; if (e.GetDecayedSignal(listenerLocation, distance2D, out pos0, out rot0)) { nontrivialResult = true; pos += pos0; rot *= rot0; } } } } return(nontrivialResult); }