#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();
}