📄 glsurfeval.cc
字号:
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 + -