Sunday, April 08, 2007

En fin, en estos ultimos programas hemos tilizado la libreria de Glut, en vez del Api de windows, creo que esto hizo que se ffacilitaran mucho las cosas...

pues bien..Hooondemos en que diablos es Glut->
Glut es una libreria muy util para los programas hechos en OpenGl, la cual basicamente opera a nivel de sistema las entradas y salidas del sistema operativo en el cual se haya trabajando.
La sfunciones que lleva acabo incluyen definicion de la ventana, control de la ventana, monitoreo del teclado y del mouse. rutinas para dibujar una serie de diferentes primitivas geometricas, como son cubos, espferas la tasita de te...Incluso se pueden hacerunos menucitos graciososo, de tipo popup...como los q ue usaron en el programa de bmp font... veamos algunas de sus funciones->


glutInit inicia la libreria GLUT. Recibe dos parametros, que son los parametros que son recibidos por el main desde la linea de comando. glutInit extraera de la linea de comando los parametros que sean entendidos
por GLUT. Por el momento poco nos interesa saber cuales son, y ademas dependen del sistema operativo en el que corra.
gluInit inicializara la libreria GLUT y negociara una sesion con el sistema (de ventanas) en el que este corriendo. Puede pasar que el programa se cierre si GLUT no puede gestionar una sesion, o si el sistema no soporta OpenGL. Del mismo modo reaccionara si recibe una linea de comando incorrecta.

glutInitDisplayMode(GLUT);

glutInitDisplayMode configura el modo de video inicial, el mismo recibe un parametro, con el que se le indica la configuracion deseada, el prototipo de la funcion es

void glutInitDisplayMode(unsigned int modo);

Debido a que cada opcion son mascaras de bits, se puede seleccionar mas de una mediante la operacion logica OR. Los modos permitidos son (estos no son la totalidad de los modos, pero los mas usados, para ver una lista completa, vease “The OpenGL Utility Toolkit (GLUT) Programming Interfase")

GLUT_GRBA selecciona una ventana con modo RGBA por omision se selecciona esta si no se especifio ni RGBA o INDEX.
GLUT_RGB sinonimo para RGBA
GLUT_SINGLE selecciona una ventana con un solo buffer de color, si no se selecciona ni SINGLE ni DOUBLE, por omision se utiliza este
GLUT_DOUBLE selecciona una ventana con doble buffer.
GLUT_ACCUM selecciona una ventana con un buffer de acumulacion (o accumulation buffer)
GLUT_ALPHA selecciona una ventana cuyos color buffers tienen un componente alpha
GLUT_DEPTH selecciona una ventana con Depth Buffer (o Z-Buffer, o buffer de profundidad)
GLUT_STENCIL selecciona una ventana con un stencil buffer

Por el momento solo iniciamos una ventana con RGB, en los proximos tutoriales iremos iniciando mas cosas, como Depth Buffer, Double Buffer, y demas.

glutInitWindowSize(300,300);

Aqui le indicamos a GLUT que la ventana que creara debe tener una dimension de 300x300 (ancho x alto).

glutCreateWindow("glTut #1");

Aqui le indicamos a GLUT que efectivamente cree la ventana en el sistema que se esta corriendo. glutCreateWindow toma como parametro un string, en el que se le indica el titulo de la ventana.

Bien, a partir de aqui viene la parte de asignacion de rutinas, nosotros debemos asignarle a GLUT que rutinas utilizara como Display, Reshape, Idle, entrada de datos, y demas. Cada una de estas tendra caracteristicas diferentes que veremos mas adelante. La ventaja que nos provee el hecho de que nosotros debamos asignarles las funciones, radica en que tenemos un poco mas de libertad con respecto al nombre de las mismas (si alguien ha utilizado alguna vez el workframe de D3D habra visto que incomodo resulta).

Asignemos ahora las rutinas.

glutDisplayFunc(Display);

Aqui le indicamos a GLUT que la rutina utilizada como Display sera la llamada Display. Este tipo de rutinas se ejecuta una vez por ciclo de programa, y sera la que realice todas las operaciones graficas (o sea de render).

glutReshapeFunc(Reshape);

Aqui hacemos lo mismo que antes, solo que esta vez le asignamos la rutina de Reshape. Reshape se ejecuta cuando la ventana es cambiada de tamaño, y la primera vez que la aplicacion es ejecutada.

glutKeyboardFunc(KeyDown);

Esta vez asignamos la funcion de I/O. Esta rutina se ejecuta cada vez que se detecta una entrada de datos por teclado, y sera la responsable de manejar e interpretar esa entrada.

glutIdleFunc(Idle);

Por ultimo asignamos la rutina de Idle. Idle se ejecuta una vez por ciclo de programa, y es usada usualmente para albergar el codigo de manejo de variables de la aplicacion.

Una vez asignadas todas las rutinas necesarias, el programa entra en un ciclo constante que termina cuando la aplicacion es cerrada. Dentro de este ciclo se ejecutaran las rutinas Display, Idle, y cuando sea necesario KeyDown y Reshape La entrada al ciclo se realiza mediante el llamado a

glutMainLoop();

Aqui terminamos el analisis de nuestro primer programa, si bien aun no hicimos nada con OpenGL, ya tenemos una pequeña aplicacion base, que nos servira (con unas pequeñas modificaciones) para nuestros futuros ejemplos y programas

Window Management

GLUT soporta dos tipos de ventanas: top-level windows y subwindows. Ambos tipos soportan OpenGL rendering y las llamadas GLUT . Existe un identificador para ambos tipos de ventanas:

  • glutCreateWindow : glutCreateWindow crea a top-level window. The name will be provided to the window system as the window's name. The intent is that the window system will label the window with the name.
  • glutCreateSubWindow: creates a subwindow of the window identified by win of size width and height at location x and y within the current window. Implicitly, the current window is set to the newly created subwindow.

glutSetWindow, glutGetWindow: glutSetWindow sets the current window; glutGetWindow returns the identifier of the current window. If no windows exist or the previously current window was destroyed, glutGetWindow returns zero. glutSetWindow does not change the layer in use for the window; this is done using glutUseLayer.

glutDestroyWindow: glutDestroyWindow destroys the window specified by win and the window's associated OpenGL context, logical colormap (if the window is color index), and overlay and related state (if an overlay has been established). Any subwindows of destroyed windows are also destroyed by glutDestroyWindow. If win was the current window, the current window becomes invalid ( glutGetWindow will return zero).

glutPostRedisplay: Mark the normal plane of current window as needing to be redisplayed. The next iteration through glutMainLoop, the window's display callback will be called to redisplay the window's normal plane. Multiple calls to glutPostRedisplay before the next display callback opportunity generates only a single redisplay callback. glutPostRedisplay may be called within a window's display or overlay display callback to re-mark that window for redisplay.

glutSwapBuffers: Performs a buffer swap on the layer in use for the current window. Specifically, glutSwapBuffers promotes the contents of the back buffer of the layer in use of the current window to become the contents of the front buffer. The contents of the back buffer then become undefined. The update typically takes place during the vertical retrace of the monitor, rather than immediately after glutSwapBuffers is called.


  • glutPositionWindow

    :

    glutPositionWindow

    requests a change in the position of the

    current window

    . For top-lev

    el windows, the

    x

    and

    y

    parameters are pixel offsets from the screen origin. For subwindows, the

    x

    and

    y

    parameters are pixel offsets from the window's parent window origin.


    glutReshapeWindow: glutReshapeWindow requests a change in the size of the

    current window. The width and height parameters are size extents in pixels. The width and height must be positive values.


    glutFullScreen: glutFullScreen requests that the current window be made full screen. The exact semantics of what full screen means may vary by window system. The intent is to make the window as large as possible and disable any window decorations or borders added the window system. The window width and height are not guaranteed to be the same as the screen width and height, but that is the intent of making a window full screen.


    glutPopWindow, glutPushWindow: glutPopWindow and glutPushWindow work on both top-level windows and subwindows. The effect of pushing and popping windows does not take place immediately. Instead the push or pop is saved for execution upon return to the GLUT event loop. Subsequent push or pop requests on a window replace the previously saved request for that window. The effect of pushing and popping top-level windows is subject to the window system's policy for restacking windows.

    glutShowWindow, glutHideWindow, glutIconifyWindow : glutShowWindow will show the current window (though it may still not be visible if obscured by other shown windows). glutHideWindow will hide the current window. glutIconifyWindow will iconify a top-level window, but GLUT prohibits iconification of a subwindow. The effect of showing, hiding, and iconifying windows does not take place immediately. Instead the requests are saved for execution upon return to the GLUT event loop. Subsequent show, hide, or iconification requests on a window replace the previously saved request for that window. The effect of hiding, showing, or iconifying top-level windows is subject to the window system's policy for displaying windows.


    glutSetWindowTitle, glutSetIconTitle: These routines should be called only when the current window is a top-level window. Upon creation of a top-level window, the window and icon names are determined by the name parameter to glutCreateWindow. Once created, glutSetWindowTitle and glutSetIconTitle can change the window and icon names respectively of top-level windows. Each call requests the window system change the title appropriately. Requests are not buffered or coalesced. The policy by which the window and icon name are displayed is window system dependent.


    glutSetCursor: glutSetCursor changes the cursor image of the current window. Each call requests the window system change the cursor appropriately. The cursor image when a window is created is GLUT_CURSOR_INHERIT. The exact cursor images used are implementation dependent. The intent is for the image to convey the meaning of the cursor name. For a top-level window, GLUT_CURSOR_INHERIT uses the default window system cursor.

    GLUT_CURSOR_RIGHT_ARROW

      Arrow pointing up and to the right.

    GLUT_CURSOR_LEFT_ARROW

      Arrow pointing up and to the left.

    GLUT_CURSOR_INFO

      Pointing hand.

    GLUT_CURSOR_DESTROY

      Skull & cross bones.

    GLUT_CURSOR_HELP

      Question mark.

    GLUT_CURSOR_CYCLE

      Arrows rotating in a circle.

    GLUT_CURSOR_SPRAY

      Spray can.

    GLUT_CURSOR_WAIT

      Wrist watch.

    GLUT_CURSOR_TEXT

      Insertion point cursor for text.

    GLUT_CURSOR_CROSSHAIR

      Simple cross-hair.

    GLUT_CURSOR_UP_DOWN

      Bi-directional pointing up & down.

    GLUT_CURSOR_LEFT_RIGHT

      Bi-directional pointing left & right.

    GLUT_CURSOR_TOP_SIDE

      Arrow pointing to top side.

    GLUT_CURSOR_BOTTOM_SIDE

      Arrow pointing to bottom side.

    GLUT_CURSOR_LEFT_SIDE

      Arrow pointing to left side.

    GLUT_CURSOR_RIGHT_SIDE

      Arrow pointing to right side.

    GLUT_CURSOR_TOP_LEFT_CORNER

      Arrow pointing to top-left corner.

    GLUT_CURSOR_TOP_RIGHT_CORNER

      Arrow pointing to top-right corner.

    GLUT_CURSOR_BOTTOM_RIGHT_CORNER

      Arrow pointing to bottom-left corner.

    GLUT_CURSOR_BOTTOM_LEFT_CORNER

      Arrow pointing to bottom-right corner.

    GLUT_CURSOR_FULL_CROSSHAIR

      Full-screen cross-hair cursor (if possible, otherwise GLUT_CURSOR_CROSSHAIR).

    GLUT_CURSOR_NONE

      Invisible cursor.

    GLUT_CURSOR_INHERIT

      Use parent's cursor.

    Ahora que la ventana ha sido creada, es necesario mostrarla. Para ello la función

    main llama a la función glutDisplayFunc(). Esta función es la más importante de las

    funciones callback. Gracias a la definición de las funciones callback, GLUT hace posible

    una dinámica de programación de aplicaciones OpenGL. Una función callback será

    llamada por GLUT para hacer alguna operación especifica cada vez que se produzca un

    evento. En este caso, glutDisplayFunc(display), define que la función display que es

    pasada como argumento sea ejecutada cada vez que GLUT determine que la ventana debe

    ser dibujada (la primera vez que se muestra la ventana) o redibujada (cuando se maximiza,

    cuando se superponen varias ventanas, etc).

    La ultima función que es llamada en el main es glutMainLoop(). Esta función se

    encarga de pasar el control del flujo del programa a la GLUT, de manera que cada vez que

    ocurra un “evento” sean llamadas las funciones definidas como callbacks hasta que el la

    ventana se cierre.

    La función GLUT glutWireTorus(0.25, 0.75, 28, 28) dibuja un toroide de frame de

    hilos cuyo radio interno es el double 0,25; radio externo el double 0,75; el primer entero 28

    representa el numero de lados que se puede observar en cada sección radial y el segundo

    entero 28 el numero de divisiones radiales del toroide.

    La función GLUT glutWireCube(0.60) dibuja un cubo cuyo tamaño queda

    determinado por su único parámetro de valor float.

    DEFINIENDO EL ÁREA DE PROYECCIÓN INICIAL

    Una vez que se ha dibujado un objeto en la ventana es necesario definir el área de

    proyección inicial que se desea de la figura en la ventana. Para ello se debe manipular el

    área de proyección por medio de la función callback glutReshapeFunc(). Esta función

    callback especifica cuál función será llamada cada vez que la ventana sea redimensionada

    o movida, pero también es utilizada para definir inicialmente el área de proyección de la

    figura en la ventana.

    Overlay Management

    When overlay hardware is available, GLUT provides a set of routine for establishing, using, and removing an overlay for GLUT windows. When an overlay is established, a separate OpenGL context is also established. A window's overlay OpenGL state is kept distinct from the normal planes OpenGL state.

    glutEstablishOverlay: glutEstablishOverlay establishes an overlay (if possible) for the current window. The requested display mode for the overlay is determined by the initial display mode. glutLayerGet(GLUT_OVERLAY_POSSIBLE) can be called to determine if an overlay is possible for the current window with the current initial display mode. Do not attempt to establish an overlay when one is not possible; GLUT will terminate the program.

      glutUseLayer : changes the layer in use for the current window.

    glutRemoveOverlay: glutRemoveOverlay removes the overlay (if one exists). It is safe to call glutRemoveOverlay even if no overlay is currently established--it does nothing in this case. Implicitly, the window's layer in use changes to the normal plane immediately once the overlay is removed.

      glutShowOverlay, glutHideOverlay : glutShowOverlay shows the overlay of the current window; glutHideOverlay hides the overlay. The effect of showing or hiding an overlay takes place immediately. Note that glutShowOverlay will not actually display the overlay unless the window is also shown (and even a shown window may be obscured by other windows, thereby obscuring the overlay). It is typically faster and less resource intensive to use these routines to control the display status of an overlay as opposed to removing and re-establishing the overlay.


    Primitivas de objetos predefinidos

    Hay algunos objetos que vamos a renderizar muy a menudo, y que por tanto, ya vienen definidos. Así,

    disponemos de las siguientes funciones:

    - glutWireSphere(radius, slices, stacks), glutSolidSphere(radius, slices, stacks)

    - glutWireCube(size), glutSolidCube(size)

    - glutWireCone(base, height, slices, stacks), glutSolidCone(base, height, slices, stacks)

    - glutWireDodecahedron(void), glutSolidDodecahedron(void)

    - glutWireOctahedron(void), glutSolidOctahedron(void)

    - glutWireTetrahedron(void), glutSolidTetrahedron(void)

    - glutWireIcosahedron(void), glutSolidIcosahedron(void)

    - glutWireTeapot(void), glutSolidTeapot(void)

    Your browser may not support display of this image.

    Control del mouse

    De entre los callbacks que nos da la GLUT, son especialmente interesantes para el control del mouse los

    siguientes:

    Your browser may not support display of this image.

    Definición de menús

    La GLUT provee una manera sencilla de definir menús para nuestra aplicación. Veamos algunas de las

    herramientas de que disponemos para trabajar con menús:

    Your browser may not support display of this image.

    Funciones de CallBack

    Hay cuatro funciones de callback de debemos conocer.

    • Display: Esta función es invocada cuando el sistema determina que el contenido de la ventana tiene que ser redibujado, por ejemplo cuando la ventana se abre, o arrastramos otra ventana por delante de esta. La función de glut encargada de registrar este evento es glutDisplayFunc(). La función que registramos no tiene ningún argumento de entrada.
    • Reshape: La ventada de la aplicación puede cambiar de tamaño, normalmente porque el usuario arrastre alguno de los bordes de la ventana con el ratón. La función que registra este evento es glutReshapeFunc(). Y la función que nosotros registremos para manejar el evento debe tener dos parámetros enteros. Cuando se ejecute esta función de redimensión estos dos parámetros contendrán los nuevos valores del tamaño de la ventana.
    • Mouse: Esta función va a manejar los eventos que sean producidos por el ratón. Por ejemplo, que uno de los botones se presione o se suelte. La función que registra este evento es glutMouseFunc(). Al igual que en el caso anterior, esta función, al ser invocada pasa argumentos a la función de callback. En este caso estos argumentos describen la posición del ratón y el evento que se acaba de producir.
    • Keyboard: Esta función es muy parecida a la anterior. En este caso en lugar del ratón se trata de un evento de teclado. La función de glut que registra el callback es glutKeyboardFunc(). Y como viene siendo normal, a la función de callback también se le pasa información sobre la tecla en la que se ha producido el evento. Como caso excepcional, al callback también se le suministra información sobre la posición del ratón en el momento que se pulsó la tecla.
    • glutEntryFunc: sets the mouse enter/leave callback for the current window.
    • glutSpecialFunc: sets the special keyboard callback for the current window.
    • glutSpaceballMotionFunc: sets the Spaceball motion callback for the current window.
    • glutSpaceballRotateFunc: sets the Spaceball rotation callback for the current window.
    • glutSpaceballButtonFunc: The Spaceball button callback for a window is called when the window has Spaceball input focus (normally, when the mouse is in the window) and the user generates Spaceball button presses.
    • glutButtonBoxFunc: sets the dial & button box button callback for the current window.
    • glutDialsFunc: sets the dial & button box dials callback for the current window.
    • glutTabletMotionFunc: sets the special keyboard callback for the current window.
    • glutTabletButtonFunc: sets the special keyboard callback for the current window.
    • glutMenuStatusFunc: sets the global menu status callback.
    • glutIdleFunc: sets the global idle callback.
    • glutTimerFunc: registers a timer callback to be triggered in a specified number of milliseconds.

    Manejo de Color y Color Bitmap

    • glutSetColor: sets the color of a colormap entry in the layer of use for the current window.
    • glutGetColor: retrieves a red, green, or blue component for a given color index colormap entry for the layer in use's logical colormap for the current window.
    • glutCopyColormap: copies the logical colormap for the layer in use from a specified window to the current window.

    Recuperación del estado

    • glutGet : retrieves simple GLUT state represented by integers.
    • glutLayerGet : retrieves GLUT state pertaining to the layers of the current window.
    • glutDeviceGet : recupera la información del dispositivo GLUT representado por números enteros.
    • glutGetModifiers vuelve el estado de la llave del modificante cuando ciertos servicios repetidos fueron generados.
    • glutExtensionSupported : ayuda a determinar fácilmente si una extensión dada de es soportada por OpenGL.

    Representación de la fuente

    • glutBitmapCharacter: representa un carácter a memoria de imagen que usa OpenGL.
    • glutBitmapWidth: vuelve la anchura de un carácter a memoria de imagen.
    • glutStrokeCharacter: representa un carácter en movimiento usando OpenGL.
    • glutStrokeWidth: regresa el tamaño de un carácter en movimiento

    Representación geométrica del objeto

    No comments: