/*
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 (dummy) post processing step to validate the loader's
 * output data structure (for debugging)
 */
#ifndef AI_VALIDATEPROCESS_H_INC
#define AI_VALIDATEPROCESS_H_INC

#include <assimp/types.h>
#include <assimp/material.h>
#include "BaseProcess.h"

struct aiBone;
struct aiMesh;
struct aiAnimation;
struct aiNodeAnim;
struct aiTexture;
struct aiMaterial;
struct aiNode;
struct aiString;
struct aiCamera;
struct aiLight;

namespace Assimp    {

// --------------------------------------------------------------------------------------
/** Validates the whole ASSIMP scene data structure for correctness.
 *  ImportErrorException is thrown of the scene is corrupt.*/
// --------------------------------------------------------------------------------------
class ValidateDSProcess : public BaseProcess
{
public:

    ValidateDSProcess();
    ~ValidateDSProcess();

public:
    // -------------------------------------------------------------------
    bool IsActive( unsigned int pFlags) const;

    // -------------------------------------------------------------------
    void Execute( aiScene* pScene);

protected:

    // -------------------------------------------------------------------
    /** Report a validation error. This will throw an exception,
     *  control won't return.
     * @param msg Format string for sprintf().*/
    AI_WONT_RETURN void ReportError(const char* msg,...) AI_WONT_RETURN_SUFFIX;


    // -------------------------------------------------------------------
    /** Report a validation warning. This won't throw an exception,
     *  control will return to the caller.
     * @param msg Format string for sprintf().*/
    void ReportWarning(const char* msg,...);


    // -------------------------------------------------------------------
    /** Validates a mesh
     * @param pMesh Input mesh*/
    void Validate( const aiMesh* pMesh);

    // -------------------------------------------------------------------
    /** Validates a bone
     * @param pMesh Input mesh
     * @param pBone Input bone*/
    void Validate( const aiMesh* pMesh,const aiBone* pBone,float* afSum);

    // -------------------------------------------------------------------
    /** Validates an animation
     * @param pAnimation Input animation*/
    void Validate( const aiAnimation* pAnimation);

    // -------------------------------------------------------------------
    /** Validates a material
     * @param pMaterial Input material*/
    void Validate( const aiMaterial* pMaterial);

    // -------------------------------------------------------------------
    /** Search the material data structure for invalid or corrupt
     *  texture keys.
     * @param pMaterial Input material
     * @param type Type of the texture*/
    void SearchForInvalidTextures(const aiMaterial* pMaterial,
        aiTextureType type);

    // -------------------------------------------------------------------
    /** Validates a texture
     * @param pTexture Input texture*/
    void Validate( const aiTexture* pTexture);

    // -------------------------------------------------------------------
    /** Validates a light source
     * @param pLight Input light
     */
    void Validate( const aiLight* pLight);

    // -------------------------------------------------------------------
    /** Validates a camera
     * @param pCamera Input camera*/
    void Validate( const aiCamera* pCamera);

    // -------------------------------------------------------------------
    /** Validates a bone animation channel
     * @param pAnimation Animation channel.
     * @param pBoneAnim Input bone animation */
    void Validate( const aiAnimation* pAnimation,
        const aiNodeAnim* pBoneAnim);

    // -------------------------------------------------------------------
    /** Validates a node and all of its subnodes
     * @param Node Input node*/
    void Validate( const aiNode* pNode);

    // -------------------------------------------------------------------
    /** Validates a string
     * @param pString Input string*/
    void Validate( const aiString* pString);

private:

    // template to validate one of the aiScene::mXXX arrays
    template <typename T>
    inline void DoValidation(T** array, unsigned int size,
        const char* firstName, const char* secondName);

    // extended version: checks whether T::mName occurs twice
    template <typename T>
    inline void DoValidationEx(T** array, unsigned int size,
        const char* firstName, const char* secondName);

    // extension to the first template which does also search
    // the nodegraph for an item with the same name
    template <typename T>
    inline void DoValidationWithNameCheck(T** array, unsigned int size,
        const char* firstName, const char* secondName);

    aiScene* mScene;
};




} // end of namespace Assimp

#endif // AI_VALIDATEPROCESS_H_INC
