void mepp_component_CGAL_Example_plugin::draw_connections(Viewer* viewer, int frame_i, int frame_j)
{
#if (1)
	PolyhedronPtr pMesh_i = viewer->getScenePtr()->get_polyhedron(frame_i);
	PolyhedronPtr pMesh_j = viewer->getScenePtr()->get_polyhedron(frame_j);

	int nbp_i = pMesh_i->size_of_vertices();
	int nbp_j = pMesh_j->size_of_vertices();

	if (nbp_i == nbp_j)
	{
		glLineWidth(2);
		glColor3f(1., 0., 0.);

		Vertex_iterator pVertex_i = NULL;
		Vertex_iterator pVertex_j = NULL;
		for (pVertex_i = pMesh_i->vertices_begin(), pVertex_j = pMesh_j->vertices_begin(); pVertex_i != pMesh_i->vertices_end(); pVertex_i++, pVertex_j++)
		{
			Vec pi(pVertex_i->point().x(), pVertex_i->point().y(), pVertex_i->point().z());
			Vec pj(pVertex_j->point().x(), pVertex_j->point().y(), pVertex_j->point().z());

			draw_link(viewer, frame_i, frame_j, pi, pj);
		}
	}
#endif
}
Esempio n. 2
0
bool Print(const RichText& text, const Rect& page, int currentpage, const char *name)
{
	PrinterJob pj(name);
	pj.CurrentPage(currentpage);
	pj.PageCount(text.GetHeight(page).page + 1);
	pj.Landscape(page.GetWidth() > page.GetHeight());
	if(pj.Execute()) {
		Print(pj, text, page, pj.GetPages());
		return true;
	}
	return false;
}
	Vector2f computeError(int i, Matrix3f X, MatrixXf Z){

		Vector3f pi(1, 1, 1);
		Vector3f pj(1, 1, 1);

		for(int j=0; j<2; j++){

			pi(j, 0) = Z(j, i);
			pj(j, 0) = Z(j+2, i); 

		}

		Vector3f efull = X*pi - pj;
		Vector2f e;

		e(0,0) = efull(0,0);
		e(1,0) = efull(1,0);

		return e;

	}
Esempio n. 4
0
inline uint256 HashAxiom(const T1 pbegin, const T1 pend)
{

    int R = 2;
    int N = 65536;

    std::vector<uint256> M(N);

    static unsigned char pblank[1];
    pblank[0] = 0;

    sph_shabal256_context   ctx_shabal;

    uint256 hash1;
    sph_shabal256_init(&ctx_shabal);
    sph_shabal256 (&ctx_shabal, (pbegin == pend ? pblank : static_cast<const void*>(&pbegin[0])), (pend - pbegin) * sizeof(pbegin[0]));
    sph_shabal256_close(&ctx_shabal, static_cast<void*>(&hash1));
    M[0] = hash1;


    for(int i = 1; i < N; i++)
    {
	sph_shabal256_init(&ctx_shabal);
        sph_shabal256 (&ctx_shabal, (unsigned char*)&M[i - 1], sizeof(M[i - 1]));
        sph_shabal256_close(&ctx_shabal, static_cast<void*>((unsigned char*)&M[i]));
    }

    for(int r = 1; r < R; r ++)
    {
	for(int b = 0; b < N; b++)
	{	    
	    int p = (b - 1 + N) % N;
	    int q = M[p].GetInt() % (N - 1);
	    int j = (b + q) % N;
	    std::vector<uint256> pj(2);
	    
	    pj[0] = M[p];
	    pj[1] = M[j];
	    sph_shabal256_init(&ctx_shabal);
            sph_shabal256 (&ctx_shabal, (unsigned char*)&pj[0], 2 * sizeof(pj[0]));
            sph_shabal256_close(&ctx_shabal, static_cast<void*>((unsigned char*)&M[b]));
	}
    }

    return M[N - 1];

}
Esempio n. 5
0
    ATOOLS::Vec4D_Vector  Combine
    (const Cluster_Amplitude &ampl,int i,int j,int k,const ATOOLS::Flavour &mo)
    {
      Mass_Selector *p_ms=ampl.MS();
      if (i>j) std::swap<int>(i,j);
      Vec4D_Vector after(ampl.Legs().size()-1);
      double mb2(0.0);
      if (i<2) {
	mb2=ampl.Leg(1-i)->Mom().Abs2();
	double mfb2(p_ms->Mass2(ampl.Leg(1-i)->Flav()));
	if ((mfb2==0.0 && IsZero(mb2,1.0e-6)) || IsEqual(mb2,mfb2,1.0e-6)) mb2=mfb2;
      }
      Vec4D pi(ampl.Leg(i)->Mom()), pj(ampl.Leg(j)->Mom());
      Vec4D pk(ampl.Leg(k)->Mom()), pb(i<2?ampl.Leg(1-i)->Mom():Vec4D());
      double mi2=pi.Abs2(), mfi2=p_ms->Mass2(ampl.Leg(i)->Flav());
      double mj2=pj.Abs2(), mfj2=p_ms->Mass2(ampl.Leg(j)->Flav());
      double mk2=pk.Abs2(), mfk2=p_ms->Mass2(ampl.Leg(k)->Flav());
      if ((mfi2==0.0 && IsZero(mi2,1.0e-6)) || IsEqual(mi2,mfi2,1.0e-6)) mi2=mfi2;
      if ((mfj2==0.0 && IsZero(mj2,1.0e-6)) || IsEqual(mj2,mfj2,1.0e-6)) mj2=mfj2;
      if ((mfk2==0.0 && IsZero(mk2,1.0e-6)) || IsEqual(mk2,mfk2,1.0e-6)) mk2=mfk2;
      double mij2=p_ms->Mass2(mo);
      Kin_Args lt;
      if (i>1) {
	if (k>1) lt=ClusterFFDipole(mi2,mj2,mij2,mk2,pi,pj,pk,2);
	else lt=ClusterFIDipole(mi2,mj2,mij2,mk2,pi,pj,-pk,2);
	if ((k==0 && lt.m_pk[3]<0.0) ||
	    (k==1 && lt.m_pk[3]>0.0) || lt.m_pk[0]<0.0) return Vec4D_Vector();
      }
      else {
	if (k>1) {
	  lt=ClusterIFDipole(mi2,mj2,mij2,mk2,mb2,-pi,pj,pk,-pb,2);
	}
	else lt=ClusterIIDipole(mi2,mj2,mij2,mk2,-pi,pj,-pk,2);
	if ((i==0 && lt.m_pi[3]<0.0) ||
	    (i==1 && lt.m_pi[3]>0.0) || lt.m_pi[0]<0.0) return Vec4D_Vector();
      }
      if (lt.m_stat<0) return Vec4D_Vector();
      for (size_t l(0), m(0);m<ampl.Legs().size();++m) {
	if (m==(size_t)j) continue;
	if (m==(size_t)i) after[l]=i>1?lt.m_pi:-lt.m_pi;
	else if (m==(size_t)k) after[l]=k>1?lt.m_pk:-lt.m_pk;
	else after[l]=lt.m_lam*ampl.Leg(m)->Mom();
	++l;
      }
      return after;
    }
Esempio n. 6
0
	void Polyhedron_triangulation::extract_CAT()
	{
		std::for_each(cat_cells.begin(), cat_cells.end(), std::mem_fun_ref(&std::list<CAT_facet>::clear));
		int *tetra_vtx_ptr = tetra_mesh.tetrahedronlist;
		int *marker = tetra_mesh.pointmarkerlist;
		REAL *pnt_tbl = tetra_mesh.pointlist;
		std::function<Point_3(int)> cgal_pnt = [=](int idx) { return Point_3(pnt_tbl[idx*3], pnt_tbl[idx*3+1], pnt_tbl[idx*3+2]); };
		for (int i = 0; i < tetra_mesh.numberoftetrahedra; i++, tetra_vtx_ptr += 4)
		{
			std::set<int> group_no;
			std::multimap<int, int> group_no_vidx;
			typedef std::multimap<int, int>::const_iterator Iter;
			for (int j = 0; j < 4; j++)
			{
				int vid = tetra_vtx_ptr[j];
				int gid = marker[vid];
				group_no.insert(gid);
				group_no_vidx.insert(std::make_pair(gid, vid));
			}
			if (group_no.size() == 2)
			{
				std::set<int>::const_iterator gid0 = group_no.begin(), gid1 = group_no.begin();
				++gid1;
				if (group_no_vidx.count(*gid0) == 1 && group_no_vidx.count(*gid1) == 3)
				{
					std::pair<Iter, Iter> i0 = group_no_vidx.equal_range(*gid0);
					std::pair<Iter, Iter> i1 = group_no_vidx.equal_range(*gid1);
					std::list<Point_3> mid_tri;
					for (Iter it = i1.first; it != i1.second; ++it)
						mid_tri.push_back(CGAL::midpoint(cgal_pnt(i0.first->second), cgal_pnt(it->second)));
					if (*gid0 >= 0)
						cat_cells[*gid0].push_back(CAT_facet(cgal_pnt(i0.first->second), mid_tri));
					if (*gid1 >= 0)
						for (Iter it = i1.first; it != i1.second; ++it)
							cat_cells[*gid1].push_back(CAT_facet(cgal_pnt(it->second), mid_tri));
				}
				else if (group_no_vidx.count(*gid0) == 3 && group_no_vidx.count(*gid1) == 1)
				{
					std::pair<Iter, Iter> i0 = group_no_vidx.equal_range(*gid0);
					std::pair<Iter, Iter> i1 = group_no_vidx.equal_range(*gid1);
					std::list<Point_3> mid_tri;
					for (Iter it = i0.first; it != i0.second; ++it)
						mid_tri.push_back(CGAL::midpoint(cgal_pnt(i1.first->second), cgal_pnt(it->second)));
					if (*gid1 >= 0)
						cat_cells[*gid1].push_back(CAT_facet(cgal_pnt(i1.first->second), mid_tri));
					if (*gid0 >= 0)
						for (Iter it = i0.first; it != i0.second; ++it)
							cat_cells[*gid0].push_back(CAT_facet(cgal_pnt(it->second), mid_tri));
				}
				else
				{
					std::pair<Iter, Iter> i0 = group_no_vidx.equal_range(*gid0);
					std::pair<Iter, Iter> i1 = group_no_vidx.equal_range(*gid1);
					Iter it = i0.first;
					Point_3 p00(cgal_pnt(it->second));
					++it;
					Point_3 p01(cgal_pnt(it->second));
					it = i1.first;
					Point_3 p10(cgal_pnt(it->second));
					++it;
					Point_3 p11(cgal_pnt(it->second));
					Point_3 midpnt[4] = {CGAL::midpoint(p00, p10), CGAL::midpoint(p00, p11), CGAL::midpoint(p01, p10), CGAL::midpoint(p01, p11)};
					std::list<Point_3> mid_pm; // the middle parallelogram
					mid_pm.push_back(midpnt[0]);
					mid_pm.push_back(midpnt[1]);
					if (Vector_3(midpnt[0], midpnt[1])*Vector_3(midpnt[2], midpnt[3]) < 0)
					{
						mid_pm.push_back(midpnt[2]);
						mid_pm.push_back(midpnt[3]);
					}
					else
					{
						mid_pm.push_back(midpnt[3]);
						mid_pm.push_back(midpnt[2]);
					}
					if (*gid0 >= 0)
					{
						cat_cells[*gid0].push_back(CAT_facet(p00, mid_pm));
						cat_cells[*gid0].push_back(CAT_facet(p01, mid_pm));
					}
					if (*gid1 >= 0)
					{
						cat_cells[*gid1].push_back(CAT_facet(p10, mid_pm));
						cat_cells[*gid1].push_back(CAT_facet(p11, mid_pm));
					}
				}
			}
			else if (group_no.size() == 3)
			{
				// the two vertices in the same group
				int smgp[2];
				// the two vertices in the other two different groups
				int dfgp[2];
				int gi, gj, gk;
				std::vector< std::pair<int, int> > tmpv(group_no_vidx.begin(), group_no_vidx.end());
				if (tmpv[0].first == tmpv[1].first)
				{
					smgp[0] = tmpv[0].second;	smgp[1] = tmpv[1].second;	gi = tmpv[0].first;
					dfgp[0] = tmpv[2].second;	dfgp[1] = tmpv[3].second;	gj = tmpv[2].first;	gk = tmpv[3].first;
				}
				else if (tmpv[1].first == tmpv[2].first)
				{
					smgp[0] = tmpv[1].second;	smgp[1] = tmpv[2].second;	gi = tmpv[1].first;
					dfgp[0] = tmpv[0].second;	dfgp[1] = tmpv[3].second;	gj = tmpv[0].first;	gk = tmpv[3].first;
				}
				else
				{
					smgp[0] = tmpv[2].second;	smgp[1] = tmpv[3].second;	gi = tmpv[2].first;
					dfgp[0] = tmpv[0].second;	dfgp[1] = tmpv[1].second;	gj = tmpv[0].first; gk = tmpv[1].first;
				}
				Point_3 pi[2] = {cgal_pnt(smgp[0]), cgal_pnt(smgp[1])};
				Point_3 pj(cgal_pnt(dfgp[0])), pk(cgal_pnt(dfgp[1]));
				Point_3 tri_cent[2] = {CGAL::centroid(pi[0], pj, pk), CGAL::centroid(pi[1], pj, pk)};
				Point_3 edge_mid[5] = {CGAL::midpoint(pi[0], pj), CGAL::midpoint(pi[0], pk), 
										CGAL::midpoint(pi[1], pj), CGAL::midpoint(pi[1], pk),
										CGAL::midpoint(pj, pk)};
				//std::list<Point_3> quad_i0i1j, quad_i0i1k, tri_i0i1jk;
				std::array<Point_3, 4> quad_i0i1j = {edge_mid[0], edge_mid[2], tri_cent[1], tri_cent[0]};
				std::array<Point_3, 4> quad_i0i1k = {edge_mid[1], edge_mid[3], tri_cent[1], tri_cent[0]};
				std::array<Point_3, 3> tri_i0i1jk = {edge_mid[4], tri_cent[1], tri_cent[0]};
				if (gi >= 0)
				{
					cat_cells[gi].push_back(CAT_facet(pi[0], quad_i0i1j.begin(), quad_i0i1j.end()));
					cat_cells[gi].push_back(CAT_facet(pi[0], quad_i0i1k.begin(), quad_i0i1k.end()));
					cat_cells[gi].push_back(CAT_facet(pi[1], quad_i0i1j.begin(), quad_i0i1j.end()));
					cat_cells[gi].push_back(CAT_facet(pi[1], quad_i0i1k.begin(), quad_i0i1k.end()));
				}
				if (gj >= 0)
				{
					cat_cells[gj].push_back(CAT_facet(pj, quad_i0i1j.begin(), quad_i0i1j.end()));
					cat_cells[gj].push_back(CAT_facet(pj, tri_i0i1jk.begin(), tri_i0i1jk.end()));
				}
				if (gk >= 0)
				{
					cat_cells[gk].push_back(CAT_facet(pk, quad_i0i1k.begin(), quad_i0i1k.end()));
					cat_cells[gk].push_back(CAT_facet(pk, tri_i0i1jk.begin(), tri_i0i1jk.end()));
				}
			}
			else if (group_no.size() == 4)
			{
				std::array<Point_3, 4> vs;
				std::array<int, 4> groupid;
				for (int j = 0; j < 4; j++)
				{
					vs[j] = cgal_pnt(tetra_vtx_ptr[j]);
					groupid[j] = marker[tetra_vtx_ptr[j]];
				}
				Point_3 tetra_cent = CGAL::centroid(vs.begin(), vs.end(), CGAL::Dimension_tag<0>());
				for (int j = 0; j < 4; j++)
				{
					if (groupid[j] < 0)
						continue;
					for (int k = 0; k < 4; k++)
					{
						if (j == k) 
							continue;
						for (int l = 0; l < 4; l++)
						{
							if (l == j || l == k)
								continue;
							Point_3 mpnt = CGAL::midpoint(vs[j], vs[k]);
							int m;
							for (m = 0; m < 4; m++)	
								if (m != j && m != k && m != l)
									break;
							Point_3 tri_cent[2] = { CGAL::centroid(vs[j], vs[k], vs[l]), CGAL::centroid(vs[j], vs[k], vs[m]) };
							std::list<Point_3> tri;
							tri.push_back(mpnt); 
							tri.push_back(tri_cent[0]);
							tri.push_back(tri_cent[1]);
							cat_cells[groupid[j]].push_back(CAT_facet(vs[j], tri));
							tri.pop_front();
							tri.push_back(tetra_cent);
							cat_cells[groupid[j]].push_back(CAT_facet(vs[j], tri));
						}
					}
				}
			}
		}
	}
Esempio n. 7
0
int main(){

	initAndLoad(cv::Mat::eye(4,4,CV_32F), cv::Mat::eye(4,4,CV_32F), &vidRecord, &wcSkeletons, "map000000_aoto4_edit/video/", true);
	zeroWorldCoordinateSkeletons(cv::Mat::eye(4,4,CV_32F), &vidRecord, &wcSkeletons);
	setCameraMatrixTexture(KINECT::loadCameraParameters());
	setCameraMatrixScene(KINECT::loadCameraParameters());
	cylinderBody.Load("map000000-custCB/");

	cv::namedWindow("rgb");
	cv::namedWindow("3d", CV_GUI_NORMAL);
	cv::setMouseCallback("3d", onMouse);

	frame=0;
	angle_y = 0;
	angle_x = 0;
	trans = cv::Mat::eye(4,4,CV_32F);

	calculateSkeletonOffsetPoints(vidRecord, wcSkeletons, cylinderBody);
	boundingBoxLerp = cv::Rect (0,0,WIDTH,HEIGHT);
	lc = generateLerpCorners(boundingBoxLerp);

	while(true){
		cv::Mat tex_ = uncrop(vidRecord[frame].videoFrame);
		cv::Mat tex(tex_.size(), CV_8UC4, cv::Scalar(255,255,255,255));
		int from_to[] = { 0,0, 1,1, 2,2};
		cv::mixChannels(&tex_,1,&tex,1,from_to,3);

		cv::Mat _3d(HEIGHT, WIDTH, CV_8UC4, cv::Scalar(0,0,0,255));

		cv::Vec3f sCenter = calcSkeleCenter(vidRecord[frame].kinectPoints);
		trans = getTranslationMatrix(sCenter) * mat3_to_mat4(getRotationMatrix(cv::Vec3f(0,1,0), angle_y)) * mat3_to_mat4(getRotationMatrix(cv::Vec3f(1,0,0), angle_x)) * getTranslationMatrix(-sCenter);

		ghostdraw_parallel(frame, cv::Mat::eye(4,4,CV_32F), vidRecord, wcSkeletons, cylinderBody, Limbrary(), tex, cv::Mat(), GD_CYL);
		ghostdraw_parallel(frame, trans, vidRecord, wcSkeletons, cylinderBody, Limbrary(), _3d, cv::Mat(), GD_CYL);

		cv::Scalar goodColor(50, 200, 250);
		cv::Scalar badColor(20, 20, 250);

		for(int joint=0;joint<NUMJOINTS;++joint)
		{
			cv::Scalar color;
			if (wcSkeletons[frame].states[joint] < 1)
				color = badColor;
			else
				color = goodColor;

			{
				cv::Vec3f jv = mat_to_vec3(wcSkeletons[frame].points.col(joint));
				cv::Vec2f jv2 = mat4_to_vec2(getCameraMatrixScene() * vec3_to_mat4(jv));
				cv::Point pj(jv2(0), jv2(1));

				cv::circle(tex,pj,2,color,-1);
			}

			{
				cv::Vec3f jv = mat_to_vec3(trans * wcSkeletons[frame].points.col(joint));
				cv::Vec2f jv2 = mat4_to_vec2(getCameraMatrixScene() * vec3_to_mat4(jv));
				cv::Point pj(jv2(0), jv2(1));

				cv::circle(_3d,pj,3,color,-1);
			}
		}
		std::stringstream frameSS;
		frameSS << frame;

		cv::putText(tex, frameSS.str(), cv::Point(30, 30), CV_FONT_HERSHEY_PLAIN, 2, cv::Scalar(0, 255, 0), 3);
		cv::putText(_3d, frameSS.str(), cv::Point(30, 30), CV_FONT_HERSHEY_PLAIN, 2, cv::Scalar(255, 0, 255), 3);

		cv::imshow("rgb", tex);
		cv::imshow("3d", _3d);
		char in = cv::waitKey(10);

		switch(in){
		case 'q':
			return 0;
		case 'z':
			--frame;
			while(vidRecord[frame].videoFrame.mat.empty()){
				--frame;
			}
			if(frame < 0) frame = 0;
			break;
		case 'x':
			++frame;
			if (frame >= vidRecord.size()) frame = vidRecord.size() - 1;
			while(vidRecord[frame].videoFrame.mat.empty()){
				++frame;
				if (frame >= vidRecord.size()) frame = vidRecord.size() - 1;
			}
			break;
		case 'd':
			if (lastjoint != -1){
				if (wcSkeletons[frame].states[lastjoint] < 1){
					wcSkeletons[frame].states[lastjoint] = 1;
				}
				else{
					wcSkeletons[frame].states[lastjoint] = 0.5;
				}
			}
		case 'r':
			angle_y = 0;
			angle_x = 0;
			break;
		case 'c':
			alljoints = !alljoints;
			break;
		case 's':
			
			for(int i=0;i<vidRecord.size();++i){
				vidRecord[i].kinectPoints = wcSkeletons[i];

				//if(!vidRecord[i].cam2World.empty())
				//{
				//	vidRecord[i].kinectPoints.points = vidRecord[i].cam2World.inv() * vidRecord[i].kinectPoints.points;
				//}
			}

			SaveVideo(&vidRecord, getCameraMatrixScene(),  "map000000_aoto4_edit/video/");
			break;
		}
	}
}
Esempio n. 8
0
void onMouse(int e, int x, int y, int, void *){
	switch (e)
	{
	case cv::EVENT_LBUTTONDOWN:
		start.x = x;
		start.y = y;
		prev = start;
		mousedn = true;
		rmousedn = false;
		break;
	case cv::EVENT_LBUTTONUP:
		mousedn = false;
		rmousedn = false;
		break;
	case cv::EVENT_MOUSEMOVE:
		if(mousedn){
			cv::Point curr(x,y);
			angle_y += (curr.x - prev.x)/180.*CV_PI;
			angle_x += (curr.y - prev.y)/180.*CV_PI;
			prev = curr;
		}
		else if(rmousedn){
			if(!alljoints){
				if(cjoint != -1){
					cv::Vec3f ray = lerpPoint(x,y,boundingBoxLerp,lc);
					cv::Vec3f newPos = vectorProject(mat_to_vec3(trans * wcSkeletons[frame].points.col(cjoint)), ray);
					cv::Mat(trans.inv() * vec3_to_mat4(newPos)).copyTo(wcSkeletons[frame].points.col(cjoint));
					calculateSkeletonOffsetPoints(vidRecord, wcSkeletons, cylinderBody);
				}
			}else{
				
				if(cjoint != -1){
					cv::Vec3f ray = lerpPoint(x,y,boundingBoxLerp,lc);
					cv::Vec3f newPosProj = vectorProject(mat_to_vec3(trans * wcSkeletons[frame].points.col(cjoint)), ray);
					cv::Mat newPos = trans.inv() * vec3_to_mat4(newPosProj);
					
					cv::Mat oldPos = wcSkeletons[frame].points.col(cjoint);

					cv::Mat diff = newPos - oldPos;

					newPos.copyTo(wcSkeletons[frame].points.col(cjoint));

					for(int joint = 0; joint < NUMJOINTS; ++joint){
						if(joint != cjoint){

							cv::Mat newPosCopyTransform = wcSkeletons[frame].points.col(joint) + diff;

							newPosCopyTransform.copyTo(wcSkeletons[frame].points.col(joint));
						}
					}

					calculateSkeletonOffsetPoints(vidRecord, wcSkeletons, cylinderBody);
				}
			}
		}
		break;
	case cv::EVENT_RBUTTONDOWN:
		{
			mousedn = false;
			rmousedn = true;

			cv::Point curr(x,y);

			float cdist=10000;
			cjoint=-1;

			for(int joint=0;joint<NUMJOINTS;++joint)
			{
				cv::Vec3f jv = mat_to_vec3(trans * wcSkeletons[frame].points.col(joint));
				cv::Vec2f jv2 = mat4_to_vec2(getCameraMatrixScene() * vec3_to_mat4(jv));
				cv::Point pj(jv2(0), jv2(1));

				float dist = cv::norm(curr-pj);
				if(dist < cdist && dist < 10){
					cdist = dist;
					cjoint = joint;
				}
			}
			lastjoint = cjoint;
			break;
		}
	case cv::EVENT_RBUTTONUP:
		{
			mousedn = false;
			rmousedn = false;
			cjoint = -1;
		}
	default:
		break;
	}
}
Esempio n. 9
0
    GraphExample(void)
        : prog()
        , projection_matrix(prog, "ProjectionMatrix")
        , camera_matrix(prog, "CameraMatrix")
        , node_count(512)
        , edge_count(0)
        , cam_path(make_cam_path_cps())
        , tgt_path(make_tgt_path_cps())
    {
        std::srand(std::time(0));

        // Vertex shader
        VertexShader vs;
        // Set the vertex shader source
        vs.Source(
            "#version 330\n"
            "uniform mat4 ProjectionMatrix, CameraMatrix;"
            "in vec4 Position;"
            "void main(void)"
            "{"
            "	gl_Position = "
            "		ProjectionMatrix *"
            "		CameraMatrix *"
            "		Position;"
            "	gl_PointSize = 4.0 * gl_Position.w / gl_Position.z;"
            "}"
        );
        // compile it
        vs.Compile();

        // Fragment shader
        FragmentShader fs;
        // set the fragment shader source
        fs.Source(
            "#version 330\n"
            "out vec4 fragColor;"
            "void main(void)"
            "{"
            "	fragColor = vec4(0.0, 0.0, 0.0, 1.0);"
            "}"
        );
        // compile it
        fs.Compile();

        // attach the shaders to the program
        prog.AttachShader(vs);
        prog.AttachShader(fs);
        // link and use it
        prog.Link();
        prog.Use();

        // bind the VAO for the cube
        graph.Bind();

        std::vector<GLfloat> positions(node_count * 3);
        // bind the VBO for the cube vertices
        verts.Bind(Buffer::Target::Array);
        {
            GLuint k = 0;
            for(GLuint p=0; p!=node_count; ++p)
            {
                positions[k++] = nrand() *120.0;
                positions[k++] = nrand() *  5.0;
                positions[k++] = nrand() *120.0;
            }
            assert(k == positions.size());

            // upload the data
            Buffer::Data(Buffer::Target::Array, positions);
            // setup the vertex attribs array for the vertices
            VertexAttribArray vert_attr(prog, "Position");
            vert_attr.Setup(3, DataType::Float).Enable();
        }

        // bind the VBO for cube edge indices
        edges.Bind(Buffer::Target::ElementArray);
        {
            std::vector<GLuint> edge_data;
            edge_data.reserve(node_count * 6);
            for(GLuint i=0; i!=node_count; ++i)
            {
                Vec3f pi(
                    positions[i*3+0],
                    positions[i*3+1],
                    positions[i*3+2]
                );
                float min_dist = 1000.0f;
                GLuint m = i;
                for(GLuint j=i+1; j!=node_count; ++j)
                {
                    Vec3f pj(
                        positions[j*3+0],
                        positions[j*3+1],
                        positions[j*3+2]
                    );
                    float dist = Distance(pi, pj);
                    if(min_dist > 1.0 && min_dist > dist)
                    {
                        min_dist = dist;
                        m = j;
                    }
                }
                min_dist *= 2.0f;
                GLuint done = 0;
                for(GLuint j=i+1; j!=node_count; ++j)
                {
                    Vec3f pj(
                        positions[j*3+0],
                        positions[j*3+1],
                        positions[j*3+2]
                    );
                    float dist = Distance(pi, pj);
                    if(min_dist > dist)
                    {
                        float x = dist/min_dist;
                        if(std::pow(nrand(), 2.0) >= x)
                        {
                            edge_data.push_back(i);
                            edge_data.push_back(j);
                            ++done;
                        }
                    }
                }
                if(done == 0)
                {
                    if(i != m)
                    {
                        edge_data.push_back(i);
                        edge_data.push_back(m);
                    }
                }
            }
            Buffer::Data(Buffer::Target::ElementArray, edge_data);
            assert(edge_data.size() % 2 == 0);
            edge_count = edge_data.size();
            positions.clear();
        }

        //
        gl.ClearColor(0.9f, 0.9f, 0.8f, 0.0f);
        gl.ClearDepth(1.0f);
        gl.Enable(Capability::DepthTest);
        gl.Enable(Capability::LineSmooth);
        gl.Enable(Capability::ProgramPointSize);
        gl.Enable(Capability::Blend);
        gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
    }
Esempio n. 10
0
TEST_F(RoStrTest, compact2) {
    str r = compact(file_read(pj("fix/test_compact")));
}