662 lines
30 KiB
C++
662 lines
30 KiB
C++
|
/*
|
||
|
---------------------------------------------------------------------------
|
||
|
Open Asset Import Library (assimp)
|
||
|
---------------------------------------------------------------------------
|
||
|
|
||
|
Copyright (c) 2006-2016, assimp team
|
||
|
|
||
|
All rights reserved.
|
||
|
|
||
|
Redistribution and use of this software in source and binary forms,
|
||
|
with or without modification, are permitted provided that the following
|
||
|
conditions are met:
|
||
|
|
||
|
* Redistributions of source code must retain the above
|
||
|
copyright notice, this list of conditions and the
|
||
|
following disclaimer.
|
||
|
|
||
|
* Redistributions in binary form must reproduce the above
|
||
|
copyright notice, this list of conditions and the
|
||
|
following disclaimer in the documentation and/or other
|
||
|
materials provided with the distribution.
|
||
|
|
||
|
* Neither the name of the assimp team, nor the names of its
|
||
|
contributors may be used to endorse or promote products
|
||
|
derived from this software without specific prior
|
||
|
written permission of the assimp team.
|
||
|
|
||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
---------------------------------------------------------------------------
|
||
|
*/
|
||
|
|
||
|
/** @file Importer.hpp
|
||
|
* @brief Defines the C++-API to the Open Asset Import Library.
|
||
|
*/
|
||
|
#ifndef INCLUDED_AI_ASSIMP_HPP
|
||
|
#define INCLUDED_AI_ASSIMP_HPP
|
||
|
|
||
|
#ifndef __cplusplus
|
||
|
# error This header requires C++ to be used. Use assimp.h for plain C.
|
||
|
#endif
|
||
|
|
||
|
// Public ASSIMP data structures
|
||
|
#include "types.h"
|
||
|
#include "config.h"
|
||
|
|
||
|
namespace Assimp {
|
||
|
// =======================================================================
|
||
|
// Public interface to Assimp
|
||
|
class Importer;
|
||
|
class Exporter; // export.hpp
|
||
|
class IOStream;
|
||
|
class IOSystem;
|
||
|
class ProgressHandler;
|
||
|
|
||
|
// =======================================================================
|
||
|
// Plugin development
|
||
|
//
|
||
|
// Include the following headers for the declarations:
|
||
|
// BaseImporter.h
|
||
|
// BaseProcess.h
|
||
|
class BaseImporter;
|
||
|
class BaseProcess;
|
||
|
class SharedPostProcessInfo;
|
||
|
class BatchLoader;
|
||
|
|
||
|
// =======================================================================
|
||
|
// Holy stuff, only for members of the high council of the Jedi.
|
||
|
class ImporterPimpl;
|
||
|
class ExporterPimpl; // export.hpp
|
||
|
} //! namespace Assimp
|
||
|
|
||
|
#define AI_PROPERTY_WAS_NOT_EXISTING 0xffffffff
|
||
|
|
||
|
struct aiScene;
|
||
|
|
||
|
// importerdesc.h
|
||
|
struct aiImporterDesc;
|
||
|
|
||
|
/** @namespace Assimp Assimp's CPP-API and all internal APIs */
|
||
|
namespace Assimp {
|
||
|
|
||
|
// ----------------------------------------------------------------------------------
|
||
|
/** CPP-API: The Importer class forms an C++ interface to the functionality of the
|
||
|
* Open Asset Import Library.
|
||
|
*
|
||
|
* Create an object of this class and call ReadFile() to import a file.
|
||
|
* If the import succeeds, the function returns a pointer to the imported data.
|
||
|
* The data remains property of the object, it is intended to be accessed
|
||
|
* read-only. The imported data will be destroyed along with the Importer
|
||
|
* object. If the import fails, ReadFile() returns a NULL pointer. In this
|
||
|
* case you can retrieve a human-readable error description be calling
|
||
|
* GetErrorString(). You can call ReadFile() multiple times with a single Importer
|
||
|
* instance. Actually, constructing Importer objects involves quite many
|
||
|
* allocations and may take some time, so it's better to reuse them as often as
|
||
|
* possible.
|
||
|
*
|
||
|
* If you need the Importer to do custom file handling to access the files,
|
||
|
* implement IOSystem and IOStream and supply an instance of your custom
|
||
|
* IOSystem implementation by calling SetIOHandler() before calling ReadFile().
|
||
|
* If you do not assign a custion IO handler, a default handler using the
|
||
|
* standard C++ IO logic will be used.
|
||
|
*
|
||
|
* @note One Importer instance is not thread-safe. If you use multiple
|
||
|
* threads for loading, each thread should maintain its own Importer instance.
|
||
|
*/
|
||
|
class ASSIMP_API Importer {
|
||
|
public:
|
||
|
/**
|
||
|
* @brief The upper limit for hints.
|
||
|
*/
|
||
|
static const unsigned int MaxLenHint = 200;
|
||
|
|
||
|
public:
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Constructor. Creates an empty importer object.
|
||
|
*
|
||
|
* Call ReadFile() to start the import process. The configuration
|
||
|
* property table is initially empty.
|
||
|
*/
|
||
|
Importer();
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Copy constructor.
|
||
|
*
|
||
|
* This copies the configuration properties of another Importer.
|
||
|
* If this Importer owns a scene it won't be copied.
|
||
|
* Call ReadFile() to start the import process.
|
||
|
*/
|
||
|
Importer(const Importer& other);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Destructor. The object kept ownership of the imported data,
|
||
|
* which now will be destroyed along with the object.
|
||
|
*/
|
||
|
~Importer();
|
||
|
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Registers a new loader.
|
||
|
*
|
||
|
* @param pImp Importer to be added. The Importer instance takes
|
||
|
* ownership of the pointer, so it will be automatically deleted
|
||
|
* with the Importer instance.
|
||
|
* @return AI_SUCCESS if the loader has been added. The registration
|
||
|
* fails if there is already a loader for a specific file extension.
|
||
|
*/
|
||
|
aiReturn RegisterLoader(BaseImporter* pImp);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Unregisters a loader.
|
||
|
*
|
||
|
* @param pImp Importer to be unregistered.
|
||
|
* @return AI_SUCCESS if the loader has been removed. The function
|
||
|
* fails if the loader is currently in use (this could happen
|
||
|
* if the #Importer instance is used by more than one thread) or
|
||
|
* if it has not yet been registered.
|
||
|
*/
|
||
|
aiReturn UnregisterLoader(BaseImporter* pImp);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Registers a new post-process step.
|
||
|
*
|
||
|
* At the moment, there's a small limitation: new post processing
|
||
|
* steps are added to end of the list, or in other words, executed
|
||
|
* last, after all built-in steps.
|
||
|
* @param pImp Post-process step to be added. The Importer instance
|
||
|
* takes ownership of the pointer, so it will be automatically
|
||
|
* deleted with the Importer instance.
|
||
|
* @return AI_SUCCESS if the step has been added correctly.
|
||
|
*/
|
||
|
aiReturn RegisterPPStep(BaseProcess* pImp);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Unregisters a post-process step.
|
||
|
*
|
||
|
* @param pImp Step to be unregistered.
|
||
|
* @return AI_SUCCESS if the step has been removed. The function
|
||
|
* fails if the step is currently in use (this could happen
|
||
|
* if the #Importer instance is used by more than one thread) or
|
||
|
* if it has not yet been registered.
|
||
|
*/
|
||
|
aiReturn UnregisterPPStep(BaseProcess* pImp);
|
||
|
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Set an integer configuration property.
|
||
|
* @param szName Name of the property. All supported properties
|
||
|
* are defined in the aiConfig.g header (all constants share the
|
||
|
* prefix AI_CONFIG_XXX and are simple strings).
|
||
|
* @param iValue New value of the property
|
||
|
* @return true if the property was set before. The new value replaces
|
||
|
* the previous value in this case.
|
||
|
* @note Property of different types (float, int, string ..) are kept
|
||
|
* on different stacks, so calling SetPropertyInteger() for a
|
||
|
* floating-point property has no effect - the loader will call
|
||
|
* GetPropertyFloat() to read the property, but it won't be there.
|
||
|
*/
|
||
|
bool SetPropertyInteger(const char* szName, int iValue);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Set a boolean configuration property. Boolean properties
|
||
|
* are stored on the integer stack internally so it's possible
|
||
|
* to set them via #SetPropertyBool and query them with
|
||
|
* #GetPropertyBool and vice versa.
|
||
|
* @see SetPropertyInteger()
|
||
|
*/
|
||
|
bool SetPropertyBool(const char* szName, bool value) {
|
||
|
return SetPropertyInteger(szName,value);
|
||
|
}
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Set a floating-point configuration property.
|
||
|
* @see SetPropertyInteger()
|
||
|
*/
|
||
|
bool SetPropertyFloat(const char* szName, float fValue);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Set a string configuration property.
|
||
|
* @see SetPropertyInteger()
|
||
|
*/
|
||
|
bool SetPropertyString(const char* szName, const std::string& sValue);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Set a matrix configuration property.
|
||
|
* @see SetPropertyInteger()
|
||
|
*/
|
||
|
bool SetPropertyMatrix(const char* szName, const aiMatrix4x4& sValue);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Get a configuration property.
|
||
|
* @param szName Name of the property. All supported properties
|
||
|
* are defined in the aiConfig.g header (all constants share the
|
||
|
* prefix AI_CONFIG_XXX).
|
||
|
* @param iErrorReturn Value that is returned if the property
|
||
|
* is not found.
|
||
|
* @return Current value of the property
|
||
|
* @note Property of different types (float, int, string ..) are kept
|
||
|
* on different lists, so calling SetPropertyInteger() for a
|
||
|
* floating-point property has no effect - the loader will call
|
||
|
* GetPropertyFloat() to read the property, but it won't be there.
|
||
|
*/
|
||
|
int GetPropertyInteger(const char* szName,
|
||
|
int iErrorReturn = 0xffffffff) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Get a boolean configuration property. Boolean properties
|
||
|
* are stored on the integer stack internally so it's possible
|
||
|
* to set them via #SetPropertyBool and query them with
|
||
|
* #GetPropertyBool and vice versa.
|
||
|
* @see GetPropertyInteger()
|
||
|
*/
|
||
|
bool GetPropertyBool(const char* szName, bool bErrorReturn = false) const {
|
||
|
return GetPropertyInteger(szName,bErrorReturn)!=0;
|
||
|
}
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Get a floating-point configuration property
|
||
|
* @see GetPropertyInteger()
|
||
|
*/
|
||
|
float GetPropertyFloat(const char* szName,
|
||
|
float fErrorReturn = 10e10f) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Get a string configuration property
|
||
|
*
|
||
|
* The return value remains valid until the property is modified.
|
||
|
* @see GetPropertyInteger()
|
||
|
*/
|
||
|
const std::string GetPropertyString(const char* szName,
|
||
|
const std::string& sErrorReturn = "") const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Get a matrix configuration property
|
||
|
*
|
||
|
* The return value remains valid until the property is modified.
|
||
|
* @see GetPropertyInteger()
|
||
|
*/
|
||
|
const aiMatrix4x4 GetPropertyMatrix(const char* szName,
|
||
|
const aiMatrix4x4& sErrorReturn = aiMatrix4x4()) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Supplies a custom IO handler to the importer to use to open and
|
||
|
* access files. If you need the importer to use custion IO logic to
|
||
|
* access the files, you need to provide a custom implementation of
|
||
|
* IOSystem and IOFile to the importer. Then create an instance of
|
||
|
* your custion IOSystem implementation and supply it by this function.
|
||
|
*
|
||
|
* The Importer takes ownership of the object and will destroy it
|
||
|
* afterwards. The previously assigned handler will be deleted.
|
||
|
* Pass NULL to take again ownership of your IOSystem and reset Assimp
|
||
|
* to use its default implementation.
|
||
|
*
|
||
|
* @param pIOHandler The IO handler to be used in all file accesses
|
||
|
* of the Importer.
|
||
|
*/
|
||
|
void SetIOHandler( IOSystem* pIOHandler);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Retrieves the IO handler that is currently set.
|
||
|
* You can use #IsDefaultIOHandler() to check whether the returned
|
||
|
* interface is the default IO handler provided by ASSIMP. The default
|
||
|
* handler is active as long the application doesn't supply its own
|
||
|
* custom IO handler via #SetIOHandler().
|
||
|
* @return A valid IOSystem interface, never NULL.
|
||
|
*/
|
||
|
IOSystem* GetIOHandler() const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Checks whether a default IO handler is active
|
||
|
* A default handler is active as long the application doesn't
|
||
|
* supply its own custom IO handler via #SetIOHandler().
|
||
|
* @return true by default
|
||
|
*/
|
||
|
bool IsDefaultIOHandler() const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Supplies a custom progress handler to the importer. This
|
||
|
* interface exposes a #Update() callback, which is called
|
||
|
* more or less periodically (please don't sue us if it
|
||
|
* isn't as periodically as you'd like it to have ...).
|
||
|
* This can be used to implement progress bars and loading
|
||
|
* timeouts.
|
||
|
* @param pHandler Progress callback interface. Pass NULL to
|
||
|
* disable progress reporting.
|
||
|
* @note Progress handlers can be used to abort the loading
|
||
|
* at almost any time.*/
|
||
|
void SetProgressHandler ( ProgressHandler* pHandler );
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Retrieves the progress handler that is currently set.
|
||
|
* You can use #IsDefaultProgressHandler() to check whether the returned
|
||
|
* interface is the default handler provided by ASSIMP. The default
|
||
|
* handler is active as long the application doesn't supply its own
|
||
|
* custom handler via #SetProgressHandler().
|
||
|
* @return A valid ProgressHandler interface, never NULL.
|
||
|
*/
|
||
|
ProgressHandler* GetProgressHandler() const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Checks whether a default progress handler is active
|
||
|
* A default handler is active as long the application doesn't
|
||
|
* supply its own custom progress handler via #SetProgressHandler().
|
||
|
* @return true by default
|
||
|
*/
|
||
|
bool IsDefaultProgressHandler() const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** @brief Check whether a given set of postprocessing flags
|
||
|
* is supported.
|
||
|
*
|
||
|
* Some flags are mutually exclusive, others are probably
|
||
|
* not available because your excluded them from your
|
||
|
* Assimp builds. Calling this function is recommended if
|
||
|
* you're unsure.
|
||
|
*
|
||
|
* @param pFlags Bitwise combination of the aiPostProcess flags.
|
||
|
* @return true if this flag combination is fine.
|
||
|
*/
|
||
|
bool ValidateFlags(unsigned int pFlags) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Reads the given file and returns its contents if successful.
|
||
|
*
|
||
|
* If the call succeeds, the contents of the file are returned as a
|
||
|
* pointer to an aiScene object. The returned data is intended to be
|
||
|
* read-only, the importer object keeps ownership of the data and will
|
||
|
* destroy it upon destruction. If the import fails, NULL is returned.
|
||
|
* A human-readable error description can be retrieved by calling
|
||
|
* GetErrorString(). The previous scene will be deleted during this call.
|
||
|
* @param pFile Path and filename to the file to be imported.
|
||
|
* @param pFlags Optional post processing steps to be executed after
|
||
|
* a successful import. Provide a bitwise combination of the
|
||
|
* #aiPostProcessSteps flags. If you wish to inspect the imported
|
||
|
* scene first in order to fine-tune your post-processing setup,
|
||
|
* consider to use #ApplyPostProcessing().
|
||
|
* @return A pointer to the imported data, NULL if the import failed.
|
||
|
* The pointer to the scene remains in possession of the Importer
|
||
|
* instance. Use GetOrphanedScene() to take ownership of it.
|
||
|
*
|
||
|
* @note Assimp is able to determine the file format of a file
|
||
|
* automatically.
|
||
|
*/
|
||
|
const aiScene* ReadFile(
|
||
|
const char* pFile,
|
||
|
unsigned int pFlags);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Reads the given file from a memory buffer and returns its
|
||
|
* contents if successful.
|
||
|
*
|
||
|
* If the call succeeds, the contents of the file are returned as a
|
||
|
* pointer to an aiScene object. The returned data is intended to be
|
||
|
* read-only, the importer object keeps ownership of the data and will
|
||
|
* destroy it upon destruction. If the import fails, NULL is returned.
|
||
|
* A human-readable error description can be retrieved by calling
|
||
|
* GetErrorString(). The previous scene will be deleted during this call.
|
||
|
* Calling this method doesn't affect the active IOSystem.
|
||
|
* @param pBuffer Pointer to the file data
|
||
|
* @param pLength Length of pBuffer, in bytes
|
||
|
* @param pFlags Optional post processing steps to be executed after
|
||
|
* a successful import. Provide a bitwise combination of the
|
||
|
* #aiPostProcessSteps flags. If you wish to inspect the imported
|
||
|
* scene first in order to fine-tune your post-processing setup,
|
||
|
* consider to use #ApplyPostProcessing().
|
||
|
* @param pHint An additional hint to the library. If this is a non
|
||
|
* empty string, the library looks for a loader to support
|
||
|
* the file extension specified by pHint and passes the file to
|
||
|
* the first matching loader. If this loader is unable to completely
|
||
|
* the request, the library continues and tries to determine the
|
||
|
* file format on its own, a task that may or may not be successful.
|
||
|
* Check the return value, and you'll know ...
|
||
|
* @return A pointer to the imported data, NULL if the import failed.
|
||
|
* The pointer to the scene remains in possession of the Importer
|
||
|
* instance. Use GetOrphanedScene() to take ownership of it.
|
||
|
*
|
||
|
* @note This is a straightforward way to decode models from memory
|
||
|
* buffers, but it doesn't handle model formats that spread their
|
||
|
* data across multiple files or even directories. Examples include
|
||
|
* OBJ or MD3, which outsource parts of their material info into
|
||
|
* external scripts. If you need full functionality, provide
|
||
|
* a custom IOSystem to make Assimp find these files and use
|
||
|
* the regular ReadFile() API.
|
||
|
*/
|
||
|
const aiScene* ReadFileFromMemory(
|
||
|
const void* pBuffer,
|
||
|
size_t pLength,
|
||
|
unsigned int pFlags,
|
||
|
const char* pHint = "");
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Apply post-processing to an already-imported scene.
|
||
|
*
|
||
|
* This is strictly equivalent to calling #ReadFile() with the same
|
||
|
* flags. However, you can use this separate function to inspect
|
||
|
* the imported scene first to fine-tune your post-processing setup.
|
||
|
* @param pFlags Provide a bitwise combination of the
|
||
|
* #aiPostProcessSteps flags.
|
||
|
* @return A pointer to the post-processed data. This is still the
|
||
|
* same as the pointer returned by #ReadFile(). However, if
|
||
|
* post-processing fails, the scene could now be NULL.
|
||
|
* That's quite a rare case, post processing steps are not really
|
||
|
* designed to 'fail'. To be exact, the #aiProcess_ValidateDS
|
||
|
* flag is currently the only post processing step which can actually
|
||
|
* cause the scene to be reset to NULL.
|
||
|
*
|
||
|
* @note The method does nothing if no scene is currently bound
|
||
|
* to the #Importer instance. */
|
||
|
const aiScene* ApplyPostProcessing(unsigned int pFlags);
|
||
|
|
||
|
const aiScene* ApplyCustomizedPostProcessing( BaseProcess *rootProcess, bool requestValidation );
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** @brief Reads the given file and returns its contents if successful.
|
||
|
*
|
||
|
* This function is provided for backward compatibility.
|
||
|
* See the const char* version for detailed docs.
|
||
|
* @see ReadFile(const char*, pFlags) */
|
||
|
const aiScene* ReadFile(
|
||
|
const std::string& pFile,
|
||
|
unsigned int pFlags);
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Frees the current scene.
|
||
|
*
|
||
|
* The function does nothing if no scene has previously been
|
||
|
* read via ReadFile(). FreeScene() is called automatically by the
|
||
|
* destructor and ReadFile() itself. */
|
||
|
void FreeScene( );
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Returns an error description of an error that occurred in ReadFile().
|
||
|
*
|
||
|
* Returns an empty string if no error occurred.
|
||
|
* @return A description of the last error, an empty string if no
|
||
|
* error occurred. The string is never NULL.
|
||
|
*
|
||
|
* @note The returned function remains valid until one of the
|
||
|
* following methods is called: #ReadFile(), #FreeScene(). */
|
||
|
const char* GetErrorString() const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Returns the scene loaded by the last successful call to ReadFile()
|
||
|
*
|
||
|
* @return Current scene or NULL if there is currently no scene loaded */
|
||
|
const aiScene* GetScene() const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Returns the scene loaded by the last successful call to ReadFile()
|
||
|
* and releases the scene from the ownership of the Importer
|
||
|
* instance. The application is now responsible for deleting the
|
||
|
* scene. Any further calls to GetScene() or GetOrphanedScene()
|
||
|
* will return NULL - until a new scene has been loaded via ReadFile().
|
||
|
*
|
||
|
* @return Current scene or NULL if there is currently no scene loaded
|
||
|
* @note Use this method with maximal caution, and only if you have to.
|
||
|
* By design, aiScene's are exclusively maintained, allocated and
|
||
|
* deallocated by Assimp and no one else. The reasoning behind this
|
||
|
* is the golden rule that deallocations should always be done
|
||
|
* by the module that did the original allocation because heaps
|
||
|
* are not necessarily shared. GetOrphanedScene() enforces you
|
||
|
* to delete the returned scene by yourself, but this will only
|
||
|
* be fine if and only if you're using the same heap as assimp.
|
||
|
* On Windows, it's typically fine provided everything is linked
|
||
|
* against the multithreaded-dll version of the runtime library.
|
||
|
* It will work as well for static linkage with Assimp.*/
|
||
|
aiScene* GetOrphanedScene();
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Returns whether a given file extension is supported by ASSIMP.
|
||
|
*
|
||
|
* @param szExtension Extension to be checked.
|
||
|
* Must include a trailing dot '.'. Example: ".3ds", ".md3".
|
||
|
* Cases-insensitive.
|
||
|
* @return true if the extension is supported, false otherwise */
|
||
|
bool IsExtensionSupported(const char* szExtension) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** @brief Returns whether a given file extension is supported by ASSIMP.
|
||
|
*
|
||
|
* This function is provided for backward compatibility.
|
||
|
* See the const char* version for detailed and up-to-date docs.
|
||
|
* @see IsExtensionSupported(const char*) */
|
||
|
inline bool IsExtensionSupported(const std::string& szExtension) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Get a full list of all file extensions supported by ASSIMP.
|
||
|
*
|
||
|
* If a file extension is contained in the list this does of course not
|
||
|
* mean that ASSIMP is able to load all files with this extension ---
|
||
|
* it simply means there is an importer loaded which claims to handle
|
||
|
* files with this file extension.
|
||
|
* @param szOut String to receive the extension list.
|
||
|
* Format of the list: "*.3ds;*.obj;*.dae". This is useful for
|
||
|
* use with the WinAPI call GetOpenFileName(Ex). */
|
||
|
void GetExtensionList(aiString& szOut) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** @brief Get a full list of all file extensions supported by ASSIMP.
|
||
|
*
|
||
|
* This function is provided for backward compatibility.
|
||
|
* See the aiString version for detailed and up-to-date docs.
|
||
|
* @see GetExtensionList(aiString&)*/
|
||
|
inline void GetExtensionList(std::string& szOut) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Get the number of importrs currently registered with Assimp. */
|
||
|
size_t GetImporterCount() const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Get meta data for the importer corresponding to a specific index..
|
||
|
*
|
||
|
* For the declaration of #aiImporterDesc, include <assimp/importerdesc.h>.
|
||
|
* @param index Index to query, must be within [0,GetImporterCount())
|
||
|
* @return Importer meta data structure, NULL if the index does not
|
||
|
* exist or if the importer doesn't offer meta information (
|
||
|
* importers may do this at the cost of being hated by their peers).*/
|
||
|
const aiImporterDesc* GetImporterInfo(size_t index) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Find the importer corresponding to a specific index.
|
||
|
*
|
||
|
* @param index Index to query, must be within [0,GetImporterCount())
|
||
|
* @return Importer instance. NULL if the index does not
|
||
|
* exist. */
|
||
|
BaseImporter* GetImporter(size_t index) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Find the importer corresponding to a specific file extension.
|
||
|
*
|
||
|
* This is quite similar to #IsExtensionSupported except a
|
||
|
* BaseImporter instance is returned.
|
||
|
* @param szExtension Extension to check for. The following formats
|
||
|
* are recognized (BAH being the file extension): "BAH" (comparison
|
||
|
* is case-insensitive), ".bah", "*.bah" (wild card and dot
|
||
|
* characters at the beginning of the extension are skipped).
|
||
|
* @return NULL if no importer is found*/
|
||
|
BaseImporter* GetImporter (const char* szExtension) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Find the importer index corresponding to a specific file extension.
|
||
|
*
|
||
|
* @param szExtension Extension to check for. The following formats
|
||
|
* are recognized (BAH being the file extension): "BAH" (comparison
|
||
|
* is case-insensitive), ".bah", "*.bah" (wild card and dot
|
||
|
* characters at the beginning of the extension are skipped).
|
||
|
* @return (size_t)-1 if no importer is found */
|
||
|
size_t GetImporterIndex (const char* szExtension) const;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Returns the storage allocated by ASSIMP to hold the scene data
|
||
|
* in memory.
|
||
|
*
|
||
|
* This refers to the currently loaded file, see #ReadFile().
|
||
|
* @param in Data structure to be filled.
|
||
|
* @note The returned memory statistics refer to the actual
|
||
|
* size of the use data of the aiScene. Heap-related overhead
|
||
|
* is (naturally) not included.*/
|
||
|
void GetMemoryRequirements(aiMemoryInfo& in) const;
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Enables "extra verbose" mode.
|
||
|
*
|
||
|
* 'Extra verbose' means the data structure is validated after *every*
|
||
|
* single post processing step to make sure everyone modifies the data
|
||
|
* structure in a well-defined manner. This is a debug feature and not
|
||
|
* intended for use in production environments. */
|
||
|
void SetExtraVerbose(bool bDo);
|
||
|
|
||
|
|
||
|
// -------------------------------------------------------------------
|
||
|
/** Private, do not use. */
|
||
|
ImporterPimpl* Pimpl() { return pimpl; }
|
||
|
const ImporterPimpl* Pimpl() const { return pimpl; }
|
||
|
|
||
|
protected:
|
||
|
|
||
|
// Just because we don't want you to know how we're hacking around.
|
||
|
ImporterPimpl* pimpl;
|
||
|
}; //! class Importer
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
// For compatibility, the interface of some functions taking a std::string was
|
||
|
// changed to const char* to avoid crashes between binary incompatible STL
|
||
|
// versions. This code her is inlined, so it shouldn't cause any problems.
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
AI_FORCE_INLINE const aiScene* Importer::ReadFile( const std::string& pFile,unsigned int pFlags){
|
||
|
return ReadFile(pFile.c_str(),pFlags);
|
||
|
}
|
||
|
// ----------------------------------------------------------------------------
|
||
|
AI_FORCE_INLINE void Importer::GetExtensionList(std::string& szOut) const {
|
||
|
aiString s;
|
||
|
GetExtensionList(s);
|
||
|
szOut = s.data;
|
||
|
}
|
||
|
// ----------------------------------------------------------------------------
|
||
|
AI_FORCE_INLINE bool Importer::IsExtensionSupported(const std::string& szExtension) const {
|
||
|
return IsExtensionSupported(szExtension.c_str());
|
||
|
}
|
||
|
|
||
|
} // !namespace Assimp
|
||
|
#endif // INCLUDED_AI_ASSIMP_HPP
|