Triangulateすべてを三角形を大きなVA/VBOに投げる。
EDIT:GLUtesselatorラッパー:
struct TessContext
{
~TessContext()
{
for(size_t i = 0; i < combined.size(); ++i)
{
delete[] combined[i];
}
}
vector<Eigen::Vector2d> pts;
vector< GLdouble* > combined;
};
#define APIENTRY __stdcall
void APIENTRY tess_begin(GLenum type) {}
void APIENTRY tess_edgeFlag(GLboolean flag) {}
void APIENTRY tess_end() {}
void APIENTRY tess_vertex(void *data, TessContext* ctx)
{
GLdouble* coord = (GLdouble*)data;
ctx->pts.push_back(Eigen::Vector2d(coord[0], coord[1]));
}
void APIENTRY tess_combine(GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData, TessContext* ctx)
{
GLdouble* newVert = new GLdouble[3];
ctx->combined.push_back(newVert);
newVert[0] = coords[0];
newVert[1] = coords[1];
newVert[2] = coords[2];
*outData = newVert;
}
template< typename Vec >
vector<Vec> Triangulate
(
const vector<Vec>& aSimplePolygon
)
{
vector<GLdouble> coords;
for(size_t i = 0; i < aSimplePolygon.size(); ++i)
{
coords.push_back(aSimplePolygon[i].x());
coords.push_back(aSimplePolygon[i].y());
coords.push_back(0);
}
GLUtesselator* tess = gluNewTess();
//gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
//gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO);
gluTessCallback(tess, GLU_TESS_BEGIN, (GLvoid (APIENTRY *)()) tess_begin );
gluTessCallback(tess, GLU_TESS_EDGE_FLAG, (GLvoid (APIENTRY *)()) tess_edgeFlag );
gluTessCallback(tess, GLU_TESS_VERTEX_DATA, (GLvoid (APIENTRY *)()) tess_vertex );
gluTessCallback(tess, GLU_TESS_END, (GLvoid (APIENTRY *)()) tess_end );
gluTessCallback(tess, GLU_TESS_COMBINE_DATA, (GLvoid (APIENTRY *)()) tess_combine );
gluTessNormal(tess, 0.0, 0.0, 1.0);
TessContext ctx;
gluTessBeginPolygon(tess, &ctx);
gluTessBeginContour(tess);
for(size_t i = 0; i < aSimplePolygon.size(); ++i)
{
gluTessVertex(tess, &coords[i*3], &coords[i*3]);
}
gluTessEndContour(tess);
gluTessEndPolygon(tess);
gluDeleteTess(tess);
vector<Vec> ret(ctx.pts.size());
for(size_t i = 0; i < ret.size(); ++i)
{
ret[i].x() = ctx.pts[i].x();
ret[i].y() = ctx.pts[i].y();
}
return ret;
}
が面白い何のためのEigenではなくを使用します。
OpenGL呼び出しをたくさん行っています。それぞれの呼び出しにはオーバーヘッドがあります。すべてのデータをバッファに格納し、すべてをレンダリングするためにわずかな呼び出しを使用する必要があります。 @genpfaultの回答を参照してください。 – lvella