
/*
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  3DSLoader.h
 *  @brief 3DS File format loader
 */
#ifndef AI_3DSIMPORTER_H_INC
#define AI_3DSIMPORTER_H_INC

#include "BaseImporter.h"
#include <assimp/types.h>

#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER

#include "3DSHelper.h"
#include "StreamReader.h"

struct aiNode;

namespace Assimp    {


using namespace D3DS;

// ---------------------------------------------------------------------------------
/** Importer class for 3D Studio r3 and r4 3DS files
 */
class Discreet3DSImporter : public BaseImporter
{
public:

    Discreet3DSImporter();
    ~Discreet3DSImporter();

public:

    // -------------------------------------------------------------------
    /** Returns whether the class can handle the format of the given file.
     * See BaseImporter::CanRead() for details.
     */
    bool CanRead( const std::string& pFile, IOSystem* pIOHandler,
        bool checkSig) const;

    // -------------------------------------------------------------------
    /** Called prior to ReadFile().
     * The function is a request to the importer to update its configuration
     * basing on the Importer's configuration property list.
     */
    void SetupProperties(const Importer* pImp);

protected:

    // -------------------------------------------------------------------
    /** Return importer meta information.
     * See #BaseImporter::GetInfo for the details
     */
    const aiImporterDesc* GetInfo () const;

    // -------------------------------------------------------------------
    /** Imports the given file into the given scene structure.
     * See BaseImporter::InternReadFile() for details
     */
    void InternReadFile( const std::string& pFile, aiScene* pScene,
        IOSystem* pIOHandler);

    // -------------------------------------------------------------------
    /** Converts a temporary material to the outer representation
     */
    void ConvertMaterial(D3DS::Material& p_cMat,
        aiMaterial& p_pcOut);

    // -------------------------------------------------------------------
    /** Read a chunk
     *
     *  @param pcOut Receives the current chunk
     */
    void ReadChunk(Discreet3DS::Chunk* pcOut);

    // -------------------------------------------------------------------
    /** Parse a percentage chunk. mCurrent will point to the next
    * chunk behind afterwards. If no percentage chunk is found
    * QNAN is returned.
    */
    ai_real ParsePercentageChunk();

    // -------------------------------------------------------------------
    /** Parse a color chunk. mCurrent will point to the next
    * chunk behind afterwards. If no color chunk is found
    * QNAN is returned in all members.
    */
    void ParseColorChunk(aiColor3D* p_pcOut,
        bool p_bAcceptPercent = true);


    // -------------------------------------------------------------------
    /** Skip a chunk in the file
    */
    void SkipChunk();

    // -------------------------------------------------------------------
    /** Generate the nodegraph
    */
    void GenerateNodeGraph(aiScene* pcOut);

    // -------------------------------------------------------------------
    /** Parse a main top-level chunk in the file
    */
    void ParseMainChunk();

    // -------------------------------------------------------------------
    /** Parse a top-level chunk in the file
    */
    void ParseChunk(const char* name, unsigned int num);

    // -------------------------------------------------------------------
    /** Parse a top-level editor chunk in the file
    */
    void ParseEditorChunk();

    // -------------------------------------------------------------------
    /** Parse a top-level object chunk in the file
    */
    void ParseObjectChunk();

    // -------------------------------------------------------------------
    /** Parse a material chunk in the file
    */
    void ParseMaterialChunk();

    // -------------------------------------------------------------------
    /** Parse a mesh chunk in the file
    */
    void ParseMeshChunk();

    // -------------------------------------------------------------------
    /** Parse a light chunk in the file
    */
    void ParseLightChunk();

    // -------------------------------------------------------------------
    /** Parse a camera chunk in the file
    */
    void ParseCameraChunk();

    // -------------------------------------------------------------------
    /** Parse a face list chunk in the file
    */
    void ParseFaceChunk();

    // -------------------------------------------------------------------
    /** Parse a keyframe chunk in the file
    */
    void ParseKeyframeChunk();

    // -------------------------------------------------------------------
    /** Parse a hierarchy chunk in the file
    */
    void ParseHierarchyChunk(uint16_t parent);

    // -------------------------------------------------------------------
    /** Parse a texture chunk in the file
    */
    void ParseTextureChunk(D3DS::Texture* pcOut);

    // -------------------------------------------------------------------
    /** Convert the meshes in the file
    */
    void ConvertMeshes(aiScene* pcOut);

    // -------------------------------------------------------------------
    /** Replace the default material in the scene
    */
    void ReplaceDefaultMaterial();

    // -------------------------------------------------------------------
    /** Convert the whole scene
    */
    void ConvertScene(aiScene* pcOut);

    // -------------------------------------------------------------------
    /** generate unique vertices for a mesh
    */
    void MakeUnique(D3DS::Mesh& sMesh);

    // -------------------------------------------------------------------
    /** Add a node to the node graph
    */
    void AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,D3DS::Node* pcIn,
        aiMatrix4x4& absTrafo);

    // -------------------------------------------------------------------
    /** Search for a node in the graph.
    * Called recursively
    */
    void InverseNodeSearch(D3DS::Node* pcNode,D3DS::Node* pcCurrent);

    // -------------------------------------------------------------------
    /** Apply the master scaling factor to the mesh
    */
    void ApplyMasterScale(aiScene* pScene);

    // -------------------------------------------------------------------
    /** Clamp all indices in the file to a valid range
    */
    void CheckIndices(D3DS::Mesh& sMesh);

    // -------------------------------------------------------------------
    /** Skip the TCB info in a track key
    */
    void SkipTCBInfo();

protected:

    /** Stream to read from */
    StreamReaderLE* stream;

    /** Last touched node index */
    short mLastNodeIndex;

    /** Current node, root node */
    D3DS::Node* mCurrentNode, *mRootNode;

    /** Scene under construction */
    D3DS::Scene* mScene;

    /** Ambient base color of the scene */
    aiColor3D mClrAmbient;

    /** Master scaling factor of the scene */
    ai_real mMasterScale;

    /** Path to the background image of the scene */
    std::string mBackgroundImage;
    bool bHasBG;

    /** true if PRJ file */
    bool bIsPrj;
};

} // end of namespace Assimp

#endif // !! ASSIMP_BUILD_NO_3DS_IMPORTER

#endif // AI_3DSIMPORTER_H_INC
