2013-01-09 1 views
5

테셀레이션 콜백을 다른 클래스로 이동하려면 예제 here을 사용했습니다.OpenGL 테셀레이션 콜백이 실행되지 않음

코드가 컴파일되지만 콜백 코드가 실행되지 않습니다.

콜백 클래스 :

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_; 
}; 

콜백 :

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"; 
} 

테셀레이션 기능 내가 그들을 등록 해요 :

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; 
} 

무엇 콜백 등록되는 방식에 문제가 있습니다 ?

+0

함수 포인터로 객체 포인터를 캐스팅하는 것이 어떻게 작동하는지 보지 않습니다. 필자가 읽는 방식은 테셀레이터가'BeginCallback :: class_instance_'에서 데이터를 실행하고'BeginCallback'을 참조하지 않고'operator()'를 실행하려고 시도한다는 것입니다. – genpfault

+9

당신이 말하는 것을 봅니다. 이 부분은이 솔루션 (http://www.partow.net/programming/templatecallback/)을 테셀레이션 코드에 맞추려는 시도였습니다. 내가 전부 잘못 온거야? – BrickFrog

+1

종류입니다. GLU 테셀레이터는 오히려 오래된 코드이며, 여러분이 시도하는 방식으로 C++ 객체를 처리하지 않습니다. 콜백을 단순하게 만드는 C-sytle 함수는 많은 것을 단순화합니다. ['gluTessCallback' man page] (http://www.opengl.org/sdk/docs/man2/xhtml/gluTessCallback.xml)에는 콜백에 대한 합당한 논의가 포함되어 있습니다. 즉각적인 모드 스타일의 OpenGL에 익숙합니다. – radical7

답변

0

"BeginCallback"에서 "void (CALLBACK *)()"과 같은 함수 유형에 대한 포인터로 객체 유형에 대한 포인터를 캐스팅하고 있습니다. 이러한 유형은 호환되지 않으며 관련이 없습니다. 코드는 유형 검사없이 C 스타일의 캐스트이므로 컴파일됩니다. 더우기 C++ 컴파일러 관점에서 볼 때 BeginCallback과 VertexCallback은 서로 다른 호환되지 않는 유형이며 gluTessCallback 함수는 오버로드 된 연산자()를 호출 할 수 없습니다. 이는 서로 다른 멤버 함수입니다.