protected:
 void update(int dt)
 {
   mUpdateProgram->enable();
   mUpdateProgram->setUniform("u_fTime",      (float)mTime);
   mUpdateProgram->setUniform("u_fDeltaTime", (float)dt);
   mRandomTexture->bind(OGL_TEXTURE_GENERIC);
   
   glEnable(GL_RASTERIZER_DISCARD);
   
   glBindBuffer(GL_ARRAY_BUFFER, mVBOs[mActiveVBO]);
   glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTBOs[mActiveTBO]);
   
   glBindVertexArray(mVAOs[0]);
   
   glBeginTransformFeedback(GL_POINTS); ///////////////////////////////////////////////////////////////////////////
   if(mFirst)
   {
     glDrawArrays(GL_POINTS, 0, 1);
     mFirst = false;
   }
   else
   {
     glDrawTransformFeedback(GL_POINTS, mTBOs[mActiveVBO]);
   }
   glEndTransformFeedback(); //////////////////////////////////////////////////////////////////////////////////////
   
   // glExitIfError();
   
   glBindVertexArray(0);
   
   glDisable(GL_RASTERIZER_DISCARD);
 
 void render()
 {
   mRenderProgram->enable();
   mRenderProgram->setUniform("u_vCameraPosition", mCameraPosition);
   mRenderProgram->setUniform("u_mVP", mProjectionMatrix * mViewMatrix);
   mDiffuseTexture->bind(OGL_TEXTURE_DIFFUSE);
   
   glBindBuffer(GL_ARRAY_BUFFER, mVBOs[mActiveTBO]);
   
   glBindVertexArray(mVAOs[1]);
   
   glDrawTransformFeedback(GL_POINTS, mTBOs[mActiveTBO]);
   
   // glExitIfError();
   
   glBindVertexArray(0);