⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slicer.cc

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 CC
📖 第 1 页 / 共 3 页
字号:
  /**********for reading newtess_flag from a file**********/#ifdef USE_READ_FLAGstatic Int read_flag(char* name){  Int ret;  FILE* fp = fopen(name, "r");  if(fp == NULL)    {      fprintf(stderr, "can't open file %s\n", name);      exit(1);    }  fscanf(fp, "%i", &ret);  fclose(fp);  return ret;}#endif  /***********nextgen tess****************/#include "sampleMonoPoly.h"directedLine* arcToDLine(Arc_ptr arc){  int i;  Real vert[2];  directedLine* ret;  sampledLine* sline = new sampledLine(arc->pwlArc->npts);  for(i=0; i<arc->pwlArc->npts; i++)    {      vert[0] = arc->pwlArc->pts[i].param[0];      vert[1] = arc->pwlArc->pts[i].param[1];      sline->setPoint(i, vert);    }  ret = new directedLine(INCREASING, sline);  return ret;} /*an pwlArc may not be a straight line*/directedLine* arcToMultDLines(directedLine* original, Arc_ptr arc){  directedLine* ret = original;  int is_linear = 0;  if(arc->pwlArc->npts == 2 )    is_linear = 1;  else if(area(arc->pwlArc->pts[0].param, arc->pwlArc->pts[1].param, arc->pwlArc->pts[arc->pwlArc->npts-1].param) == 0.0)    is_linear = 1;    if(is_linear)    {      directedLine *dline = arcToDLine(arc);      if(ret == NULL)	ret = dline;      else	ret->insert(dline);      return ret;    }  else /*not linear*/    {      for(Int i=0; i<arc->pwlArc->npts-1; i++)	{	  Real vert[2][2];	  vert[0][0] = arc->pwlArc->pts[i].param[0];	  vert[0][1] = arc->pwlArc->pts[i].param[1];	  vert[1][0] = arc->pwlArc->pts[i+1].param[0];	  vert[1][1] = arc->pwlArc->pts[i+1].param[1];	  	  sampledLine *sline = new sampledLine(2, vert);	  directedLine *dline = new directedLine(INCREASING, sline);	  if(ret == NULL)	    ret = dline;	  else	    ret->insert(dline);	}      return ret;    }}       	directedLine* arcLoopToDLineLoop(Arc_ptr loop){  directedLine* ret;  if(loop == NULL)    return NULL;  ret = arcToMultDLines(NULL, loop);//ret->printSingle();  for(Arc_ptr temp = loop->next; temp != loop; temp = temp->next){    ret = arcToMultDLines(ret, temp);//ret->printSingle();  }  return ret;}/*void Slicer::evalRBArray(rectBlockArray* rbArray, gridWrap* grid){  TrimVertex *trimVert = (TrimVertex*)malloc(sizeof(TrimVertex));  trimVert -> nuid = 0;//????  Real* u_values = grid->get_u_values();  Real* v_values = grid->get_v_values();  Int i,j,k,l;  for(l=0; l<rbArray->get_n_elements(); l++)    {      rectBlock* block = rbArray->get_element(l);      for(k=0, i=block->get_upGridLineIndex(); i>block->get_lowGridLineIndex(); i--, k++)	{	  backend.bgnqstrip();	  for(j=block->get_leftIndices()[k+1]; j<= block->get_rightIndices()[k+1]; j++)	    {	      trimVert->param[0] = u_values[j];	      trimVert->param[1] = v_values[i];	      backend.tmeshvert(trimVert);	      trimVert->param[1] = v_values[i-1];	      backend.tmeshvert(trimVert);	    }	  backend.endqstrip();	}    }    free(trimVert);}*/void Slicer::evalRBArray(rectBlockArray* rbArray, gridWrap* grid){  Int i,j,k;    Int n_vlines=grid->get_n_vlines();  //the reason to switch the position of v_max and v_min is because of the  //the orientation problem. glEvalMesh generates quad_strip clockwise, but  //we need counter-clockwise.  backend.surfgrid(grid->get_u_min(), grid->get_u_max(), grid->get_n_ulines()-1,		   grid->get_v_max(), grid->get_v_min(), n_vlines-1);  for(j=0; j<rbArray->get_n_elements(); j++)    {      rectBlock* block = rbArray->get_element(j);      Int low = block->get_lowGridLineIndex();      Int high = block->get_upGridLineIndex();      for(k=0, i=high; i>low; i--, k++)	{	  backend.surfmesh(block->get_leftIndices()[k+1], n_vlines-1-i, block->get_rightIndices()[k+1]-block->get_leftIndices()[k+1], 1);	}    }}void Slicer::evalStream(primStream* pStream){  Int i,j,k;  k=0;/*  TrimVertex X;*/  TrimVertex *trimVert =/*&X*/  (TrimVertex*)malloc(sizeof(TrimVertex));  trimVert -> nuid = 0;//???  Real* vertices = pStream->get_vertices(); //for efficiency  for(i=0; i<pStream->get_n_prims(); i++)    {     //ith primitive  has #vertices = lengths[i], type=types[i]      switch(pStream->get_type(i)){      case PRIMITIVE_STREAM_FAN:	backend.bgntfan();	for(j=0; j<pStream->get_length(i); j++)	  {	    	    trimVert->param[0] = vertices[k];	    trimVert->param[1] = vertices[k+1];	    backend.tmeshvert(trimVert);	   	    //	    backend.tmeshvert(vertices[k], vertices[k+1]);	    k += 2;	  }	backend.endtfan();	break;	      default:	fprintf(stderr, "evalStream: not implemented yet\n");	exit(1);      }    }  free(trimVert);}	   	   	    void Slicer::slice_new(Arc_ptr loop){//count++;//if(count == 78) count=1;//printf("count=%i\n", count);//if( ! (4<= count && count <=4)) return;  Int num_ulines;  Int num_vlines;  Real uMin, uMax, vMin, vMax;  Real mydu, mydv;  uMin = uMax = loop->tail()[0];  vMin = vMax = loop->tail()[1];  mydu = (du>0)? du: -du;  mydv = (dv>0)? dv: -dv;  for(Arc_ptr jarc=loop->next; jarc != loop; jarc = jarc->next)   {     if(jarc->tail()[0] < uMin)       uMin = jarc->tail()[0];     if(jarc->tail()[0] > uMax)       uMax = jarc->tail()[0];     if(jarc->tail()[1] < vMin)       vMin = jarc->tail()[1];     if(jarc->tail()[1] > vMax)       vMax = jarc->tail()[1];   }  if (uMax == uMin)    return; // prevent divide-by-zero.  Jon Perry.  17 June 2002  if(mydu > uMax - uMin)    num_ulines = 2;  else    {      num_ulines = 3 + (Int) ((uMax-uMin)/mydu);    }  if(mydv>=vMax-vMin)    num_vlines = 2;  else    {      num_vlines = 2+(Int)((vMax-vMin)/mydv);    }  Int isRect = is_rect(loop);  if(isRect && (num_ulines<=2 || num_vlines<=2))    {      if(vlinear)	triangulateRect(loop, backend, 1, ulinear, vlinear);      else if(ulinear)	triangulateRect(loop, backend, -1, ulinear, vlinear);	      else	triangulateRect(loop, backend, 0, ulinear, vlinear);		    }   else if(isRect)    {      triangulateRectGen(loop, num_ulines-2, num_vlines-2, backend);     }  else if( (num_ulines<=2 || num_vlines <=2) && ulinear)    {      monoTriangulationFunBackend(loop, compV2InY, &backend);    }  else if( (!ulinear) && (!vlinear) && (num_ulines == 2) && (num_vlines > 2))    {      monoTriangulationFunBackend(loop, compV2InY, &backend);    }  else     {      directedLine* poly = arcLoopToDLineLoop(loop);      gridWrap grid(num_ulines, num_vlines, uMin, uMax, vMin, vMax);      primStream pStream(20, 20);      rectBlockArray rbArray(20);      sampleMonoPoly(poly, &grid, ulinear, vlinear, &pStream, &rbArray);      evalStream(&pStream);      evalRBArray(&rbArray, &grid);      #ifdef COUNT_TRIANGLES      num_triangles += pStream.num_triangles();      num_quads += rbArray.num_quads();#endif      poly->deleteSinglePolygonWithSline();          }  #ifdef COUNT_TRIANGLES  printf("num_triangles=%i\n", num_triangles);  printf("num_quads = %i\n", num_quads);#endif}void Slicer::slice(Arc_ptr loop){#ifdef USE_READ_FLAG  if(read_flag("flagFile"))    slice_new(loop);  else    slice_old(loop);#else    slice_new(loop);#endif}  Slicer::Slicer( Backend &b ) 	: CoveAndTiler( b ), Mesher( b ), backend( b ){    ulinear = 0;    vlinear = 0;}Slicer::~Slicer(){}voidSlicer::setisolines( int x ){    isolines = x;}voidSlicer::setstriptessellation( REAL x, REAL y ){    assert(x > 0 && y > 0);    du = x;    dv = y;    setDu( du );}voidSlicer::slice_old( Arc_ptr loop ){    loop->markverts();    Arc_ptr extrema[4];    loop->getextrema( extrema );    unsigned int npts = loop->numpts();    TrimRegion::init( npts, extrema[0] );    Mesher::init( npts );    long ulines = uarray.init( du, extrema[1], extrema[3] );//printf("ulines = %i\n", ulines);    Varray varray;    long vlines = varray.init( dv, extrema[0], extrema[2] );//printf("vlines = %i\n", vlines);    long botv = 0;    long topv;    TrimRegion::init( varray.varray[botv] );    getGridExtent( &extrema[0]->pwlArc->pts[0], &extrema[0]->pwlArc->pts[0] );    for( long quad=0; quad<varray.numquads; quad++ ) {	backend.surfgrid( uarray.uarray[0], 		       uarray.uarray[ulines-1], 	 	       ulines-1, 		       varray.vval[quad], 		       varray.vval[quad+1], 		       varray.voffset[quad+1] - varray.voffset[quad] );	for( long i=varray.voffset[quad]+1; i <= varray.voffset[quad+1]; i++ ) {    	    topv = botv++;    	    advance( topv - varray.voffset[quad], 		     botv - varray.voffset[quad], 		     varray.varray[botv] );	    if( i == vlines )		getPts( extrema[2] );	    else		getPts( backend );	    getGridExtent();            if( isolines ) {	        outline();	    } else {		if( canTile() ) 		    coveAndTile();		else		    mesh();	    }        }   }}voidSlicer::outline( void ){    GridTrimVertex upper, lower;    Hull::init( );    backend.bgnoutline();    while( (nextupper( &upper )) ) {	if( upper.isGridVert() )	    backend.linevert( upper.g );	else	    backend.linevert( upper.t );    }    backend.endoutline();    backend.bgnoutline();    while( (nextlower( &lower )) ) {	if( lower.isGridVert() )	    backend.linevert( lower.g );	else	    backend.linevert( lower.t );    }    backend.endoutline();}voidSlicer::outline( Arc_ptr jarc ){    jarc->markverts();    if( jarc->pwlArc->npts >= 2 ) {	backend.bgnoutline();	for( int j = jarc->pwlArc->npts-1; j >= 0; j--  )	    backend.linevert( &(jarc->pwlArc->pts[j]) );	backend.endoutline();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -