Помогите новичку с Tao Framework и list объектов

Добрый день, хочу реализовать с помощью OpenGL (Tao Framework) программу которая б создавала атомы в пространстве по указанным координатам (как бы кристаллическую решетку) и можно было манипулировать этими объектами (вращать, передвигать), также надо это сделать компонентом, чтоб можно было просто в другие проекты вставлять, и все это нужно для моего универа. Суть проблемы в том, что вроде все правильно, а работает с глюками. Создает атомы, по координатам, вращает, но через несколько поворотов/созданий, исчезают все атомы кроме первого созданного атома, я пока не понимаю почему так происходит. Работаю без таймера, графика рисуется и обновляется по событию (к примеру кнопки вращения или добавления нового атома).

Вот код, не могу понять своей ошибки =(

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// для работы с библиотекой OpenGL
using Tao.OpenGl;
// для работы с библиотекой FreeGLUT
using Tao.FreeGlut;
// для работы с элементом управления SimpleOpenGLControl
using Tao.Platform.Windows;

namespace WindowsFormsControlLibrary1
{
   public partial class UserControl1 : UserControl
   {

      Atom[] SomeAtom = new Atom[9999];
      public int AtomNum = 0;

      public double rotX = 0; //повороты
      public double rotY = 0;
      public double rotZ = 0;
      public double rot = 0;

      class Atom
      {
        private int AtomID; // идентификатор/номер Атома
        private double X = 0;
        private double Y = 0;
        private double Z = 0;
        private string Color = "red";

        public int ID // метод присовения ИД
        {
           get { return AtomID; }
           set { AtomID = value; }
        }

        public double x
        {
           get { return X; }
           set { X = value; }
        }

        public double y
        {
           get { return Y; }
           set { Y = value; }
        }

        public double z
        {
           get { return Z; }
           set { Z = value; }
        }

        public string color
        {
           get { return Color; }
           set { Color = value; }
        }


      }

      public UserControl1()
      {
        InitializeComponent();
        GraphicsWindow.InitializeContexts(); //Инициализация OpenGL
      }

      private void DrawMatrix(int x)
      {
        float quad_size = 1;

        // две последовательно линий после пересечения создадут "матрицу" чтобы мы могли понимать где находится центр
        Gl.glBegin(Gl.GL_LINES);

        Gl.glColor3f(0.0f, 0.0f, 0.0f);

        Gl.glVertex3d(0, 0, 0 - (x / 2));
        Gl.glVertex3d(0, 0, quad_size * (x / 2));

        Gl.glVertex3d(0 - (x / 2), 0, 0);
        Gl.glVertex3d(quad_size * (x / 2), 0, 0);

        Gl.glColor3f(0.7f, 0.7f, 0.7f);

        for (int ax = -(x / 2); ax < (x / 2)+1; ax++)
        {
           Gl.glVertex3d(quad_size * ax, 0, 0 - (x / 2));
           Gl.glVertex3d(quad_size * ax, 0, quad_size * (x / 2));
        }

        for (int bx = -(x / 2); bx < (x / 2)+1; bx++)
        {
           Gl.glVertex3d(0 - (x / 2), 0, quad_size * bx);
           Gl.glVertex3d(quad_size * (x / 2), 0, quad_size * bx);
        }

        Gl.glEnd();
      }

      private void Visualization()
      {
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

        Gl.glLoadIdentity();

        Gl.glPushMatrix();

        Gl.glTranslated(0, 0, -12);
        Gl.glRotated(45+rotX, 1, 0, 0);
        Gl.glRotated(rotY, 0, 1, 0);
        Gl.glRotated(rotZ, 0, 0, 1);

        DrawMatrix(10);

        Gl.glColor3f(1.0f, 0, 0);

        for (int i = 0; i <= AtomNum; i++)
        {
           try
           {
              Gl.glPushMatrix();
              Gl.glTranslated(SomeAtom[i].x, SomeAtom[i].y, SomeAtom[i].z);
              Gl.glRotated(rot, 1, 1, 0);

              // рисуем сферу с помощью библиотеки FreeGLUT
              Glut.glutWireSphere(0.5, 8, 8);

              Gl.glPopMatrix();

           }
           catch
           {
              //MessageBox.Show("Ошибка!");
           }
        }

        Gl.glPopMatrix();
        Gl.glFlush();

        GraphicsWindow.Invalidate();
      }

      private void UserControl1_Load(object sender, EventArgs e)
      {
        // инициализация Glut
        Glut.glutInit();
        Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

        // очитка окна
        Gl.glClearColor(255, 255, 255, 1);

        // установка порта вывода в соотвествии с размерами элемента anT
        Gl.glViewport(0, 0, GraphicsWindow.Width, GraphicsWindow.Height);


        // настройка проекции
        Gl.glMatrixMode(Gl.GL_PROJECTION);
        Gl.glLoadIdentity();
        Glu.gluPerspective(45, (float)GraphicsWindow.Width / (float)GraphicsWindow.Height, 0.1, 200);
        Gl.glMatrixMode(Gl.GL_MODELVIEW);
        Gl.glLoadIdentity();

        Gl.glEnable(Gl.GL_DEPTH_TEST);
        Gl.glEnable(Gl.GL_LIGHTING);
        Gl.glEnable(Gl.GL_LIGHT0);

        // настройка параметров OpenGL для визуализации
        Gl.glEnable(Gl.GL_DEPTH_TEST);

        SomeAtom[0] = new Atom(); //чтоб самим не рисовать уже в программе, изначально создадим квадрат из атомов
        SomeAtom[0].x = -2.0f;
        SomeAtom[0].y = 0.0f;
        SomeAtom[0].z = -2.0f;
        AtomNum++;

        SomeAtom[1] = new Atom();
        SomeAtom[1].x = 2.0f;
        SomeAtom[1].y = 0.0f;
        SomeAtom[1].z = -2.0f;
        AtomNum++;

        SomeAtom[2] = new Atom();
        SomeAtom[2].x = -2.0f;
        SomeAtom[2].y = 0.0f;
        SomeAtom[2].z = 2.0f;
        AtomNum++;

        SomeAtom[3] = new Atom();
        SomeAtom[3].x = 2.0f;
        SomeAtom[3].y = 0.0f;
        SomeAtom[3].z = 2.0f;
        AtomNum++;

        Visualization();
      }

      private void button2_Click(object sender, EventArgs e)
      {
        SomeAtom[AtomNum] = new Atom();
        SomeAtom[AtomNum].x = Convert.ToDouble(numericUpDown1.Value);
        SomeAtom[AtomNum].y = Convert.ToDouble(numericUpDown2.Value);
        SomeAtom[AtomNum].z = Convert.ToDouble(numericUpDown3.Value);
        AtomNum++;

        Visualization();
      }

      private void button3_Click(object sender, EventArgs e)
      {
        rotX += 5;
        Visualization();
        label4.Text = Convert.ToString(rotX);
      }

      private void button4_Click(object sender, EventArgs e)
      {
        rotX -= 5;
        Visualization();
      }
   }
}