Exemplo n.º 1
0
        public Color[,] RenderEffect(Color[,] buffer, Color[] palette, int eventToRender)
        {
            const int speedFactor = 200;
            var bufferHeight = buffer.GetLength(Utils.IndexRowsOrHeight);
            var bufferWidth = buffer.GetLength(Utils.IndexColsOrWidth);

            Color color;
            var hsv2 = new HSV();
            var colorcnt = palette.Length;
            var cycleLen = colorcnt * speedFactor;
            var count = tbCount.Value;
            if (eventToRender > (colorcnt - 1) * speedFactor * count && count < 10) {
                color = palette.GetMultiColorBlend(count % 2, false);
            } else {
                color = palette.GetMultiColorBlend(eventToRender % cycleLen / (double)cycleLen, true);
            }
            var hsv = color.ToHSV();
            var halfHeight = (bufferHeight - 1) / 2.0;
            var halfWidth = (bufferWidth - 1) / 2.0;
            for (var col = 0; col < bufferWidth; col++) {
                for (var row = 0; row < bufferHeight; row++) {
                    hsv2.SetToHSV(hsv);
                    if (chkBoxHFade.Checked) hsv2.Value *= (float)(1.0 - Math.Abs(halfWidth - col) / halfWidth);
                    if (chkBoxVFade.Checked) hsv2.Value *= (float)(1.0 - Math.Abs(halfHeight - row) / halfHeight);
                    buffer[row, col] = hsv2.ToColor();
                }
            }
            return buffer;
        }
Exemplo n.º 2
0
        public Color[,] RenderEffect(Color[,] buffer, Color[] palette, int eventToRender)
        {
            if (eventToRender == 0) _meteors.Clear();

            var bufferHeight = buffer.GetLength(Utils.IndexRowsOrHeight);
            var bufferWidth = buffer.GetLength(Utils.IndexColsOrWidth);
            var mspeed = eventToRender - _lastRenderedEvent;
            _lastRenderedEvent = eventToRender;

            // create new meteors
            var hsv = new HSV();
            var hsv0 = palette[0].ToHSV();
            var hsv1 = (palette.Length > 1 ? palette[1] : palette[0]).ToHSV();
            var colorcnt = palette.Length;
            var count = bufferWidth * tbCount.Value / 100;
            var tailLength = (bufferHeight < 10) ? tbTrailLength.Value / 10 : bufferHeight * tbTrailLength.Value / 100;
            if (tailLength < 1) tailLength = 1;
            var tailStart = bufferHeight - tailLength;
            if (tailStart < 1) tailStart = 1;
            for (var i = 0; i < count; i++) {
                var m = new MeteorClass {X = _random.Next() % bufferWidth, Y = bufferHeight - 1 - (_random.Next() % tailStart)};
                switch (cbType.SelectedIndex) {
                    case 1:
                        m.HSV = hsv0.CreateRangeTo(hsv1);
                        break;
                    case 2:
                        m.HSV = palette[_random.Next() % colorcnt].ToHSV() ;
                        break;
                }
                _meteors.Add(m);
            }

            // render meteors
            foreach (var meteor in _meteors) {
                {
                    for (var ph = 0; ph < tailLength; ph++) {
                        switch (cbType.SelectedIndex) {
                            case 0:
                                hsv.Hue = _random.Next() % 1000 / 1000.0f;
                                hsv.Saturation = 1.0f;
                                hsv.Value = 1.0f;
                                break;
                            default:
                                hsv.SetToHSV(meteor.HSV);
                                break;
                        }
                        hsv.Value *= (float)(1.0 - (double)ph / tailLength);
                        if (meteor.X < 0 || meteor.X >= bufferWidth || meteor.Y + ph < 0 || meteor.Y + ph >= bufferHeight) {
                            continue;
                        }
                        var y = meteor.Y + (chkBoxUp.Checked ? -ph : ph);
                        if (y >= 0 && y < bufferHeight) {
                            buffer[y, meteor.X] = hsv.ToColor();
                        }
                    }
                    meteor.Y += (chkBoxUp.Checked ? mspeed : -mspeed);
                }
            }
            // delete old meteors
            var meteorNum = 0;
            while (meteorNum < _meteors.Count) {
                if (_meteors[meteorNum].HasExpired(tailLength)) {
                    _meteors.RemoveAt(meteorNum);
                }
                else {
                    meteorNum++;
                }
            }
            return buffer;
        }