/// Helper allowing 'intelligent' writing of external files (images, shaders, etc.), regarding to a main file (a scene), especially in plugins.
/// Goals are:
/// - Enable writing out objects only once (even if referenced multiple times)
/// - Handle duplicates (avoid writing two different objects at the same place, renaming files as needed)
/// - Handle directory creation when paths don't just exist
/// - Generate writing paths which may keep original directory structure (depending on user wishes). Ex:
/// Reading: model.osg and images/img1.jpg
/// Writing with 'keepRelativePaths': /somePath/newmodel.osg and /somePath/images/img1.jpg
/// Writing without 'keepRelativePaths': /somePath/newmodel.osg and /somePath/img1.jpg
///\author Sukender
///\todo Handling of naming constraints (such as "8.3" names in 3DS)
class OSGDB_EXPORT ExternalFileWriter
{
public:
/// Builds the helper class with all options.
///\param srcDirectory Directory of the initial main file (if any), used as a base when relativising objects names. Not used if keepRelativePaths==false.
///\param destDirectory Directory where to write the main file.
///\param keepRelativePaths If true, then relative paths of source objects are kept if possible (ex: If an image is initially "imageDir/image.jpg" relatively to the source dir, then we'd like to get "destDir/imageDir/image.jpg"). If false, then only the simple file name is used to write the object file.
///\param allowUpDirs When relativising objects paths, sets the maximum number of directories the objects can be written "up" the destination directory. Not used if keepRelativePaths==false. Examples: If an image is initially "../image.jpg" relatively to the source dir *AND* if we allow one dir level up, then we'd like to get "destDirParent/destDir/../image.jpg" (= "destDirParent/image.jpg"). If we *DO NOT* allow one dir level up, then we'd like to get "destDir/image.jpg".
/// Writes the current object if not already done.
///\param obj Object to write, using corresponding osgDB::write method.
///\param options Writing options to pass to corresponding osgDB::write method.
///\param [out] out_absolutePath Pointer to a string to be filled with absolute writing path, or NULL.
///\param [out] out_relativePath Pointer to a string to be filled with write path relative to the destination directory if possible (absolute path if not), or NULL.
// A multi-indexed structure would be more efficient for ObjectsSet (such as boost::multi_index, indexed on object pointer (unique), and hashed indexed on absolute path (unique)).
// In order to get a correct search time, SearchMap "replaces" the multi-index structure for hashed indexes on absolute paths.