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
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
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.
glutPostOverlayRedisplay : marks the overlay of the current window as needing to be redisplayed.
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)
Control del mouse
De entre los callbacks que nos da la GLUT, son especialmente interesantes para el control del mouse los
siguientes:
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:
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
- glutSolidSphere, glutWireSphere: representan una esfera en sólido o en wireframe respectivamente.
- glutSolidCube, glutWireCube: representa un cubo en un sólido o en wireframe respectivamente
- glutSolidCone, glutWireCone: representa un cono en un sólido o en wireframe respectivamente
- glutSolidTorus, glutWireTorus: representa un toroide en un sólido o en wireframe respectivamente
- glutSolidDodecahedron, glutWireDodecahedron: representa un dodecaedro en un sólido o en wireframe respectivamente
- glutSolidOctahedron, glutWireOctahedron: representa un octaedro en un sólido o en wireframe respectivamente
- glutSolidTetrahedron, glutWireTetrahedron: representa un tetraedro en un sólido o en wireframe respectivamente
- glutSolidIcosahedron, glutWireIcosahedron: representa un icosaedro(20 lados) en un sólido o en wireframe respectivamente
- 11.9 glutSolidTeapot, glutWireTeapot : representa una tetera en un sólido o en wireframe respectivamente
No comments:
Post a Comment