/// <summary>
        /// Pops the specified parent element.
        /// </summary>
        /// <param name="gl">The OpenGL instance.</param>
        /// <param name="parentElement">The parent element.</param>
        public override void Pop(OpenGL gl, SceneElement parentElement)
        {
            LookAtCamera camera = parentElement.TraverseToRootElement().ParentScene.CurrentCamera as LookAtCamera;

            if (camera != null)
            {
                gl.Viewport(0, 0, result[2], result[3]);
            }

            //  Pop the stack.
            gl.PopMatrix();
        }
        /// <summary>
        /// Pushes the effect onto the specified parent element.
        /// </summary>
        /// <param name="gl">The OpenGL instance.</param>
        /// <param name="parentElement">The parent element.</param>
        public override void Push(OpenGL gl, SceneElement parentElement)
        {
            //  Push the stack.
            gl.PushMatrix();

            LookAtCamera camera = parentElement.TraverseToRootElement().ParentScene.CurrentCamera as LookAtCamera;

            if (camera != null)
            {
                SetTranslate(gl, camera);
                const int width = 200;
                gl.GetInteger(OpenGL.GL_VIEWPORT, result);
                gl.Viewport(0, 0, width, width * result[3] / result[2]);
            }

            //  Perform the transformation.
            linearTransformation.Transform(gl);
        }
        /// <summary>
        /// Pushes the effect onto the specified parent element.
        /// </summary>
        /// <param name="gl">The OpenGL instance.</param>
        /// <param name="parentElement">The parent element.</param>
        public override void Push(OpenGL gl, SceneElement parentElement)
        {
            //  Push the stack.
            gl.PushMatrix();

            // Try to get the scene's camera.
            if (this.arcBall.Camera == null)
            {
                SceneContainer container = parentElement.TraverseToRootElement();
                if (container != null)
                {
                    Scene             scene  = container.ParentScene;
                    IScientificCamera camera = scene.CurrentCamera as IScientificCamera;
                    this.arcBall.Camera = camera;
                }
            }

            //  Perform the transformation.
            arcBall.TransformMatrix(gl);
        }