public static void DrawMinMaxFilledCurve(Rect r, AudioCurveRendering.AudioMinMaxCurveAndColorEvaluator eval)
        {
            HandleUtility.ApplyWireMaterial();
            GL.Begin(1);
            float num  = EditorGUIUtility.pixelsPerPoint;
            float num2 = 1f / num;
            float num3 = 0.5f * num2;
            float num4 = Mathf.Ceil(r.width) * num;
            float num5 = Mathf.Floor(r.x) + AudioCurveRendering.pixelEpsilon;
            float num6 = 1f / (num4 - 1f);
            float num7 = r.height * 0.5f;
            float num8 = r.y + 0.5f * r.height;
            Color c;
            float value;
            float value2;

            eval(0.0001f, out c, out value, out value2);
            AudioCurveRendering.Sort2(ref value, ref value2);
            float b    = num8 - num7 * Mathf.Clamp(value2, -1f, 1f);
            float b2   = num8 - num7 * Mathf.Clamp(value, -1f, 1f);
            float y    = r.y;
            float max  = r.y + r.height;
            int   num9 = 0;

            while ((float)num9 < num4)
            {
                float x = num5 + (float)num9 * num2;
                eval((float)num9 * num6, out c, out value, out value2);
                AudioCurveRendering.Sort2(ref value, ref value2);
                Color c2    = new Color(c.r, c.g, c.b, 0f);
                float num10 = num8 - num7 * Mathf.Clamp(value2, -1f, 1f);
                float num11 = num8 - num7 * Mathf.Clamp(value, -1f, 1f);
                float y2    = Mathf.Clamp(Mathf.Min(num10, b) - num3, y, max);
                float y3    = Mathf.Clamp(Mathf.Max(num10, b) + num3, y, max);
                float y4    = Mathf.Clamp(Mathf.Min(num11, b2) - num3, y, max);
                float y5    = Mathf.Clamp(Mathf.Max(num11, b2) + num3, y, max);
                AudioCurveRendering.Sort2(ref y2, ref y4);
                AudioCurveRendering.Sort2(ref y3, ref y5);
                AudioCurveRendering.Sort2(ref y2, ref y3);
                AudioCurveRendering.Sort2(ref y4, ref y5);
                AudioCurveRendering.Sort2(ref y3, ref y4);
                GL.Color(c2);
                AudioMixerDrawUtils.Vertex(x, y2);
                GL.Color(c);
                AudioMixerDrawUtils.Vertex(x, y3);
                AudioMixerDrawUtils.Vertex(x, y3);
                AudioMixerDrawUtils.Vertex(x, y4);
                AudioMixerDrawUtils.Vertex(x, y4);
                GL.Color(c2);
                AudioMixerDrawUtils.Vertex(x, y5);
                b2 = num11;
                b  = num10;
                num9++;
            }
            GL.End();
        }
Exemple #2
0
        public static void DrawMinMaxFilledCurve(Rect r, AudioCurveRendering.AudioMinMaxCurveAndColorEvaluator eval)
        {
            HandleUtility.ApplyWireMaterial();
            GL.Begin(1);
            float pixelsPerPoint = EditorGUIUtility.pixelsPerPoint;
            float num1           = 1f / pixelsPerPoint;
            float num2           = 0.5f * num1;
            float num3           = Mathf.Ceil(r.width) * pixelsPerPoint;
            float num4           = Mathf.Floor(r.x) + AudioCurveRendering.pixelEpsilon;
            float num5           = 1f / (num3 - 1f);
            float num6           = r.height * 0.5f;
            float num7           = r.y + 0.5f * r.height;
            Color col;
            float minValue1;
            float maxValue1;

            eval(0.0001f, out col, out minValue1, out maxValue1);
            AudioCurveRendering.Sort2(ref minValue1, ref maxValue1);
            float b1  = num7 - num6 * Mathf.Clamp(maxValue1, -1f, 1f);
            float b2  = num7 - num6 * Mathf.Clamp(minValue1, -1f, 1f);
            float y1  = r.y;
            float max = r.y + r.height;

            for (int index = 0; (double)index < (double)num3; ++index)
            {
                float x = num4 + (float)index * num1;
                eval((float)index * num5, out col, out minValue1, out maxValue1);
                AudioCurveRendering.Sort2(ref minValue1, ref maxValue1);
                Color c         = new Color(col.r, col.g, col.b, 0.0f);
                float a1        = num7 - num6 * Mathf.Clamp(maxValue1, -1f, 1f);
                float a2        = num7 - num6 * Mathf.Clamp(minValue1, -1f, 1f);
                float minValue2 = Mathf.Clamp(Mathf.Min(a1, b1) - num2, y1, max);
                float y2        = Mathf.Clamp(Mathf.Max(a1, b1) + num2, y1, max);
                float y3        = Mathf.Clamp(Mathf.Min(a2, b2) - num2, y1, max);
                float maxValue2 = Mathf.Clamp(Mathf.Max(a2, b2) + num2, y1, max);
                AudioCurveRendering.Sort2(ref minValue2, ref y3);
                AudioCurveRendering.Sort2(ref y2, ref maxValue2);
                AudioCurveRendering.Sort2(ref minValue2, ref y2);
                AudioCurveRendering.Sort2(ref y3, ref maxValue2);
                AudioCurveRendering.Sort2(ref y2, ref y3);
                GL.Color(c);
                AudioMixerDrawUtils.Vertex(x, minValue2);
                GL.Color(col);
                AudioMixerDrawUtils.Vertex(x, y2);
                AudioMixerDrawUtils.Vertex(x, y2);
                AudioMixerDrawUtils.Vertex(x, y3);
                AudioMixerDrawUtils.Vertex(x, y3);
                GL.Color(c);
                AudioMixerDrawUtils.Vertex(x, maxValue2);
                b2 = a2;
                b1 = a1;
            }
            GL.End();
        }
Exemple #3
0
        // Passing in clip and importer separately as we're not completely done with the asset setup at the time we're asked to generate the preview.
        private void DoRenderPreview(bool setMaterial, AudioClip clip, AudioImporter audioImporter, Rect wantedRect, float scaleFactor)
        {
            scaleFactor *= 0.95f; // Reduce amplitude slightly to make highly compressed signals fit.
            float[] minMaxData  = (audioImporter == null) ? null : AudioUtil.GetMinMaxData(audioImporter);
            int     numChannels = clip.channels;
            int     numSamples  = (minMaxData == null) ? 0 : (minMaxData.Length / (2 * numChannels));
            float   h           = (float)wantedRect.height / (float)numChannels;

            for (int channel = 0; channel < numChannels; channel++)
            {
                Rect  channelRect = new Rect(wantedRect.x, wantedRect.y + h * channel, wantedRect.width, h);
                Color curveColor  = new Color(1.0f, 140.0f / 255.0f, 0.0f, 1.0f);

                AudioCurveRendering.AudioMinMaxCurveAndColorEvaluator dlg = delegate(float x, out Color col, out float minValue, out float maxValue)
                {
                    col = curveColor;
                    if (numSamples <= 0)
                    {
                        minValue = 0.0f;
                        maxValue = 0.0f;
                    }
                    else
                    {
                        float p       = Mathf.Clamp(x * (numSamples - 2), 0.0f, numSamples - 2);
                        int   i       = (int)Mathf.Floor(p);
                        int   offset1 = (i * numChannels + channel) * 2;
                        int   offset2 = offset1 + numChannels * 2;
                        minValue = Mathf.Min(minMaxData[offset1 + 1], minMaxData[offset2 + 1]) * scaleFactor;
                        maxValue = Mathf.Max(minMaxData[offset1 + 0], minMaxData[offset2 + 0]) * scaleFactor;
                        if (minValue > maxValue)
                        {
                            float tmp = minValue; minValue = maxValue; maxValue = tmp;
                        }
                    }
                };

                if (setMaterial)
                {
                    AudioCurveRendering.DrawMinMaxFilledCurve(channelRect, dlg);
                }
                else
                {
                    AudioCurveRendering.DrawMinMaxFilledCurveInternal(channelRect, dlg);
                }
            }
        }
Exemple #4
0
    public void drawWaveform(Rect rect, int channel, Vector2 visibleRange)
    {
        var minX        = rect.x + rect.width * visibleRange.x;
        var maxX        = rect.x + rect.width * visibleRange.y;
        var visibleRect = new Rect(minX, rect.y, maxX - minX, rect.height);

        AudioCurveRendering.AudioMinMaxCurveAndColorEvaluator dlg = delegate(float x, out Color col, out float minValue, out float maxValue) {
            col = Color.yellow;

            x = Mathf.InverseLerp(rect.xMin, rect.xMax, Mathf.Lerp(minX, maxX, x));
            var divisions  = Mathf.FloorToInt(rect.width);
            var groupIndex = Mathf.Clamp(Mathf.FloorToInt(x * divisions), min: 0, max: divisions - 1);
            minMaxInInterval(groupIndex, divisions, channel, out minValue, out maxValue);
        };

        AudioCurveRendering.DrawMinMaxFilledCurve(visibleRect, dlg);
    }