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)); }
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); }
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); } }