コード例 #1
0
ファイル: UpperBVH-flat.cpp プロジェクト: ricortiz/MCCD
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);
	}
}
コード例 #2
0
ファイル: Testing.cpp プロジェクト: swantescholz/cpptdd
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();
}
コード例 #3
0
ファイル: DeformBVH-flat.cpp プロジェクト: desaic/MeshPlane
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);
			}
		}
	}
}
コード例 #4
0
ファイル: DeformBVH-flat.cpp プロジェクト: desaic/MeshPlane
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;
}