<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-1">
</head>
<body bgcolor="#ffffff" text="#000000">
Buenas.<br>
<br>
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.<br>
<br>
Al final están todos los enlaces, el [2] es una captura de pantalla
para ver de que estoy hablando.<br>
<br>
<b><u>Antecedentes:</u></b><br>
<br>
Lo cuento por justificar la decisión de crear el proyecto, se puede
omitir tranquilamente. <br>
<br>
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.<br>
<br>
Si hay que mover imagenes con la mayor suavidad posible, la primera
decision fue fácil: aprender OpenGL. <br>
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. <br>
<br>
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.<br>
<br>
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.<br>
<br>
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<br>
<br>
<br>
<u><b>El proyecto Nabla Framework:</b></u><br>
<br>
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.<br>
<br>
- nabla.gui: el GUI, basicamente proporciona un objeto "Overlay"
sobre el que se dibujan Widgets.<br>
- nabla.geo: un modulo para graficos en "dos dimensiones y media".
Organiza los planos, y permite seleccionar puntos. Necesita OpenGL
2.0+<br>
- nabla.app: un esqueleto ampliable "Application" que maneja las dos
capas anteriores, las ventanas y sus cámaras. <br>
<br>
De momento estoy centrado en nabla.gui, que en resumen tiene:<br>
<br>
- Un sistema de colocación al estilo de Tkinter, a base de celdas y
modos "sticky".<br>
- Una forma de construir widgets, ampliando el genérico "Control"<br>
- Un conjunto de widgets hechos (van mas de 40): Label, Image,
Button, ListBox, ComboBox, Window, Tabs, Menu... <br>
- Dialogos estándar: MessageBox, InputBox, FileOpen, FileSave...<br>
- Esqueletos de miniaplicaciones: Explorer, Viever, Player,
Notepad... <br>
- Administrador de ventanas sencillito.<br>
- Consola interactiva.<br>
<br>
<br>
<u><b>Las posibilidades:</b></u><br>
<br>
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. <br>
<br>
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.<br>
<br>
Algunas de las cosas para las que puede servir que se me ocurren:<br>
- Pizarras interactivas, <br>
- Editor GLSL en tiempo real.<br>
- Editor de GUI para hacerlos en plan visual, incluso se podria
llegar a hacer un IDE.<br>
- Livecoding, algo como Fluxus [5].<br>
- Hacer un sustituto de nabla.geo que use pyODE [6].<br>
- Soporte de Wiimote, o multitactil tipo J. Lee. [7]<br>
<br>
<br>
<u><b>Comentarios:</b></u><br>
<br>
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.<br>
<br>
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. <br>
<br>
Gracias por tu atención.<br>
Saludos. <br>
<br>
<br>
<u><b>Enlaces</b></u><br>
<br>
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.<br>
<br>
Necesita pyglet instalado para funcionar: <br>
[1] <a moz-do-not-send="true" class="moz-txt-link-freetext"
href="http://www.pyglet.org/download.html">http://www.pyglet.org/download.html</a><br>
<br>
Captura de pantalla: <br>
[2]<a moz-do-not-send="true" class="moz-txt-link-freetext"
href="http://www.nabla.net/lab/nabla-test.jpg">http://www.nabla.net/lab/nabla-test.jpg</a><br>
<br>
Programa de prueba: <br>
[3]<a moz-do-not-send="true" class="moz-txt-link-freetext"
href="http://www.nabla.net/lab/nabla-test.zip">http://www.nabla.net/lab/nabla-test.zip</a><br>
<br>
Documentacion API (en construcción): <br>
[4] <a moz-do-not-send="true" class="moz-txt-link-freetext"
href="http://www.nabla.net/lab/nabla-api/">http://www.nabla.net/lab/nabla-api/</a><br>
<br>
<br>
Otros:<br>
[5] <a moz-do-not-send="true" class="moz-txt-link-freetext"
href="http://www.pawfal.org/fluxus/">http://www.pawfal.org/fluxus/</a><br>
[6] <a moz-do-not-send="true" class="moz-txt-link-freetext"
href="http://pyode.sourceforge.net/">http://pyode.sourceforge.net/</a><br>
[7] <a moz-do-not-send="true" class="moz-txt-link-freetext"
href="http://johnnylee.net/projects/wii/">http://johnnylee.net/projects/wii/</a><br>
<br>
Además:<br>
Un Widget sencillo:<br>
<a class="moz-txt-link-freetext" href="http://www.nabla.net/lab/nabla-api/nabla.gui.widget.Label-class.html">http://www.nabla.net/lab/nabla-api/nabla.gui.widget.Label-class.html</a><br>
<br>
Un Widget complicado:<br>
<a class="moz-txt-link-freetext" href="http://www.nabla.net/lab/nabla-api/nabla.gui.widget.TreeFolder-class.html">http://www.nabla.net/lab/nabla-api/nabla.gui.widget.TreeFolder-class.html</a><br>
<br>
Páginas de API interesantes:<br>
<a class="moz-txt-link-freetext" href="http://www.nabla.net/lab/nabla-api/nabla.gui-module.html">http://www.nabla.net/lab/nabla-api/nabla.gui-module.html</a><br>
<a class="moz-txt-link-freetext" href="http://www.nabla.net/lab/nabla-api/nabla.geo.space.Space-class.html">http://www.nabla.net/lab/nabla-api/nabla.geo.space.Space-class.html</a><br>
<a class="moz-txt-link-freetext" href="http://www.nabla.net/lab/nabla-api/nabla.app.Application-class.html">http://www.nabla.net/lab/nabla-api/nabla.app.Application-class.html</a><br>
<br>
</body>
</html>