2009-12-11 [長年日記]

[Haskell] HaskellでOpenGL (2)

ところが、ウィンドウを閉じてもプロセスが終了しません。GLUTバインディングのAPIドキュメントを見ると、closeCallbackを指定するとうまくいきそうに見えます。というわけで、こんな感じにしてみます。

import Graphics.Rendering.OpenGL
import Graphics.UI.GLUT
import System.Exit

main =
  do (progName, _) <- getArgsAndInitialize
     createWindow "Hello World"
     displayCallback $= clear [ColorBuffer]
     closeCallback $= Just exitSuccess
     mainLoop

これを実行すると、

opengl1.exe: user error (unknown GLUT entry glutCloseFunc)

というエラーになります。どうやら、glut32.dllからglutCloseFuncというエントリがエクスポートされていないようです。色々調べてみると、glutCloseFuncというのは、OpenGLUTというGLUTから派生したプロジェクトで追加されたAPIのようです。そこでバイナリをダウンロードして、OpenGLUT.dllをglut32.dllにリネームして実行してみると、今度は、

opengl1.exe: user error (unknown GLUT entry glutInit)

というエラーが発生します。Dependency Walkerで調べてみると、OpenGLUTのDLLは、stdcallの命名規約そのままで関数をエクスポートしているようで、例えばglutInitは、_glutInit@8という名前でエクスポートされています。

仕方がないのでソースをダウンロードしてきて、以下のようなDEFファイルをリンカのオプションで指定してビルドしてみました。

LIBRARY OpenGLUT
EXPORTS
    glutInit
    glutInitDisplayMode
    glutInitDisplayString
    glutInitWindowPosition
    glutInitWindowSize
    glutMainLoop
    glutCreateWindow
    glutCreateSubWindow
    glutDestroyWindow
    glutPostRedisplay
    glutPostWindowRedisplay
    glutSwapBuffers
    glutGetWindow
    glutSetWindow
    glutSetWindowTitle
    glutSetIconTitle
    glutPositionWindow
    glutReshapeWindow
    glutPopWindow
    glutPushWindow
    glutIconifyWindow
    glutShowWindow
    glutHideWindow
    glutFullScreen
    glutSetCursor
    glutWarpPointer
    glutEstablishOverlay
    glutRemoveOverlay
    glutUseLayer
    glutPostOverlayRedisplay
    glutPostWindowOverlayRedisplay
    glutShowOverlay
    glutHideOverlay
    glutCreateMenu
    glutDestroyMenu
    glutGetMenu
    glutSetMenu
    glutAddMenuEntry
    glutAddSubMenu
    glutChangeToMenuEntry
    glutChangeToSubMenu
    glutRemoveMenuItem
    glutAttachMenu
    glutDetachMenu
    glutDisplayFunc
    glutReshapeFunc
    glutKeyboardFunc
    glutMouseFunc
    glutMotionFunc
    glutPassiveMotionFunc
    glutEntryFunc
    glutVisibilityFunc
    glutIdleFunc
    glutTimerFunc
    glutMenuStateFunc
    glutSpecialFunc
    glutSpaceballMotionFunc
    glutSpaceballRotateFunc
    glutSpaceballButtonFunc
    glutButtonBoxFunc
    glutDialsFunc
    glutTabletMotionFunc
    glutTabletButtonFunc
    glutMenuStatusFunc
    glutOverlayDisplayFunc
    glutWindowStatusFunc
    glutKeyboardUpFunc
    glutSpecialUpFunc
    glutJoystickFunc
    glutSetColor
    glutGetColor
    glutCopyColormap
    glutGet
    glutDeviceGet
    glutExtensionSupported
    glutGetModifiers
    glutLayerGet
    glutBitmapCharacter
    glutBitmapWidth
    glutStrokeCharacter
    glutStrokeWidth
    glutBitmapLength
    glutStrokeLength
    glutWireSphere
    glutSolidSphere
    glutWireCone
    glutSolidCone
    glutWireCube
    glutSolidCube
    glutWireTorus
    glutSolidTorus
    glutWireDodecahedron
    glutSolidDodecahedron
    glutWireTeapot
    glutSolidTeapot
    glutWireOctahedron
    glutSolidOctahedron
    glutWireTetrahedron
    glutSolidTetrahedron
    glutWireIcosahedron
    glutSolidIcosahedron
    glutVideoResizeGet
    glutSetupVideoResizing
    glutStopVideoResizing
    glutVideoResize
    glutVideoPan
    glutReportErrors
    glutIgnoreKeyRepeat
    glutSetKeyRepeat
    glutForceJoystickFunc
    glutGameModeString
    glutEnterGameMode
    glutLeaveGameMode
    glutGameModeGet
    glutMainLoopEvent
    glutLeaveMainLoop
    glutCloseFunc
    glutWMCloseFunc
    glutMenuDestroyFunc
    glutSetOption
    glutSetWindowData
    glutGetWindowData
    glutSetMenuData
    glutGetMenuData
    glutBitmapHeight
    glutStrokeHeight
    glutBitmapString
    glutStrokeString
    glutWireRhombicDodecahedron
    glutSolidRhombicDodecahedron
    glutWireSierpinskiSponge 
    glutSolidSierpinskiSponge 
    glutGetProcAddress
    glutMouseWheelFunc

できたOpenGLUT.dllをglut32.dllにリネームしてから実行すると、最初のサンプルも実行できるようになりました。しかし、どうやらOpenGLUTでは最初からこの問題に対処してあるようで、closeCallbackを指定しなくても、ウィンドウを閉じるとプロセスが終了するようになっていました。


トップ «前の日記(2009-12-10) 最新 次の日記(2009-12-13)»