《高效学习OpenGL》 之 多边形分格化 gluNewTess(),gluTessCallback(),gluTessProperty(),gluTessBeginPolygon()

   GLUtesselator* gluNewTess( void );
   //创建一个新的分割化对象,并返回一个指向他的指针,如果创建失败,返回NULL
   void gluTessCallback(GLUtesselator *tess, GLenum which, void(CALLBACK *fn)());
	//把回调函数fn与分格化对象tess相关联。回调函数的类型是由which决定的,which的原型见下图

   gluTessProperty(tobj, GLU_TESS_WINDING_RULE,
                   GLU_TESS_WINDING_POSITIVE);
   void gluTessProperty(GLUtesselator *tess, GLenum which, GLdouble value );
   //对于分格化对象tess,which的当前值被设置为value。
   //如果which是GLU_TESS_WINDING_RULE,他决定了多边形哪部分位于外部,哪部分位于内部,value可以是GLU_TESS_WINDING_ADD(默认)、GLU_TESS_WINDING_POSITIVE等

   void gluTessNormal(GLUtesselator *tess, GLdouble x, GLdouble y, GLdouble z);
   //对于分格化对象tess,此函数定义了一条法线向量,用于控制生成多边形的环绕方向。

   gluTessBeginPolygon(tobj, NULL);
   void gluTessBeginPolygon(GLUtesselator *tess,void *polygon_data);
   void gluTessEndPolygon(GLUtesselator *tess);
   //开始和结束对需要进行分格化的多边形的指定,并把分格化对象tess与它相关联。polygon_data指向一个用户定义的数据结构,传递给所有在GLU_YESS_*_DATA回调函数中注册的函数。

   gluTessBeginContour(GLUtesselator *tess);
   gluTessEndContour(GLUtesselator *tess);
   //开始和结束一条轮廓线的指定,这条轮廓线是一个多边形的一部分,闭合的轮廓线是通过零次或多次调用gluTessVertex()形成的,每条轮廓线的最后一个顶点会连接到第一个顶点

         gluTessVertex(tobj, star[4], star[4]);
		 void gluTessVertex(GLUtesselator *tess, GLdouble coords[3], void *data );
		 //在实际使用中,指定分格化对象的当前轮廓线的一个顶点。coords包含了三维顶点坐标,data是个指针,它发送到与GLU_TESS_VERTEX或GLU_TESS_VERTEX_DATA相关联的回调函数。

   gluDeleteTess(GLUtesselator *tess);
   //删除分格化对象



void IntersectionInfoCache::makePolygonDrawData(std::vector<GeoLocation>& vecPoints, std::vector<uint16>& triangleIndexList, uint8 drawelement, //多边形描画数据 vector<IntersectionImageData>& imageData) { std::vector<PolygonTessVertex> points; uint32 pointcount = vecPoints.size(); points.reserve(pointcount); for(int32 i = 0;i < pointcount;++i) { PolygonTessVertex m_point; m_point.vertex.x = vecPoints[i].longitude; m_point.vertex.y = vecPoints[i].latitude; points.emplace_back(m_point); } TessPolygon(points, triangleIndexList); std::vector<GeoLocation> vecTessPoints; uint32 pointcountTess = points.size(); vecTessPoints.reserve(pointcountTess); for(int32 i = 0;i < pointcountTess;++i) { GeoLocation m_point; m_point.longitude = points[i].vertex.x; m_point.latitude = points[i].vertex.y; vecTessPoints.emplace_back(m_point); } IntersectionImageData tempimagedata; tempimagedata.drawelement = drawelement; tempimagedata.vertex.assign(vecTessPoints.begin(), vecTessPoints.end()); tempimagedata.index.assign(triangleIndexList.begin(), triangleIndexList.end()); imageData.emplace_back(tempimagedata); } void TessPolygon(std::vector<PolygonTessVertex> &points, std::vector<uint16> &triangleIndexList) { auto uiPointCount = points.size(); GLUtesselator* tobj = gluNewTess(); gluTessCallback(tobj, GLU_TESS_VERTEX_DATA, (_GLUfuncptr)PolygonVertexCallback); gluTessCallback(tobj, GLU_TESS_BEGIN_DATA, (_GLUfuncptr)PolygonBeginCallback); gluTessCallback(tobj, GLU_TESS_END_DATA, (_GLUfuncptr)PolygonEndCallback); gluTessCallback(tobj, GLU_TESS_ERROR_DATA, (_GLUfuncptr)PolygonErrorCallback); gluTessCallback(tobj, GLU_TESS_COMBINE_DATA, (_GLUfuncptr)PolygonCombineCallback); gluTessProperty(tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO); PolygonData_t stPolygonData; gluTessBeginPolygon(tobj, &stPolygonData); gluTessBeginContour(tobj); /* for loop statement: the initial value of decltype(uiPointCount) Index is 0 / for(decltype(uiPointCount) Index = 0; Index < uiPointCount; ++Index) { stPolygonData.vecVertexArray.emplace_back(points[Index]); TessPolygonVertex tempTessVertex; tempTessVertex.location[0] = points[Index].vertex.x; tempTessVertex.location[1] = points[Index].vertex.y; gluTessNormal(tobj, 0.0, 0.0, 1.0); gluTessVertex(tobj, tempTessVertex.location, (GLvoid)Index); } gluTessEndContour(tobj); gluTessEndPolygon(tobj); gluDeleteTess(tobj); points.swap(stPolygonData.vecVertexArray); triangleIndexList.swap(stPolygonData.vecDrawIndices); }加上注释
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚坏叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值