/// <summary>
        /// メインクラスを開始
        /// </summary>
        public DynamicDataMain()
        {
            // 最上位ウインドウを作成して設定
            MainWindow mainWindow = new MainWindow();
            base.MainWindow = mainWindow;

            // ウインドウ表示
            base.MainWindow.Show();

            // 四角錐を描画
            mainWindow.Draw(new[]
            {
                new Pyramid(new Vector3( 0,  0, 2), 0.2f, new Color4(100,   0,   0, 255)),
                new Pyramid(new Vector3(-2,  0, 2), 0.4f, new Color4(  0, 100,   0, 255)),
                new Pyramid(new Vector3(-4,  0, 2), 0.6f, new Color4(  0,   0, 100, 255)),
                new Pyramid(new Vector3( 0, -2, 2), 0.8f, new Color4(100, 100,   0, 255)),
                new Pyramid(new Vector3( 0, -4, 2), 1.0f, new Color4(  0, 100, 100, 255)),
                new Pyramid(new Vector3( 0, -6, 2), 1.2f, new Color4(100,   0, 100, 255)),
            });

            // 立方体数
            int cubeCount = 300;

            // 立方体配列を初期化
            var cubes = new Cube[cubeCount * cubeCount];

            // 時刻と時間刻み
            double t = 0;
            double dt = 1.0/25;

            // 各立方体を
            for(int i = 0; i < cubeCount; i++)
            {
                for(int j = 0; j < cubeCount; j++)
                {
                    // 作成
                    cubes[i * cubeCount + j] = new Cube(0.8f, new Color4((byte)(255 * i / cubeCount), 0, 255, 255));

                    // 座標設定
                    cubes[i * cubeCount + j].PositionX = i;
                    cubes[i * cubeCount + j].PositionY = j;
                    cubes[i * cubeCount + j].PositionZ = 0;
                }
            }

            bool isProccessing = false;

            // 一定間隔での処理
            Timer timer = new Timer((TimerCallback)((state)=>
            {
                if(!isProccessing)
                {
                    isProccessing = true;

                    // 各立方体を
                    for(int i = 0; i < cubeCount; i++)
                    {
                        for(int j = 0; j < cubeCount; j++)
                        {
                            cubes[i * cubeCount + j].PositionZ = (float)(10 * Math.Sin(10 * i * t / cubeCount) * j / cubeCount);
                        }
                    }

                    // 立方体を描画
                    mainWindow.Dispatcher.BeginInvoke((Action)(() =>
                    {
                        mainWindow.Draw(cubes);

                        isProccessing = false;
                    }));
                }

                // 時刻を進める
                t += dt;
            }));

            // 動的描画を開始
            timer.Change(0, (int)(dt*1000));
        }
        /// <summary>
        /// 立方体を描画
        /// </summary>
        /// <param name="cubes">描画する立方体の配列</param>
        public void Draw(Cube[] cubes)
        {
            // バッファーがなければ
            if(cubesBuffer == null)
            {
                // 動的バッファーを作成
                cubesBuffer = Buffer.CreateDynamic<Cube>(
                        this.Viewport, BeginMode.Points,
                        cubes.Length,
                        MainWindow.CreatePointsIndices(cubes.Length));

                // 立方体プログラムにバッファーを割り当て
                programCube.AttachBuffer(cubesBuffer,
                    new[]
                    {
                        new VertexAttribution("cubePosition", VertexAttribPointerType.Float, 3, 0),
                        new VertexAttribution("cubeSize", VertexAttribPointerType.Float, 1, Vector3.SizeInBytes),
                        new VertexAttribution("cubeColor", VertexAttribPointerType.Float, 4, Vector3.SizeInBytes + sizeof(float)),
                    });
            }

            // データを書き込み
            cubesBuffer.WriteData(cubes);
        }