8    IMPLEMENT_TCLASS(PointSet, TDataType)
 
   10    template<typename TDataType>
 
   11    PointSet<TDataType>::PointSet()
 
   14        //this->setUpdateAlways(true);
 
   17    template<typename TDataType>
 
   18    PointSet<TDataType>::~PointSet()
 
   23    template<typename TDataType>
 
   24    void PointSet<TDataType>::loadObjFile(std::string filename)
 
   26        if (filename.size() < 5 || filename.substr(filename.size() - 4) != std::string(".obj")) {
 
   27            std::cerr << "Error: Expected OBJ file with filename of the form <name>.obj.\n";
 
   31        std::ifstream infile(filename);
 
   33            std::cerr << "Failed to open. Terminating.\n";
 
   37        int ignored_lines = 0;
 
   39        std::vector<Coord> vertList;
 
   40        while (!infile.eof()) {
 
   41            std::getline(infile, line);
 
   43            //.obj files sometimes contain vertex normals indicated by "vn"
 
   44            if (line.substr(0, 1) == std::string("v") && line.substr(0, 2) != std::string("vn")) {
 
   45                std::stringstream data(line);
 
   48                data >> c >> point[0] >> point[1] >> point[2];
 
   49                vertList.push_back(point);
 
   57        std::cout << "Total number of particles: " << vertList.size() << std::endl;
 
   64    template<typename TDataType>
 
   65    void PointSet<TDataType>::copyFrom(PointSet<TDataType>& pointSet)
 
   67        mCoords.assign(pointSet.getPoints());
 
   70    template<typename TDataType>
 
   71    void PointSet<TDataType>::setPoints(const std::vector<Coord>& pos)
 
   73        mCoords.resize(pos.size());
 
   79    template<typename TDataType>
 
   80    void PointSet<TDataType>::setPoints(const DArray<Coord>& pos)
 
   82        mCoords.resize(pos.size());
 
   88    template<typename TDataType>
 
   89    void PointSet<TDataType>::setSize(int size)
 
   95    template<typename TDataType>
 
   96    void PointSet<TDataType>::requestBoundingBox(Coord& lo, Coord& hi)
 
   98        Reduction<Coord> reduce;
 
   99        lo = reduce.minimum(mCoords.begin(), mCoords.size());
 
  100        hi = reduce.maximum(mCoords.begin(), mCoords.size());
 
  103    template <typename Real, typename Coord>
 
  104    __global__ void PS_Scale(
 
  105        DArray<Coord> vertex,
 
  108        int pId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  109        if (pId >= vertex.size()) return;
 
  111        vertex[pId] = vertex[pId] * s;
 
  114    template<typename TDataType>
 
  115    void PointSet<TDataType>::scale(const Real s)
 
  117        cuExecute(mCoords.size(), PS_Scale, mCoords, s);
 
  120    template <typename Coord>
 
  121    __global__ void PS_Scale(
 
  122        DArray<Coord> vertex,
 
  125        int pId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  126        if (pId >= vertex.size()) return;
 
  128        Coord pos_i = vertex[pId];
 
  129        vertex[pId] = Coord(pos_i[0] * s[0], pos_i[1] * s[1], pos_i[2] * s[2]);
 
  132    template<typename TDataType>
 
  133    void PointSet<TDataType>::scale(const Coord s)
 
  135        cuExecute(mCoords.size(), PS_Scale, mCoords, s);
 
  138    template <typename Coord>
 
  139    __global__ void PS_Translate(
 
  140        DArray<Coord> vertex,
 
  143        int pId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  144        if (pId >= vertex.size()) return;
 
  146        vertex[pId] = vertex[pId] + t;
 
  150    template<typename TDataType>
 
  151    void PointSet<TDataType>::translate(const Coord t)
 
  153        cuExecute(mCoords.size(), PS_Translate, mCoords, t);
 
  156    template <typename Coord>
 
  157    __global__ void PS_Rotate(
 
  158        DArray<Coord> vertex,
 
  163        int pId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  164        if (pId >= vertex.size()) return;
 
  166        Coord pos = vertex[pId];
 
  172        pos[1] = y * cos(theta[1]) - z * sin(theta[1]);
 
  173        pos[2] = y * sin(theta[1]) + z * cos(theta[1]);
 
  179        pos[0] = x * cos(theta[0]) - y * sin(theta[0]);
 
  180        pos[1] = x * sin(theta[0]) + y * cos(theta[0]);
 
  186        pos[2] = z * cos(theta[2]) - x * sin(theta[2]);
 
  187        pos[0] = z * sin(theta[2]) + x * cos(theta[2]);
 
  193    template<typename TDataType>
 
  194    void PointSet<TDataType>::rotate(const Coord angle)
 
  196        cuExecute(mCoords.size(), PS_Rotate, mCoords, angle, Coord(0.0f));
 
  199    template <typename Coord>
 
  200    __global__ void PS_Rotate(
 
  201        DArray<Coord> vertex,
 
  204        int pId = threadIdx.x + (blockIdx.x * blockDim.x);
 
  205        if (pId >= vertex.size()) return;
 
  206        Mat3f rot = q.toMatrix3x3();
 
  208        vertex[pId] = rot * vertex[pId];
 
  211    template<typename TDataType>
 
  212    void PointSet<TDataType>::rotate(const Quat<Real> q)
 
  214        cuExecute(mCoords.size(), PS_Rotate, mCoords, q);
 
  217    template<typename TDataType>
 
  218    bool PointSet<TDataType>::isEmpty()
 
  220        return mCoords.size() == 0;
 
  223    template<typename TDataType>
 
  224    void PointSet<TDataType>::clear()
 
  229    DEFINE_CLASS(PointSet);