Пример #1
0
        /// <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);
            }
        }