void LandmarkCapturePlugin::drawSingleLandmark(MeshModel * mp, int ii, int j, QPainter *p,GLArea * gla) { int sens = (int)gla->width()/(int(sqrt((double)mp->cm.vert.size()))-1); int maxPs = (int)gla->width()/40; CMeshO::VertexPointer vp = &mp->cm.vert[ii]; if(vp != NULL){ int ps = maxPs<(sens/2)?maxPs:sens/2; glPointSize(ps); //glPointSize(sens/2); glEnable( GL_POINT_SMOOTH ); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glPushMatrix(); glBegin (GL_POINTS); //glNormal3f (0.0, 0.0, 1.0); glColor4f(1, 0, 0, .3f); //glColor3f(1.0,0.0,0.0); glVertex(vp->P()); glEnd(); glPopMatrix(); glDisable(GL_POINT_SMOOTH); int i = tri::Index(mp->cm,vp); //QString buf =QString("\nlm%1 v%2:(%3 %4 %5)").arg(j).arg(i).arg(vp->P()[0]).arg(vp->P()[1]).arg(vp->P()[2]); QString buf =QString("\nlm%1").arg(j); vcg::glLabel::render(p,vp->P(),buf); } }
/** @def This function move a particle over the mesh */ void MoveParticle(Particle<CMeshO> &info,CMeshO::VertexPointer p,float l,int t,Point3f dir,Point3f g,float a){ if(CheckFallPosition(info.face,g,a)){ p->SetS(); return; } float time=t; if(dir.Norm()==0) dir=getRandomDirection(); Point3f new_pos; Point3f current_pos; Point3f int_pos; CMeshO::FacePointer current_face=info.face; CMeshO::FacePointer new_face; new_face=current_face; current_pos=p->P(); new_pos=StepForward(current_pos,info.v,info.mass,current_face,g+dir,l,time); while(!IsOnFace(new_pos,current_face)){ int edge=ComputeIntersection(current_pos,new_pos,current_face,new_face,int_pos); if(edge!=-1){ Point3f n = new_face->N(); if(CheckFallPosition(new_face,g,a)) p->SetS(); float elapsed_time=GetElapsedTime(current_pos,int_pos,new_pos,time); info.v=GetNewVelocity(info.v,current_face,new_face,g+dir,g,info.mass,elapsed_time); time=time-elapsed_time; current_pos=int_pos; current_face->Q()+=elapsed_time*5; current_face=new_face; new_pos=int_pos; if(time>0){ if(p->IsS()) break; new_pos=StepForward(current_pos,info.v,info.mass,current_face,g+dir,l,time); } current_face->C()=Color4b::Green;//Just Debug!!!! }else{ //We are on a border new_pos=int_pos; current_face=new_face; p->SetS(); break; } } p->P()=new_pos; info.face=current_face; }
void LandmarkCapturePlugin::drawPoint(CMeshO::VertexPointer vp, int i, MeshModel &m, GLArea *gla, QPainter *p) { QString buf; { buf =QString("\nv%1: (%3 %4 %5)").arg(i).arg(vp->P()[0]).arg(vp->P()[1]).arg(vp->P()[2]); vcg::glLabel::render(p,vp->P(),buf); /* buf =QString("\nv%1:%2 (%3 %4 %5)").arg(i).arg(fp->V(i) - &m.cm.vert[0]).arg(fp->P(i)[0]).arg(fp->P(i)[1]).arg(fp->P(i)[2]); if( m.hasDataMask(MeshModel::MM_VERTQUALITY) ) buf +=QString(" - Q(%1)").arg(fp->V(i)->Q()); if( m.hasDataMask(MeshModel::MM_WEDGTEXCOORD) ) buf +=QString("- uv(%1 %2) id:%3").arg(fp->WT(i).U()).arg(fp->WT(i).V()).arg(fp->WT(i).N()); if( m.hasDataMask(MeshModel::MM_VERTTEXCOORD) ) buf +=QString("- uv(%1 %2) id:%3").arg(fp->V(i)->T().U()).arg(fp->V(i)->T().V()).arg(fp->V(i)->T().N()); vcg::glLabel::render(p,fp->P(),buf); */ } //p->drawText(QRect(0,0,gla->width(),gla->height()), Qt::AlignLeft | Qt::TextWordWrap, buf); //p->restore(); //p->beginNativePainting(); }
/** This function compute the repulsion beetwen particles @param MeshModel* b_m - base mesh @param MeshModel* c_m - cloud of points @param int k - max number of particle to repulse @param float l - lenght of the step @return nothing - adhesion factor */ void ComputeRepulsion(MeshModel* b_m,MeshModel *c_m,int k,float l,Point3f g,float a){ CMeshO::PerVertexAttributeHandle<Particle<CMeshO> > ph = Allocator<CMeshO>::GetPerVertexAttribute<Particle<CMeshO> >(c_m->cm,"ParticleInfo"); MetroMeshVertexGrid v_grid; std::vector< Point3<float> > v_points; std::vector<CMeshO::VertexPointer> vp; std::vector<float> distances; v_grid.Set(c_m->cm.vert.begin(),c_m->cm.vert.end(),b_m->cm.bbox); CMeshO::VertexIterator vi; for(vi=c_m->cm.vert.begin();vi!=c_m->cm.vert.end();++vi){ vcg::tri::GetKClosestVertex(c_m->cm,v_grid,k,vi->P(),EPSILON,vp,distances,v_points); for(unsigned int i=0;i<vp.size();i++){CMeshO::VertexPointer v = vp[i]; if(v->P()!=vi->P() && !v->IsD() && !vi->IsD()){ Ray3<float> ray(vi->P(),fromBarCoords(RandomBaricentric(),ph[vp[i]].face)); ray.Normalize(); Point3f dir=ray.Direction(); dir.Normalize(); MoveParticle(ph[vp[i]],vp[i],0.01,1,dir,g,a); } } } }