void UpperNode::Construct(unsigned int *lst, unsigned int lst_num) { if (lst_num == 1){ _child = lst[0]; _box = s_trees[getID()]->box(); return; } _box.empty(); //try to split them for (unsigned int t=0; t<lst_num; t++) { int i=lst[t]; _box += s_trees[i]->box(); } if (lst_num == 2) {// must split it! getLeftChild()->Construct(lst[0]); getRightChild()->Construct(lst[1]); return; } aap pln(_box); unsigned int left_idx=0, right_idx=lst_num-1; for (unsigned int t=0; t<lst_num; t++) { int i=lst[left_idx]; if (pln.inside(s_trees[i]->box().center())) left_idx++; else {// swap it unsigned int tmp = i; lst[left_idx] = lst[right_idx]; lst[right_idx--] = tmp; } } int hal = lst_num/2; if (left_idx == 0 || left_idx == lst_num) { getLeftChild()->Construct(lst, hal); getRightChild()->Construct(lst+hal, lst_num-hal); } else { getLeftChild()->Construct(lst, left_idx); getRightChild()->Construct(lst+left_idx, lst_num-left_idx); } }
void Testing::runAllTests() { println(createLine("=")); pln(estr + "RUNNING ALL TESTS (" + testcases.size() + " testfiles with " + testCountToString(getTestCount()) + ")") vector<string> keys; for (auto entry : testcases) { keys.push_back(entry.first); } auto cmp = [](String a, String b) { a = a.toLower(); b = b.toLower(); return a.compare(b) < 0; }; sort(keys.begin(),keys.end(), cmp); for (auto key : keys) { runTestfile(key); } printStatistic(); }
void DeformBVHNode::Construct(unsigned int *lst, unsigned int lst_num) { _count = lst_num; for (unsigned int t=0; t<lst_num; t++) _box += s_mdl->_tri_boxes[lst[t]]; if (lst_num == 1) { _child = ID(lst[0]); _box = s_mdl->_tri_boxes[lst[0]]; } else { // try to split _child = this-s_current_node; s_current_node += 2; if (lst_num == 2) {// must split getLeftChild()->Construct(ID(lst[0])); getRightChild()->Construct(ID(lst[1])); } else { aap pln(_box); unsigned int left_idx = 0, right_idx = lst_num-1; for (unsigned int t=0; t<lst_num; t++) { int i=lst[left_idx]; if (pln.inside(s_mdl->_tri_centers[i])) left_idx++; else {// swap it unsigned int tmp = i; lst[left_idx] = lst[right_idx]; lst[right_idx--] = tmp; } } int half = lst_num/2; if (left_idx == 0 || left_idx == lst_num) { getLeftChild()->Construct(lst, half); getRightChild()->Construct(lst+half, lst_num-half); } else { getLeftChild()->Construct(lst, left_idx); getRightChild()->Construct(lst+left_idx, lst_num-left_idx); } } } }
void DeformBVHTree::Construct(DeformModel *mdl, bool ccd) { BOX total; int count; if (_part == -1) { for (unsigned int i=0; i<mdl->_num_vtx; i++) { total += mdl->_cur_vtxs[i]; total += mdl->_prev_vtxs[i]; } count = mdl->_num_tri; } else { count = 0; for (unsigned int i=0; i<mdl->_num_tri; i++) { if (mdl->_parts[i] != _part) continue; else count++; for (int j=0; j<3; j++) { total += mdl->_cur_vtxs[mdl->_tris[i].id(j)]; total += mdl->_prev_vtxs[mdl->_tris[i].id(j)]; } } } assert(mdl->_tri_boxes == NULL); assert(mdl->_tri_centers == NULL); mdl->_tri_boxes = new BOX[count]; mdl->_tri_centers = new vec3f[count]; if (_part != -1) _tri_idxes = new unsigned int[count]; else _tri_idxes = NULL; aap pln(total); s_idx_buffer = new unsigned int[count]; unsigned int left_idx = 0, right_idx = count, tri_idx = 0; for (unsigned int i=0; i<mdl->_num_tri; i++) { if (_part != -1 && mdl->_parts[i] != _part) continue; tri_idx++; if (_part != -1) _tri_idxes[tri_idx-1] = i; vec3f &p1 = mdl->_cur_vtxs[mdl->_tris[i].id0()]; vec3f &p2 = mdl->_cur_vtxs[mdl->_tris[i].id1()]; vec3f &p3 = mdl->_cur_vtxs[mdl->_tris[i].id2()]; vec3f &pp1 = mdl->_prev_vtxs[mdl->_tris[i].id0()]; vec3f &pp2 = mdl->_prev_vtxs[mdl->_tris[i].id1()]; vec3f &pp3 = mdl->_prev_vtxs[mdl->_tris[i].id2()]; mdl->_tri_centers[tri_idx-1].set_value( (middle_xyz(0, p1, p2, p3)+middle_xyz(0, pp1, pp2, pp3))*0.5f, (middle_xyz(1, p1, p2, p3)+middle_xyz(1, pp1, pp2, pp3))*0.5f, (middle_xyz(2, p1, p2, p3)+middle_xyz(2, pp1, pp2, pp3))*0.5f); if (pln.inside(mdl->_tri_centers[tri_idx-1])) s_idx_buffer[left_idx++] = tri_idx-1; else s_idx_buffer[--right_idx] = tri_idx-1; mdl->_tri_boxes[tri_idx-1] += p1; mdl->_tri_boxes[tri_idx-1] += p2; mdl->_tri_boxes[tri_idx-1] += p3; mdl->_tri_boxes[tri_idx-1] += pp1; mdl->_tri_boxes[tri_idx-1] += pp2; mdl->_tri_boxes[tri_idx-1] += pp3; } _nodes = new DeformBVHNode[count*2-1]; _nodes[0]._box = total; _nodes[0]._count = count; s_current_node = _nodes+3; s_tree = this; if (count == 1) { _nodes[0]._child = ID(0); } else { _nodes[0]._child = -1; if (left_idx == 0 || left_idx == count) left_idx = count/2; s_mdl = mdl; _nodes[0].getLeftChild()->Construct(s_idx_buffer, left_idx); _nodes[0].getRightChild()->Construct(s_idx_buffer+left_idx, count-left_idx); } _mdl = mdl; delete [] mdl->_tri_boxes; mdl->_tri_boxes = NULL; delete [] mdl->_tri_centers; mdl->_tri_centers = NULL; delete [] s_idx_buffer; s_idx_buffer = NULL; }