@@ -207,53 +207,42 @@ namespace BVH
207207 {
208208 n_corners = cornerlist.size ();
209209
210- boxlist.resize (
211- max_node_index (
212- 1 , 0 , n_corners) +
213- 1 // <-- this is because size == max_index + 1 !!!
214- );
215-
216- init_boxes_recursive (cornerlist, 1 , 0 , n_corners);
217- }
218-
219- void BVH::init (const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const double tol)
220- {
221- assert (F.cols () == 3 );
222- assert (V.cols () == 3 );
223-
224- struct sortstruct
210+ Eigen::MatrixXd box_centers (n_corners, 3 );
211+ for (int i = 0 ; i < n_corners; ++i)
225212 {
226- int order;
227- Resorting::MortonCode64 morton;
228- };
229- std::vector<sortstruct> list;
230- const int multi = 1000 ;
213+ box_centers.row (i) = (cornerlist[i][0 ] + cornerlist[i][1 ]) / 2 ;
214+ }
231215
232- const Eigen::RowVector3d vmin = V .colwise ().minCoeff ();
233- const Eigen::RowVector3d vmax = V .colwise ().maxCoeff ();
216+ const Eigen::RowVector3d vmin = box_centers .colwise ().minCoeff ();
217+ const Eigen::RowVector3d vmax = box_centers .colwise ().maxCoeff ();
234218 const Eigen::RowVector3d center = (vmin + vmax) / 2 ;
235- Eigen::MatrixXd v_shifted (V.rows (), V.cols ());
236-
237- for (int i = 0 ; i < V.rows (); i++)
219+ for (int i = 0 ; i < n_corners; i++)
238220 {
239221 // make box centered at origin
240- v_shifted .row (i) = V. row (i) - center;
222+ box_centers .row (i) -= center;
241223 }
242224
243225 // after placing box at origin, vmax and vmin are symetric.
244226 const Eigen::Vector3d scale_point = vmax - center;
245227 const double scale = scale_point.lpNorm <Eigen::Infinity>();
246228 // if the box is too big, resize it
247- if (scale > 300 )
229+ if (scale > 100 )
248230 {
249- v_shifted /= scale;
231+ box_centers /= scale;
250232 }
251233
252- list.resize (F.rows ());
234+ struct sortstruct
235+ {
236+ int order;
237+ Resorting::MortonCode64 morton;
238+ };
239+ std::vector<sortstruct> list;
240+ const int multi = 1000 ;
241+ list.resize (n_corners);
253242
254- for (int i = 0 ; i < F. rows () ; i++)
243+ for (int i = 0 ; i < n_corners ; i++)
255244 {
256- const Eigen::MatrixXd tmp = (v_shifted .row (F (i, 0 )) + v_shifted. row ( F (i, 1 )) + v_shifted. row ( F (i, 2 )) ) * multi;
245+ const Eigen::MatrixXd tmp = box_centers .row (i ) * multi;
257246
258247 list[i].morton = Resorting::MortonCode64 (int (tmp (0 )), int (tmp (1 )), int (tmp (2 )));
259248 list[i].order = i;
@@ -264,17 +253,38 @@ namespace BVH
264253 };
265254 std::sort (list.begin (), list.end (), morton_compare);
266255
267- new2old.resize (F. rows () );
268- for (int i = 0 ; i < F. rows () ; i++)
256+ new2old.resize (n_corners );
257+ for (int i = 0 ; i < n_corners ; i++)
269258 {
270259 new2old[i] = list[i].order ;
271260 }
272261
262+ std::vector<std::array<Eigen::Vector3d, 2 >> sorted_cornerlist (n_corners);
263+
264+ for (int i = 0 ; i < n_corners; i++)
265+ {
266+ sorted_cornerlist[i] = cornerlist[list[i].order ];
267+ }
268+
269+ boxlist.resize (
270+ max_node_index (
271+ 1 , 0 , n_corners) +
272+ 1 // <-- this is because size == max_index + 1 !!!
273+ );
274+
275+ init_boxes_recursive (sorted_cornerlist, 1 , 0 , n_corners);
276+ }
277+
278+ void BVH::init (const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const double tol)
279+ {
280+ assert (F.cols () == 3 );
281+ assert (V.cols () == 3 );
282+
273283 std::vector<std::array<Eigen::Vector3d, 2 >> cornerlist (F.rows ());
274284
275285 for (int i = 0 ; i < F.rows (); i++)
276286 {
277- const Eigen::RowVector3i face = F.row (list[i]. order );
287+ const Eigen::RowVector3i face = F.row (i );
278288 const Eigen::RowVector3d v0 = V.row (face (0 ));
279289 const Eigen::RowVector3d v1 = V.row (face (1 ));
280290 const Eigen::RowVector3d v2 = V.row (face (2 ));
0 commit comments