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

📄 insurfeval.cc

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 CC
📖 第 1 页 / 共 4 页
字号:
{  int i,j,x;  surfEvalMachine *temp_em;  switch(which){  case 0: //vertex    vertex_flag = 1;    temp_em = &em_vertex;    break;  case 1: //normal    normal_flag = 1;    temp_em = &em_normal;    break;  case 2: //color    color_flag = 1;    temp_em = &em_color;    break;  default:    texcoord_flag = 1;    temp_em = &em_texcoord;    break;  }  REAL *data = temp_em->ctlPoints;    temp_em->uprime = -1;//initilized  temp_em->vprime = -1;  temp_em->k = k;  temp_em->u1 = ulower;  temp_em->u2 = uupper;  temp_em->ustride = ustride;  temp_em->uorder = uorder;  temp_em->v1 = vlower;  temp_em->v2 = vupper;  temp_em->vstride = vstride;  temp_em->vorder = vorder;  /*copy the contrl points from ctlPoints to global_ev_ctlPoints*/  for (i=0; i<uorder; i++) {    for (j=0; j<vorder; j++) {      for (x=0; x<k; x++) {	data[x] = ctlPoints[x];      }      ctlPoints += vstride;      data += k;    }    ctlPoints += ustride - vstride * vorder;  }}void OpenGLSurfaceEvaluator::inDoDomain2WithDerivsEM(surfEvalMachine *em, REAL u, REAL v, 				REAL *retPoint, REAL *retdu, REAL *retdv){    int j, row, col;    REAL the_uprime;    REAL the_vprime;    REAL p;    REAL pdv;    REAL *data;    if((em->u2 == em->u1) || (em->v2 == em->v1))	return;    the_uprime = (u - em->u1) / (em->u2 - em->u1);    the_vprime = (v - em->v1) / (em->v2 - em->v1);        /* Compute coefficients for values and derivs */    /* Use already cached values if possible */    if(em->uprime != the_uprime) {        inPreEvaluateWithDeriv(em->uorder, the_uprime, em->ucoeff, em->ucoeffDeriv);	em->uprime = the_uprime;    }    if (em->vprime != the_vprime) {	inPreEvaluateWithDeriv(em->vorder, the_vprime, em->vcoeff, em->vcoeffDeriv);	em->vprime = the_vprime;    }    for (j = 0; j < em->k; j++) {	data=em->ctlPoints+j;	retPoint[j] = retdu[j] = retdv[j] = 0.0;	for (row = 0; row < em->uorder; row++)  {	    /* 	    ** Minor optimization.	    ** The col == 0 part of the loop is extracted so we don't	    ** have to initialize p and pdv to 0.	    */	    p = em->vcoeff[0] * (*data);	    pdv = em->vcoeffDeriv[0] * (*data);	    data += em->k;	    for (col = 1; col < em->vorder; col++) {		/* Incrementally build up p, pdv value */		p += em->vcoeff[col] * (*data);		pdv += em->vcoeffDeriv[col] * (*data);		data += em->k;	    }	    /* Use p, pdv value to incrementally add up r, du, dv */	    retPoint[j] += em->ucoeff[row] * p;	    retdu[j] += em->ucoeffDeriv[row] * p;	    retdv[j] += em->ucoeff[row] * pdv;	}    }  }  void OpenGLSurfaceEvaluator::inDoDomain2EM(surfEvalMachine *em, REAL u, REAL v, 				REAL *retPoint){    int j, row, col;    REAL the_uprime;    REAL the_vprime;    REAL p;    REAL *data;    if((em->u2 == em->u1) || (em->v2 == em->v1))	return;    the_uprime = (u - em->u1) / (em->u2 - em->u1);    the_vprime = (v - em->v1) / (em->v2 - em->v1);        /* Compute coefficients for values and derivs */    /* Use already cached values if possible */    if(em->uprime != the_uprime) {        inPreEvaluate(em->uorder, the_uprime, em->ucoeff);	em->uprime = the_uprime;    }    if (em->vprime != the_vprime) {	inPreEvaluate(em->vorder, the_vprime, em->vcoeff);	em->vprime = the_vprime;    }    for (j = 0; j < em->k; j++) {	data=em->ctlPoints+j;	retPoint[j] = 0.0;	for (row = 0; row < em->uorder; row++)  {	    /* 	    ** Minor optimization.	    ** The col == 0 part of the loop is extracted so we don't	    ** have to initialize p and pdv to 0.	    */	    p = em->vcoeff[0] * (*data);	    data += em->k;	    for (col = 1; col < em->vorder; col++) {		/* Incrementally build up p, pdv value */		p += em->vcoeff[col] * (*data);		data += em->k;	    }	    /* Use p, pdv value to incrementally add up r, du, dv */	    retPoint[j] += em->ucoeff[row] * p;	}    }  }  void OpenGLSurfaceEvaluator::inDoEvalCoord2EM(REAL u, REAL v){  REAL temp_vertex[5];  REAL temp_normal[3];  REAL temp_color[4];  REAL temp_texcoord[4];  if(texcoord_flag)    {      inDoDomain2EM(&em_texcoord, u,v, temp_texcoord);      texcoordCallBack(temp_texcoord, userData);    }  if(color_flag)    {      inDoDomain2EM(&em_color, u,v, temp_color);      colorCallBack(temp_color, userData);    }  if(normal_flag) //there is a normla map    {      inDoDomain2EM(&em_normal, u,v, temp_normal);      normalCallBack(temp_normal, userData);          if(vertex_flag)	{	  inDoDomain2EM(&em_vertex, u,v,temp_vertex);	  if(em_vertex.k == 4)	    {	      temp_vertex[0] /= temp_vertex[3];	      temp_vertex[1] /= temp_vertex[3];	      temp_vertex[2] /= temp_vertex[3];	      	    }          temp_vertex[3]=u;          temp_vertex[4]=v;	  	  vertexCallBack(temp_vertex, userData);	}    }  else if(auto_normal_flag) //no normal map but there is a normal callbackfunctin    {      REAL du[4];      REAL dv[4];            /*compute homegeneous point and partial derivatives*/      inDoDomain2WithDerivsEM(&em_vertex, u,v,temp_vertex,du,dv);      if(em_vertex.k ==4)	inComputeFirstPartials(temp_vertex, du, dv);#ifdef AVOID_ZERO_NORMAL      if(myabs(dv[0]) <= MYZERO && myabs(dv[1]) <= MYZERO && myabs(dv[2]) <= MYZERO)	{	  	  REAL tempdu[4];	  REAL tempdata[4];	  REAL u1 = em_vertex.u1;	  REAL u2 = em_vertex.u2;	  if(u-MYDELTA*(u2-u1) < u1)	    u = u+ MYDELTA*(u2-u1);	  else	    u = u-MYDELTA*(u2-u1);	  inDoDomain2WithDerivsEM(&em_vertex,u,v, tempdata, tempdu, dv);	  if(em_vertex.k ==4)	    inComputeFirstPartials(temp_vertex, du, dv);	  	}      else if(myabs(du[0]) <= MYZERO && myabs(du[1]) <= MYZERO && myabs(du[2]) <= MYZERO)	{	  REAL tempdv[4];	  REAL tempdata[4];	  REAL v1 = em_vertex.v1;	  REAL v2 = em_vertex.v2;	  if(v-MYDELTA*(v2-v1) < v1)	    v = v+ MYDELTA*(v2-v1);	  else	    v = v-MYDELTA*(v2-v1);	  inDoDomain2WithDerivsEM(&em_vertex,u,v, tempdata, du, tempdv);	  if(em_vertex.k ==4)	    inComputeFirstPartials(temp_vertex, du, dv);	}#endif      /*compute normal*/      switch(em_vertex.k){      case 3:	inComputeNormal2(du, dv, temp_normal);	break;      case 4://	inComputeFirstPartials(temp_vertex, du, dv);	inComputeNormal2(du, dv, temp_normal);	/*transform the homegeneous coordinate of retPoint into inhomogenous one*/	temp_vertex[0] /= temp_vertex[3];	temp_vertex[1] /= temp_vertex[3];	temp_vertex[2] /= temp_vertex[3];	break;      }      normalCallBack(temp_normal, userData);      temp_vertex[3] = u;      temp_vertex[4] = v;      vertexCallBack(temp_vertex, userData);          }/*end if auto_normal*/  else //no normal map, and no normal callback function    {      if(vertex_flag)	{	  inDoDomain2EM(&em_vertex, u,v,temp_vertex);	  if(em_vertex.k == 4)	    {	      temp_vertex[0] /= temp_vertex[3];	      temp_vertex[1] /= temp_vertex[3];	      temp_vertex[2] /= temp_vertex[3];	      	    }          temp_vertex[3] = u;          temp_vertex[4] = v;	  vertexCallBack(temp_vertex, userData);	}    }}void OpenGLSurfaceEvaluator::inBPMEvalEM(bezierPatchMesh* bpm){  int i,j,k;  float u,v;  int ustride;  int vstride;#ifdef USE_LOD  if(bpm->bpatch != NULL)    {      bezierPatch* p=bpm->bpatch;      ustride = p->dimension * p->vorder;      vstride = p->dimension;      glMap2f( (p->dimension == 3)? GL_MAP2_VERTEX_3 : GL_MAP2_VERTEX_4,	      p->umin,	      p->umax,	      ustride,	      p->uorder,	      p->vmin,	      p->vmax,	      vstride,	      p->vorder,	      p->ctlpoints);/*    inMap2fEM(0, p->dimension,	  p->umin,	  p->umax,	  ustride,	  p->uorder,	  p->vmin,	  p->vmax,	  vstride,	  p->vorder,	  p->ctlpoints);*/    }#else  if(bpm->bpatch != NULL){    bezierPatch* p = bpm->bpatch;    ustride = p->dimension * p->vorder;    vstride = p->dimension;    inMap2fEM(0, p->dimension,	  p->umin,	  p->umax,	  ustride,	  p->uorder,	  p->vmin,	  p->vmax,	  vstride,	  p->vorder,	  p->ctlpoints);  }  if(bpm->bpatch_normal != NULL){    bezierPatch* p = bpm->bpatch_normal;    ustride = p->dimension * p->vorder;    vstride = p->dimension;    inMap2fEM(1, p->dimension,	  p->umin,	  p->umax,	  ustride,	  p->uorder,	  p->vmin,	  p->vmax,	  vstride,	  p->vorder,	  p->ctlpoints);  }  if(bpm->bpatch_color != NULL){    bezierPatch* p = bpm->bpatch_color;    ustride = p->dimension * p->vorder;    vstride = p->dimension;    inMap2fEM(2, p->dimension,	  p->umin,	  p->umax,	  ustride,	  p->uorder,	  p->vmin,	  p->vmax,	  vstride,	  p->vorder,	  p->ctlpoints);  }  if(bpm->bpatch_texcoord != NULL){    bezierPatch* p = bpm->bpatch_texcoord;    ustride = p->dimension * p->vorder;    vstride = p->dimension;    inMap2fEM(3, p->dimension,	  p->umin,	  p->umax,	  ustride,	  p->uorder,	  p->vmin,	  p->vmax,	  vstride,	  p->vorder,	  p->ctlpoints);  }#endif  k=0;  for(i=0; i<bpm->index_length_array; i++)    {#ifdef USE_LOD      if(bpm->type_array[i] == GL_POLYGON) //a mesh	{	  GLfloat *temp = bpm->UVarray+k;	  GLfloat u0 = temp[0];	  GLfloat v0 = temp[1];	  GLfloat u1 = temp[2];	  GLfloat v1 = temp[3];	  GLint nu = (GLint) ( temp[4]);	  GLint nv = (GLint) ( temp[5]);	  GLint umin = (GLint) ( temp[6]);	  GLint vmin = (GLint) ( temp[7]);	  GLint umax = (GLint) ( temp[8]);	  GLint vmax = (GLint) ( temp[9]);	  glMapGrid2f(LOD_eval_level*nu, u0, u1, LOD_eval_level*nv, v0, v1);	  glEvalMesh2(GL_FILL, LOD_eval_level*umin, LOD_eval_level*umax, LOD_eval_level*vmin, LOD_eval_level*vmax);	}      else	{	  LOD_eval(bpm->length_array[i], bpm->UVarray+k, bpm->type_array[i],		   0		   );	}	  k+= 2*bpm->length_array[i];           #else //undef  USE_LOD#ifdef CRACK_TESTif(  bpm->bpatch->umin == 2 &&   bpm->bpatch->umax == 3  && bpm->bpatch->vmin ==2 &&    bpm->bpatch->vmax == 3){REAL vertex[4];REAL normal[4];#ifdef DEBUGprintf("***number ****1\n");#endifbeginCallBack(GL_QUAD_STRIP, NULL);inDoEvalCoord2EM(3.0, 3.0);inDoEvalCoord2EM(2.0, 3.0);inDoEvalCoord2EM(3.0, 2.7);inDoEvalCoord2EM(2.0, 2.7);inDoEvalCoord2EM(3.0, 2.0);inDoEvalCoord2EM(2.0, 2.0);endCallBack(NULL);beginCallBack(GL_TRIANGLE_STRIP, NULL);inDoEvalCoord2EM(2.0, 3.0);inDoEvalCoord2EM(2.0, 2.0);inDoEvalCoord2EM(2.0, 2.7);endCallBack(NULL);}if(  bpm->bpatch->umin == 1 &&   bpm->bpatch->umax == 2  && bpm->bpatch->vmin ==2 &&    bpm->bpatch->vmax == 3){#ifdef DEBUGprintf("***number 3\n");#endifbeginCallBack(GL_QUAD_STRIP, NULL);inDoEvalCoord2EM(2.0, 3.0);inDoEvalCoord2EM(1.0, 3.0);inDoEvalCoord2EM(2.0, 2.3);inDoEvalCoord2EM(1.0, 2.3);inDoEvalCoord2EM(2.0, 2.0);inDoEvalCoord2EM(1.0, 2.0);endCallBack(NULL);beginCallBack(GL_TRIANGLE_STRIP, NULL);inDoEvalCoord2EM(2.0, 2.3);inDoEvalCoord2EM(2.0, 2.0);inDoEvalCoord2EM(2.0, 3.0);endCallBack(NULL);}return;#endif //CRACK_TEST      beginCallBack(bpm->type_array[i], userData);      for(j=0; j<bpm->length_array[i]; j++)	{	  u = bpm->UVarray[k];	  v = bpm->UVarray[k+1];#ifdef USE_LOD          LOD_EVAL_COORD(u,v);//	  glEvalCoord2f(u,v);#else#ifdef  GENERIC_TEST          float temp_normal[3];          float temp_vertex[3];          if(temp_signal == 0)	    {	      gTessVertexSphere(u,v, temp_normal, temp_vertex);//printf("normal=(%f,%f,%f)\n", temp_normal[0], temp_normal[1], temp_normal[2])//printf("veretx=(%f,%f,%f)\n", temp_vertex[0], temp_vertex[1], temp_vertex[2]);              normalCallBack(temp_normal, userData);	      vertexCallBack(temp_vertex, userData);	    }          else if(temp_signal == 1)	    {	      gTessVertexCyl(u,v, temp_normal, temp_vertex);//printf("normal=(%f,%f,%f)\n", temp_normal[0], temp_normal[1], temp_normal[2])//printf("veretx=(%f,%f,%f)\n", temp_vertex[0], temp_vertex[1], temp_vertex[2]);              normalCallBack(temp_normal, userData);	      vertexCallBack(temp_vertex, userData);	    }	  else#endif //GENERIC_TEST	    inDoEvalCoord2EM(u,v);     #endif //USE_LOD	  k += 2;	}      endCallBack(userData);#endif //USE_LOD    }}void OpenGLSurfaceEvaluator::inBPMListEvalEM(bezierPatchMesh* list){  bezierPatchMesh* temp;  for(temp = list; temp != NULL; temp = temp->next)    {      inBPMEvalEM(temp);    }}

⌨️ 快捷键说明

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