Пример #1
0
        private static void DefineColorBand(int bandIndex, float bandPosition,
                                            float bandWidth, float bandEdgeWidth, Color bandColor,
                                            Color primaryColor, ref ColorGradient gradient)
        {
            const float indexOffset = 0f;

            gradient.AddColorKey(new GradientColorKey(primaryColor, bandPosition - bandWidth * .5f - bandEdgeWidth + indexOffset * bandIndex));
            gradient.AddColorKey(new GradientColorKey(bandColor, bandPosition - bandWidth * .5f + indexOffset * bandIndex));
            //gradient.AddColorKey(new GradientColorKey(bandColor, bandPosition + indexOffset * bandIndex));
            gradient.AddColorKey(new GradientColorKey(bandColor, bandPosition + bandWidth * .5f + indexOffset * bandIndex));
            gradient.AddColorKey(new GradientColorKey(primaryColor, bandPosition + bandWidth * .5f + bandEdgeWidth + indexOffset * bandIndex));
        }
Пример #2
0
        public static ColorGradient GenerateDebugGradient(OpcodeHistogram opcodes,
                                                          Color primaryColor, int numberOfBands = 5)
        {
            ColorGradient newGradient = new ColorGradient(8);

            newGradient.AddColorKey(new GradientColorKey(Color.green, .15f));
            newGradient.AddColorKey(new GradientColorKey(Color.blue, .2f));
            newGradient.AddColorKey(new GradientColorKey(Color.green, .25f));

            newGradient.AddColorKey(new GradientColorKey(Color.green, .35f));
            newGradient.AddColorKey(new GradientColorKey(Color.blue, .4f));
            newGradient.AddColorKey(new GradientColorKey(Color.green, .45f));

            newGradient.AddColorKey(new GradientColorKey(Color.blue, .65f));
            newGradient.AddColorKey(new GradientColorKey(Color.red, .75f));

            return(newGradient);
        }
        protected override MutableObject Mutate(MutableObject mutable)
        {
            var frequencies = ByteHistogram.GetFirstValue(mutable);

            var saturation = Saturation.GetFirstValue(mutable);
            var value      = Value.GetFirstValue(mutable);

            var frequencyBands = new List <FrequencyBand>();

            var totalSize = (float)frequencies.Sum(f => f);

            var currentPosition = 0f;
            int i = 0;

            foreach (var frequency in frequencies)
            {
                frequencyBands.Add(new FrequencyBand
                {
                    Byte      = i++,
                    Color     = ColorUtility.HsvtoRgb(currentPosition / totalSize, saturation, value),
                    Start     = currentPosition / totalSize,
                    End       = (currentPosition + frequency) / totalSize,
                    Frequency = frequency
                });
                currentPosition = currentPosition + frequency;
            }

            frequencyBands.Sort((a, b) => 0 - a.Frequency.CompareTo(b.Frequency));

            var smoothGradient       = SmoothGradient.GetFirstValue(mutable);
            var numberOfPoints       = Keypoints.GetFirstValue(mutable);
            var edgeWidth            = EdgeWidth.GetFirstValue(mutable);
            var primaryColor         = PrimaryColor.GetFirstValue(mutable);
            var primaryImpactOnBands = PrimaryImpactOnBands.GetFirstValue(mutable);

            var newGradient = new ColorGradient(numberOfPoints * (smoothGradient?1:2));

            frequencyBands = frequencyBands.Take(numberOfPoints).OrderBy(f => f.Start).ToList();

            if (smoothGradient)
            {
                for (var k = 0; k < Mathf.Min(numberOfPoints, frequencyBands.Count); k++)
                {
                    {
                        newGradient.AddColorKey(new GradientColorKey(
                                                    frequencyBands[k].Color,
                                                    (frequencyBands[k].Start + frequencyBands[k].End) / 2f));
                    }
                }
            }
            else
            {
                for (var k = 1; k < Mathf.Min(numberOfPoints, frequencyBands.Count); k++)
                {
                    var k1 = frequencyBands[k - 1].Color;
                    newGradient.AddColorKey(new GradientColorKey(
                                                Color.Lerp(frequencyBands[k - 1].Color,
                                                           primaryColor, primaryImpactOnBands),
                                                frequencyBands[k - 1].Start + edgeWidth / 2f));

                    var k2 = frequencyBands[k - 1].Color;
                    newGradient.AddColorKey(new GradientColorKey(
                                                Color.Lerp(frequencyBands[k - 1].Color,
                                                           primaryColor, primaryImpactOnBands),
                                                frequencyBands[k].Start - edgeWidth / 2f));

                    if (k1 != k2)
                    {
                        throw new Exception("What?  How are these colors not matched?");
                    }
                }
            }


            HistogramGradient.SetValue(newGradient, mutable);

            return(mutable);
        }
Пример #4
0
        public override IEnumerator ReceivePayload(VisualPayload payload)
        {
            var currentWidth = 0f;

            var flagColorImpact = FlagColorImpact.GetFirstValue(payload.Data);

            var sections = SectionScope.GetEntries(payload.Data).ToList();

            var totalSize = (float)(from entry in SectionScope.GetEntries(payload.Data)
                                    select
                                    SectionMemorySize.GetValue(entry)).Aggregate((a, b) => a + b);

            ColorGradient sectionGradient = new ColorGradient(2 * sections.Count);

            foreach (var section in SectionScope.GetEntries(payload.Data))
            {
                var bandColor = Color.Lerp(
                    SectionColorMapping.GetSectionTypeColor(SectionType.GetValue(section)),
                    SectionColorMapping.GetSectionFlagColor(SectionFlag.GetValue(section)),
                    flagColorImpact);
                sectionGradient.AddColorKey(new GradientColorKey(
                                                bandColor,
                                                currentWidth));

                currentWidth += SectionMemorySize.GetValue(section);

                sectionGradient.AddColorKey(new GradientColorKey(
                                                bandColor,
                                                currentWidth));

                currentWidth += Epsilon * totalSize;
            }

            var textureWidth  = TextureWidth.GetFirstValue(payload.Data);
            var textureHeight = TextureHeight.GetFirstValue(payload.Data);

            sectionGradient.RescaleColorKeys(currentWidth);


            var resultTexture = new Texture2D(textureWidth, textureHeight);

            var outColors = new Color[textureWidth * textureHeight];

            for (int x = 0; x < textureWidth; x++)
            {
                var localColor = sectionGradient.Evaluate(x / (float)textureWidth);
                for (int y = 0; y < textureHeight; y++)
                {
                    outColors[x + textureWidth * y] = localColor;
                }
            }

            resultTexture.SetPixels(outColors);
            resultTexture.Apply();

            var quadMaterial = GameObject.Instantiate(MaterialFactory.GetDefaultMaterial());

            quadMaterial.mainTexture = resultTexture;

            MaterialTarget.SetValue(quadMaterial, payload.Data);

            var iterator = Router.TransmitAll(payload);

            while (iterator.MoveNext())
            {
                yield return(null);
            }
        }