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

📄 glsurfeval.cc

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 CC
📖 第 1 页 / 共 2 页
字号:
	      coord2f(botMostV[0], botMostV[1]);//	      glNormal3fv(botMostNormal);//	      glVertex3fv(botMostXYZ);	      endtfan();	      /*update i and botMostV for next loop	       */	      i = k+1;	      botMostV[0] = u_left;	      botMostV[1] = left_val[k];//	      botMostNormal = leftNormal[k];//	      botMostXYZ = leftXYZ[k];	    }	  else /*left_val[i] > right_val[j])*/	    {	      bgntfan();	      coord2f(u_left, left_val[i]);//	      glNormal3fv(leftNormal[i]);//	      glVertex3fv(leftXYZ[i]);        	      coord2f(botMostV[0], botMostV[1]);//	      glNormal3fv(botMostNormal);//	      glVertex3fv(botMostXYZ);        	      /*find the last k>=j such that	       *rightverts[k][0] < leftverts[i][0]	       */	      k=j;	      while(k< n_right)		{		  if(right_val[k] >= left_val[i])		    break;		  coord2f(u_right, right_val[k]);//		  glNormal3fv(rightNormal[k]);//		  glVertex3fv(rightXYZ[k]);		  k++;		}	      endtfan();	      /*update j and botMostV for next loop	       */	      j=k;	      botMostV[0] = u_right;	      botMostV[1] = right_val[j-1];//	      botMostNormal = rightNormal[j-1];//	      botMostXYZ = rightXYZ[j-1];	    }	}    }  //clean up//  free(leftXYZ);//  free(leftNormal);//  free(rightXYZ);//  free(rightNormal);#endif}voidOpenGLSurfaceEvaluator::bgnqstrip(void){  if(output_triangles)    bezierPatchMeshBeginStrip(global_bpm, GL_QUAD_STRIP);  else    glBegin((GLenum) GL_QUAD_STRIP);#ifdef STATISTICS	STAT_num_of_quad_strips++;#endif}voidOpenGLSurfaceEvaluator::endqstrip(void){  if(output_triangles)    bezierPatchMeshEndStrip(global_bpm);  else    glEnd();}/*------------------------------------------------------------------------- * bgnmap2f - preamble to surface definition and evaluations *------------------------------------------------------------------------- */voidOpenGLSurfaceEvaluator::bgnmap2f(long){  if(output_triangles)    {      /*deallocate the space which may has been       *allocated by global_bpm previously       */      if(global_bpm != NULL) {	bezierPatchMeshListDelete(global_bpm);	global_bpm = NULL;      }      /*	auto_normal_flag = 1; //always output normal in callback mode.			      //we could have used the following code,			      //but Inspector doesn't have gl context			      //before it calls tessellator.			      //this way is temporary.	*/      //NEWCALLBACK      //if one of the two normal callback functions are set,      //then set      if(normalCallBackN != NULL ||	 normalCallBackData != NULL)	auto_normal_flag = 1;      else	auto_normal_flag = 0;      //initialize so that no maps initially      vertex_flag = 0;      normal_flag = 0;      color_flag = 0;      texcoord_flag = 0;      /*      if(glIsEnabled(GL_AUTO_NORMAL) == GL_TRUE)	auto_normal_flag = 1;      else if (callback_auto_normal == 1)	auto_normal_flag = 1;      else	auto_normal_flag = 0;	*/	  glPushAttrib((GLbitfield) GL_EVAL_BIT);    }  else    {      glPushAttrib((GLbitfield) GL_EVAL_BIT);      /*to avoid side effect, we restor the opengl state for GL_POLYGON_MODE       */             glGetIntegerv(GL_POLYGON_MODE, gl_polygon_mode);    }}/*------------------------------------------------------------------------- * endmap2f - postamble to a map *------------------------------------------------------------------------- */voidOpenGLSurfaceEvaluator::endmap2f(void){  if(output_triangles)    {      //bezierPatchMeshListDelDeg(global_bpm);      //    bezierPatchMeshListEval(global_bpm);      //surfcount++;      //printf("surfcount=%i\n", surfcount);      //if(surfcount == 8) exit(0);      inBPMListEvalEM(global_bpm);/*    global_bpm = bezierPatchMeshListReverse(global_bpm);    {      float *vertex_array;      float *normal_array;      int *length_array;      int *type_array;      int num_strips;      bezierPatchMeshListCollect(global_bpm, &vertex_array, &normal_array, &length_array, &type_array, &num_strips);      drawStrips(vertex_array, normal_array, length_array, type_array, num_strips);      free(vertex_array);      free(normal_array);      free(length_array);      free(type_array);    }*/    //bezierPatchMeshListPrint(global_bpm);    //bezierPatchMeshListDraw(global_bpm);//	  printf("num triangles=%i\n", bezierPatchMeshListNumTriangles(global_bpm));#ifdef USE_LOD#else    bezierPatchMeshListDelete(global_bpm);    global_bpm = NULL;#endif	glPopAttrib();  }else  {#ifndef USE_LOD    glPopAttrib();#endif#ifdef STATISTICS    fprintf(stderr, "num_vertices=%i,num_triangles=%i,num_quads_strips=%i\n", STAT_num_of_eval_vertices,STAT_num_of_triangles,STAT_num_of_quad_strips);#endif    /*to restore the gl_polygon_mode     */#ifndef USE_LOD    glPolygonMode( GL_FRONT, (GLenum) gl_polygon_mode[0]);    glPolygonMode( GL_BACK,  (GLenum) gl_polygon_mode[1]);#endif}}/*------------------------------------------------------------------------- * map2f - pass a desription of a surface map *------------------------------------------------------------------------- */voidOpenGLSurfaceEvaluator::map2f(    long _type,    REAL _ulower,	/* u lower domain coord 	*/    REAL _uupper,	/* u upper domain coord 	*/    long _ustride,	/* interpoint distance		*/    long _uorder,	/* parametric order		*/    REAL _vlower,	/* v lower domain coord 	*/    REAL _vupper,	/* v upper domain coord 	*/    long _vstride,	/* interpoint distance		*/    long _vorder,	/* parametric order		*/    REAL *pts)	/* control points		*/{#ifdef USE_INTERNAL_EVAL   inMap2f((int) _type, (REAL) _ulower, (REAL) _uupper,	    (int) _ustride, (int) _uorder, (REAL) _vlower,	    (REAL) _vupper, (int) _vstride, (int) _vorder,	    (REAL *) pts);#else   if(output_triangles)     {       if(global_bpm == NULL)	 global_bpm = bezierPatchMeshMake2(10,10);       if(	  (global_bpm->bpatch == NULL &&	  (_type == GL_MAP2_VERTEX_3 || _type == GL_MAP2_VERTEX_4))	  ||	  (global_bpm->bpatch_normal == NULL &&	   (_type == GL_MAP2_NORMAL))	  ||	  (global_bpm->bpatch_color == NULL &&	   (_type == GL_MAP2_INDEX || _type == GL_MAP2_COLOR_4))	  ||	  (global_bpm->bpatch_texcoord == NULL &&	   (_type == GL_MAP2_TEXTURE_COORD_1 ||	    _type == GL_MAP2_TEXTURE_COORD_2 ||	    _type == GL_MAP2_TEXTURE_COORD_3 ||	    _type == GL_MAP2_TEXTURE_COORD_4 )	   ))	 {	   bezierPatchMeshPutPatch(global_bpm, (int) _type, _ulower, _uupper,(int)  _ustride,(int) _uorder,_vlower, _vupper, (int) _vstride, (int) _vorder, pts);	 }       else /*new surface patch (with multiple maps) starts*/	 {	   bezierPatchMesh *temp = bezierPatchMeshMake2(10,10);	   bezierPatchMeshPutPatch(temp, (int) _type, _ulower, _uupper,(int)  _ustride,(int) _uorder,_vlower, _vupper, (int) _vstride, (int) _vorder, pts);	   global_bpm = bezierPatchMeshListInsert(global_bpm, temp);	   /*	   global_bpm = bezierPatchMeshListInsert(global_bpm,						  bezierPatchMeshMake(								      (int) _type, _ulower, _uupper,(int)  _ustride, (int) _uorder, _vlower, _vupper, (int) _vstride, (int) _vorder, pts, 10, 10));	   */	 }     }   else /*not output triangles*/     {       glMap2f((GLenum) _type, (GLfloat) _ulower, (GLfloat) _uupper,	       (GLint) _ustride, (GLint) _uorder, (GLfloat) _vlower,	       (GLfloat) _vupper, (GLint) _vstride, (GLint) _vorder,	       (const GLfloat *) pts);     }#endif}/*------------------------------------------------------------------------- * mapmesh2f - evaluate a mesh of points on lattice *------------------------------------------------------------------------- */voidOpenGLSurfaceEvaluator::mapmesh2f(long style, long umin, long umax, long vmin, long vmax){#ifdef NO_EVALUATIONreturn;#endif#ifdef USE_INTERNAL_EVAL    inEvalMesh2((int)umin, (int)vmin, (int)umax, (int)vmax);#elseif(output_triangles){#ifdef USE_LOD  bezierPatchMeshBeginStrip(global_bpm, GL_POLYGON);  bezierPatchMeshInsertUV(global_bpm, global_grid_u0, global_grid_v0);  bezierPatchMeshInsertUV(global_bpm, global_grid_u1, global_grid_v1);  bezierPatchMeshInsertUV(global_bpm, (REAL)global_grid_nu, (REAL)global_grid_nv);  bezierPatchMeshInsertUV(global_bpm, (REAL)umin, (REAL)vmin);  bezierPatchMeshInsertUV(global_bpm, (REAL)umax, (REAL)vmax);  bezierPatchMeshEndStrip(global_bpm);#else  REAL du, dv;  long i,j;  if(global_grid_nu == 0 || global_grid_nv == 0)    return; /*no points need to be output*/  du = (global_grid_u1 - global_grid_u0) / (REAL)global_grid_nu;  dv = (global_grid_v1 - global_grid_v0) / (REAL)global_grid_nv;  if(global_grid_nu >= global_grid_nv){    for(i=umin; i<umax; i++){      REAL u1 = (i==global_grid_nu)? global_grid_u1:(global_grid_u0 + i*du);      REAL u2 = ((i+1) == global_grid_nu)? global_grid_u1: (global_grid_u0+(i+1)*du);      bgnqstrip();      for(j=vmax; j>=vmin; j--){	REAL v1 = (j == global_grid_nv)? global_grid_v1: (global_grid_v0 +j*dv);        	coord2f(u1, v1);	coord2f(u2, v1);      }      endqstrip();    }  }  else{    for(i=vmin; i<vmax; i++){      REAL v1 = (i==global_grid_nv)? global_grid_v1:(global_grid_v0 + i*dv);      REAL v2 = ((i+1) == global_grid_nv)? global_grid_v1: (global_grid_v0+(i+1)*dv);      bgnqstrip();      for(j=umax; j>=umin; j--){	REAL u1 = (j == global_grid_nu)? global_grid_u1: (global_grid_u0 +j*du);        	coord2f(u1, v2);	coord2f(u1, v1);      }      endqstrip();    }  }#endif}else{    switch(style) {    default:    case N_MESHFILL:	glEvalMesh2((GLenum) GL_FILL, (GLint) umin, (GLint) umax,		(GLint) vmin, (GLint) vmax);	break;    case N_MESHLINE:	glEvalMesh2((GLenum) GL_LINE, (GLint) umin, (GLint) umax,		(GLint) vmin, (GLint) vmax);	break;    case N_MESHPOINT:	glEvalMesh2((GLenum) GL_POINT, (GLint) umin, (GLint) umax,		(GLint) vmin, (GLint) vmax);	break;    }  }#endif#ifdef STATISTICS	STAT_num_of_quad_strips += (umax-umin)*(vmax-vmin);#endif}/*------------------------------------------------------------------------- * evalcoord2f - evaluate a point on a surface *------------------------------------------------------------------------- */voidOpenGLSurfaceEvaluator::evalcoord2f(long, REAL u, REAL v){#ifdef NO_EVALUATIONreturn;#endif    newtmeshvert(u, v);}/*------------------------------------------------------------------------- * evalpoint2i - evaluate a grid point *------------------------------------------------------------------------- */voidOpenGLSurfaceEvaluator::evalpoint2i(long u, long v){#ifdef NO_EVALUATIONreturn;#endif    newtmeshvert(u, v);}voidOpenGLSurfaceEvaluator::point2i( long u, long v ){#ifdef NO_EVALUATIONreturn;#else#ifdef USE_INTERNAL_EVAL    inEvalPoint2( (int)u,  (int)v);#elseif(output_triangles){  REAL du, dv;  REAL fu,fv;  du = (global_grid_u1 - global_grid_u0) / (REAL)global_grid_nu;  dv = (global_grid_v1 - global_grid_v0) / (REAL)global_grid_nv;  fu = (u==global_grid_nu)? global_grid_u1:(global_grid_u0 + u*du);  fv = (v == global_grid_nv)? global_grid_v1: (global_grid_v0 +v*dv);  coord2f(fu,fv);}else    glEvalPoint2((GLint) u, (GLint) v);#endif#ifdef STATISTICS  STAT_num_of_eval_vertices++;#endif#endif}voidOpenGLSurfaceEvaluator::coord2f( REAL u, REAL v ){#ifdef NO_EVALUATIONreturn;#else#ifdef USE_INTERNAL_EVAL    inEvalCoord2f( u, v);#elseif(output_triangles)    bezierPatchMeshInsertUV(global_bpm, u,v);else    glEvalCoord2f((GLfloat) u, (GLfloat) v);#endif#ifdef STATISTICS  STAT_num_of_eval_vertices++;#endif#endif}voidOpenGLSurfaceEvaluator::newtmeshvert( long u, long v ){#ifdef NO_EVALUATIONreturn;#else    if (tmeshing) {	if (vcount == 2) {	    vertexCache[0]->invoke(this);	    vertexCache[1]->invoke(this);	    point2i( u,  v);	} else {	    vcount++;	}	vertexCache[which]->saveEvalPoint(u, v);	which = 1 - which;    } else {	point2i( u,  v);    }#endif}voidOpenGLSurfaceEvaluator::newtmeshvert( REAL u, REAL v ){#ifdef NO_EVALUATIONreturn;#else    if (tmeshing) {	if (vcount == 2) {	    vertexCache[0]->invoke(this);	    vertexCache[1]->invoke(this);	    coord2f(u,v);	} else {	    vcount++;	}	vertexCache[which]->saveEvalCoord(u, v);	which = 1 - which;    } else {	coord2f( u,  v);    }#endif}#ifdef _WIN32void OpenGLSurfaceEvaluator::putCallBack(GLenum which, void (GLAPIENTRY *fn)() )#elsevoid OpenGLSurfaceEvaluator::putCallBack(GLenum which, _GLUfuncptr fn )#endif{  switch(which)    {    case GLU_NURBS_BEGIN:      beginCallBackN = (void (GLAPIENTRY *) (GLenum)) fn;      break;    case GLU_NURBS_END:      endCallBackN = (void (GLAPIENTRY *) (void)) fn;      break;    case GLU_NURBS_VERTEX:      vertexCallBackN = (void (GLAPIENTRY *) (const GLfloat*)) fn;      break;    case GLU_NURBS_NORMAL:      normalCallBackN = (void (GLAPIENTRY *) (const GLfloat*)) fn;      break;    case GLU_NURBS_COLOR:      colorCallBackN = (void (GLAPIENTRY *) (const GLfloat*)) fn;      break;    case GLU_NURBS_TEXTURE_COORD:      texcoordCallBackN = (void (GLAPIENTRY *) (const GLfloat*)) fn;      break;    case GLU_NURBS_BEGIN_DATA:      beginCallBackData = (void (GLAPIENTRY *) (GLenum, void*)) fn;      break;    case GLU_NURBS_END_DATA:      endCallBackData = (void (GLAPIENTRY *) (void*)) fn;      break;    case GLU_NURBS_VERTEX_DATA:      vertexCallBackData = (void (GLAPIENTRY *) (const GLfloat*, void*)) fn;      break;    case GLU_NURBS_NORMAL_DATA:      normalCallBackData = (void (GLAPIENTRY *) (const GLfloat*, void*)) fn;      break;    case GLU_NURBS_COLOR_DATA:      colorCallBackData = (void (GLAPIENTRY *) (const GLfloat*, void*)) fn;      break;    case GLU_NURBS_TEXTURE_COORD_DATA:      texcoordCallBackData = (void (GLAPIENTRY *) (const GLfloat*, void*)) fn;      break;    }}voidOpenGLSurfaceEvaluator::beginCallBack(GLenum which, void *data){  if(beginCallBackData)    beginCallBackData(which, data);  else if(beginCallBackN)    beginCallBackN(which);}voidOpenGLSurfaceEvaluator::endCallBack(void *data){  if(endCallBackData)    endCallBackData(data);  else if(endCallBackN)    endCallBackN();}voidOpenGLSurfaceEvaluator::vertexCallBack(const GLfloat *vert, void* data){  if(vertexCallBackData)    vertexCallBackData(vert, data);  else if(vertexCallBackN)    vertexCallBackN(vert);}voidOpenGLSurfaceEvaluator::normalCallBack(const GLfloat *normal, void* data){  if(normalCallBackData)    normalCallBackData(normal, data);  else if(normalCallBackN)    normalCallBackN(normal);}voidOpenGLSurfaceEvaluator::colorCallBack(const GLfloat *color, void* data){  if(colorCallBackData)    colorCallBackData(color, data);  else if(colorCallBackN)    colorCallBackN(color);}voidOpenGLSurfaceEvaluator::texcoordCallBack(const GLfloat *texcoord, void* data){  if(texcoordCallBackData)    texcoordCallBackData(texcoord, data);  else if(texcoordCallBackN)    texcoordCallBackN(texcoord);}

⌨️ 快捷键说明

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