OpenGL镶嵌回调未执行
OpenGL Tessellation Callback Not Executing
我使用这里的例子将我的镶嵌回调移动到一个不同的类。
代码可以编译,但是回调代码永远不会执行。
Callback类:
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;
}
注册回调函数的方式有什么问题?
您正在将指向对象类型的指针转换为指向函数类型的指针(例如,"BeginCallback"转换为"void (CALLBACK *)()")。这些类型是不相容且不相关的。代码被编译为c风格的强制转换,没有任何类型检查。更重要的是,从c++编译器的角度来看,BeginCallback和VertexCallback是不同且不兼容的类型,函数gluTessCallback不能调用它们的重载操作符()——它们是不同的成员函数。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 如果事件在仍在执行时再次设置,RegisterWaitForSingleObject 是否会并行运行回调?
- 模板函数,用于在模板化对象上执行成员回调,而无需提供其实例
- 在窗口执行目标 TLS 回调之前注入 dll
- 如何为回调执行循环 (C++)
- Chromium Embedded如何从c++执行javascript回调
- cuda流:流执行后未调用回调
- 如何在C++中的原始线程中执行回调
- 如何在执行回调时隐藏顶级GTK窗口
- 是否可以对全局运算符“new”和“delete”执行回调
- 使用devenv调试c++可执行文件中的回调
- 如何在c++中设置函数返回时执行回调?
- OpenGL镶嵌回调未执行