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