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);