#include <qapplication.h>
#include <animal/argumentParser.h>
#include <animal/X3DTK/mainScene.h>
#include <animal/X3DTK/Qt/mainControllerGUI/MainController.h>
#include <animal/X3DTK/X3D/morphingNode/morphingNode.h>
#include <animal/X3DTK/Qt/morphingEngineGUI/morphingEngineQt.h>
#include <animal/X3DTK/X3D/massSpringNode/massSpringNode.h>
#include <animal/X3DTK/Qt/massSpringEngineGUI/massSpringEngineGUI.h>
#include <animal/X3DTK/X3D/frameNode/frameNode.h>
#include <animal/X3DTK/X3D/frameNode/frameNodeGUI.h>
#include "spinningCube/spinningCubeNode.h"
#include "spinningCube/spinningCubeQt.h"
#include "spinningFrame/spinningFrameNode.h"
#include "spinningFrame/spinningFrameNodeGUI.h"
#include "particles/ParticleSystemNode.h"
#include "particles/ParticleSystemNodeQt.h"
#include "particles/SpringForceFieldNode.h"
#include "particles/SpringForceFieldNodeQt.h"
#include "particles/FixedParticleConstraintNode.h"
#include "particles/ParticleCollisionConstraintNode.h"
#include "particles/TetrahedronFEMForceFieldNode.h"
#include "particles/TetrahedronFEMForceFieldNodeQt.h"
#include "particles/TriangleFEMForceFieldNode.h"
#include "particles/TriangleFEMForceFieldNodeQt.h" 
#include "particles/ParticleMeshNode.h"
#include "particles/ParticleMeshNodeQt.h"
#include "animal/skinning/characterNode.h"
#include "animal/skinning/skinningEngineGUI.h"
#include "animal/skinning/keyFrameNode.h"
#include "animal/deformableOctree/DeformableOctreeNode.h"
#include "animal/deformableOctree/DeformableOctreeShapeNode.h"
#include "animal/deformableOctree/DeformableOctreeQt.h"
#include "animal/deformableOctree/DeformableOctreeShapeQt.h" 
int main(int argc, char* argv[]) 
{
    
    std::string fileName="";
    std::string defaultFileDirectory="./files-x3d";
    bool use_docked_windows = false;
    animal::parse("AnimX3D")
    .option(&defaultFileDirectory,'d',"dir","default x3d scenes directory") 
    .option(&fileName,'f',"file","x3d scene file")
    .option(&use_docked_windows,0,"dock","use Qt docked windows")
    (argc,argv);
    
    X3DTK::MainScene mainScene;
    
    
    
    mainScene.newX4DClass<X3DTK::X3D::MorphingNode>();
    mainScene.newX4DClass<X3DTK::X3D::MassSpringNode>();
    mainScene.newX4DClass<X3DTK::X3D::SpinningCubeNode>();
    mainScene.newX4DClass<X3DTK::X3D::FrameNode>();
    mainScene.newX4DClass<X3DTK::X3D::SpinningFrameNode>();
    mainScene.newX4DClass<X3DTK::X3D::ParticleSystemNode>();
    mainScene.newX4DClass<X3DTK::X3D::ParticleMeshNode>();
    mainScene.newX4DClass<X3DTK::X3D::FixedParticleConstraintNode>();
    mainScene.newX4DClass<X3DTK::X3D::SpringForceFieldNode>();
    mainScene.newX4DClass<X3DTK::X3D::ParticleCollisionConstraintNode>();
    mainScene.newX4DClass<X3DTK::X3D::TetrahedronFEMForceFieldNode>();
    mainScene.newX4DClass<X3DTK::X3D::TriangleFEMForceFieldNode>();
    mainScene.newX4DClass<X3DTK::X3D::CharacterNode>();
    mainScene.newX4DClass<X3DTK::X3D::KeyFrameNode>();
    
   mainScene.newX4DClass<X3DTK::X3D::DeformableOctreeNode>();
   mainScene.newX4DClass<X3DTK::X3D::DeformableOctreeShapeNode>();
    
    QApplication application(argc,argv);
    MainController* mainController = new MainController(&mainScene, use_docked_windows);
    mainController->setX3dDirectory(defaultFileDirectory);
    mainController->show();
    if (fileName=="")
        mainController->fileOpen();
    else
        mainController->fileOpen(fileName.c_str());
    
    
    mainController->defineQWidgetCreationFunction(X3DTK::Qt::createMorphingNodeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::Qt::createMassSpringNodeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::Qt::createSpinningCubeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::Qt::createSpinningFrameQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::X3D::createParticleSystemNodeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::X3D::createParticleMeshNodeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::X3D::createSpringForceFieldNodeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::X3D::createTetrahedronFEMForceFieldNodeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::X3D::createTriangleFEMForceFieldNodeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::Qt::createSkinningNodeQWidget);
    mainController->defineQWidgetCreationFunction(X3DTK::X3D::createParticleCollisionConstraintQWidget);
   mainController->defineQWidgetCreationFunction(X3DTK::Qt::createDeformableOctreeQWidget);
   mainController->defineQWidgetCreationFunction(X3DTK::Qt::createDeformableOctreeShapeQWidget);
    
    
    
    
    
    
    
    
    
    
    
    
    
    application.setMainWidget(mainController);
    return application.exec();
}