using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Tao.OpenGl;
using Tao.Platform.Windows;

namespace Ornek2020
{
    public partial class Form1 : Form
    {
        List<Line> lines;
        Random rnd;

        public Form1()
        {
            InitializeComponent();
            OpenGlControl.InitializeContexts();
            // OpenGL ilk işlemler
            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Gl.glOrtho(0.0, 500.0, 0.0, 500.0, -500.0, 500.0);
            Gl.glMatrixMode(Gl.GL_MODELVIEW);

            lines = new List<Line>();
            rnd = new Random();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void MyPaint(object sender, PaintEventArgs e)
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

            for (int i = 0; i < lines.Count; i++)
            {
                // Sıradaki çizgi rengi
                Gl.glColor3fv(lines[i].clr);

                // Sıradaki çizgi çizimi
                Gl.glBegin(Gl.GL_LINES);
                    Gl.glVertex3iv(lines[i].pnt1);
                    Gl.glVertex3iv(lines[i].pnt2);
                Gl.glEnd();
            }
        }

        private void OpenGlControl_Load(object sender, EventArgs e)
        {

        }

        private void buttonDondur_Click(object sender, EventArgs e)
        {
            timer1.Interval = 10;
            timer1.Start();
        }

        private void MyKeyDown(object sender, KeyEventArgs e)
        {
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int i,k;
            // Maksimum çizgi sayısı 200'dür.
            if (lines.Count == 0)
                lines.Add(new Line(true));
            else if (lines.Count < 200)
                lines.Add(new Line(false));

            // Listedeki herşey bir sonrakine aktarılır.
            // Liste başındaki çizgi aşağıda değişiyor.
            for (i = lines.Count-1; i>=1; --i)
            {
                lines[i].life = lines[i - 1].life;
                for (k = 0; k < 3; k++)
                {
                    lines[i].pnt1[k] = lines[i - 1].pnt1[k];
                    lines[i].pnt2[k] = lines[i - 1].pnt2[k];
                    lines[i].dir1[k] = lines[i - 1].dir1[k];
                    lines[i].dir2[k] = lines[i - 1].dir2[k];
                    lines[i].clr[k] = lines[i - 1].clr[k];
                }
            }

            // Liste başındaki çizgi değişiyor.
            i = 0;
            lines[i].life--;
            if (lines[i].life <= 0)
            {
                lines.RemoveAt(i);
                lines.Insert(0, new Line(true));
            }

            // point1 ve point2 x,y,z'lerini dirx, diry, dirz
            // kadar arttırıyoruz, köşelere denk gelirlerse
            // direction'lar ters çevriliyorlar.
            // Çizgi rengi de giderek azaltılıyor.
            for (k = 0; k < 3; k++)
            {
                lines[i].clr[k] -= 0.001f;

                lines[i].pnt1[k] += lines[i].dir1[k];
                if (lines[i].pnt1[k] < 0 || lines[i].pnt1[k] > 500)
                    lines[i].dir1[k] *= -1;

                lines[i].pnt2[k] += lines[i].dir2[k];
                if (lines[i].pnt2[k] < 0 || lines[i].pnt2[k] > 500)
                    lines[i].dir2[k] *= -1;
            }

            // Ekranı tazelemek lazım.
            OpenGlControl.Refresh();
        }
    }
}
