2013-01-09 16 views
5

テッセレーションのコールバックを別のクラスに移動するために、例hereを使用しました。OpenGL Tessellationコールバックが実行されない

コードはコンパイルされますが、コールバックコードは決して実行されません。

コールバッククラス:

template <class Class, typename ReturnType, typename Parameter> 
class SingularCallBack 
{ 
public: 

    typedef ReturnType (Class::*Method)(Parameter); 

    SingularCallBack(Class* class_instance, Method method) 
     : class_instance_(class_instance), 
     method_(method) 
    {} 

    ReturnType operator()(Parameter parameter) 
    { 
     return (class_instance_->*method_)(parameter); 
    } 

    ReturnType execute(Parameter parameter) 
    { 
     return operator()(parameter); 
    } 

private: 

    Class* class_instance_; 
    Method method_; 
}; 

コールバック:

int MyClass::TessellatePolys() 
{ 
    GLUtesselator *tess = gluNewTess(); // create a tessellator 
    if(!tess) return 0; // failed to create tessellation object, return 0 

    // register callback functions 
    SingularCallBack<GLOrtho, void, GLenum>*BeginCallback; 
    BeginCallback = new SingularCallBack<GLOrtho, void, GLenum>(this,&GLOrtho::tessBegin); 
    gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK *)())BeginCallback); 

    SingularCallBack<GLOrtho, void, const GLvoid*>*VertexCallback; 
    VertexCallback = new SingularCallBack<GLOrtho, void, const GLvoid*>(this,&GLOrtho::tessVertex); 
    gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK *)())VertexCallback); 

    ... (do tessellation) ... 

    return id; 
} 

コールバックが登録されている方法と間違っている何を:私はそれらを登録してい

void MyClass::tessBegin(GLenum which) 
{ 
    glBegin(which); 
    cout << "BEGIN CALLBACK IS WORKING"; 
} 

void MyClass::tessVertex(const GLvoid *data) 
{ 
    // cast back to double type 
    const GLdouble *ptr = (const GLdouble*)data; 

    glVertex3dv(ptr); 
    cout << "VERTEX CALLBACK IS WORKING"; 
} 

テッセレーション機能?

+0

私は、関数ポインタへのオブジェクトポインタのキャスティングがどのように動作するはずですか?私が読んでいるところは、tesselatorが 'BeginCallback :: class_instance_'でデータを実行し、' BeginCallback'を参照せずに 'operator()'を実行しようとすることです。 – genpfault

+9

あなたの言っていることが分かります。その部分は、このソリューション(http://www.partow.net/programming/templatecallback/)をテッセレーションコードに適合させる私の試みでした。私は全体的に間違って来ますか?種別: – BrickFrog

+1

GLUテッセレータはかなり古いコードで、あなたが試している方法でC++オブジェクトを扱いません。あなたのコールバックを単純なC-sytle関数にすることは、多くのことを単純化します。 ['gluTessCallback'のマニュアルページ(http://www.opengl.org/sdk/docs/man2/xhtml/gluTessCallback.xml)には、コールバックとその中に含めるものについて合理的な議論がありますあなたは即時モードスタイルのOpenGLに精通しています)。 – radical7

答えて

0

オブジェクト型へのポインタを、 "BeginCallback"から "void(CALLBACK *)()"のような関数型へのポインタにキャストしています。これらのタイプは互換性がなく、無関係です。コードは、型チェックを行わずにCスタイルのキャストとしてコンパイルされます。さらに、C++コンパイラの観点からは、BeginCallbackとVertexCallbackは異なる型と互換性がなく、関数gluTessCallbackはオーバーロードされた演算子()を呼び出すことができません。これらは異なるメンバ関数です。

関連する問題