2017-11-15 24 views
0

私はsetCallback関数を使用するcライブラリを使っています。これらの機能は、例えば、固定の署名と機能を取る:mouse_moveは署名CythonのC関数のクラス/インスタンス属性へのアクセス

void mouse_move(GLFWwindow * window, double xpos, double ypos) 

を持っている。しかしmouse_movecamera構造体のように、これらの関数の引数を超えて他の状態に依存するとし

int glfwSetCursorPosCallback(window, mouse_move); 

はどこ? Cでは、私はcameraをグローバル変数にするだけです。しかし、私はCythonで働いていて、グローバル変数に頼らずにglfwSetCursorPosCallbackを使用したいと思います。これは不快で面倒です。 cameraがクラス属性またはインスタンス属性の場合は、引数として渡さずにmouse_moveにアクセスする方法はありますか?

+1

これは実際にはCythonでは不可能です。私は[過去に同様の問題にctypesを使用することを推奨しました](https://stackoverflow.com/questions/34878942/using-function-pointers-to-methods-of-classes-without-the-gil/34900829#34900829 )を使って一般的なPython呼び出し可能関数を渡すことができますが、 'GLFWwindow *'ウィンドウパラメータではこれを行うのが難しくなります。 – DavidW

+0

また、 'GLFWwindow'はコールバックからアクセスできるカスタムデータを(例えばvoidポインターを介して)格納できる可能性があります。これはもちろん、使用されているライブラリに依存します。これはCythonとはまったく独立しています。 –

答えて

0

これは、一般的な問題の解決策ではなく、GLFWコールバックのために、次のようにあなたのGLFWwindowvoid*を関連付けることが可能である:

glfwSetWindowUserPointer(window, yourVoidPtr); 

を、アクセス後で(例えば、コールバックで):

YourData *data = (YourData *) glfwGetWindowUserPointer(window); 
関連する問題