/* -----------------------------------------------------------------------------
	GSFramework
	Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */


#ifndef	__FBXIMPORT__
#define __FBXIMPORT__


		#define	FBXSDK_NEW_API
		#include "fbxsdk.h"

		#include "import/import_interface.h"
		#include "automation/automated_property_provider.h"
		#include "core/resource_factory_event_interface.h"
		#include "container/nlist.h"


namespace GS {

	namespace Core {
		class Motion;
		class Geometry;
		struct Material;
	}
	namespace S3D {
		class MItem;
		struct MObject;

/// Exported node cache.
struct	ExportedNode
{
		FbxNode		*node;
		MItem		*item;

		ExportedNode(FbxNode *n, MItem *i) : node(n), item(i) {}
};

/*!
	@short	Autodesk FBX Importer.
	@author	Emmanuel Julien (ejulien@gsworks.fr)
*/
class	FBXImporter : public IImport
{
		int				current_node_index;

		String			input_path;
		Scene			*scene;
		const Config	*config;

		FbxManager		*sdk_manager;
		FbxScene		*fbx_scene;

		List <Core::Geometry *> geometry_list;
		List <ExportedNode *> node_list;

		/// Save material.
		String			SaveMaterial(const Core::Material &, const char *);

		/// Get the item corresponding to a node, if it has been exported already.
		bool			GetNodeItem(FbxNode *, MItem **);

		/// Export motion channels.
		void			ExportMotionChannel(FbxNode *, FbxAnimCurve *, Core::Motion *, Core::MotionChannel::Type);
		/// Bake transformation.
		void			BakeTransformation(FbxNode *, MItem *, Core::Motion *);
		/// Export motions.
		void			ExportMotions(FbxNode *, MItem *);
		/// Export mesh layer.
		void			ExportMeshLayer(FbxMesh *, Core::Geometry *, int layer_index = 0);
		/// Export skin.
		bool			ExportDeformers(FbxMesh *, FbxNode *, Core::Geometry &, MObject *);
		/// Export vertex color.
		void			ExportMeshVertexColor(FbxMesh *, Core::Geometry *);
		/// Export tangent frame.
		void			ExportMeshTangentFrame(FbxMesh *, Core::Geometry *);
		/// Export a geometry (topology and normals).
		String			ExportGeometry(FbxMesh *, FbxNode *, MObject *);

		/// Export a file-based texture.
		String			ExportFileTexture(FbxFileTexture *);
		/// Export a layered texture.
		String			ExportLayeredTexture(FbxLayeredTexture *);
		/// Export a material.
		String			ExportMaterial(FbxSurfaceMaterial *, FbxMesh *, bool use_skin);

		/// Export a camera.
		MItem			*ExportCamera(FbxNodeAttribute *, FbxNode * = 0);
		/// Export a mesh.
		MObject			*ExportObject(FbxNodeAttribute *, FbxNode * = 0);
		/// Export a light.
		MItem			*ExportLight(FbxNodeAttribute *, FbxNode * = 0);
		/// Dispatch the node to the correct exporter.
		MItem			*ExportNode(FbxNode *pNode);

		/// Create and import an FBX file to a native FBX scene.
		FbxScene		*LoadNativeScene(const char *fbx_path);

public:

		/// Return the geometries created during import.
		const List <Core::Geometry *> &GeometryList() const { return geometry_list; }

		/// Test importer on a file.
virtual	bool			TestImport(const char *uri);
		/// Import scene from file.
virtual	bool			ImportScene(Scene *, const char *uri, const Config &, Group ** = 0);

		FBXImporter();
		~FBXImporter();
};

	} // S3D
} // GS


#endif	// __FBXIMPORT__
