<!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&aacute;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&oacute;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&eacute; 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&aacute;cil: aprender OpenGL. <br>
    La segunda decision, en que lenguaje se hace, ya no es tan f&aacute;cil, si
    lo es decir que por supuesto en C++, pero yo no me atrevo. <br>
    <br>
    Asi que alla por 2005 descubr&iacute; python, y con &eacute;l pygame, pyOpenGL y
    finalmente pyglet, que a&uacute;n era beta pero promet&iacute;a. De esta batalla
    sali&oacute; 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&oacute;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&aacute; 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&oacute;n de la aplicaci&oacute;n, intent&eacute; separar el m&oacute;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&aacute;s
    cosas de las que plane&eacute;. El paquete se divide en tres submodulos,
    con la idea de que se pueda usar s&oacute;lo el GUI sin necesitar los
    dem&aacute;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&aacute;maras. <br>
    <br>
    De momento estoy centrado en nabla.gui, que en resumen tiene:<br>
    <br>
    - Un sistema de colocaci&oacute;n al estilo de Tkinter, a base de celdas y
    modos "sticky".<br>
    - Una forma de construir widgets, ampliando el gen&eacute;rico "Control"<br>
    - Un conjunto de widgets hechos (van mas de 40): Label, Image,
    Button, ListBox, ComboBox, Window, Tabs, Menu... <br>
    - Dialogos est&aacute;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
    &uacute;nico batch, deberia poderse usar el modulo nabla.gui junto con
    cualquier otro framework o programa hecho sobre pyglet. &nbsp;<br>
    <br>
    Sobre la manera en que est&aacute; hecho, hay buenas y malas noticias. La
    mala es que se puede optimizar mucho, ahora hace m&aacute;s cambios de
    estado OpenGL de los necesarios para que funcione. La buena es que
    as&iacute; ser&iacute;a muy f&aacute;cil convertirlo en un GUI tridimensional, incluso
    con perspectiva, iluminaci&oacute;n o lo que se quiera. El c&oacute;digo de
    picking necesario est&aacute; hecho en nabla.geo. Resumiendo, es un GUI
    dibujado sobre un plano que casualmente coincide con la pantalla,
    pero no tiene por qu&eacute; 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&oacute;n y encima vasco, aprend&iacute; con un Spectrum,
    luego unos a&ntilde;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&oacute;digo que no siguen las buenas costumbres, reinventan la rueda o
    est&aacute;n hechas muy a lo bestia, pero lo voy puliendo.<br>
    <br>
    Si teneis un ratito para probarlo, aun no est&aacute; acabado, pero
    sinceramente necesito comentarios y &aacute;nimo, es muy dificil explicar a
    la gente porque est&aacute;s perdiendo el tiempo dibujando botoncitos
    cuando ya hay hechos (no en mi contexto OpenGL, co&ntilde;o!). A mi me
    sirve para lo que quiero, pero me cuesta mucho documentarlo en
    ingl&eacute;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&oacute;n.<br>
    Saludos. <br>
    <br>
    <br>
    <u><b>Enlaces</b></u><br>
    <br>
    Esto no es una "release", a&uacute;n no esta terminado. S&oacute;lo lo he probado
    en Win, pero deberia funcionar en Linux y Mac, espero confirmaci&oacute;n o
    alg&uacute;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&oacute;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&aacute;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&aacute;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>