Initiual commit: AssetImporter source moved from ZFXCE repository to its own repository. PLease do not use the ZFXCE repo any more.
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
This commit is contained in:
83
code/3DSSpatialSort.h
Normal file
83
code/3DSSpatialSort.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/** 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"
|
||||
#include "3DSHelper.h"
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
|
||||
using namespace Dot3DS;
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
/** Specialized version of SpatialSort to support smoothing groups
|
||||
* This is used in the .3ds loader
|
||||
*/
|
||||
class D3DSSpatialSorter
|
||||
{
|
||||
public:
|
||||
|
||||
D3DSSpatialSorter() {/* This is unintialized. This is evil. This is OK. */}
|
||||
|
||||
/** Constructs a spatially sorted representation from the given position array.
|
||||
* Supply the positions in its layout in memory, the class will only refer to them
|
||||
* by index.
|
||||
* @param pPositions Pointer to the first position vector of the array.
|
||||
* @param pNumPositions Number of vectors to expect in that array.
|
||||
* @param pElementOffset Offset in bytes from the beginning of one vector in memory to the beginning of the next vector.
|
||||
* @note Smoothing groups are ignored
|
||||
*/
|
||||
D3DSSpatialSorter( const aiVector3D* pPositions,
|
||||
unsigned int pNumPositions, unsigned int pElementOffset);
|
||||
|
||||
/** Construction from a given face array, handling smoothing groups properly
|
||||
* @param p_pcMesh Input mesh.
|
||||
*/
|
||||
D3DSSpatialSorter( const Dot3DS::Mesh* p_pcMesh);
|
||||
|
||||
|
||||
/** 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
|
||||
Reference in New Issue
Block a user