131 lines
4.8 KiB
C++
131 lines
4.8 KiB
C++
/*
|
|
Open Asset Import Library (ASSIMP)
|
|
----------------------------------------------------------------------
|
|
|
|
Copyright (c) 2006-2008, ASSIMP Development 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 Development 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 optimise finding vertizes close to a given location
|
|
*/
|
|
#ifndef AI_D3DSSPATIALSORT_H_INC
|
|
#define AI_D3DSSPATIALSORT_H_INC
|
|
|
|
#include <vector>
|
|
#include "../include/aiVector3D.h"
|
|
|
|
|
|
#if (!defined AI_BUILD_NO_ASE_IMPORTER)
|
|
# include "3DSHelper.h"
|
|
#endif
|
|
|
|
namespace Assimp
|
|
{
|
|
|
|
using namespace Dot3DS;
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
/** Specialized version of SpatialSort to support smoothing groups
|
|
* This is used in the .3ds loader
|
|
*/
|
|
class D3DSSpatialSorter
|
|
{
|
|
public:
|
|
|
|
D3DSSpatialSorter();
|
|
|
|
// -------------------------------------------------------------------
|
|
/** Construction from a given face array, handling smoothing groups properly
|
|
*/
|
|
D3DSSpatialSorter(const std::vector<aiVector3D>& vPositions);
|
|
|
|
// -------------------------------------------------------------------
|
|
/** Add a face to the spatial sorter
|
|
* @param pcFace Face to be added
|
|
* @param vPositions Input position list
|
|
*/
|
|
void AddFace(const Dot3DS::Face* pcFace,
|
|
const std::vector<aiVector3D>& vPositions);
|
|
|
|
// -------------------------------------------------------------------
|
|
/** Prepare the spatial sorter for use
|
|
*/
|
|
void Prepare();
|
|
|
|
/** Destructor */
|
|
~D3DSSpatialSorter();
|
|
|
|
// -------------------------------------------------------------------
|
|
/** 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.
|
|
* @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) 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)
|
|
:
|
|
mPosition( pPosition), mIndex( pIndex), mDistance( pDistance),mSmoothGroups (pSG)
|
|
{ }
|
|
|
|
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
|