void onDraw(int nTime)
    {
      glBindFramebuffer(GL_FRAMEBUFFER, 0);
    
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      
      math::mat4 mM;
      math::mat4 mV;
      math::mat4 mP;
      
      mM = pObject1->getM();
      mV = pCamera->getViewMatrix();
      mP = pCamera->getProjectionMatrix();
      
      pProgramRender->enable();    // ::enable() ::disable()
      pProgramRender->setUniform("u_mM",  mM);
      pProgramRender->setUniform("u_mMV", mV * mM);
      pProgramRender->setUniform("u_mP",  mP);
      pProgramRender->setUniform("u_oDirectLight.vColor",            pDirectLight->mColor);
      pProgramRender->setUniform("u_oDirectLight.vDirection",        math::normalize(pDirectLight->mDirection)); // left to rigth
      pProgramRender->setUniform("u_oDirectLight.fAmbientIntensity", pDirectLight->mAmbientIntensity);
      pProgramRender->setUniform("u_oDirectLight.fDiffuseIntensity", pDirectLight->mDiffuseIntensity);
      pProgramRender->setUniform("u_fSpecularIntensity",             0.0f);
      pProgramRender->setUniform("u_fSpecularPower",                 0.0f);
      pProgramRender->setUniform("u_fEyePosition",                   pCamera->getPosition());
      // pObjectP->draw(); // DEPRICATED
      
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      
      pProgramBillboard->enable();
      pProgramBillboard->setUniform("u_mVP", pCamera->getProjectionMatrix() * pCamera->getViewMatrix());
      pProgramBillboard->setUniform("u_vCameraPosition", pCamera->getPosition());
      // pObjectB->draw(); // DEPRICATED
      
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      
      GLint prevCullFace;
      glGetIntegerv(GL_CULL_FACE_MODE, &prevCullFace);
      GLint prevDepthFunc;
      glGetIntegerv(GL_DEPTH_FUNC, &prevDepthFunc);
      
      glCullFace(GL_FRONT);
      glDepthFunc(GL_LEQUAL);
      
      pProgramSkybox->enable();
      mM = math::translate(pCamera->getPosition()) * pObjectS->getM();
      mV = pCamera->getViewMatrix();
      mP = pCamera->getProjectionMatrix();
      pProgramSkybox->setUniform("u_mMVP", mP * mV * mM);
      // pObjectS->draw(); // DEPRICATED
      
      glCullFace(prevCullFace);
      glDepthFunc(prevDepthFunc);

      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      
      //CApp::exit();
    }
    void onDraw(int nTime)
    {
      const float fTime = nTime / 1000.0f;
      sys::info << "app::COGLDev02App::onDraw(" << nTime << ") > " << fTime << sys::endl;
      
      static const GLfloat gray[]  = { 0.1f, 0.1f, 0.1f, 0.0f };
      static const GLfloat ones[]  = { 1.0f };
      glClearBufferfv(GL_COLOR, 0, gray);
      glClearBufferfv(GL_DEPTH, 0, ones);
      
      math::mat4 mM = pObject->getM() *
                      math::rotate(fTime * 13.25f, math::Y);
      math::mat4 mV = pCamera->getViewMatrix();
      math::mat4 mP = pCamera->getProjectionMatrix();
//      math::mat4 mV = math::lookat(math::vec3(0.0f, 1.0f, 0.0f), math::vec3(0.0f, 0.8f, 0.5f), math::Y);
//      math::mat4 mP = math::perspective(60.0f, mConfig.mRatio, 0.1f, 100.0f);
      
      //math::mat4 mMV = math::translate(0.0f, 0.0f, -5.0f) *
      //                 math::rotate(fTime * 13.75f, math::Y);
      
      glViewport(0, 0, mConfig.mWidth, mConfig.mHeight);
      
      pProgram->use();
      pProgram->setUniform("u_fTime", fTime);
      //pProgram->setUniform("u_mM", mM);
      //pProgram->setUniform("u_mMV", mMV);
      pProgram->setUniform("u_mMV", mV * mM);
      pProgram->setUniform("u_mP",  mP);
      pProgram->setUniform("u_bWireframe",  false);
      pProgram->setUniform("u_oDirectLight.vColor",     oDirectionalLight.vColor);
      pProgram->setUniform("u_oDirectLight.vDirection", math::normalize(oDirectionalLight.vDirection));
      pProgram->setUniform("u_oDirectLight.fAmbientIntensity", oDirectionalLight.fAmbientIntensity);
      pProgram->setUniform("u_vEyePos",            pCamera->getPosition());
      pProgram->setUniform("u_fSpecularIntensity", 1.0f);
      pProgram->setUniform("u_fSpecularPower",     64.0f);
      
      pTexture->bind(GL_TEXTURE0);
      
      glEnable(GL_POLYGON_OFFSET_FILL);
      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
      // pObject->draw(); // DEPRICATED
      
//      pProgram->setUniform("u_bWireframe",  true);
      
      pTexture->unbind();
      
//      glEnable(GL_POLYGON_OFFSET_LINE);
//      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//      glLineWidth(1.0f);
//      pObject->draw();
//      glDisable(GL_POLYGON_OFFSET_LINE);
      
      pProgram->unuse();
    }