/*
Open Asset Import Library (assimp)
----------------------------------------------------------------------

Copyright (c) 2006-2017, 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 Defines a post processing step to search all meshes for
  degenerated faces */
#ifndef AI_SCENE_PREPROCESSOR_H_INC
#define AI_SCENE_PREPROCESSOR_H_INC

#include <assimp/defs.h>
#include <stddef.h>

struct aiScene;
struct aiAnimation;
struct aiMesh;

class ScenePreprocessorTest;
namespace Assimp    {

// ----------------------------------------------------------------------------------
/** ScenePreprocessor: Preprocess a scene before any post-processing
 *  steps are executed.
 *
 *  The step computes data that needn't necessarily be provided by the
 *  importer, such as aiMesh::mPrimitiveTypes.
*/
// ----------------------------------------------------------------------------------
class ASSIMP_API ScenePreprocessor
{
    // Make ourselves a friend of the corresponding test unit.
    friend class ::ScenePreprocessorTest;
public:

    // ----------------------------------------------------------------
    /** Default c'tpr. Use SetScene() to assign a scene to the object.
     */
    ScenePreprocessor()
        :   scene   (NULL)
    {}

    /** Constructs the object and assigns a specific scene to it
     */
    ScenePreprocessor(aiScene* _scene)
        :   scene   (_scene)
    {}

    // ----------------------------------------------------------------
    /** Assign a (new) scene to the object.
     *
     *  One 'SceneProcessor' can be used for multiple scenes.
     *  Call ProcessScene to have the scene preprocessed.
     *  @param sc Scene to be processed.
     */
    void SetScene (aiScene* sc) {
        scene = sc;
    }

    // ----------------------------------------------------------------
    /** Preprocess the current scene
     */
    void ProcessScene ();

protected:

    // ----------------------------------------------------------------
    /** Preprocess an animation in the scene
     *  @param anim Anim to be preprocessed.
     */
    void ProcessAnimation (aiAnimation* anim);


    // ----------------------------------------------------------------
    /** Preprocess a mesh in the scene
     *  @param mesh Mesh to be preprocessed.
     */
    void ProcessMesh (aiMesh* mesh);

protected:

    //! Scene we're currently working on
    aiScene* scene;
};


} // ! end namespace Assimp

#endif // include guard
