Обратный вызов тесселяции 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_;
};

Callbacks:

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

Что плохого в том, как регистрируются обратные вызовы?

5

Решение

Вы приводите указатель на тип объекта к указателю на тип функции (например, «BeginCallback» на «void (CALLBACK *) ()»). Эти типы несовместимы и не связаны. Код компилируется как приведение в стиле c, без какой-либо проверки типов. Более того, с точки зрения компилятора C ++ BeginCallback и VertexCallback — это разные и несовместимые типы, а функция gluTessCallback не может вызывать их перегруженный оператор () — это разные функции-члены.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]