[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