/// <summary>
        /// Draw the scene
        /// </summary>
        /// <param name="camera">The camera where you want to draw from</param>
        /// <param name="window">The window you want to draw to</param>
        public void Draw(Camera camera, GameWindow window)
        {
            Matrix4 mat = camera.CalculateMatrix();

            _voxelData.Update();
            _modelData.Update();

            for (int i = 0; i < _models.Count; i++)
            {
                Matrix4 inverseModelMatrix = _models[i].Transform.CalculateInverseMatrix();
                Matrix4 modelMatrix        = _models[i].Transform.CalculateMatrix();
                Matrix4 normalMatrix       = _models[i].Transform.CalculateNormalMatrix();

                // Check if the matrices are the same to avoid sending data the gpu already has
                if (_modelTransformations[i * 3 + 0] != inverseModelMatrix)
                {
                    _modelTransformations[i * 3 + 0] = inverseModelMatrix;
                }

                if (_modelTransformations[i * 3 + 1] != modelMatrix)
                {
                    _modelTransformations[i * 3 + 1] = modelMatrix;
                }

                if (_modelTransformations[i * 3 + 2] != normalMatrix)
                {
                    _modelTransformations[i * 3 + 2] = normalMatrix;
                }
            }
            _modelTransformations.Update();

            Shader.Bind();
            GL.BindVertexArray(_canvasFB.Vao);

            // Send the buffers containing the models
            _voxelData.Bind(TextureUnit.Texture0);
            GL.Uniform1(Shader.GetUniformLocation("u_voxelBuffer"), 1, new[] { 0 });
            _modelData.Bind(TextureUnit.Texture1);
            GL.Uniform1(Shader.GetUniformLocation("u_modelData"), 1, new[] { 1 });
            _modelTransformations.Bind(TextureUnit.Texture2);
            GL.Uniform1(Shader.GetUniformLocation("u_modelTransformations"), 1, new[] { 2 });

            // Send the materials
            Materials.Bind("u_materials");

            // Send the windowsize
            GL.Uniform2(Shader.GetUniformLocation("u_windowSize"), 1, new float[] { window.Width, window.Height / 2 });

            // Send the camera
            GL.Uniform1(Shader.GetUniformLocation("u_camera.zoom"), 1, new[] { (window.Height / 1.5f) / (float)Math.Tan(camera.Fov * (Math.PI / 360.0f)) });
            GL.UniformMatrix4(Shader.GetUniformLocation("u_camera.matrix"), false, ref mat);

            // Send the lights
            GL.Uniform1(Shader.GetUniformLocation("u_dirLightCount"), DirectionalLights.Count());
            for (int i = 0; i < DirectionalLights.Count(); i++)
            {
                GL.Uniform3(Shader.GetUniformLocation($"u_dirLights[{i}].direction"), DirectionalLights[i].direction);
                GL.Uniform1(Shader.GetUniformLocation($"u_dirLights[{i}].intensity"), DirectionalLights[i].intensity);
                GL.Uniform3(Shader.GetUniformLocation($"u_dirLights[{i}].colour"), DirectionalLights[i].colour);
            }
            GL.Uniform1(Shader.GetUniformLocation("u_pointLightCount"), PointLights.Count());
            for (int i = 0; i < PointLights.Count(); i++)
            {
                GL.Uniform3(Shader.GetUniformLocation($"u_pointLights[{i}].position"), PointLights[i].position); //_pointLights[i].position
                GL.Uniform1(Shader.GetUniformLocation($"u_pointLights[{i}].intensity"), PointLights[i].intensity);
                GL.Uniform3(Shader.GetUniformLocation($"u_pointLights[{i}].colour"), PointLights[i].colour);
            }

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, _framebuffer);
            //GL.Viewport(window.Width / 2, window.Height / 2, window.Width / 2, window.Height / 2);
            GL.DrawArrays(PrimitiveType.TriangleFan, 0, 4);
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);

            Shader.Unbind();

            ScaleShader.Bind();
            GL.BindVertexArray(_canvas.Vao);
            GL.ActiveTexture(TextureUnit.Texture0);
            GL.BindTexture(TextureTarget.Texture2D, _textureColorBuffer);
            GL.Uniform1(ScaleShader.GetUniformLocation("u_framebuffer"), 1, new[] { 0 });
            GL.Uniform2(ScaleShader.GetUniformLocation("u_resolution"), 1, new float[] { window.Width, window.Height });

            //GL.Viewport(0,0, window.Width,window.Height);

            GL.DrawArrays(PrimitiveType.TriangleFan, 0, 4);

            ScaleShader.Unbind();
        }