/*
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.

----------------------------------------------------------------------
*/

/** Small helper classes to optimize finding vertices close to a given location
 */
#ifndef AI_D3DSSPATIALSORT_H_INC
#define AI_D3DSSPATIALSORT_H_INC

#include <assimp/types.h>
#include <vector>
#include <stdint.h>

namespace Assimp    {

// ----------------------------------------------------------------------------------
/** Specialized version of SpatialSort to support smoothing groups
 *  This is used in by the 3DS, ASE and LWO loaders. 3DS and ASE share their
 *  normal computation code in SmoothingGroups.inl, the LWO loader has its own
 *  implementation to handle all details of its file format correctly.
 */
// ----------------------------------------------------------------------------------
class SGSpatialSort
{
public:

    SGSpatialSort();

    // -------------------------------------------------------------------
    /** Construction from a given face array, handling smoothing groups
     *  properly
     */
    explicit SGSpatialSort(const std::vector<aiVector3D>& vPositions);

    // -------------------------------------------------------------------
    /** Add a vertex to the spatial sort
     * @param vPosition Vertex position to be added
     * @param index Index of the vrtex
     * @param smoothingGroup SmoothingGroup for this vertex
     */
    void Add(const aiVector3D& vPosition, unsigned int index,
        unsigned int smoothingGroup);

    // -------------------------------------------------------------------
    /** Prepare the spatial sorter for use. This step runs in O(logn)
     */
    void Prepare();

    /** Destructor */
    ~SGSpatialSort();

    // -------------------------------------------------------------------
    /** Returns an iterator for all positions close to the given position.
     * @param pPosition The position to look for vertices.
     * @param pSG Only included vertices with at least one shared smooth group
     * @param pRadius Maximal distance from the position a vertex may have
     *   to be counted in.
     * @param poResults The container to store the indices of the found
     *   positions. Will be emptied by the call so it may contain anything.
     * @param exactMatch Specifies whether smoothing groups are bit masks
     *   (false) or integral values (true). In the latter case, a vertex
     *   cannot belong to more than one smoothing group.
     * @return An iterator to iterate over all vertices in the given area.
     */
    // -------------------------------------------------------------------
    void FindPositions( const aiVector3D& pPosition, uint32_t pSG,
        float pRadius, std::vector<unsigned int>& poResults,
        bool exactMatch = false) const;

protected:
    /** Normal of the sorting plane, normalized. The center is always at (0, 0, 0) */
    aiVector3D mPlaneNormal;

    // -------------------------------------------------------------------
    /** An entry in a spatially sorted position array. Consists of a
     *  vertex index, its position and its precalculated distance from
     *  the reference plane */
    // -------------------------------------------------------------------
    struct Entry
    {
        unsigned int mIndex;    ///< The vertex referred by this entry
        aiVector3D mPosition;   ///< Position
        uint32_t mSmoothGroups;
        float mDistance;        ///< Distance of this vertex to the sorting plane

        Entry() { /** intentionally not initialized.*/ }
        Entry( unsigned int pIndex, const aiVector3D& pPosition, float pDistance,uint32_t pSG)
            :
            mIndex( pIndex),
            mPosition( pPosition),
            mSmoothGroups (pSG),
            mDistance( pDistance)
            {   }

        bool operator < (const Entry& e) const { return mDistance < e.mDistance; }
    };

    // all positions, sorted by distance to the sorting plane
    std::vector<Entry> mPositions;
};

} // end of namespace Assimp

#endif // AI_SPATIALSORT_H_INC
