c++ - gluTessCallback 指向回调函数的指针。编译错误

标签 c++ visual-c++ opengl function-pointers

我有一个名为Polygon的类,我试图在其中渲染一个 segmentation 的多边形。

我在这个类中有一个名为render的方法,以及几个绘制多边形的方法。

其中包括:

public class Polygon : public Entity
{
protected:
...
public:
    bool render();
    GLdouble* NewVector(GLdouble x, GLdouble y);
    void CALLBACK BeginCallback(GLenum type);
    void CALLBACK EndCallback();
    void CALLBACK VertexCallback(GLvoid *vertex);
    void CALLBACK CombineCallback(GLdouble coords[3], GLdouble *data[4], GLfloat weight[4], GLdouble **dataOut);
    void CALLBACK ErrorCallback(GLenum errorCode);
    };

在我的方法 render 中,我尝试为 BeginCallbackEndCallback 注册 gluTessCallback 回调等等...

gluTessCallback(tess, GLU_TESS_BEGIN, (void(*)())&this->BeginCallback);

但这给了我一个编译错误,

error C2276: '&' : illegal operation on bound member function expression

我需要成为这个方法(来自当前实例),因为我需要在其中创建并释放一些实例值。

有人可以帮助我吗?

最佳答案

With GLU_TESS_*_DATA, the user-specified data may be used for "per-polygon" data.

使用私有(private)静态成员函数作为回调,并通过 user_data 传入实例指针.

在每个回调中,您可以 static_cast<> user_data指向您的Polygon根据需要键入并操作结果实例。

类似这样的事情:

class Poly
{
public:
    Poly( vector< dvec3 >& poly )
    {
        GLUtesselator* tess = gluNewTess();
        gluTessCallback( tess, GLU_TESS_BEGIN,          (GLvoid (CALLBACK *)()) Poly::begin       );
        gluTessCallback( tess, GLU_TESS_EDGE_FLAG,      (GLvoid (CALLBACK *)()) Poly::edgeFlag    );
        gluTessCallback( tess, GLU_TESS_END,            (GLvoid (CALLBACK *)()) Poly::end         );
        gluTessCallback( tess, GLU_TESS_VERTEX_DATA,    (GLvoid (CALLBACK *)()) Poly::vertexData  );
        gluTessCallback( tess, GLU_TESS_COMBINE_DATA,   (GLvoid (CALLBACK *)()) Poly::combineData );
        gluTessNormal( tess, 0.0, 0.0, 1.0 );

        gluTessBeginPolygon( tess, (void*)this );
        gluTessBeginContour( tess );

        for( size_t i = 0; i < poly.size(); ++i )
        {
            gluTessVertex( tess, &poly[i][0], &poly[i] );
        }

        gluTessEndContour( tess );
        gluTessEndPolygon( tess );

        gluDeleteTess(tess);

        for( size_t i = 0; i < mCombined.size(); ++i )
        {
            delete mCombined[i];
        }
        mCombined.clear();
    }

    void Render()
    {
        glBegin( GL_TRIANGLES );
        for( size_t i = 0; i < mTriangles.size(); ++i )
        {
            glVertex3dv( &mTriangles[i][0] );
        }
        glEnd();
    }

private:
    static void begin( GLenum type ) {}
    static void edgeFlag( GLboolean flag ) {}
    static void end() {}

    static void vertexData( void *vertex_data, void *polygon_data )
    {
        Poly& p = *static_cast< Poly* >( polygon_data );
        dvec3& pt = *static_cast< dvec3* >( vertex_data );
        p.mTriangles.push_back( pt );
    }

    static void combineData( GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData, void *polygon_data )
    {
        Poly& p = *static_cast< Poly* >( polygon_data );

        dvec3* newVert = new dvec3();
        (*newVert)[0] = coords[0];
        (*newVert)[1] = coords[1];
        (*newVert)[2] = coords[2];

        p.mCombined.push_back( newVert );
        *outData = newVert;
    }

    vector< dvec3 > mTriangles;
    vector< dvec3* > mCombined;
};

关于c++ - gluTessCallback 指向回调函数的指针。编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23614356/

相关文章:

c++ - (有效地)动态存储多项式

c++ - 我应该制作自己的框架吗?

c++ - link.exe 返回错误 LNK1181 : cannot open input file 'C:\Program.obj'

c++ - 如何使 vector 的元素独一无二? (删除不相邻的重复项)

java - 如何在java中访问c++内存映射文件

visual-c++ - 静态文本的点击事件

gcc - msvc 和 gcc 上的用户警告?

java - 外观呈三角形 strip 。表面法线?还是绕组?

c++ - 执行 OpenGL 程序时出现 libGL 错误

opengl - 在opengl中围绕固定点旋转对象