Program Listing for File NeighborhoodSearchSpatialHashing.h

Return to documentation for file (Simulation/NeighborhoodSearchSpatialHashing.h)

#ifndef __NEIGHBORHOODSEARCHSPATIALHASHING_H__
#define __NEIGHBORHOODSEARCHSPATIALHASHING_H__

#include "Utils/Hashmap.h"
#include <vector>
#include "Common/Common.h"

typedef Eigen::Vector3i NeighborhoodSearchCellPos;

namespace Utilities
{
    template<>
    inline unsigned int hashFunction<NeighborhoodSearchCellPos*>(NeighborhoodSearchCellPos* const &key)
    {
        const int p1 = 73856093 * (*key)[0];
        const int p2 = 19349663 * (*key)[1];
        const int p3 = 83492791 * (*key)[2];
        return p1 + p2 + p3;
    }
}

namespace PBD
{
    class NeighborhoodSearchSpatialHashing
    {
    public:
        NeighborhoodSearchSpatialHashing(const unsigned int numParticles = 0, const Real radius = 0.1, const unsigned int maxNeighbors = 60u, const unsigned int maxParticlesPerCell = 50u);
        ~NeighborhoodSearchSpatialHashing();

        // Spatial hashing
        struct HashEntry
        {
            HashEntry() {};
            unsigned long timestamp;
            std::vector<unsigned int> particleIndices;
        };

        FORCE_INLINE static int floor(const Real v)
        {
            return (int)(v + 32768.f) - 32768;          // Shift to get positive values
        }

        void cleanup();
        void neighborhoodSearch(Vector3r *x);
        void neighborhoodSearch(Vector3r *x, const unsigned int numBoundaryParticles, Vector3r *boundaryX);
        void update();
        unsigned int **getNeighbors() const;
        unsigned int *getNumNeighbors() const;
        const unsigned int getMaxNeighbors() const { return m_maxNeighbors; }

        unsigned int getNumParticles() const;
        void setRadius(const Real radius);
        Real getRadius() const;

        FORCE_INLINE unsigned int n_neighbors(unsigned int i) const
        {
            return m_numNeighbors[i];
        }
        FORCE_INLINE unsigned int neighbor(unsigned int i, unsigned int k) const
        {
            return m_neighbors[i][k];
        }


    private:
        unsigned int m_numParticles;
        unsigned int m_maxNeighbors;
        unsigned int m_maxParticlesPerCell;
        unsigned int **m_neighbors;
        unsigned int *m_numNeighbors;
        Real m_cellGridSize;
        Real m_radius2;
        unsigned int m_currentTimestamp;
        Utilities::Hashmap<NeighborhoodSearchCellPos*, HashEntry*> m_gridMap;
    };
}

#endif