/// <summary> /// Calculate KLAudioSource position using current KLListener /// </summary> public Vector3 GetSourcePosition() { if (ReferenceEquals(KLListener.Current, null)) { return(CachedTransform.position); } switch (sourceShape) { case SourceType.Sphere: return(KLMath.NearPointToSphere(CachedTransform.position, sphereShapeRadius, KLListener.Current.CachedTransform.position)); case SourceType.Line: return(KLMath.ProjectPointOnLineSegment( CachedTransform.TransformPoint(lineShapeStart), CachedTransform.TransformPoint(lineShapeEnd), KLListener.Current.CachedTransform.position )); case SourceType.Area: // TODO: Move this to KLMath Vector3 half = areaShapeSize / 2f; Vector3 d = KLListener.Current.CachedTransform.position - CachedTransform.position; Vector3 ld = CachedTransform.InverseTransformDirection(d); ld = new Vector3( Mathf.Clamp(ld.x, -half.x, half.x), Mathf.Clamp(ld.y, -half.y, half.y), Mathf.Clamp(ld.z, -half.z, half.z) ); return(CachedTransform.position + CachedTransform.TransformDirection(ld)); default: return(CachedTransform.position); } }