#include <iostream>
#include <osgDB/ReadFile>
#include <osgProducer/Viewer>

int main (int argc, char* argv[])
{
   // Checa parâmetros da linha de comando
   if (argc != 2)
   {
      std::cerr << "Uso: " << argv[0] << " <arquivo com modelo>\n";
      exit (1);
   }

   // Cria um visualizador baseado em um Producer
   osgProducer::Viewer viewer;
   viewer.setUpViewer (osgProducer::Viewer::STANDARD_SETTINGS);

   // Carrega o modelo
   osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile(argv[1]);

   if (!loadedModel)
   {
      std::cerr << "Problema ao abrir '" << argv[1] << "'\n";
      exit (1);
   }

   viewer.setSceneData (loadedModel.get());

   // Entra no loop de renderização
   viewer.realize();

   while (!viewer.done())
   {
      // Espera todas as threads de descarte e de desenho completarem.
      viewer.sync();

      // Atualiza a cena percorrendo-a com o update visitor, que
      // chamará todos os callbacks de atualziação e animações do nó.
      viewer.update();

      // Dispara os cull e draw traversals da cena.
      viewer.frame();
   }

   // Espera todas as threads de descarte e de desenho completarem antes de sair.
   viewer.sync();
}
