Re: [GtkGLExt] troubles with my first OpenGL app
- From: "Vladimir Bashkardin" <bash deg gubkin ru>
- To: gtkglext-list gnome org
- Subject: Re: [GtkGLExt] troubles with my first OpenGL app
- Date: Thu, 3 Aug 2006 15:51:48 +0400 (MSD)
Hi.
I suggest to move the following code from realize () to expose_event ():
> glBegin(GL_POLYGON);
> glVertex2f(-0.5, -0.5);
> glVertex2f(-0.5, 0.5);
> glVertex2f(0.5, 0.5);
> glVertex2f(0.5, -0.5);
> glEnd();
It should be like this:
static void realize (GtkWidget *widget, gpointer data) {
GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
/*** OpenGL BEGIN ***/
if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
return;
/*** Begin code from example-1.1 ***/
glClearColor (0.0, 0.0, 0.0, 0.0);
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glFlush();
/*** End code from example-1.1 ***/
glViewport (0, 0, widget->allocation.width, widget->allocation.height);
gdk_gl_drawable_gl_end (gldrawable);
/*** OpenGL END ***/
}
static gboolean expose_event (GtkWidget *widget, GdkEventExpose
*event, gpointer data) {
GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
/*** OpenGL BEGIN ***/
if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
return FALSE;
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
if (gdk_gl_drawable_is_double_buffered (gldrawable))
gdk_gl_drawable_swap_buffers (gldrawable);
else
glFlush ();
gdk_gl_drawable_gl_end (gldrawable);
/*** OpenGL END ***/
return TRUE;
}
Now works OK on my configuration: RedHat Enterprise Linux 4.0,
nVidia QuadroFX 1300, nVidia propietary driver version 87.62
PS. Instead of the "realize" event, I would handle the "configure" event.
Currently, it doesn't react properly to resize/maximize/minimize window
events.
Thu, 03 Aug 2006, 06:49 jesus ruiz wrote:
> Hello
>
> First of all, sorry for my English.
>
> I want to learn developing OpenGL applications, so I try gtkglext. The
> examples are great! :) But I would like to follow the redbook from
> OpenGL to learn it from scratch.
>
> So, I try the example1-1 [1] (A white square into a black screen), but
> i didnt get it working. The code (based on simple.c) mentioned is
> commented and posted below.
>
> Thanks in advance
>
> P.S. If this is off topic, please tell me and sorry.
>
> [1] http://www.rush3d.com/reference/opengl-redbook-1.1/chapter01.html
>
> ---------------- CODE: example1_1.c --------------------
>
> /*
> * example1_1.c on redBook (The White square)
> *
> * Problem: The app only display a black window
> *
> * Using GTK+ through libgtkglext
> *
> * Functions:
> * main() create the widgets and connect the signals to their callback
> * realize() is called only once on startup
> * expose_event() is called when the drawingarea should be repainted.
> */
>
> #include <stdlib.h>
> #include <gtk/gtk.h>
> #include <gtk/gtkgl.h>
>
> #include <GL/gl.h>
> #include <GL/glu.h>
>
> static void realize (GtkWidget *widget, gpointer data) {
> GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
> GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
>
> /*** OpenGL BEGIN ***/
> if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
> return;
>
> /*** Begin code from example-1.1 ***/
>
> glClearColor (0.0, 0.0, 0.0, 0.0);
> glClear (GL_COLOR_BUFFER_BIT);
> glColor3f (1.0, 1.0, 1.0);
> glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
> glBegin(GL_POLYGON);
> glVertex2f(-0.5, -0.5);
> glVertex2f(-0.5, 0.5);
> glVertex2f(0.5, 0.5);
> glVertex2f(0.5, -0.5);
> glEnd();
> glFlush();
>
> /*** End code from example-1.1 ***/
>
> glViewport (0, 0, widget->allocation.width, widget->allocation.height);
>
> gdk_gl_drawable_gl_end (gldrawable);
> /*** OpenGL END ***/
> }
>
> static gboolean expose_event (GtkWidget *widget, GdkEventExpose
> *event, gpointer data) {
> GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
> GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
>
> /*** OpenGL BEGIN ***/
> if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
> return FALSE;
>
> if (gdk_gl_drawable_is_double_buffered (gldrawable))
> gdk_gl_drawable_swap_buffers (gldrawable);
> else
> glFlush ();
>
> gdk_gl_drawable_gl_end (gldrawable);
> /*** OpenGL END ***/
>
> return TRUE;
> }
>
> int main (int argc, char *argv[]) {
> GdkGLConfig *glconfig;
> gint major, minor;
>
> GtkWidget *window;
> GtkWidget *vbox;
> GtkWidget *drawing_area;
> GtkWidget *button;
>
> /*
> * Init GTK.
> */
>
> gtk_init (&argc, &argv);
>
> /*
> * Init GtkGLExt.
> */
>
> gtk_gl_init (&argc, &argv);
>
> /*
> * Query OpenGL extension version.
> */
>
> gdk_gl_query_version (&major, &minor);
> g_print ("\nOpenGL extension version - %d.%d\n",
> major, minor);
>
> /*
> * Configure OpenGL-capable visual.
> */
>
> /* Try double-buffered visual */
> glconfig = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGB |
> GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE);
> if (glconfig == NULL)
> {
> g_print ("*** Cannot find the double-buffered visual.\n");
> g_print ("*** Trying single-buffered visual.\n");
>
> /* Try single-buffered visual */
> glconfig = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGB |
> GDK_GL_MODE_DEPTH);
> if (glconfig == NULL)
> {
> g_print ("*** No appropriate OpenGL-capable visual found.\n");
> exit (1);
> }
> }
>
>
> /*
> * Top-level window.
> */
>
> window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
> gtk_window_set_title (GTK_WINDOW (window), "simple");
>
> /* Get automatically redrawn if any of their children changed
> allocation. */
> gtk_container_set_reallocate_redraws (GTK_CONTAINER (window), TRUE);
>
> g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK
> (gtk_main_quit), NULL);
>
> /*
> * VBox.
> */
>
> vbox = gtk_vbox_new (FALSE, 0);
> gtk_container_add (GTK_CONTAINER (window), vbox);
> gtk_widget_show (vbox);
>
> /*
> * Drawing area for drawing OpenGL scene.
> */
>
> drawing_area = gtk_drawing_area_new ();
> gtk_widget_set_size_request (drawing_area, 200, 200);
>
> /* Set OpenGL-capability to the widget. */
> gtk_widget_set_gl_capability (drawing_area, glconfig, NULL, TRUE,
> GDK_GL_RGBA_TYPE);
>
> g_signal_connect_after (G_OBJECT (drawing_area), "realize",
> G_CALLBACK (realize), NULL);
> g_signal_connect (G_OBJECT (drawing_area), "expose_event",
> G_CALLBACK (expose_event), NULL);
>
> gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0);
> gtk_widget_show (drawing_area);
>
> /*
> * Simple quit button.
> */
>
> button = gtk_button_new_with_label ("Quit");
>
> g_signal_connect (G_OBJECT (button), "clicked",
> G_CALLBACK (gtk_main_quit), NULL);
>
> gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
>
> gtk_widget_show (button);
>
> /*
> * Show window.
> */
>
> gtk_widget_show (window);
>
> /*
> * Main loop.
> */
>
> gtk_main ();
>
> return 0;
> }
> _______________________________________________
> gtkglext-list mailing list
> gtkglext-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtkglext-list
>
--
Vladimir Bashkardin
Department of Exploration Geophysics
Gubkin's Russian State University of Oil and Gas
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]