[PyOpenGL-Users] glut, freeglut, dlls lookup
Brought to you by:
mcfletch
From: Claudio <cla...@ya...> - 2010-04-01 18:34:01
|
In windows xp sp3, python 2.6.3, pyOpenGL 3.0.1, installed from the .exe in sourceforge 1. For glut32.dll the dll lookup order seems to be i) %windows%\system32 ii) site-packages\OpenGL\DLLS iii) the CWD (current working dir) is irrelevant I'm unsure if this was intended, but seems weird: in worst case you should touch %windows%\system32 and site-packages to ensure the desired glut flavor is loaded (see 3. , concrete case) 2. freeglut.dll is a replacement for glut32.dll that have some extra functions, like glutBitmapString. The glut32.dll provided by PyOpenGL-3.0.1.win32.exe dont have the extra functions, thus you can get a traceback like: [snipped] OpenGL.error.NullFunctionError: Attempt to call an undefined function glutBitmapString, check for bool(glutBitmapString) before calling Should the NullFuncionError handler check if the name belongs to the freeglut exclusive functions and inform 'you need to use freeglut...' ? Wouldn't be better functionality to load a specific glut flavor, like: import OpenGl OpenGL.glut_desired = 'freeglut' ... Then in site-packages\OpenGL\DLLS you can include both flavors: glut32.dll and freeglut.dll, and at run time you bind according to .glut_desired 3. concrete case: a pyweek10 entry, look at this thread if you want the code http://www.pyweek.org/d/3222/#comment-7145 I will reproduce my comment there: """ At first it crashed, made some adjustments and then succeed in windows xp, pyOpenGL 3.0.1 (the latest released in sourceforge), at the start crashes with: D:\tmp\_pyweek10_previa\teetering-towers-2\teetering-tower-2>run_game.py Traceback (most recent call last): File "D:\tmp\_pyweek10_previa\teetering-towers-2\teetering-tower-2\run_game.py ", line 268, in <module> tower.render() File "D:\tmp\_pyweek10_previa\teetering-towers-2\teetering-tower-2\run_game.py ", line 116, in render glutBitmapString(GLUT_BITMAP_HELVETICA_18, "%.1f" % r) File "C:\Python26\lib\site-packages\OpenGL\platform\baseplatform.py", line 336 , in __call__ self.__name__, self.__name__, OpenGL.error.NullFunctionError: Attempt to call an undefined function glutBitmap String, check for bool(glutBitmapString) before calling Workaround: seems that glutBitmapString is not available in the standard glut32.dll shipped in the win binaries for pyOpenGL greping the pyOpenGL sources with the func name suggested that freeglut was needed got freeglut (I choosed the MSVC version) from http://www.transmissionzero.co.uk/software/freeglut-devel/ copied freeglut.dll to site-packages\OpenGL\DLLS renamed to glut32.dll in %windir%\system32 rename glut32.dll to something else Done, it runs (and the text shows) """ Comments: Stashing the freeglut.dll (renamed or not to glut32.dll) at the script directory (thus in the CWD) dont work. If you happen to have glut32.dll in %windows%\system32, it will hide the glut32.dll in site-packages\OpenGL\DLLS So a python app needs to modify system-wide and python-wide settings in order to specify the desired glut variant (!). And if packaging with py2exe or similar, surely my expectation would be that the dlls will come from the narrower environment: CWD, site-packages\pyOpenGL\DLLS, system32. Should at least pyOpenGL try to load the dll first from the CWD ? -- claxo Yahoo! Cocina Encontra las mejores recetas con Yahoo! Cocina. http://ar.mujer.yahoo.com/cocina/ |