[Python-es] Framework Nabla para aplicaciones OpenGL
Txema Vicente
txema en nabla.net
Sab Ago 28 21:51:27 CEST 2010
Buenas.
Estoy cocinando una cosa y voy a soltaros un paquete terrible sobre
OpenGL e interfaces de usuario, a ver que opinais los que os interese el
tema.
Al final están todos los enlaces, el [2] es una captura de pantalla para
ver de que estoy hablando.
*_Antecedentes:_*
Lo cuento por justificar la decisión de crear el proyecto, se puede
omitir tranquilamente.
Hace tiempo me pidieron una aplicacion que moviera imagenes sobre un
videowall de cuatro proyectores, y eso ha derivado en una libreria que
publicaré en un par de meses bajo licencia tipo BSD.
Si hay que mover imagenes con la mayor suavidad posible, la primera
decision fue fácil: aprender OpenGL.
La segunda decision, en que lenguaje se hace, ya no es tan fácil, si lo
es decir que por supuesto en C++, pero yo no me atrevo.
Asi que alla por 2005 descubrí python, y con él pygame, pyOpenGL y
finalmente pyglet, que aún era beta pero prometía. De esta batalla salió
un claro vencedor: pyglet. Casi todo el API OpenGL al descubierto,
soporta multiples pantallas, sonido y video. Y no va nada mal para ser
interpretado.
El fallo catastrófico es que no hay GUI. Todo se hace a mano. Supongo
que es por esto que no se ven muchas aplicaciones hechas con pyglet,
está muy bien para hacer juegos sencillos o pruebas de concepto, pero
como necesites sacar un dialogo para abrir un archivo, simplemente no
hay. En la lista de pyglet se ve que hay gente que lo quiere usar con
librerias como wxWidgets, pero no parece que les vaya muy bien. Otros se
han hecho sus propios GUI Toolkit, pero son muy ligeritos y no valen
para lo que yo necesito. Necesito in GUI Toolkit que tenga de todo, me
da igual que penalize el rendimiento mientras se ve, si oculto no lo hace.
En la primera versión de la aplicación, intenté separar el módulo GUI
para que sirviera para otras cosas, pero al final no pudo ser. Se hizo
funcionar, pero el GUI acabo siendo un engendro incrustado por las malas
dentro de un bucle principal personalizado de pyglet 1.0. Tan modificado
que ya no valia para pyglet 1.1
_*El proyecto Nabla Framework:*_
Hace ya 7 meses empece de cero otra vez, para hacer un GUI reutilizable,
esta vez usando la API de pyglet [1] al pie de la letra. Y ya se puede
probar [3], de hecho he acabado haciendo más cosas de las que planeé. El
paquete se divide en tres submodulos, con la idea de que se pueda usar
sólo el GUI sin necesitar los demás.
- nabla.gui: el GUI, basicamente proporciona un objeto "Overlay" sobre
el que se dibujan Widgets.
- nabla.geo: un modulo para graficos en "dos dimensiones y media".
Organiza los planos, y permite seleccionar puntos. Necesita OpenGL 2.0+
- nabla.app: un esqueleto ampliable "Application" que maneja las dos
capas anteriores, las ventanas y sus cámaras.
De momento estoy centrado en nabla.gui, que en resumen tiene:
- Un sistema de colocación al estilo de Tkinter, a base de celdas y
modos "sticky".
- Una forma de construir widgets, ampliando el genérico "Control"
- Un conjunto de widgets hechos (van mas de 40): Label, Image, Button,
ListBox, ComboBox, Window, Tabs, Menu...
- Dialogos estándar: MessageBox, InputBox, FileOpen, FileSave...
- Esqueletos de miniaplicaciones: Explorer, Viever, Player, Notepad...
- Administrador de ventanas sencillito.
- Consola interactiva.
_*Las posibilidades:*_
El GUI se conecta al sistema de eventos de pyglet y se dibuja en un
único batch, deberia poderse usar el modulo nabla.gui junto con
cualquier otro framework o programa hecho sobre pyglet.
Sobre la manera en que está hecho, hay buenas y malas noticias. La mala
es que se puede optimizar mucho, ahora hace más cambios de estado OpenGL
de los necesarios para que funcione. La buena es que así sería muy fácil
convertirlo en un GUI tridimensional, incluso con perspectiva,
iluminación o lo que se quiera. El código de picking necesario está
hecho en nabla.geo. Resumiendo, es un GUI dibujado sobre un plano que
casualmente coincide con la pantalla, pero no tiene por qué coincidir.
Algunas de las cosas para las que puede servir que se me ocurren:
- Pizarras interactivas,
- Editor GLSL en tiempo real.
- Editor de GUI para hacerlos en plan visual, incluso se podria llegar a
hacer un IDE.
- Livecoding, algo como Fluxus [5].
- Hacer un sustituto de nabla.geo que use pyODE [6].
- Soporte de Wiimote, o multitactil tipo J. Lee. [7]
_*Comentarios:*_
Soy autodidacta, cabezón y encima vasco, aprendí con un Spectrum, luego
unos años oscuros de VB6, y otros muchos con PHP. Digo esto porque soy
consciente de que tengo malos vicios: hay muchas cosas de mi código que
no siguen las buenas costumbres, reinventan la rueda o están hechas muy
a lo bestia, pero lo voy puliendo.
Si teneis un ratito para probarlo, aun no está acabado, pero
sinceramente necesito comentarios y ánimo, es muy dificil explicar a la
gente porque estás perdiendo el tiempo dibujando botoncitos cuando ya
hay hechos (no en mi contexto OpenGL, coño!). A mi me sirve para lo que
quiero, pero me cuesta mucho documentarlo en inglés, y necesito saber
que no estoy hablando con la pared: no se si merece la pena si no hay
gente que lo vaya a usar.
Gracias por tu atención.
Saludos.
_*Enlaces*_
Esto no es una "release", aún no esta terminado. Sólo lo he probado en
Win, pero deberia funcionar en Linux y Mac, espero confirmación o algún
traceback.
Necesita pyglet instalado para funcionar:
[1] http://www.pyglet.org/download.html
Captura de pantalla:
[2]http://www.nabla.net/lab/nabla-test.jpg
Programa de prueba:
[3]http://www.nabla.net/lab/nabla-test.zip
Documentacion API (en construcción):
[4] http://www.nabla.net/lab/nabla-api/
Otros:
[5] http://www.pawfal.org/fluxus/
[6] http://pyode.sourceforge.net/
[7] http://johnnylee.net/projects/wii/
Además:
Un Widget sencillo:
http://www.nabla.net/lab/nabla-api/nabla.gui.widget.Label-class.html
Un Widget complicado:
http://www.nabla.net/lab/nabla-api/nabla.gui.widget.TreeFolder-class.html
Páginas de API interesantes:
http://www.nabla.net/lab/nabla-api/nabla.gui-module.html
http://www.nabla.net/lab/nabla-api/nabla.geo.space.Space-class.html
http://www.nabla.net/lab/nabla-api/nabla.app.Application-class.html
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20100828/573bf02f/attachment.html>
Más información sobre la lista de distribución Python-es