private static void ChangeMask(BinaryParticleCloud p) { var c = RandomColorMask(); if (p.ColorMask.HasFlag(c)) { p.ColorMask &= ~c; } else { p.ColorMask |= c; } }
private BinaryParticleCloud SpawnColorChild() { var p = new BinaryParticleCloud(); p.Location.Copy(Location); p.Velocity.Copy(Velocity); p.Acceleration.Copy(Acceleration); p.SplitCounter = SplitCounter; p.ColorMask = ColorMask; p.ParticleColor = ParticleColor; p.SplitChance = SplitChance; p.ColorIncrement = ColorIncrement; p.ColorDecrement = ColorDecrement; p.ChildLocationVariation = ChildLocationVariation; p.ChildVelocityVariation = ChildVelocityVariation; p.EmitPeriod = EmitPeriod; p.SplitPeriod = SplitPeriod; //p.ParticleColor = Color.FromRgb((byte)((ParticleColor.R + p.ParticleColor.R) / 2), (byte)((ParticleColor.G + p.ParticleColor.G) / 2), (byte)((ParticleColor.B + p.ParticleColor.B) / 2)); var R = p.ParticleColor.R; var G = p.ParticleColor.G; var B = p.ParticleColor.B; //Convert RGB to CYMK var C = 1 - ((double)R / 255); var M = 1 - ((double)G / 255); var Y = 1 - ((double)B / 255); var K = (double)1; if (C < K) K = C; if (M < K) K = M; if (Y < K) K = Y; if (K == 1) { //Black C = 0; M = 0; Y = 0; } else { C = (C - K) / (1 - K); M = (M - K) / (1 - K); Y = (Y - K) / (1 - K); } //if (Y > 0.9) //{ // p.ColorMask &= ~(ColorEvolutionMask.Yellow); //} //if (M > 0.9) //{ // p.ColorMask &= ~(ColorEvolutionMask.Magenta); //} //if (C > 0.9) //{ // p.ColorMask &= ~(ColorEvolutionMask.Cyan); //} //if (K > 0.5) //{ // p.ColorMask &= ~(ColorEvolutionMask.Black); // K = 0.1; //} //if (R > 230) //{ // p.ColorMask &= ~(ColorEvolutionMask.Red); //} //if (G > 230) //{ // p.ColorMask &= ~(ColorEvolutionMask.Green); //} //if (B > 230) //{ // p.ColorMask &= ~(ColorEvolutionMask.Blue); //} if (p.ColorMask == 0) { ChangeMask(p); } else { ColorEvolutionMask mask; while (!p.ColorMask.HasFlag(mask = RandomColorMask())) { } switch (mask) { //RGB we reduce case ColorEvolutionMask.Red: R = (byte)Math.Max(R + (byte)ColorDecrement, R); //Max is for possible overflow p.ParticleColor = Color.FromRgb(R, G, B); break; case ColorEvolutionMask.Green: G = (byte)Math.Max(G + (byte)ColorDecrement, G); p.ParticleColor = Color.FromRgb(R, G, B); break; case ColorEvolutionMask.Blue: B = (byte)Math.Max(B + (byte)ColorDecrement, B); p.ParticleColor = Color.FromRgb(R, G, B); break; //CYMK we increase case ColorEvolutionMask.Cyan: C = Math.Min(1, C + ColorIncrement); p.ParticleColor = CymkToColor(C, Y, M, K); break; case ColorEvolutionMask.Yellow: Y = Math.Min(1, Y + ColorIncrement); p.ParticleColor = CymkToColor(C, Y, M, K); break; case ColorEvolutionMask.Magenta: M = Math.Min(1, M + ColorIncrement); p.ParticleColor = CymkToColor(C, Y, M, K); break; } } return p; }